在开始所有之前,先确定已经完成了前面文章的内容。
EOS开发入门1 -- 环境搭建
EOS开发入门2 -- 钱包与账户
EOS开发入门3 -- 合约部署与调用
eosiocpp 命令
eosiocpp是帮助我们进行eos合约开发的编译工具,eosiocpp命令很简单,这里列出其参数示例
参数 | 说明 | 示例 |
---|---|---|
-o | 输出文件名,根据输入文件生成wast的输出文件 | eosiocpp -o hello.wast hello.cpp |
-n | 目录名称,基于示例合约,在指定文件夹下创建一个新的合约 | eosiocpp -n hi |
-g | 输出文件名,生成abi文件 | eosiocpp -g hello.abi hello.cpp |
创建一个新合约
eosio的合约是基于c++语言的。
创建一个名为“hello”的新文件夹,cd进入该文件夹,创建一个文件“hello.cpp”,输入以下内容:
#include <eosiolib/eosio.hpp>
#include <eosiolib/print.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) )
将代码编译为Web程序集(.wast),如下所示:
$ eosiocpp -o hello.wast hello.cpp
生成过程中会有一些警告,先不用理会。再生成abi文件:
$ eosiocpp -g hello.abi hello.cpp
Generated hello.abi ...
创建新账户并上传合约
$ cleos create account eosio hello.code EOS7ijWCBmoXBi3CgtK7DJxentZZeTkeUnaSDvyro9dq7Sd1C3dC4 EOS7ijWCBmoXBi3CgtK7DJxentZZeTkeUnaSDvyro9dq7Sd1C3dC4
...
$ cleos set contract hello.code ../hello -p hello.code
...
看过前面的文章,我们应该对这两条命令很熟悉了。
这里再提醒下,nodeos是eosio的区块链节点命令,我们在整个教程中,都需要保证nodeos是在运行状态下。而cleos是一个命令行工具,它向nodeos提交请求,由nodeos对提交数据进行验证并打包进入区块链。
合约调用
我们来运行合约:
$ cleos push action hello.code hi '["user"]' -p user
executed transaction: 4c10c1426c16b1656e802f3302677594731b380b18a44851d38e8b5275072857 244 bytes 1000 cycles
# hello.code <= hello.code::hi {"user":"user"}
>> Hello, user
当前合约允许任何账户授权,我们也可以这样运行:
$ cleos push action hello.code hi '["user"]' -p tester
executed transaction: 28d92256c8ffd8b0255be324e4596b7c745f50f85722d0c4400471bc184b9a16 244 bytes 1000 cycles
# hello.code <= hello.code::hi {"user":"user"}
>> Hello, user
接下来我们对合约做一下修改,要求合约调用账户和传入的user是同一个账户,修改hello.cpp代码:
void hi( account_name user ) {
require_auth( user );
print( "Hello, ", name{user} );
}
重新对合约进行编译和发布:
$ eosiocpp -o hello.wast hello.cpp
...
$ eosiocpp -g hello.abi hello.cpp
...
$ cleos set contract hello.code ../hello -p hello.code
...
再次调用合约:
$ cleos push action hello.code hi '["tester"]' -p user
Error 3030001: missing required authority
Ensure that you have the related authority inside your transaction!;
If you are currently using 'cleos push action' command, try to add the relevant authority using -p option.
Error Details:
missing authority of tester
报错了,因为新的合约中做了验证。现在只有授权用户和合约参数的用户相同,才能正确执行合约:
$ cleos push action hello.code hi '["tester"]' -p tester
executed transaction: 235bd766c2097f4a698cfb948eb2e709532df8d18458b92c9c6aae74ed8e4518 244 bytes 1000 cycles
# hello.code <= hello.code::hi {"user":"tester"}
>> Hello, tester