深入淺出Solidity之三支付

【編者按:】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)用按鈕。

圖一-w60px

操作成功后,如圖二所示,可看到區(qū)域1出現(xiàn)了合約函數(shù)對(duì)應(yīng)的getBalancedeposit調(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ū)域4deposit按鈕,這樣,我們就成功發(fā)送了3個(gè)以太幣給當(dāng)前這個(gè)合約了。

圖二-w60px

請(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ō)明操作成功了。

-w45px

操作成功時(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


  1. 原文參考:http://solidity.readthedocs.io/en/develop/types.html#address ?

  2. 示例代碼勿在正式環(huán)境中使用,需使用時(shí)勿必參考最佳實(shí)踐:http://solidity.readthedocs.io/en/develop/common-patterns.html ?

  3. 更多關(guān)于payable標(biāo)識(shí)的信息請(qǐng)查看:http://solidity.readthedocs.io/en/develop/control-structures.html?highlight=payable#expressions-and-control-structures ?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容