智能合约 eos 智能合约最新工具 eosio.cdt

gk5 · 2018年11月19日 · 最后由 gk5 回复于 2018年11月19日 · 733 次阅读
os智能合约开发工具将用eosio.cdt代替之前的eosiocpp,eosiocpp将被废弃!
在此,提醒大家,要开发eos智能合约的同学,紧跟版本变更的步伐不要徒劳!
原文链接  https://github.com/EOSIO/eosio.cdt/

EOSIO.CDT(合同开发工具包)
版本:1.4.1
EOSIO.CDT是WebAssembly(WASM)的工具链和一组工具,用于促进EOSIO平台的合同编写。除了作为通用WebAssembly工具链之外,还可以使用EOSIO特定的优化来支持构建EOSIO智能合约。这个新工具链是围绕Clang 7构建的,这意味着EOSIO.CDT具有最新的LLVM优化和分析,但由于WASM目标仍被认为是实验性的,因此某些优化不可用或不完整。

重要!
EOSIO.CDT版本1.3.x引入了一些重大变化。要获得二进制版本,我们需要从EOSIO.CDT中删除核心符号的概念。这意味着对符号,资产和与其相关的其他类型/功能进行了重大更改。由于这些变化具有破坏性,我们决定在未来的合同编写中添加尽可能多的破坏性变更,以便中断只发生一次。请阅读本自述文件的1.2.x版和1.3.x版之间的差异。

二进制版本
EOSIO.CDT目前支持Mac OS X brew,Linux x86_64 Debian软件包和Linux x86_64 RPM软件包。

如果您以前安装过EOSIO.CDT,请uninstall在下载和使用二进制版本之前运行脚本(它位于您克隆EOSIO.CDT的目录中)。

Mac OS X Brew安装
$ brew tap eosio / eosio.cdt
$ brew install eosio.cdt
Mac OS X Brew卸载
$ brew删除eosio.cdt
Debian软件包安装
$ wget https://github.com/eosio/eosio.cdt/releases/download/v1.4.1/eosio.cdt-1.4.1.x86_64.deb
$ sudo apt install ./eosio.cdt-1.4.1.x86_64.deb
Debian软件包卸载
$ sudo apt删除eosio.cdt
Fedora RPM软件包安装
$ wget https://github.com/eosio/eosio.cdt/releases/download/v1.4.1/eosio.cdt-fedora-1.4.1.x86_64-0.x86_64.rpm
$ sudo yum install ./eosio.cdt-fedora-1.4.1.x86_64-0.x86_64.rpm
Fedora RPM软件包卸载
$ sudo yum删除eosio.cdt
Centos RPM软件包安装
$ wget https://github.com/eosio/eosio.cdt/releases/download/v1.4.1/eosio.cdt-centos-1.4.1.x86_64-0.x86_64.rpm
$ sudo yum install ./eosio.cdt-centos-1.4.1.x86_64-0.x86_64.rpm
Centos RPM软件包卸载
$ sudo yum删除eosio.cdt
引导式安装(从零开始构建)
$ git clone --recursive https://github.com/eosio/eosio.cdt
$ cd eosio.cdt
$ ./build.sh
$ sudo ./install.sh
建立你的第一份智能合约
导航到示例(./examples/hello)中的hello文件夹。
然后,您应该看到hello.cpp文件
现在运行编译器
$ eosio-cpp -abigen hello.cpp -o hello.wasm
或者使用CMake
$ mkdir build
$ cd build
$ cmake ..
$ make
这将生成两个文件:

编译后的二进制文件wasm(hello.wasm)
生成的ABI文件(hello.abi)
单独使用eosio-abigen
要生成ABI eosio-abigen,只需要将主“.cpp”文件编译并输出文件名--output并根据合同名称生成--contract。

例:

$ eosio-abigen hello.cpp --contract = hello --output = hello.abi
这将生成一个文件:

