【eos不定期更新的日常】使用require_recipient触发合约动作原理介绍

背景介绍

eos的智能合约中,不少合约都会调用require_receipent方法,用于通知合约的参与方账户。这里的通知,实际上是调用被通知账户的智能合约,如果它部署了。被通知账户接到通知后,可以在其智能合约中做一系列操作,这个功能极大的方便了dapp的功能交互。

require_receipent如何传递通知

拿eosio.token发币合约为例,当用户触发了一个transfer转账动作,则会调用require_receipent方法通知from、to账户

eosio.token transfer源码

看看require_receipent方法的实现,其实就是将需要通知的账户,加入通知列表中

require_receipent函数

通知动作的执行,实际上是exec函数完成的,它会轮询通知列表,执行exec_one函数挨个通知

exec函数

exec_one函数,则会检查被通知账户是否部署了合约,如果部署了,则调用合约的apply函数,apply函数的用途会在稍后讲解。至此,require_recipient成功将消息传递给了被通知账户的合约。

exec_one函数

eosio.token合约源码:源码

require_recipient、exec、exec_one等方法:源码 

智能合约如何被调用

1. apply函数

前文提到了apply函数,实际上就是智能合约的入口。apply函数的作用就是监听合约的调用,当合约方法被调用时,apply函数会创建上下文环境,供合约方法运行

apply函数的作用

同样,apply函数作为智能合约入口,在接收到通知后,可以自定义处理逻辑、调用handler进行下一步动作。具体apply函数怎么实现,根据智能逻辑而定,但是每个智能合约必须实现apply函数。

extern "C"  {

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

             // 下一步处理逻辑

       }

}

2. EOSIO_DISPATCH

EOSIO_DISPATCH宏是eosio.cdt合约编译器提供的一个默认定义,实现了最简单的apply函数,逻辑是当receiver==code时,被通知账户和合约部署账户相同时,才执行智能合约的方法

EOSIO_DISPATCH宏

EOSIO_DISPATCH_HELPER来具体做执行的动作

EOSIO_DISPATCH_HELPER宏

依然拿eosio.token合约举例,合约的最后,直接调用了EOSIO_DISPATCH宏,用默认的apply去执行合约

eosio.token源码

apply和EOSIO_DISPATCH用法详见:https://developers.eos.io/eosio-home/docs (Custom Dispatchers一节)

智能合约的通信原理详见:https://developers.eos.io/eosio-cpp/docs/communication-model

使用require_recipient触发合约动作示例

1. 需求

当A账户转账到B账户时,B账户部署合约检查memo,当memo不合法时,终止这笔转账

2. 合约实现示例

这里我们自己实现了apply函数,检测到合约动作是transfer时,即执行testrecipient::transfer方法。将这个合约部署在B账户上,则B账户在收到转账时,会调用testrecipient::transfer方法检测memo是否合法

合约源码

往eosiotest账户部署上面的智能合约,则非法的转账会被拒绝

执行结果

参考文章

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

apply函数和EOSIO_DISPATCH的用法:https://developers.eos.io/eosio-home/docs/writing-a-custom-dispatcher

使用require_recipient触发合约动作:https://eos.live/detail/11530

使用eosio.cdt编译合约后,apply函数如何重写:http://knowledge.cryptokylin.io/topics/99

后记

最近,eos重磅级侧链准备出来了,作者也忙着coding没太多时间更新。后面等侧链的事情落地了,再为大家介绍一波,尽请期待!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,542评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,596评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,021评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,682评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,792评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,985评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,107评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,845评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,299评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,612评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,747评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,441评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,072评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,828评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,069评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,545评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,658评论 2 350

推荐阅读更多精彩内容