eosio.cdt:EOS智能合约工具集
目前EOS已经迎来了1.5.x时代,很多内容都有了较大的改变。其中智能合约的工作流程发生了改变,EOSIO为智能合约提供了独立且功能完整的工具集eosio.cdt。该工具集基于WASM平台,可解耦于eos系统,更便携地完成智能合约的开发编译。此外eosio.cdt在底层优化上已经超脱于eos系统,使用了更新的对LLVM有了更佳地支持,未来在性能方面会有较大提升。本章讲重点介绍eosio.cdt工具集,在该工具集的基础上,分析研究eos现有的官方智能合约例子。
关键字:eos,eosio.cdt,hello,bbt脚本,李嘉图合约,合约更新,合约调试
hello
首先,在本机安装eosio.cdt。官方推荐的安装方式有很多,笔者推荐采用源码安装的方式。
$ git clone --recursive https://github.com/eosio/eosio.cdt
$ cd eosio.cdt
$ ./build.sh
$ sudo ./install.sh
编译
hello合约的源文件内容:
#include "hello.hpp"
using namespace eosio;ACTION hello::hi( name user ) {print_f( "Hello % from hello", user );
}EOSIO_DISPATCH( hello, (hi) )
下面开始编译example/hello合约。执行eosio.cdt刚刚安装的命令eosio-cpp编译合约,传入hello.cpp文件。执行命令:
eosio-cpp -abigen hello.cpp -o hello.wasm
将会生成两个文件:
- abi文件,是合约的描述文件,是可读的json结构,其中包含了合约的备注、版本、结构、接口或动作以及状态库的table,这些内容是由编译工具eosio-cpp通过合约源文件生成的。
- wasm文件,内容不可读,用于将合约部署运行在wasm平台上。
部署
合约成功编译以后,可以在链上部署运行。使用前文介绍的bbt脚本快速构建一个多节点EOS网络环境,然后执行:
cleos set contract useraaaaaaaa examples/hello/ hello.wasm hello.abi
这时会报错:
Error 3080001: Account using more than allotted RAM usage
说明useraaaaaaaa账户的内存容量不够,需要再购买一些。执行命令购买内存:
cleos system buyram useraaaaaaaa useraaaaaaaa "10 SYS"
然后再次执行前面的合约部署命令,内存充足以后,hello合约被成功部署。
执行
下面尝试执行hello合约。使用命令:
cleos push action useraaaaaaaa hi '["evsward"]' -p useraaaaaaaa
同步跟踪EOS节点的日志输出,会发现有hello合约的信息打印出来。
debug 2018-12-20T12:13:20.233 thread-0 apply_context.cpp:28 print_debug ]
[(useraaaaaaaa,hi)->useraaaaaaaa]: CONSOLE OUTPUT BEGIN =====================
Hello evsward from hello
[(useraaaaaaaa,hi)->useraaaaaaaa]: CONSOLE OUTPUT END =====================
要注意开启节点的合约调试选项:--contracts-console
合约编写
下面来研究如何利用eosio.cdt完成合约的编写。首先尝试修改hello.cpp。前面的测试中,执行hello合约时是不限制输入参数的内容的,可以增加检验将输入参数改为有效用户。
#include "hello.hpp"
using namespace eosio;ACTION hello::hi( name user ) {require_auth(user);print_f( "Hello % from lwb", user );
}EOSIO_DISPATCH( hello, (hi) )
加入了一行代码require_auth(user);用来校验用户的权限,如果输入参数不是有效用户名或者传入的权限与输入用户不一致则会报错,下面来演示如何更新hello合约以及执行最新代码。仍然是编译、部署、执行三步:
- eosio-cpp -abigen hello.cpp -o hello.wasm
- set contract useraaaaaaaa ../hello/ hello.wasm hello.abi
- push action useraaaaaaaa hi '["evsward"]' -p useraaaaaaaa
此时第三步的运行命令将会执行失败,因为不存在名为"evsward"的有效账户,因此修改命令:
push action useraaaaaaaa hi '["useraaaaaaaa"]' -p useraaaaaaaa
即可执行成功,这行命令末尾的-p参数不可省略,因为hello合约修改后增加了对账户权限的校验。目前这个参数是hello合约的部署者,如果传入其他有效账户并附属其权限,也是可以执行成功的。
push action useraaaaaaaa hi '["useraaaaaaab"]' -p useraaaaaaab
传入的参数改为了b结尾的账户,同时附属了其权限,该action也会成功执行。输出日志为:
Hello useraaaaaaab from lwb
李嘉图合约
通过以上对权限hello的测试,似乎能够察觉出某种深意,即有效账户useraaaaaaaa的动作是由自身签名(通过-p参数)的,useraaaaaaab账户的hi动作也是其自身签名。这种该执行其合法绑定者来关联该合约的每一个action的合约,被成为李嘉图等价的合约,简称李嘉图合约。
合约更新的结论
上面更新一个合约时,是使用相同的部署者重新部署修改后的合约。在EOS中,合约一旦被部署者部署,该合约的所有动作均通过部署者来发起。此外,一个部署者可以多次部署同一个合约,同时也可以部署不同的多个合约,以最后一次部署为准。这部分可以通过部署者code来检查:
cleos get code useraaaaaaaa
输出该账户的code,code就是对应部署的合约的hash。
code hash: ddf06bb75dadfb0b598df0047f5e469891dafce125e0224f869dc8d8e2f5d770
当部署者部署新的合约时,该code会被更新。
合约调试
由于智能合约的运行平台的特殊性,目前暂无法去到WASM平台通过断点的方式调试合约的字节码,因此官方给出的调试方法是通过日志,正如上面所展示的内容那样,官方称之为Caveman debugging,也自嘲了智能合约的原始调试手段。
转载于:https://www.cnblogs.com/Evsward/p/eosio-cdt.html
eosio.cdt:EOS智能合约工具集相关推荐
- 如何安装EOS智能合约开发工具包CDT
本文简单的介绍一下如何安装EOS智能合约开发工具包(Contract Development Toolkit),简称CDT,是与智能合约编制相关的工具集合.对于EOSIO初学者来说,可以通过使用CDT ...
- c++ eos智能合约开发_EOS开发完全解析(六):手摸手实现第一个EOS智能合约——Hello EOS...
一.概述 EOS智能合约由C++编写,所以真正商业开发的时候,肯定是需要全面学习C++语法的,通过最近爆出的越来越多的合约漏洞我们就知道问题的严重性了.可以毫不客气的说,写智能合约要比写以往任何代码都 ...
- EOS智能合约开发-开发环境搭建
我们先尽量简单直白的说下什么是EOS链,资源,智能合约,以及之间的关系. EOS链 我们可以把EOS链想成一个由多台服务器组成的一个计算机云集群{无意突出此链的中心化}.每台服务器(节点)上都部署着一 ...
- EOS智能合约编译部署
跟随大家学习编程语言一样,每次都会首先写一段代码,打印"hello,wrold".通过对EOS的学习,今天将编译一个简单的hello智能合约部署到EOS私有链上. 1.EOS智能合 ...
- 原 EOS智能合约开发入门
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. EOS智能合约的开发需要使用llvm和abigen来生成abi文件. 为此eos提供了一个 名为eosiocpp的工具. ...
- 【许晓笛】 EOS 智能合约案例解析(2)
详解 EOS 智能合约的 cpp 文件 之前的文章介绍了 eosio.token 智能合约的 hpp 文件,这次向大家介绍 eosio.token.cpp 文件,cpp 文件即 C++ 代码文件,智能 ...
- 【精】EOS智能合约:system系统合约源码分析
系统合约在链启动阶段就会被部署,是因为系统合约赋予了EOS链资源.命名拍卖.基础数据准备.生产者信息.投票等能力.本篇文章将会从源码角度详细研究system合约. 关键字:EOS,eosio.syst ...
- EOS智能合约开发(四)EOS智能合约部署及调试(附编程示例)
EOS的智能合约里面有一个action(动作)和transaction(交易)的概念. 对于我们开发以太坊开发者来说,基本上只有transaction的概念.如果我只要执行一种操作,而且是只读操作,就 ...
- 【许晓笛】EOS 智能合约案例解析(2)
详解 EOS 智能合约的 cpp 文件 之前的文章介绍了 eosio.token 智能合约的 hpp 文件,这次向大家介绍 eosio.token.cpp 文件,cpp 文件即 C++ 代码文件,智能 ...
最新文章
- “Jupyter的杀手”:Netflix发布新开发工具Polynote
- 程序员学霸!top2大学毕业!不到30岁第一次升P9失败!挫折感极强,怀疑人生?网友:没升P7的我,不要面子的吗??...
- 如何理解 ListT和 DictionaryK,V 的扩容机制 ?
- Python类中的私有属性和私有方法
- 【ALB学习笔记】基于事件触发方式的串行通信接口数据接收案例
- GraphQL实战经验和性能问题的解决方案
- 12306订票助手秘笈:2013春节我要回家
- matlab intersect
- 大数据系统架构包含哪些内容
- 推荐系统中传统模型——LightGBM + FFM融合
- Cuda-convnet配置指南 on Windows8.1+CUDA6.5+VS2013
- python shell清屏指令_python shell怎么清屏
- php115网盘seo,115网盘禁止影视资源外链 网盘行业路在何方
- noip2017广东提高组复赛成绩
- JS快速获取本周、本月时间区间的方法
- 玉米社:单页网站怎么做seo?优化思路?
- Bellman——Ford算法
- frameset框架属性
- 如何把flv转换成mp3格式 音频转换器哪个好
- JAVA使用POL导入Excel解决数据精度问题