生成的ABI文件(hello.abi)
版本1.2.x和版本1.3.x之间的差异
eosiolib C API
删除以下typedef为uint64_t:
account_name
permission_name
scope_name
table_name
action_name
添加了一个uint64_ttypedef,capi_name用于替换上面删除的typedef:
这些已被替换为,capi_name并且在编写C ++契约代码时不应使用该实践。相反,eosio::name应该使用eosiolib C ++ API中的新版本来替换这些实例。做出这个决定是因为隐式铸造问题不好uint64_t,新模式应该允许更好的类型安全性。
删除了symbol_nametypedef:
这没有C等价来替换它。在编写C ++契约代码时,eosio::symbol_code应该使用结构。与前面提到的命名类型一样,这被删除并替换eosio::symbol_code为允许合同中更好的类型安全性。要使用符号,即符号名称和精度,请使用eosio::symbol该类。
删除time并输入weight_typetypedef。
删除了transaction_id_type和block_id_typetypedef。
删除了account_permission结构。
重命名以下typedef:
checksum160 - > capi_checksum160
checksum256 - > capi_checksum256
checksum512 - > capi_checksum512
public_key - > capi_public_key
signature - > capi_signature
删除了不存在的内在函数声明require_write_lock和require_read_lock。
eosiolib C ++ API
删除了eosiolib / vector.hpp:
删除了别名eosio::vector和typedef bytes。
前进的合同编写者应该包括<vector>来自STL并使用std::vector<char>而不是字节。
删除了eosiolib / types.hpp。
删除了eosiolib / optional.hpp。使用std::optional作为替代。
删除了eosiolib / core_symbol.hpp。合同作者应明确指定符号。
添加了eosiolib / name.hpp。
eosiolib / types.hpp
将typedef移动eosio::extensions_types到eosiolib / transaction.hpp。
删除了checksum结构的比较函数。
去除eosio::char_to_symbol,eosio::string_to_name,eosio::name_suffix功能
删除N宏。该""_n运营商或name构造应该作为一种安全的替代品。示例:N(foo)- > "foo"_n或N(foo)- > name("foo")。
将eosio::name结构定义和""_n运算符移动到eosiolib / name.hpp。
eosiolib / name.hpp
删除了隐式和显式转换uint64_t。
添加了enum class eosio::name::raw从eosio::name(用于模板非类型参数)隐式转换的内容。
添加了bool转换运算符,用于有条件地测试名称是否为空。
所有的构造者现在都是constexpr。这些采取a uint64_t,an eosio::name::raw或a std::string_view。
添加constexpr方法eosio::name::length和eosio::name::suffix。
增加了等价,倒置等价和少于运算符eosio::name。
eosiolib / symbol.hpp
删除了eosio::symbol_type结构并替换为eosio::symbol类。
添加结构eosio::symbol_code:
添加了两个constexpr构造函数,可以使用raw uint64_t或std::string_view。
添加constexpr方法is_valid,length和raw。
添加了打印方法。
添加bool转换运算符以进行测试symbol_code是空的。
删除eosio::string_to_symbol,eosio::is_valid_symbol,eosio::symbol_name_length等功能。
删除了S宏。符号构造函数应该用作类型安全替换。示例:S(4,SYS)- > symbol(symbol_code("SYS"), 4)(或简称symbol("SYS", 4)v1.3.1)。
添加结构eosio::symbol:
增加了三种constexpr称取无论是原始的构造uint64_t,symbol_code和uint8_t精度或std::string_view和uint8_t精度。
添加constexpr方法is_valid,precision,code,和raw。这些分别检查是否symbol有效,获得uint8_t精度,获取symbol_code部分symbol,并获得原始uint64_t表示symbol。
增加了等价,倒置等价和少于运算符eosio::symbol。
修改结构eosio::extended_symbol:
受限制的字段为私人。
添加constexpr了带a eosio::symbol和a的构造函数eosio::name。
添加constexpr方法get_symbol和get_contract。
现有的制造商相比constexpr。
eosiolib / asset.hpp
主构造函数现在需要int64_t(数量)和eosio::symbol显式。
默认构造函数不再将实例初始化为有效零数量资产,其符号等效于“核心符号”。相反,默认构造eosio::asset是所有零的位表示(这将导致is_valid失败),以便绕过检查以允许multi_index和datastream工作。
使用的旧合同eosio::asset()应更改为使用其所针对的特定链的核心符号,即eosio::asset(0, symbol(symbol_code("SYS"),4))。要symbol(symbol_code("SYS"),4)反复减少写入,应使用constexpr返回符号或constexpr全局变量的函数。
eosiolib / contract.hpp
eosio::contract现在的构造函数接受一个eosio::name接收器,一个eosio::name代码和一个eosio::datastream<const char*>用于合同的数据流。最后一个参数是手动解包操作,请参阅有关eosio::ignore更深入使用的部分。
eosiolib / dispatcher.hpp
将宏重命名为EOSIO_ABI,EOSIO_DISPATCH因为这更加描述了此宏实际执行的操作。
修改了EOSIO_DISPATCH使用新构造函数的定义eosio::contract。
eosiolib / multi_index.hpp
现在的第一个模板参数indexed_by要求参数可以转换为eosio::name::raw(替换uint64_t)。
现在的第一个模板参数multi_index要求参数可以转换为eosio::name::raw(替换uint64_t)。
构造函数现在采用eosio::name代码类型(替换uint64_t)。范围仍然存在uint64_t。
其他各种替代品uint64_t来eosio::name。
eosiolib / singleton.hpp
现在的第一个模板参数eosio::singleton要求参数可以转换为eosio::name::raw(替换uint64_t)。
构造函数现在采用eosio::name代码的类型。
在方法get_or_create和中set,参数bill_to_account现在是类型eosio::name(替换uint64_t)。
eosiolib / action.hpp
添加了C ++功能eosio::require_auth。
添加了C ++功能eosio::has_auth。
添加了C ++功能eosio::is_account。
重新定义eosio::permission_level用于eosio::name代替uint64_t。
删除了宏ACTION。(该标识符ACTION已重新用于下面宏部分中描述的另一个宏。)
eosiolib / permission.hpp
函数的可选的provided_keys参数eosio::check_transaction_authorization现在是类型std::set<eosio::public_key>而不是类型std::set<capi_public_key>。C ++契约代码最有可能是使用eosio::public_key结构(在“eosiolib / public_key.hpp”中定义),如果它们需要处理EOSIO兼容的公钥而不是eosiolib C API中的capi_public_key结构(现在从其原始名称重命名::public_key) 。请注意,刚引用public_key没有命名空间限定的类型的现有合同代码可能意外地使用了capi_public_key结构,因此理想情况下应修改为使用eosio::public_keyC ++类型。
该account和permission的参数eosio::check_transaction_authorization都是eosio::name现在代替uint64_t。
eosiolib / ignore.hpp
添加了新类型ignore:
此类型充当占位符,表示不希望反序列化其字段但希望类型反映在ABI中的操作。
ACTION 动作(忽略<some_type>){some_type st; _ds >> st; }
添加了新类型ignore_wrapper:
这允许SEND_INLINE_ACTION使用匹配类型ignore_wrapper(some_value)的动作进行调用ignore。
宏
添加ACTION宏只是一个快捷方式[[eosio::action]] void。
添加TABLE宏只是一个快捷方式struct [[eosio::table]]。
添加CONTRACT宏只是一个快捷方式class [[eosio::contract]]。
CMake的
添加eosio.cdt-config.cmake允许find_package(eosio.cdt)。有关示例,请参阅eosio.cdt / examples / hello或eosio.cdt / examples / template。
添加了新的宏add_contract。这个新合约采用合同名称,cmake目标,然后是您将给予的任何正常参数add_executable。请参阅eosio.cdt / examples / hello或eosio.cdt / examples / template。
包括新版本检查机制。请参阅eosio.contracts / CMakeLists.txt以查看正在使用的内容。
的libc
替换printf,sprintf以及snprintf新的最小变体。这允许合同使用这些功能而不会导致堆栈溢出问题。
libcxx
删除sstream后意图在完成更多操作后返回此项。
添加__cxa_pure_virtual以允许合同类中的纯虚方法。
std::to_string 现在工作没有堆栈溢出的问题。
属性
添加[[eosio::ignore]]了将类型标记为反序列化程序忽略的属性。该属性主要仅用于eosiolib内部使用。
添加了[[eosio::contract]]属性。此新属性用于将合同类标记为“合同”,其名称是类的C ++名称或用户指定的名称(即[[eosio::contract("somecontract")]])。此属性还可以与要在类外部定义的表的eosio::action和eosio::table属性一起使用eosio::contract。这是在与任一原始结合使用eosio-cpp选项--contract <name>,-o <name>.wasm或通过CMake add_contract。它充当过滤器,使合同开发人员能够包含带有来自另一个合同(例如eosio.token)的属性的头文件,同时生成没有这些操作和表的ABI。
#包括 < eosiolib / eosio.hpp >
使用 命名空间 eosio ;
合同测试:public eosio :: contract {
公共:
   使用合同::合同;
   ACTION acta(){}
   表taba {
      uint64_t a;
      浮 b;
      uint64_t  primary_key()const { return a; }
   };
};
struct [[eosio :: table,eosio :: contract(“ test ”)]]
tabb {
   uint64_t a;
   int b;
};
typedef eosio :: multi_index < “ testtaba ” _n,test :: taba> table_a;
typedef eosio :: multi_index < “ testtabb ” _n,tabb> table_b;
EOSIO_DISPATCH(测试,(acta))
上面的代码将生成表格testtaba和testtabb您的ABI。示例:eosio-cpp -abigen test.cpp -o test.wasm将标记此编译和ABI生成eosio::contract test。使用eosio-cpp -abigen test.cpp -o test_contract.wasm --contract test或使用CMake命令可以完成同样的操作add_contract( test, test_contract, test.cpp )。前两种方法中的任何一种都将生成在合同名称的上下文中生成的test_contract.wasm和test_contract.abi test。
促进
Boost现在是图书馆的一部分。不再需要外部依赖Boost和所有系统包含在其中sysroot。(Boost将在以后的版本中删除。)
ABI生成器属性
与旧的ABI生成器工具不同,新工具使用C ++ 11或GNU样式属性来标记actions和tables。

