EOSIO.CDT (协议开发工具包)

EOSIO.CDT (协议开发工具包)_第1张图片

大家好,我们是eosBLACK团队。

2018年8月15日发布v1.2.0时,有传言称协议构建脚本,以EOSIO为基础的eosiocpp v1.3.0版本开始不再使用。此外,在9月20日,EOSIO发布EOSIO v1.3.0时曾正式介绍过使协议的制定更加容易的EOSIO.CDT。这次我们就来了解一下这个工具包有什么样的变化。

参考 : https://github.com/EOSIO/eosio.cdt

虽然eosiocpp不会马上消失,但是,将来的改进会在EOSIO.CDT上进行,所以最好是先把开发环境移过去。

这篇文章是在Windows10的wsl上安装友帮拓16.04后,以eosio.cdt

v1.2.0基础制作而成的。


安装

●复制来源

先复制来源,在Tag中校验v1.2.0

EOSIO.CDT (协议开发工具包)_第2张图片

●构建及安装方法

Core symbol指定为“EOS”

安装路径是“/usr/local/eosio.cdt/”。“/usr/local/bin”上产生和指令相关的软链接。最大的不同就是eosio-cpp替代了eosiocpp。下面就通过实际事例了解下具体有哪些不同。

用简单的事例确认一下。

例如下面这一简单的协议例子。

mytest.hpp

EOSIO.CDT (协议开发工具包)_第3张图片

mytest.cpp

EOSIO.CDT (协议开发工具包)_第4张图片

为了和以前的方式做比较,先用eosiocpp构建一下

输出的mytest.wasm的大小是3,059字节。ABI输出也很顺利。这次我们用一下今天的主人公eosio-cpp。

输出的mytest.was的大小是2,392字节。后面的内容也会提到,传输相同的-O3 Option时,可以看到编译结果明显减少。在EOSIO,协议的大小和费用有直接的联系,因此,有理由按照变小的程度移走。问题是ABI文件,可以看出它是空的,无法输出任何东西。这是因为eosio-abigen无法识别之前方式的“注释”。先让我们创建一下ABI吧。

再详细了解一下

创建ABI

如果是以前方式的eosiocpp,Action或Table可做如下注释后输出ABI信息

EOSIO.CDT (协议开发工具包)_第5张图片

变更后的eosio-cpp可用C++11的attribute记述拟要输出的ABI,

EOSIO.CDT (协议开发工具包)_第6张图片

EOSIO.CDT (协议开发工具包)_第7张图片

根据变更后的规则对前面有问题的mytest.hpp做如下修改

EOSIO.CDT (协议开发工具包)_第8张图片

重新构建后可以看到输出正常的ABI。

●ABI创建深化

在“~/eosio.cdt/example/abigen_test/test.cpp”创建ABI的方法如下事例。

编译后分不同情况进行了整理。

首先看一下结构Action定义

EOSIO.CDT (协议开发工具包)_第9张图片

输出结果如下

EOSIO.CDT (协议开发工具包)_第10张图片

下面是明示继承的结构名称的情况。 操作/表类型可以使用32个字符串('. 12345abcdefghiklmnopqrstuvwxyz '),并被编码为64位整数。最多可以创建13个字符。最多12位可以用于32个字符串。第13个字符只能写成“1-5”和“a-j”。但采用不同的内部代码和外部Interface的名称,这种境况就会减少。结构声明和ABI的曝光名称不同时,可明示如下

EOSIO.CDT (协议开发工具包)_第11张图片

输出结果如下

EOSIO.CDT (协议开发工具包)_第12张图片

现在看一下函数的Action定义方法。这个是输出时明示Action名称的例子

EOSIO.CDT (协议开发工具包)_第13张图片

输出结果如下

EOSIO.CDT (协议开发工具包)_第14张图片

直接使用定义名称的例子。传达的因子值也是前面定义的test_c类,这个也值得注意

EOSIO.CDT (协议开发工具包)_第15张图片

最后是Table定义。所举事例是以相同的结构定义两个不同的多指标 Table

EOSIO.CDT (协议开发工具包)_第16张图片

输出结果如下

EOSIO.CDT (协议开发工具包)_第17张图片

下面是Table名称的例子

