function buySomething() external payable {
//함수를 실행시킨 사람이 0.001 ether를 보냈는지 확인.
require(msg.value == 0.001 ether);
}
}
uint randNonce = uint(keccak256(now, msg.sender, nonce)) % 100
# nonce: 동일한 해시 함수에서 딱 한 번만 쓰여야 되는 값
위의 방법은 정직하지 않다. 왜냐하면 내가 원하는 결과 값을 가질 때만 트랜잭션을 공유할 수 있기 때문이다.
컨트랙트의 함수를 실행시키게 되면 특정 노드 혹은 전체 노드에게 트랜잭션으로서 알리게 된다. 만약 랜덤 함수를 실행시켜서 내가 원하는 값이 나오지 않을 경우에는 나에게만 알리고 원하는 값이 나왔을 경우에는 전체에게 알리게 된다면, 랜덤 함수이지만 내가 원하는 값만 얻을 수 있게 된다.
예를 들어 동전 뒤집기를 하는데 실제 경우로는 앞면 뒷면 둘 다 나오는데 사람들한테 알릴 때는 앞면만 나온 것처럼 할 수 있다는 것이다.
library example {
function ...
}
import "라이브러리가 존재하는 파일";
using example(라이브러리 이름) for 변수 타입;
SafeMath 코드
library SafeMath {
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
if (a == 0) {
return 0;
}
uint256 c = a * b;
assert(c / a == b);
return c;
}
function div(uint256 a, uint256 b) internal pure returns (uint256) {
// assert(b > 0); // Solidity automatically throws when dividing by 0
uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return c;
}
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
assert(b <= a);
return a - b;
}
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
assert(c >= a);
return c;
}
}
사용법
using SafeMath for uint256;
uint256 a = 4;
uint256 b = a.add(4); //b=8
uint256 c = a.mul(4); //c=16
uint256 d = a.div(2); //d=2
uint256 e = a.sub(3); //e=1
add의 매개변수는 2개인데 왜 하나만 써도 되나요?
using SafeMath for int256;를 선언하면서 각 함수의 첫 번째 매개변수에 a를 전달했기 때문.