【eos不定期更新的日?!渴褂胷equire_recipient觸發(fā)合約動作原理介紹

背景介紹

eos的智能合約中,不少合約都會調(diào)用require_receipent方法,用于通知合約的參與方賬戶。這里的通知,實際上是調(diào)用被通知賬戶的智能合約,如果它部署了。被通知賬戶接到通知后,可以在其智能合約中做一系列操作,這個功能極大的方便了dapp的功能交互。

require_receipent如何傳遞通知

拿eosio.token發(fā)幣合約為例,當(dāng)用戶觸發(fā)了一個transfer轉(zhuǎn)賬動作,則會調(diào)用require_receipent方法通知from、to賬戶

eosio.token transfer源碼

看看require_receipent方法的實現(xiàn),其實就是將需要通知的賬戶,加入通知列表中

require_receipent函數(shù)

通知動作的執(zhí)行,實際上是exec函數(shù)完成的,它會輪詢通知列表,執(zhí)行exec_one函數(shù)挨個通知

exec函數(shù)

exec_one函數(shù),則會檢查被通知賬戶是否部署了合約,如果部署了,則調(diào)用合約的apply函數(shù),apply函數(shù)的用途會在稍后講解。至此,require_recipient成功將消息傳遞給了被通知賬戶的合約。

exec_one函數(shù)

eosio.token合約源碼:源碼

require_recipient、exec、exec_one等方法:源碼?

智能合約如何被調(diào)用

1. apply函數(shù)

前文提到了apply函數(shù),實際上就是智能合約的入口。apply函數(shù)的作用就是監(jiān)聽合約的調(diào)用,當(dāng)合約方法被調(diào)用時,apply函數(shù)會創(chuàng)建上下文環(huán)境,供合約方法運行

apply函數(shù)的作用

同樣,apply函數(shù)作為智能合約入口,在接收到通知后,可以自定義處理邏輯、調(diào)用handler進(jìn)行下一步動作。具體apply函數(shù)怎么實現(xiàn),根據(jù)智能邏輯而定,但是每個智能合約必須實現(xiàn)apply函數(shù)。

extern "C"? {

? ? ? ? void apply( uint64_t receiver, uint64_t code, uint64_t action )? {

? ? ? ? ? ? ?// 下一步處理邏輯

? ? ? ?}

}

2. EOSIO_DISPATCH

EOSIO_DISPATCH宏是eosio.cdt合約編譯器提供的一個默認(rèn)定義,實現(xiàn)了最簡單的apply函數(shù),邏輯是當(dāng)receiver==code時,被通知賬戶和合約部署賬戶相同時,才執(zhí)行智能合約的方法

EOSIO_DISPATCH宏

EOSIO_DISPATCH_HELPER來具體做執(zhí)行的動作

EOSIO_DISPATCH_HELPER宏

依然拿eosio.token合約舉例,合約的最后,直接調(diào)用了EOSIO_DISPATCH宏,用默認(rèn)的apply去執(zhí)行合約

eosio.token源碼

apply和EOSIO_DISPATCH用法詳見:https://developers.eos.io/eosio-home/docs?(Custom Dispatchers一節(jié))

智能合約的通信原理詳見:https://developers.eos.io/eosio-cpp/docs/communication-model

使用require_recipient觸發(fā)合約動作示例

1. 需求

當(dāng)A賬戶轉(zhuǎn)賬到B賬戶時,B賬戶部署合約檢查memo,當(dāng)memo不合法時,終止這筆轉(zhuǎn)賬

2. 合約實現(xiàn)示例

這里我們自己實現(xiàn)了apply函數(shù),檢測到合約動作是transfer時,即執(zhí)行testrecipient::transfer方法。將這個合約部署在B賬戶上,則B賬戶在收到轉(zhuǎn)賬時,會調(diào)用testrecipient::transfer方法檢測memo是否合法

合約源碼

往eosiotest賬戶部署上面的智能合約,則非法的轉(zhuǎn)賬會被拒絕

執(zhí)行結(jié)果

參考文章

智能合約通信模式:https://developers.eos.io/eosio-cpp/docs/communication-model

apply函數(shù)和EOSIO_DISPATCH的用法:https://developers.eos.io/eosio-home/docs/writing-a-custom-dispatcher

使用require_recipient觸發(fā)合約動作:https://eos.live/detail/11530

使用eosio.cdt編譯合約后,apply函數(shù)如何重寫:http://knowledge.cryptokylin.io/topics/99

后記

最近,eos重磅級側(cè)鏈準(zhǔn)備出來了,作者也忙著coding沒太多時間更新。后面等側(cè)鏈的事情落地了,再為大家介紹一波,盡請期待!

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

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

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