Intro:
使用eosio进行合约编译时,发现一些问题,然后在找答案的时候 这里, 发现有人说eosio的合约contract/工具已经没有进行维护了,而是单独拆分出一个eosio.cdt
(EOSIO Contract Development Toolkit 即eos合约开发工具集)
因此记录一下使用cdt来进行合约开发编译的过程。
安装
安装完之后 会产生 eosio-cpp_, eosio-cc, eosio-ld, eosio-pp, and _eosio_abigen (These are the C++ compiler, C compiler, linker, postpass tool and ABI generator.) 这些交互工具
// step 1
$ git clone --recursive https://github.com/eosio/eosio.cdt
// step 2
// ./build.sh <CORE_SYMBOL> coresymbol可以理解为链名称 这里用eos
$ ./build.sh EOS
build完成之后会出现以下界面:
___ ___ ___ ___
/ /\ / /\ / /\ ___ / /\
/ /:/_ / /::\ / /:/_ / /\ / /::\
/ /:/ /\ / /:/\:\ / /:/ /\ / /:/ / /:/\:\
/ /:/ /:/_ / /:/ \:\ / /:/ /::\ /__/::\ / /:/ \:\
/__/:/ /:/ /\ /__/:/ \__\:\ /__/:/ /:/\:\ \__\/\:\__ /__/:/ \__\:\
\ \:\/:/ /:/ \ \:\ / /:/ \ \:\/:/~/:/ \ \:\/\ \ \:\ / /:/
\ \::/ /:/ \ \:\ /:/ \ \::/ /:/ \__\::/ \ \:\ /:/
\ \:\/:/ \ \:\/:/ \__\/ /:/ /__/:/ \ \:\/:/
\ \::/ \ \::/ /__/:/ \__\/ \ \::/
\__\/ \__\/ \__\/ \__\/
For more information:
EOSIO website: https://eos.io
// step 3
sudo ./install.sh
安装完后 同样会出现安装成功画面, 这一步install会将下列可执行工具连接到 bin目录下
llvm-ranlib
llvm-ar
llvm-objdump
llvm-readelf
eosio-cc
eosio-cpp
eosio-ld
eosio-pp
eosio-abigen
wasm2wat
wat2wasm
区别
1 我们可以看到 编译工具支持c11的语法 abi标记位的写法不一样了。
// 新版本hello示例
#include <eosiolib/eosio.hpp>
using namespace eosio;
class hello : public eosio::contract {
public:
using contract::contract;
[[eosio::action]]
void hi( account_name user ) {
print( "Hello, ", name{user} );
}
};
EOSIO_ABI( hello, (hi) )
// 旧版示例
#include <eosiolib/eosio.hpp>
using namespace eosio;
class hello : public eosio::contract {
public:
using contract::contract;
/// @abi action
void hi( account_name user ) {
print( "Hello, ", name{user} );
}
};
EOSIO_ABI( hello, (hi) )
2 其他可以看 new version difference
编译
在路径eosio.cdt/examples 有hello合约的示例
cd eosio.cdt/examples/hello
1 编译wasm文件(两种方式)
// 1 手动编译
$ eosio-cpp hello.cpp -o hello.wasm
// 2 cmake编译 编译后在build目录下有hello.wasm文件
$ mkdir build
$ cd build
$ cmake ../
$ make
2 编译abi文件
// 1 在手动变异wasm文件的同时加上--abigen flag可以同时编译abi文件
$ eosio-cpp hello.cpp -o hello.wasm --abigen
// 2 直接使用eosio-abigen 编译
$ eosio-abigen hello.cpp --output=hello.abi