【編者按:】Solidity編程語(yǔ)言是一門基于以太坊(Ethereum)的區(qū)塊鏈語(yǔ)言。深入淺出Solidity系列文章將介紹該語(yǔ)言的一些特點(diǎn),希望能給大家?guī)?lái)一些深入的了解。
由于Solidity是基于以太坊(Ethereum)的,故而其語(yǔ)言層面可以直接支持貨幣支付[1]。
send()函數(shù)
地址對(duì)象中的send()可以向某地址進(jìn)行支付,下面是一個(gè)向合約帳戶支付的示例[2]:
pragma solidity ^0.4.0;
//請(qǐng)注意這個(gè)僅是Demo,請(qǐng)不要用到正式環(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));
}
}
示例中提供了兩個(gè)函數(shù),一個(gè)是getBalance(),用來(lái)查看合約帳戶當(dāng)前余額。另一個(gè)是deposit()用來(lái)充值到當(dāng)前合約。
打開瀏覽器編譯器Remix,如下圖所示,在區(qū)域1錄入上述代碼,如果錄入的代碼沒(méi)有語(yǔ)法錯(cuò)誤,那么我們就能看到區(qū)域2紅色的Create按鈕,點(diǎn)擊它來(lái)創(chuàng)建合約函數(shù)調(diào)用按鈕。

操作成功后,如圖二所示,可看到區(qū)域1出現(xiàn)了合約函數(shù)對(duì)應(yīng)的getBalance和deposit調(diào)用按鈕。嘗試點(diǎn)擊getBalance查看余額,由于當(dāng)前合約沒(méi)有錢,將返回0。要進(jìn)行貨幣存入需要先點(diǎn)擊區(qū)域2的處的小飛機(jī)圖標(biāo),切換到調(diào)用合約的發(fā)起人,gas,及消息攜帶的貨幣量設(shè)置界面。我們?cè)?code>區(qū)域3填入3。并點(diǎn)擊區(qū)域4的deposit按鈕,這樣,我們就成功發(fā)送了3個(gè)以太幣給當(dāng)前這個(gè)合約了。

請(qǐng)注意,上圖區(qū)域3僅且只能在所調(diào)函數(shù)有payable標(biāo)識(shí)的才可填值,也就是說(shuō)調(diào)用getBalance時(shí)就要清空所填值,否則會(huì)報(bào)VM Exception: invalid opcode。
最終結(jié)果,可能與下圖有所差異,但如果區(qū)域2能看到對(duì)應(yīng)余額變化,就說(shuō)明操作成功了。

操作成功時(shí),send()函數(shù)返回true,失敗時(shí)返回false。
備注,通過(guò)Remix的測(cè)試發(fā)現(xiàn),發(fā)送成功,仍然返回false,原因待查,如果有哪位讀者知道,歡迎留言告知。
支付中可能的失敗
send()失敗
由于調(diào)用者可以強(qiáng)制指定調(diào)用堆棧的深度,當(dāng)調(diào)用的棧深超過(guò)指定值時(shí),一般是1024;或者接收地址處理支付過(guò)程中out of gas。由于失敗,此時(shí)的send()的結(jié)果是false。
合約的fallback()
如果是合約地址,在執(zhí)行send()時(shí),會(huì)默認(rèn)關(guān)聯(lián)執(zhí)行fallback()(如果存在這個(gè)函數(shù))。這是EVM的默認(rèn)行為,不可被阻止。所以這個(gè)函數(shù)引起out of gas或其它失敗,整個(gè)交易被撤銷。由于失敗,此時(shí)的send()的結(jié)果是false。
payable標(biāo)識(shí)[3]
細(xì)心的讀者可能發(fā)現(xiàn)在deposit函數(shù)上有一個(gè)payable關(guān)鍵字,如果一個(gè)函數(shù)需要進(jìn)行貨幣操作,必須要帶上payable關(guān)鍵字,這樣才能正常接收msg.value。
關(guān)于作者
專注基于以太坊(Ethereum)的相關(guān)區(qū)塊鏈(Blockchain)技術(shù),了解以太坊,Solidity,Truffle等。個(gè)人博客:http://me.tryblockchain.org
-
原文參考:http://solidity.readthedocs.io/en/develop/types.html#address ?
-
示例代碼勿在正式環(huán)境中使用,需使用時(shí)勿必參考最佳實(shí)踐:http://solidity.readthedocs.io/en/develop/common-patterns.html ?
-
更多關(guān)于payable標(biāo)識(shí)的信息請(qǐng)查看:http://solidity.readthedocs.io/en/develop/control-structures.html?highlight=payable#expressions-and-control-structures ?