function test() external view customModifier payable {
/* ... */
}
위와 같이 함수를 정의할 때, external
, view
, customModifier
, payable
은 모두 함수 제어자이다.
해당 함수가 언제, 어디서 호출될 수 있는지 제어한다.
private
컨트랙트 내부의 다른 함수들에서만 호출될 수 있다.
internal
private
과 비슷하지만 해당 컨트랙트를 상속하는 컨트랙트에서도 호출될 수 있다.
external
오직 컨트랙트 외부에서만 호출될 수 있다.
public
함수 내외부 모두에서, 어디서든 호출될 수 있다.
블록체인과 상호작용 하는 방법에 대한 것이다.
view
, constant
해당 함수를 실행해도 어떤 데이터도 저장/변경되지 않는다.
pure
해당 함수가 어떤 데이터도 블록체인에 저장하지 않을 뿐만 아니라, 블록체인으로부터 어떤 데이터도 읽지 않는다.
view
, pure
모두 컨트랙트 외부에서 호출되었을 때 가스를 전혀 소모하지 않는다. 하지만 동일 컨트랙트 내의 다른 함수에 의해 내부적으로 호출되었을 경우에는 가스를 소모한다.
직접 원하는 논리대로 제어자를 정의하여 함수에 적용할 수도 있다.
// 메시지를 보낸 사람이 owner와 같은지 확인하는 제어자 정의
modifier onlyOwner () {
require(msg.sender == owner);
_; // _;와 항상 함께 쓰인다.
}
함수 호출을 통해 이더리움을 받을 수 있는 특별한 함수 유형을 정의한다. 함수가 실행되는 동시에 컨트랙트 계정(CA)에 돈을 지불할 수 있다. payable
을 작성하지 않은 함수에서는 이더를 보낼 수 없다.
contract OnlineStore {
function buySomething() external payable {
require(msg.value == 0.001 ether);
transferThing(msg.sender);
}
}
payable
은 가상화폐로 접근하기 위한 키워드이다. payable
키워드는 함수 제어자로 쓰일 수 있을 뿐만 아니라, address
타입의 변수와도 함께 쓰일 수 있다. address payable
은 지불 가능한 주소 타입을 의미한다. address payable
타입 변수는 이더를 전송할 수 있는 함수인 send()
와 transfer()
를 내장한다.
// owner라는 payable한 address 선언
address payable owner;
// to라는 payable한 address를 인자로 갖는 function 선언
function func(address payable to) public { /* ... */ }
📌 Reference
https://cryptozombies.io/ko/course