[ 함수 제어자 정리 ]
함수 제어자 사용예시
function test() external view onlyOwner anotherModifier { /* ... */ }
1) 함수가 언제 어디서 호출될 수 있는지 제어하는 접근 제어자.
- private : 컨트랙트 내부의 다른 함수들에서만 호출 될 수 있음.
- internal(뜻 = 내부) : private와 비슷하지만 자식 컨트랙트에서도 호출 될 수 있다는 점에서 다름.
- external(뜻 = 외부) : 오직 컨트랙트 외부에서만 호출 될 수 있음.
- public : 내외부 어디서든 호출 될 수 있다.
2) 블록체인과 상호작용하게 해주는 상태 제어자
- view : 어떤 데이터도 저장/변경되지 않음.
- pure : 어떤 데이터도 블록체인에 저장하지않고, 블록체인으로부터 어떤 데이터도 읽지않음.
- 둘 다 컨트랙트를 생성하지 않기 때문에 외부에서 호출되는 한, 가스를 소모하지 않는다.
- 단, 함수에 의해 내부적으로 호출되었을때는 가스를 소모한다.
3) 사용자 정의 제어자
컨트랙트에 이더를 보내는 payable 제어자
msg.value : 컨트랙트로 이더가 얼마나 보내졌는지 확인해준다.
contract OnlineStore {
function buySomething() external payable {
// 함수 실행에 0.001이더가 보내졌는지 확실히 하기 위해 확인:
require(msg.value == 0.001 ether);
// 보내졌다면, 함수를 호출한 자에게 디지털 아이템을 전달하기 위한 내용 구성:
transferThing(msg.sender);
}
}
web3.js에서 다음과 같은 함수가 실행될때 위 코드가 반응한다.
- 트랜잭션 : 봉투
- 매개변수 : 편지 내용
- value : 현금
- 봉투 + 편지 + 현금은 모두 수령인에게 전달된다.
// `OnlineStore`는 이더리움 상의 컨트랙트를 가리킨다고 가정한다.
OnlineStore.buySomething({
from: web3.eth.defaultAccount,
value: web3.utils.toWei(0.001)
})
컨트랙트에서 이더를 특정 주소로 전달하는 transfer 제어자
this.balance : 컨트랙트에 저장되어 있는 전체 잔액을 반환한다.
contract GetPaid is Ownable {
function withdraw() external onlyOwner {
owner.transfer(this.balance);
}
}
msg.sender : 해당 가격보다 초과 지불을 하면 초과한 양을 돌려준다.
uint itemFee = 0.001 ether;
msg.sender.transfer(msg.value - itemFee);
seller.transfer(msg.value) :
판매자의 주소를 storage에 저장하고, 누군가 판매자의 아이템을 구매하면 구매자로부터 받은 요금을 판매자에게 전달하게 해줌
seller.transfer(msg.value).
'프로그래밍 > solidity' 카테고리의 다른 글
[220712] JSON 컴파일을 구현해서 abi, bytecode 파일 생성, 배포하기 (0) | 2022.07.06 |
---|---|
크립토좀비) 챕터3 개념 (0) | 2022.07.06 |
[220711] 솔리디티코드로 스마트 컨트랙트 작성하기 (0) | 2022.07.04 |
크립토좀비) 챕터2 개념과 sol 0.8.15버전으로 개선한 코드 (0) | 2022.05.31 |
크립토좀비로 솔리디티 기초 알기 - 챕터1 / sol 0.8.15버전으로 개선한 코드 (0) | 2022.05.31 |
댓글