太貨支払いに関する書き方と注意事項
12758 ワード
SolidityはEthernetベースであるため,その言語レベルでは直接通貨支払をサポートすることができる.
関数に
上記のコードでは、
アドレス・オブジェクトの
上記のコードでは、
ここで特に注意しなければならないのは、次はみんなが先に覚えていて、後ろにhttp://me.tryblockchain.org/blockchain-solidity-fallback.html契約は契約で fallback関数は、
呼び出し者は呼び出しスタックの深さを強制的に指定することができるため、呼び出しスタックの深さが指定値を超えると、一般的に1024である.あるいは、受信アドレス処理支払い中の
契約アドレスの場合、
注意深い読者は、
まとめ:1、関数に通貨操作が必要な場合はpayableキーワードを付けなければならない
2、現在の契約に支払う:this.send(10)
3、契約でsend()メソッドを使用する場合は、fallback関数を定義する必要があります.そうしないと、例外が発生します.
(転入先:tryblockchain.org)
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関数を定義する必要があります.そうしないと、例外が放出されます.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)