太貨支払いに関する書き方と注意事項

12758 ワード

SolidityはEthernetベースであるため,その言語レベルでは直接通貨支払をサポートすることができる.



payable識別関数


関数にpayableの識別子を追加すると、etherが受信され、次の例のdepositの関数のように、etherが現在の契約に存在する.
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()を使用して契約書に1 weiを送信することに成功したことがわかります.
ここで特に注意しなければならないのは、次はみんなが先に覚えていて、後ろに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)