이더리움 머니 결제 관련 표기법 및 주의사항

7163 단어 학습 노트
Solidity는 이더리움(Ethereum)을 기반으로 하기 때문에 언어 차원에서 화폐 지불을 직접 지원할 수 있다.
payable 표지의 함수
함수에 payable 표지를 추가하면 ether를 수신할 수 있고 ether를 현재 계약에 저장할 수 있다. 예를 들어 다음 예시의 deposit 함수와 같다.
pragma solidity ^0.4.0;

contract supportPay{

  //    ether       
  function deposit() payable{
  }

  //       
  function getBalance() constant returns(uint){
      return this.balance;
  }
}

위 코드에서 당신은 deposit()을 통해 현재 계약에 ether를 저장할 수 있습니다. 이것은 함수 호출을 통해 호출되고 호출에서 address.call( ).value( ether)을 통해 이루어진 것입니다. 여기서 참고할 수 있습니다.http://me.tryblockchain.org/Solidity-call-callcode-delegatecall.html .
send () 함수로 ether 보내기
주소 대상의 send()은 한 주소에 직접 지불할 수 있는데 다음은 계약 계좌에 지불하는 예이다.
우리가 address.send(ether to send)을 사용하여 어떤 주소로 이체하면 일반 주소라면 직접 받을 수 있으니 매우 간단하다.우리는 계약으로 발송과 수신을 시뮬레이션할 것이다.
pragma solidity ^0.4.0;

contract SendAndReceiveByContract{

  //fallback        
  event fallbackTrigged(bytes data);
  //    send()  ether ,    
  function() payable{fallbackTrigged(msg.data);}

  //    ether       
  function deposit() payable{
  }

  //       
  function getBalance() constant returns(uint){
      return this.balance;
  }

  event SendEvent(address to, uint value, bool result);
  //  send()  ether
  function sendEther(){
        //  this           
       //result    ,     this.send(1)    ,  result    true,    false
      bool result = this.send(1);
      SendEvent(this, 1, result);
  }
}


상기 코드에서 우리는 먼저 deposit() 계약을 사용하여 ether에 저장해야 한다. 그렇지 않으면 잔액이 부족하기 때문에 send() 함수를 호출하면 오류가 발생할 것이다.ether에 저장한 후 우리는 sendEther()을 호출하여 send()을 사용하여 계약에 데이터를 보내면 다음과 같은 이벤트를 촉발할 것이다.
SendEvent[
  "0xc35f7ac1351648b0b8a699c5f07dd6a78f626714",
  "1",
  "true"
]
fallbackTrigged[
  "0x"
]


보시다시피 send()을 사용하여 1wei를 계약에 발송했습니다.
여기서 특별히 주의해야 할 것은, 다음은 모두가 먼저 기억하고, 뒤에는http://me.tryblockchain.org/blockchain-solidity-fallback.html계약은 send() 함수를 통해 전송되는 ether를 수신해야 하며 다음과 같은 제한이 있습니다.
  • 만약에 우리가 계약에서 send() 함수를 통해 수신하려면 반드시fallback 함수를 정의해야 한다. 그렇지 않으면 이상을 던질 수 있다.
  • fallback 함수는 반드시 payable 키워드를 증가해야 한다. 그렇지 않으면 send()의 실행 결과는 시종 false이 될 것이다.

  • 지불 중 가능한 실패send() 실패
    호출자는 호출된 창고의 깊이를 강제로 지정할 수 있기 때문에 호출된 창고의 깊이가 지정된 값을 초과할 때 일반적으로 1024이다.또는 수신 주소 처리 지불 과정 중 out of gas.실패로 인해 이때의 send()의 결과는 false이었다.
    계약의 fallback()계약 주소라면 send()을 실행할 때 기본적으로 fallback()을 실행합니다. (이 함수가 존재한다면)EVM의 기본 동작이므로 차단할 수 없습니다.그래서 이 함수는 out of gas 또는 다른 실패를 초래하여 전체 거래가 취소되었다.실패로 인해 이때의 send()의 결과는 false이었다.
    payable 표식
    세심한 독자들은 deposit 함수에 payable 키워드가 있다는 것을 발견할 수 있다. 만약에 한 함수가 화폐 조작을 해야 한다면 반드시 payable 키워드를 가지고 있어야 msg.value을 정상적으로 수신할 수 있다.
    총괄: 1. 만약에 함수가 화폐 조작을 해야 한다면payable 키워드를 가져가야 한다.
    2. 현재 계약에 지불:this.send(10)
    3. 만약에 계약이send() 방법을 사용하려면fallback 함수를 정의해야 한다. 그렇지 않으면 이상이 발생할 수 있다.
    (tryblockchain. org)
           

    좋은 웹페이지 즐겨찾기