[[eosio ::动作]]
此属性将结构或方法标记为操作。示例(声明ABI生成操作的四种方法):

//这是C ++ 11和更高的样式属性
[[eosio ::动作]]
void  testa(name n){
    //做点什么
}

//这是GNU样式属性,可以在C代码中使用,在C ++ 11之前使用
__attribute __((eosio_action))
void testa(name n){
   //做点什么
}

struct [[eosio :: action]] testa {
   名字n;
   EOSLIB_SERIALIZE(testa,(n))
};

struct  __attribute __((eosio_action))testa {
   名字n;
   EOSLIB_SERIALIZE(testa,(n))
};
如果您的操作名称不是有效的EOSIO名称,则可以在属性中明确指定名称c++ [[eosio::action("<valid action name>")]]

示例(为ABI生成声明表的两种方法):

struct [[eosio :: table]] testtable {
    uint64_t owner;
   / *所有其他领域* /
};

struct  __attribute __((eosio_table))testtable {
    uint64_t owner;
   / *所有其他领域* /
};

typedef eosio :: multi_index < “ tablename ” _n,testtable> testtable_t ;
如果您不想使用多索引,则可以在属性中明确指定名称c++ [[eosio::table("<valid action name>")]]。

有关ABI生成的示例合同,请参阅文件./examples/abigen_test/test.cpp。您可以使用生成此文件的ABI eosio-abigen test.cpp --output=test.abi。

