精通EOS:EOS 智能合约入门

第一部分、创建钱包与账户 智能合约是与账号相关联的,账户又与钱包相关联。所以为了开发智能合约,我们首先要创建一个钱包。

1、创建钱包 执行下面的命令创建一个默认的钱包
./build/programs/cleos/cleos wallet create  --to-console
生成的钱包默认在当前户主的 eosio-wallet 目录内,同时命令还输出钱包的私钥 PW5KV37tpHBxuH52VEmhc9usCMjFc7EgxDBV9qHtN3ppfh39phJ1g,这个私钥一定要保存,因为后面当需要解锁钱包时要用到这个私钥。

2、创建两个秘钥对 正常情况下,我们需要创建两个密钥对,并把两个密钥对的私钥导入到钱包中,然后再来创建钱包。但是,在本文写作时这种方式已经不起作用。

当前本人使用的版本如下:

cloes 版本为 59626f1e,可用以下命令查看:

./build/programs/cleos/cleos version client
nodeos 版本为 v1.4.4,可用以下命令查看:
./build/programs/nodeos/nodeos -v
也可以执行下面的命令来获取版本相关的信息:
./build/programs/cleos/cleos get info
下面的命令显示如下:
{
  "server_version": "59626f1e",
  "chain_id": "cf057bbfb72640471fd910bcb67639c22df9f92470936cddc1ade0e2f2e7dc4f",
  "head_block_num": 5085,
  "last_irreversible_block_num": 5084,
  "last_irreversible_block_id": "000013dc8cff5717b630d2ac7a077242f16a882694d8a0297a1eb14c72d05415",
  "head_block_id": "000013ddcf3db56a3de7c25922d68824b5bce2240b40a95e2d4280640962d0d7",
  "head_block_time": "2018-12-03T15:32:04.500",
  "head_block_producer": "eosio",
  "virtual_block_cpu_limit": 32285095,
  "virtual_block_net_limit": 169610961,
  "block_cpu_limit": 199900,
  "block_net_limit": 1048576,
  "server_version_string": "v1.4.4"
}
在这种情况,如果你在测试网中部署智能合约,只能使用下面的密钥对:
  • 私钥5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3
  • 公钥EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
注1:创建密钥对的命令如下:./build/programs/cleos/cleos create key --to-console。在当前的版本下,已经不需要自己生成密钥了。

注2:如果在下面创建账户时,明明钱包已经解锁,并且自己生成的密钥已经钱包的情况,一直出现 Error 3090003: Provided keys, permissions, and delays do not satisfy declared authorizations,那么可以使用本文中给出的密钥进行一试。

3、导入私钥到钱包中 接下来,把上面创建好的两组私钥导入到钱包中
./build/programs/cleos/cleos wallet import
导入成功后,执行下面的命令进行检查钱包中已经导入的密钥:
./build/programs/cleos/cleos  wallet keys

4、创建账户 经过上面的各种准备下面终于到了开始创建账户的阶段了。

./build/programs/cleos/cleos create account eosio test EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV

命令执行后,控制台会显示如下信息:

executed transaction: 35464656da73bdcc2ca6ebd3b0906f5c0cf5e07cdfa7769d4b1f17a1649f4e08  200 bytes  10866 us
#         eosio <= eosio::newaccount            {"creator":"eosio","name":"test","owner":{"threshold":1,"keys":[{"key":"EOS6MRyAjQq8ud7hVNYcfnVPJqcV...
warning: transaction executed locally, but may not be confirmed by the network yet         ]
为了确保账户导入成功,执行下面的命令检查账户:
./build/programs/cleos/cleos get account -j test
这个命令显示如下:
{
  "account_name": "test",
  "head_block_num": 4377,
  "head_block_time": "2018-12-03T15:18:27.000",
  "privileged": false,
  "last_code_update": "1970-01-01T00:00:00.000",
  "created": "2018-12-03T15:16:30.000",
  "ram_quota": -1,
  "net_weight": -1,
  "cpu_weight": -1,
  "net_limit": {
    "used": -1,
    "available": -1,
    "max": -1
  },
  "cpu_limit": {
    "used": -1,
    "available": -1,
    "max": -1
  },
  "ram_usage": 2724,
  "permissions": [{
      "perm_name": "active",
      "parent": "owner",
      "required_auth": {
        "threshold": 1,
        "keys": [{
            "key": "EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV",
            "weight": 1
          }
        ],
        "accounts": [],
        "waits": []
      }
    },{
      "perm_name": "owner",
      "parent": "",
      "required_auth": {
        "threshold": 1,
        "keys": [{
            "key": "EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV",
            "weight": 1
          }
        ],
        "accounts": [],
        "waits": []
      }
    }
  ],
  "total_resources": null,
  "self_delegated_bandwidth": null,
  "refund_request": null,
  "voter_info": null
}
注:在以上操作时,如果出现提示钱包被锁定,那么请执行 ./build/programs/cleos/cleos wallet unlock --password 方法来解锁账户,密钥就是我们创建钱包时输出的私钥。

