背景介紹
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賬戶

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

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

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

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ù)作為智能合約入口,在接收到通知后,可以自定義處理邏輯、調(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_HELPER來具體做執(zhí)行的動作

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

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)賬會被拒絕

參考文章
智能合約通信模式: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è)鏈的事情落地了,再為大家介紹一波,盡請期待!