修复ABI或手动编写ABI
ABI的各个部分非常易于理解,语法纯粹是JSON,因此手动编写ABI文件是合理的。
对于所写的每份合同,ABI一代都不会完全完美。ABI最新版本的高级功能需要手动构建ABI,奇数和高级C ++模式可能会降低生成器类型的减少量。因此,熟悉如何编写ABI应该是智能合约作者的重要知识。
请参阅developers.eos.io“如何编写ABI文件”以了解ABI的不同部分。
将李嘉图合同和条款添加到ABI
从EOSIO.CDT v1.4.0开始,ABI生成器将尝试自动将合同和子句导入生成的ABI。这有一些注意事项,一个是文件的严格命名策略,以及用于标记每个Ricardian合约和每个子句的HTML标记。
Ricardian合同应存放在名为.contracts.md的文件中,并且子句应位于名为.clauses.md的文件中。
对于每个李嘉图合约,<h1 class="contract">ActionName</h1>应使用标题,因为这会指示ABI生成器将此Ricardian合约附加到指定的操作。
对于每个Ricardian子句,<h1 class="clause">ClauseID</h1>应使用标头,因为这会将ABI生成器指向子句id和后续主体。
该选项-R已添加到eosio-cpp和eosio-abigen中以添加“资源”路径进行搜索,因此您可以将这些文件放在您喜欢的任何目录结构中,并-R<path to file>以与-I包含路径相同的方式使用。
要查看这些内容,请参阅./examples/hello/hello.contracts.md和./examples/hello/hello.clauses.md。
已安装的工具
eosio-CPP
eosio-CC
eosio-LD
eosio-abigen
eosio-pp(WASM的后处理过程,自动与eosio-cpp和eosio-ld一起运行)
eosio-wasm2wast
eosio-wast2wasm
eosio-ranlib的
eosio-AR
eosio-objdump的
eosio-readelf
用法
要编译EOSIO智能合约,首选方法是使用示例文件夹中的模板CMakeLists.txt。

例如:

在CMakeLists.txt:

cmake_minimum_required(VERSION 3.5)
project(test_example VERSION 1.0.0)

find_package(eosio.cdt)

add_contract( test test test.cpp )
在test.cpp:

#include <eosiolib/eosio.hpp>
using namespace eosio;

CONTRACT test : public eosio::contract {
public:
   using contract::contract;

   ACTION testact( name test ) {
   }
};

