风险提示:理性看待区块链,提高风险意识!
精通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许可证)

上一篇: 比特币钱包开发:通过助记词导入钱包与导出钱包助记
下一篇: 看准下一轮牛市的关键:Web3.0时代的技术架构、产品设计与用户体验
推荐专栏
web3首席知识博主
一位相信价值投资的币圈KOL。稳定盈利的缠论野生交易员 #BTC行情分析师 #价值投资 #链上数据分析
爱Web 3,爱生活,爱科技,爱炒币的老韭菜
热门币种
更多
币种
价格
24H涨跌幅
BTC比特币
¥264,723.74
37,091.22 USDT
+0.1%
ETH以太坊
¥14,416.22
2,019.90 USDT
-0.12%
USDT泰达币
¥7.20
1.01 USDT
0%
BNB币安币
¥1,625.40
227.74 USDT
+0.36%
XRP瑞波币
¥4.32
0.60460 USDT
+0.37%
USDC
¥7.14
1.00 USDT
+0.03%
SOLSolana
¥398.85
55.89 USDT
+1.54%
OKBOK币
¥398.61
55.85 USDT
-1.64%
ADA艾达币
¥2.68
0.37580 USDT
-1.16%
DOGE狗狗币
¥0.55160
0.07730 USDT
-1.52%
热搜币种
更多
币种
价格
24H涨跌幅
Terra Classic
¥0.00
9.402E-5 USDT
-18.95%
Gala
¥0.18
0.025374 USDT
-4.66%
dYdX
¥22.58
3.1918 USDT
-0.91%
比特股
¥0.05
0.006964 USDT
+4.28%
PancakeSwap
¥15.52
2.1936 USDT
-2.74%
Conflux
¥1.08
0.1524 USDT
-2.87%
Filecoin
¥31.45
4.4454 USDT
-0.69%
FTX Token
¥29.82
4.2155 USDT
+16.96%
Yield Guild Games
¥2.55
0.3608 USDT
-0.52%
Shiba Inu
¥0.00
8.14E-6 USDT
-2.51%
比特币
¥262,381.44
37091.22 USDT
+0.1%
比原链
¥0.07
0.010011 USDT
-4.38%
最新快讯
更多
汇丰、恒生、渣打、富邦华一四家外资银行入围首批“数字人民币”业务试点名单
2023-11-28 19:06:57
摩根大通和Apollo计划建立代币化“企业主网”
2023-11-28 19:03:57
Nansen2公测版本上线,新增链上数据异动、智能搜索等功能
2023-11-28 18:59:52
西班牙公民需在明年3月底前申报其海外平台上加密货币持仓
2023-11-28 18:53:43
Nansen2已公开测试
2023-11-28 18:53:38
dYdX基金会:主网启动以来超过1645万DYDX被质押
2023-11-28 18:52:07
NicCarter等比特币倡导者发文:比特币挖矿是清洁能源和平衡电网的关键工具
2023-11-28 18:47:58
下载币界网APP