美文网首页
[eos10]智能合约开发-面向外部合约的内联行为

[eos10]智能合约开发-面向外部合约的内联行为

作者: FriendOfTime | 来源:发表于2020-02-03 17:50 被阅读0次

https://developers.eos.io/welcome/latest/getting-started/smart-contract-development/inline-action-to-external-contract

上次内联行为是面向同一个合约的,即用户调用了行为contract1.act1,然后contract1.act1调用了contract1.act2。本次说的是面向不同合约的行为,即用户调用了行为contract1.act1,然后contract1.act1调用了contract2.act2。

操作流程不赘述,此处主要说明关键点或新的知识点。

1、权限控制

即不可能任意调用另外一个合约,必须人家给你授权,你才能调用人家合约。代码如下:

// 只有addressbook这个合约或账号才能调用本行为

require_auth(name("addressbook"));

疑问:user1调用addressbook合约的upsert,upsert中调用了abcounter合约的count,那么是addressbook调用的abcounter,而不是user1?

理解:应该是和addressbook中的实现有关,此处get_self应该就只会返回addressbook。以下是addressbook中的代码:

void increment_counter(name user, std::string type) {    abcounter::count_action count("abcounter"_n, {get_self(), "active"_n});    count.send(user, type);}

2、action_wrapper

https://developers.eos.io/manuals/eosio.cdt/latest/structeosio_1_1action__wrapper

封装一个特定的行为,方便其他合约往这个行为发送内联行为。代码如下:

// 这是一个action_wrapper

using count_action = action_wrapper<"count"_n, &abcounter::count>;

3、emplace函数理解

问题:为啥abcounter中count行为中empalce的第一个参数是addressbook,而不是user?

参考:https://blog.csdn.net/weixin_39842528/article/details/90608503

上面的链接说的比较清楚了。

第一个参数的意思就是payer,即为 新创建的对象的存储 付费的账号。

4、错误

Error 3050003: eosio_assert_message assertion failure

参考:https://www.jianshu.com/p/a108383eca49

解决:即重新申请了一个账号addressbook2,部署合约addressbook2。

相关文章

网友评论

      本文标题:[eos10]智能合约开发-面向外部合约的内联行为

      本文链接:https://www.haomeiwen.com/subject/drkkxhtx.html