EOSIO_DISPATCH( test, (testact) )
要手动编译源代码,请使用eosio-cpp/eosio-cc和eosio-ld好像是clang和lld一样。所有针对EOSIO和CDT的包含和选项均已完成。

eosio-CPP
概述:eosio-cpp(Eosio C ++  - > WebAssembly编译器)
用法:eosio-cpp [options] <输入文件> ...

选项:
  -C  - 在预处理输出中包含注释
  -CC  - 在预处理输出中的宏中包含注释
  -D = < string >               - 将< macro >定义为< value >(如果 省略< value >,则为 1 )
  -E  - 仅运行预处理器
  -I = < string >               - 添加目录以包含搜索路径
  -L = < string >               - 将目录添加到库搜索路径
  -O = < string >               - 优化级别s,0-3
  -S  - 仅运行预处理和编译步骤
  -U = < string >               -  Undefine macro < macro > 
  -W = < string >               - 启用指定的警告
  -c  - 仅运行预处理,编译和汇编步骤
  -dD -打印宏定义在 -E模式中除了正常的输出
  -dI -打印包括指令在 -E模式中除了正常的outpu
  -dM  - 在 -E模式下打印宏定义,而不是正常输出
  -emit-ast  - 用于 源输入的Emit Clang AST文件
  -emit-llvm  - 将LLVM表示用于汇编程序和目标文件
  -faligned-allocation  - 启用C ++ 17对齐的分配函数
  -fcoroutine-ts  - 启用对 C ++协同程序TS的支持
  -finline-functions  - 内联合适的函数
  -finline-hint-functions  - 内联(明确或隐式)标记为内联的内联函数
  -fmerge-all-constants  - 允许合并常量
  -fno-cfl-aa  - 禁用CFL别名分析
  -fno-elide-constructors  - 禁用C ++拷贝构造函数elision
  -fno-lto  - 禁用LTO
  -fstack-protector  - 为可能容易受到堆栈粉碎的功能启用堆栈保护程序
  -fstack -保护-所有-强制堆栈保护的使用对所有功能
  -fstack-protector-strong  - 使用强启发式方法将堆栈保护程序应用于函数
  -fstrict-枚举-基于枚举的严格定义启用优化'价值范围
  -fstrict回报-始终治疗该脱落的非void函数为不可达的结束控制流路
  -fstrict-虚表指针-使能基于严格规则覆盖多态C ++对象的优化
  -include = <string>  - 解析之前包含文件
  -isysroot = <string>  - 设置系统根目录(通常为/)- 
  l = <string>  - 库的根名称为link 
  -lto-opt = <string>  -  LTO优化级别(O0-O3)
  -o = <string>  - 将输出写入<file> 
  -std = <string>- 要编译的语言标准
  -v  - 显示要运行的命令并使用详细输出
  -w  - 禁止所有警告

通用选项:

  -help  - 显示可用选项(-help-hidden for more)
  -help-list  - 显示可用选项列表(-help-list-hidden for more)
  -version  - 显示该程序的版本
eosio-LD
概述:eosio-ld(WebAssembly链接器)
用法:eosio-ld [选项] <输入文件> ...

选项:

通用选项:

  -help  - 显示可用选项(-help-hidden for more)
  -help-list  - 显示可用选项列表(-help-list-hidden for more)
  -version  - 显示该程序的版本

eosio.ld选项:

  -L = < string >        - 将目录添加到库搜索路径
  -fno-cfl-aa  - 禁用CFL别名分析
  -fno-lto  - 禁用LTO
  -fno-后通-唐“吨运行后处理通过
  -fno-堆叠第一-唐”吨设置第一堆栈中存储器
  -l = < string >        - 要链接的库的根名称
  -lto-opt = < string > -  LTO优化级别(O0-O3)
  -o = < string >        - 将输出写入< file >
eosio-abigen
用法:eosio-abigen [options] < source 0> [... < sourceN > ]

选项:

通用选项:

  -help  - 显示可用选项(-help-hidden for more)
  -help-list  - 显示可用选项列表(-help-list-hidden for more)
  -version  - 显示该程序的版本

eosio-abigen:
从C ++项目输入生成ABI

  -extra-arg = < string >         - 附加到编译器命令行的附加参数
  -extra-arg-before = < string > - 前缀到编译器命令行的附加参数
  -output = < string >            - 设置输出文件名和完整路径
  -p = < string >                 - 构建路径
共收到 2 条回复

👍 多多分享,帮助社区其他的小伙伴~

Surou 回复

互相学习嘛😃 😃 😃

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册