EOS开发入门4 -- 开发第一个合约

在开始所有之前,先确定已经完成了前面文章的内容。

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 
#include 
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

你可能感兴趣的:(EOS开发入门4 -- 开发第一个合约)