第二部分、创建智能合约 作为传统,在计算中通常第一个程序都是 Hello World,今天我们也不例外。下面我们就来写一个 EOS 智能合约版的 Hello World

1、编写合约 在当前目录下新建一个目录 Hello 来存放我们的智能合约相关文件。EOS 的智能合约使用 C++ 来编写,所以我们需要新建一个文件,命名为 Hello.cpp,拷贝如下内容到文件中。
#include <eosiolib/eosio.hpp>
#include <eosiolib/print.hpp>

using namespace eosio;

//所有的智能合约都继承自contract类 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、生成 `.wast` 文件 执行下面的命令来生成 .wast 文件
./build/tools/eosiocpp -o ./Hello/Hello.wast ./Hello/Hello.cpp
命令执行完你会看到在当前目录下生成了两个文件 Hello.wasmHello.wast

3、生成 `.abi` 文件 执行下面的命令来生成 .abi 文件
./build/tools/eosiocpp -g ./Hello/Hello.abi ./Hello/Hello.cpp

4、部署合约 在 .wast 文件和 .abi 文件生成之后,接下来我们就可以部署我们的合约了。

在部署合约之前,我们还要让钱包保持解锁状态,所以先执行下面的命令:

./build/programs/cleos/cleos wallet unlock --password
然后再执行下面的命令来部署我们的第一个智能合约:
./build/programs/cleos/cleos set contract test Hello
如无意外,你就可以看到下面的输出。恭喜你,少年!你的合约部署成功了。
Reading WASM from Hello/Hello.wasm...
Publishing contract...
executed transaction: cb3600150671ba433b2f9bfe09937e63f2617c37155c2e5f1cbc46112ac62472  1792 bytes  14128 us
#         eosio <= eosio::setcode               {"account":"test","vmtype":0,"vmversion":0,"code":"0061736d01000000013b0c60027f7e006000017e60027e7e0...
#         eosio <= eosio::setabi                {"account":"test","abi":"0e656f73696f3a3a6162692f312e30000102686900010475736572046e616d6501000000000...
warning: transaction executed locally, but may not be confirmed by the network yet         ]
注:之所以新建一个 Hello 目录是因为 EOS 要求合约所在的目录必须与合约的名字相同。 为了确保合约部署成功,执行下面的命令查看下合约:
./build/programs/cleos/cleos get code test
通常你会看到合约的哈希,类似于如下:
code hash: 1d0070ffc528f1268ad1f6c5ba998245811318bdcfd8827432d56e24c69a476c

调用智能合约 万事具备,只你你来调用!最后,让我们来调用这个合约吧!
./build/programs/cleos/cleos push action test hi '{"user":"eos"}' -p test
然后,你就会看到下面的输出:
executed transaction: 885a1f667a63658f5abe13435ea6989d19672fade8badc2e8544480b4031a271  104 bytes  1742 us
#          test <= test::hi                     {"user":"eos"}
warning: transaction executed locally, but may not be confirmed by the network yet         ]
但是此时你却看不到我们的合约打印信息,怎么会事呢?原来,默认情况下,系统是不在控制下打印的,为了在控制台上看到我们合约的输出,要在启动节点时加上 --contracts-console,完整的命令如下:
./build/programs/nodeos/nodeos -e -p eosio --plugin eosio::chain_api_plugin --plugin eosio::history_api_plugin --contracts-console
现在再执行一次上面调用合约的命令,就可以看到下图中打印的内容:

同时在节点运行的控制台上也可以看到下图,要特别注意红框中的内容,那里就是我们合约执行的一些内容。

后记 由于本人水平所限,文中错误在所难免,欢迎您踊跃指出错误,在下感激不尽。我的微信联系方式:joepeak。

版权声明:自由转载-非商用-非衍生-保持署名(创意共享4.0许可证)

本文来源: BTCsos 速援财经 · 为快不破 文章作者: 佚名
    下一篇