EOSIO.CDT (协议开发工具包)_第18张图片

输出结果如下。

EOSIO.CDT (协议开发工具包)_第19张图片

确认动作

eosio.cdt环境用一句话来讲就是对以wasm32为目标的clang工具链的解释器。也可以说,是把以Shell脚本提供的eosiocpp变更为C++。在构建过程中,因相关的目录,尤其是Boost的include路径等归属于现在的系统,因此编译后的eosio-cpp、eosio-ld等执行文件很难在其他计算机上使用。因此,掌握eosio-cpp给实际clang工具链传达什么参数也会是很有意义的工作。

eosio-cpp的源可以看一下“~/eosio.cdt/build/EosioClang-prefix/src/EosioClang-build/eosio-cpp.cpp”。  “~/eosio.cdt/eosio_llvm/tools/clang/tools/extra/eosio_c_tool/eosio-cpp.cpp.in”文件在构建过程中根据本地环境做了改变。其余的eosio-ld.cpp、eosio-abigen.cpp等源也是一样。

协议源的Compile呼叫clang++ ,链接呼叫eosio-ld ,abi创建呼叫eosio-abigen。为了了解在各个阶段如何传达命令行,将Console输出了eosio-cpp和eosio-ld的instr、linkstr、genstr等等。

EOSIO.CDT (协议开发工具包)_第20张图片

重新构建后编译了一下mytest.cpp。

EOSIO.CDT (协议开发工具包)_第21张图片

前面也提到过,“-O3”传达最优化选项。

看一下eosio-abigen.cpp源,传达的大部分Option已经记录到源代码本身。因此,和以前的“eosiocpp -g”一样,为了只创建ABI,可使用如下简单的命令行。

但有一点比较奇怪,eosio-abigen路径已经在PATH上,可省略执行路径后会出现如下错误。

EOSIO.CDT (协议开发工具包)_第22张图片

参数传达部分的话,现在仍在修改当中,应该很快就能完善。eosio-cpp的选项中最显眼的就是-I,这在使用外部头文件时起到指定路径的作用,也能以下面的用途使用。

这个Option当呼叫clang++时可以正常传达-I因子,

EOSIO.CDT (协议开发工具包)_第23张图片

但在abigen就会省略掉。

EOSIO.CDT (协议开发工具包)_第24张图片

eosio-xx命令中双en-dash “--”是直接将命令传达给工具链的选项。因此,也曾做过这样的尝试,

在编译(Compile)中可以正常传达,

EOSIO.CDT (协议开发工具包)_第25张图片

但在abigen阶段,出乎意料地在前部分就会卡住。

EOSIO.CDT (协议开发工具包)_第26张图片

因此,使用外部Header时,要使用上面提到的直接呼叫eosio-abigen的同时用双en-dash(--)追加选项的方法。


写完这篇文章时v1.2.1也发布了。据说对不能传输-I参数的问题也进行了修改。https://github.com/EOSIO/eosio.cdt/releases/tag/v1.2.1


结束语

Eosio还处于起步阶段,在eosiocpp上增加DASH后变成eosio-cpp过程也表现了其勇敢无畏的精神。总之,希望这篇文章能在开发过程中,给充满诸多变化的eosio 提供一个方向。


谢谢

eosBLACK团队



eosBLACK 社区:

eosBLACK 官网:http//eosblack.io 

eosBLACK Koreos:http://koreos.io/eosBLACK 

eosBLACK Medium: https://medium.com/@eosblack 

eosBLACK steemit: https://steemit.com/@eosblack 

eosBLACK Facebook: https://www.facebook.com/eosBLACKTeam 

eosBLACK twitter: https://twitter.com/EOSBLACK_IO 

eosBLACK 电报群(韩文): https://t.me/eosBLACK_Korea

eosBLACK 电报群(英文): https://t.me/eosBLACK_English 

白皮书(中文):https://www.eosblack.io/whitepaper/eosBLACK_Whitepaper_CN.pdf

白皮书 (韩文): http://bitly.kr/nap2 

白皮书 (英文) : http://bitly.kr/MOsA


EOSIO.CDT (协议开发工具包)_第27张图片

你可能感兴趣的:(EOSIO.CDT (协议开发工具包))