用户登陆
正在加载
精通EOS:EOS 智能合约入门
互联网 · 2018-12-04 11:04:00

第一部分、创建钱包与账户

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

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

现在再执行一次上面调用合约的命令,就可以看到下图中打印的内容:

eos-hello

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

eos-hello2

后记

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

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

免责声明:
本网站所提供的所有信息仅供参考,不构成任何投资建议。用户在使用本网站的信息时应自行判断和承担风险。币界网不对用户因使用本网站信息而导致的任何损失负责。用户在进行任何投资活动前应自行进行调查和研究,并谨慎决策。币界网不对用户基于本网站信息做出的任何投资决策负责。用户在本网站发布的任何内容均由其个人负责,与币界网无关。
免责声明:本网站、超链接、相关应用程序、论坛、博客等媒体账户以及其他平台和用户发布的所有内容均来源于第三方平台及平台用户。币界网对于网站及其内容不作任何类型的保证,网站所有区块链相关数据以及其他内容资料仅供用户学习及研究之用,不构成任何投资、法律等其他领域的建议和依据。币界网用户以及其他第三方平台在本网站发布的任何内容均由其个人负责,与币界网无关。币界网不对任何因使用本网站信息而导致的任何损失负责。您需谨慎使用相关数据及内容,并自行承担所带来的一切风险。强烈建议您独自对内容进行研究、审查、分析和验证。
s_logo
App内打开