上次内联行为是面向同一个合约的,即用户调用了行为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。
网友评论