【編者按:】Solidity編程語言是一門基于以太坊(Ethereum)的區(qū)塊鏈語言晦款。深入淺出Solidity系列文章將介紹該語言的一些特點梨树,希望能給大家?guī)硪恍┥钊氲牧私狻?/p>
由于Solidity是基于以太坊(Ethereum)的,故而其語言層面可以直接支持貨幣支付[1]青扔。
send()
函數(shù)
地址對象中的send()
可以向某地址進(jìn)行支付,下面是一個向合約帳戶支付的示例[2]:
pragma solidity ^0.4.0;
//請注意這個僅是Demo,請不要用到正式環(huán)境
contract PayTest {
//得到當(dāng)前合約的余額
function getBalance() returns (uint) {
return this.balance;//0
}
//向當(dāng)前合約存款
function deposit() payable returns(address addr, uint amount, bool success){
//msg.sender 全局變量腊嗡,調(diào)用合約的發(fā)起方
//msg.value 全局變量着倾,調(diào)用合約的發(fā)起方轉(zhuǎn)發(fā)的貨幣量,以wei為單位燕少。
//send() 執(zhí)行的結(jié)果
return (msg.sender, msg.value, this.send(msg.value));
}
}
示例中提供了兩個函數(shù)卡者,一個是getBalance()
,用來查看合約帳戶當(dāng)前余額客们。另一個是deposit()
用來充值到當(dāng)前合約崇决。
打開瀏覽器編譯器Remix,如下圖所示底挫,在區(qū)域1
錄入上述代碼恒傻,如果錄入的代碼沒有語法錯誤,那么我們就能看到區(qū)域2
紅色的Create
按鈕建邓,點擊它來創(chuàng)建合約函數(shù)調(diào)用按鈕盈厘。
操作成功后,如圖二所示官边,可看到區(qū)域1
出現(xiàn)了合約函數(shù)對應(yīng)的getBalance
和deposit
調(diào)用按鈕沸手。嘗試點擊getBalance
查看余額,由于當(dāng)前合約沒有錢注簿,將返回0契吉。要進(jìn)行貨幣存入需要先點擊區(qū)域2
的處的小飛機(jī)圖標(biāo),切換到調(diào)用合約的發(fā)起人诡渴,gas栅隐,及消息攜帶的貨幣量設(shè)置界面。我們在區(qū)域3
填入3玩徊。并點擊區(qū)域4
的deposit
按鈕租悄,這樣,我們就成功發(fā)送了3個以太幣給當(dāng)前這個合約了恩袱。
請注意泣棋,上圖區(qū)域3
僅且只能在所調(diào)函數(shù)有payable
標(biāo)識的才可填值,也就是說調(diào)用getBalance
時就要清空所填值畔塔,否則會報VM Exception: invalid opcode
潭辈。
最終結(jié)果,可能與下圖有所差異澈吨,但如果區(qū)域2
能看到對應(yīng)余額變化把敢,就說明操作成功了。
操作成功時谅辣,send()
函數(shù)返回true
修赞,失敗時返回false
。
備注桑阶,通過Remix
的測試發(fā)現(xiàn)柏副,發(fā)送成功勾邦,仍然返回false
,原因待查割择,如果有哪位讀者知道眷篇,歡迎留言告知。
支付中可能的失敗
send()
失敗
由于調(diào)用者可以強(qiáng)制指定調(diào)用堆棧的深度荔泳,當(dāng)調(diào)用的棧深超過指定值時蕉饼,一般是1024;或者接收地址處理支付過程中out of gas
玛歌。由于失敗椎椰,此時的send()
的結(jié)果是false
。
合約的fallback()
如果是合約地址沾鳄,在執(zhí)行send()
時慨飘,會默認(rèn)關(guān)聯(lián)執(zhí)行fallback()
(如果存在這個函數(shù))。這是EVM的默認(rèn)行為译荞,不可被阻止瓤的。所以這個函數(shù)引起out of gas
或其它失敗,整個交易被撤銷吞歼。由于失敗圈膏,此時的send()
的結(jié)果是false
。
payable標(biāo)識[3]
細(xì)心的讀者可能發(fā)現(xiàn)在deposit
函數(shù)上有一個payable
關(guān)鍵字篙骡,如果一個函數(shù)需要進(jìn)行貨幣操作稽坤,必須要帶上payable
關(guān)鍵字,這樣才能正常接收msg.value
糯俗。
關(guān)于作者
專注基于以太坊(Ethereum)的相關(guān)區(qū)塊鏈(Blockchain)技術(shù)尿褪,了解以太坊,Solidity得湘,Truffle等杖玲。個人博客:http://me.tryblockchain.org
-
原文參考:http://solidity.readthedocs.io/en/develop/types.html#address ?
-
示例代碼勿在正式環(huán)境中使用,需使用時勿必參考最佳實踐:http://solidity.readthedocs.io/en/develop/common-patterns.html ?
-
更多關(guān)于payable標(biāo)識的信息請查看:http://solidity.readthedocs.io/en/develop/control-structures.html?highlight=payable#expressions-and-control-structures ?