[EOS源码分析]7.EOS智能合约开发实践之合约调用合约(inline action)
首先,目前dawn-4.1, dawn-4.2使用inline action是会报如下错误
transaction declares authority '{"actor":"hello.code","permission":"active"}', but does not have signatures for it under a provided delay of 0 ms
这个问题是4.0以后inline action的权限发生变化导致的。这个改动在eos官网的#3013这个issue讨论BM有提到过
核心是为智能合约账号添加eosio.code permission,比如hello.code调用hello.target智能合约,需要添加如下permission
cleos set account permission args.user active '{"threshold": 1,"keys": [{"key":"EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV", "weight":1}],"accounts": [{"permission":{"actor":"hello.code","permission":"eosio.code"},"weight":1}]}' owner -p args.user@owner
代码
新建两个contract: hello.code和hello.target
hello.target代码如下
hello.code的代码:
class hello : public eosio::contract {
public:
using contract::contract;
/// @abi action
void hi( account_name from, account_name to) {
require_auth(from);
print( "Hello, from:", name{from}, ", to:", name{to});
action(
//这里{to, active}必须授权给{_self, eosio.code}
permission_level{to, N(active)},
//调用 hello.target合约 的'callme' action
N(hello.target), N(callme),
std::make_tuple(to)
).send();
}
};
核心就是上面的红色字体的内容action(xx).send(),具体参数的含义是:
Action(permssion_level, other_contract_account_name, method, args)
所以:
action(permission_level{to, N(active)},
N(hello.target), N(callme),
std::make_tuple(to)
).send();
这个等价于如下命令
$cleos push action hello.target callme '["to"]' -p to
编译
请参考我的博文【EOS编写HelloWorld智能合约】
测试
//cleos create account只适合本地私有链,其他网络需要使用cleos system newaccount命令
$cleos create account eosio hello.code $KEY_PUB_1 $KEY_PUB_1
$cleos set contract hello.code ./hello -p hello.code
$cleos create account eosio args.user $KEY_PUB_2 $KEY_PUB_2
$cleos create account eosio hello.target $KEY_PUB_3 $KEY_PUB_3
$cleos create account eosio args.user1 $KEY_PUB_4 $KEY_PUB_4
$cleos set contract hello.target ./hello.target -p hello.target
$cleos set account permission args.user1 active '{"threshold": 1,"keys": [],"accounts": [{"permission":{"actor":"hello.code","permission":"eosio.code"},"weight":1}]}' owner -p args.user1@owner
$cleos push action hello.code hi '["args.user", "args.user1"]' -p args.user
源码一键实践
从以下github网页下载源码,即可一键实践执行该智能合约
https://github.com/itleaks/eos-contract/tree/master/callcontract-exp/
/********************************
* 本文来自CSDN博主"爱踢门"
* 转载请标明出处:http://blog.csdn.net/itleaks
******************************************/
如果你对EOS,ETH技术及开发感兴趣,请入QQ群讨论: 829789117
如需实时查看最新文章,请关注公众号"区块链斜杠青年",一起探索区块链未来
[EOS源码分析]7.EOS智能合约开发实践之合约调用合约(inline action)相关推荐
- [EOS源码分析]1.EOS源码编译运行
本文所有实践都是基于EOS dawn-v4.1.0,请切到该分支然后实践 切换命令:git checkout dawn-v4.1.0 目前网络上都是针对老版EOS2.0源码编译的文章,我在mac上参考 ...
- [EOS源码分析]4.EOS源码调试
在[EOS源码编译运行]一文已经详细描述了EOS源码编译.但是阅读代码,光跑代码是不够的,必须要可以调试.一搜发现网上没有相关的文章,只好自己探索折腾.不过很快发现其实EOS已经为我们做好了的,只需带 ...
- [EOS源码分析]6.EOS特殊智能合约eosio
这里说的eosio智能合约不是泛指eos的智能合约,它是一个特殊的具体的合约.它本事可大了,我们一起来看看它有哪些功能 负责智能合约部署 大家有注意到如下红色字体的log吗 $ cleos set c ...
- [EOS源码分析]5.EOS编写HelloWorld智能合约及各种坑
本文所有实践都是基于EOS dawn-v4.1.0,请切到该分支然后实践 切换命令:git checkout dawn-v4.1.0 HelloWorld源码 #include <eosioli ...
- [EOS源码分析]10.EOS区块同步及生产
本文所有实践都是基于EOS v1.0.1,请切到该分支然后对比源码 切换命令:git checkout v1.0.1 提到区块生产和同步,我们肯定有几个疑问? 节点同步 1)节点从哪里同步数据 ...
- [EOS源码分析]2.EOS账号钱包密钥等基本概念及操作实践
本文所有实践都是基于EOS dawn-v4.1.0,请切到该分支然后实践 切换命令:git checkout dawn-v4.1.0 cleos cleos应用程序是用户端命令行交互模块,用于解析用户 ...
- eos源码分析和应用(一)调试环境搭建
转载自 http://www.limerence2017.com/2018/09/02/eos1/#more eos基于区块链技术实现的开源引擎,开发人员可以基于该引擎开发DAPP(分布式应用).下面 ...
- EOS源码分析:transaction的一生
最近在处理智能合约的事务上链问题,发现其中仍旧有知识盲点.原有的认识是一个事务请求会从客户端设备打包签名,然后通过RPC传到非出块节点,广播给超级节点,校验打包到可逆区块,共识确认最后变为不可逆区块. ...
- EOS源码分析(6)Token
# Token(通证) 区块链一直就有币圈和链圈之分,币圈的人有的埋头挖矿,有的专卖矿机,有的专心炒币,还有的搬砖套利做交易.而链圈的人则更关注区块链技术研发及应用.之前这两个圈子间相互鄙视,谁也看不 ...
最新文章
- 记录-JQuery日历插件My97DatePicker日期范围限制
- 遍历二叉树的神级方法(Morris)
- MATLAB知识点1
- libudev-dev 错误 libudev1 (= 204-5ubuntu20) 但是 204-5ubuntu20.5 正要被安装 解决方法
- 使用Python实现简易的数据标注工具
- 【yarn】INFO ipc.Client Retrying connect to server xxx 8032 Already tried 0 time(s)
- 怎么打开jsp文件目录_ppt转换成pdf怎么转?我选择这个办法
- spring5源码-aop
- 看博客学学Android(二十一)
- thinkphp在IIS7.5+环境下部署出现的URL重写问题解决方法
- OpenOCD 依赖的deb包
- Springmvc集成CXF请看教程二
- vim amp; emacs color Scheme
- 自定义设置软件的提示声音
- 基于udp的服务器消息转发(群发)
- 苹果宣布前CEO史蒂夫·乔布斯逝世
- vue3 + js-cookie加密解密(普通版本/TS版本)
- MySQL binlog时间异常分析
- python实习——03
- innerText 与 innerHtml的区别 (一)