본문 바로가기
프로그래밍/solidity

크립토좀비) 챕터4 개념 / payable, transfer

by 한코코 2022. 7. 6.

[ 함수 제어자 정리 ]

함수 제어자 사용예시

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).

 

댓글