위 둘은 컨트랙트 외부에서 불렸을 때 가스를 전혀 소모하지 않음(하지만 다른 함수에 의해 내부적으로 호출됐을 경우에는 가스를 소모)
modifier onlyAgeAbove(uint _age) {
require(user.age >= _age);
_;
}
function smoke() external view onlyAdult(20) { // 위 제어자들을 모두 혼용해서 사용 가능
doSomke();
}
이더리움에서는, 돈(이더), 데이터(transaction payload), 그리고 컨트랙트 코드 자체 모두 이더리움 위에 존재하기 때문에, 함수를 실행하는 동시에 컨트랙트에 돈을 지불하는 것이 가능하다
contract OnlineStore {
function buySomething() external payable {
require(msg.value == 0.001 ether); // msg.value로 컨트랙트에 0.001 ether가 왔는지 확인
transferThing(msg.sender);
}
}
//javascript
OnlineStore.buySomething({from: web3.eth.defaultAccount, value: web3.utils.toWei(0.001)})
만약 함수가 payable로 표시되지 않았는데 이더를 보내려 한다면, 함수에서 트랜잭션을 거부
두 함수 모두 조건을 만족하지 않으면 에러를 발생
즉, 대부분의 코드에 require를 쓰지만 assert는 일반적으로 코드가 심각하게 잘못 실행될 때 사용(uint 오버플로우 같은)