您的位置:首页 > 资讯 > 币链 > 精通EOS:EOS 智能合约入门

精通EOS:EOS 智能合约入门

时间:2018-12-04  来源:  作者:    

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

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

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.wasm 和 Hello.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

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

00.png

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

00.png


淘手游,淘链游,了解更多游戏新闻就来 淘游戏新闻频道

链游/手游热门排行榜

  • 链游
  • 手游