在eos私有链上开发 eos 合约

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qyvlik/article/details/83143761

在eos私有链上开发 eos 合约

本文将以合约名 helloeos 进行书写。钱包名为 qyvlik

使用 docker 创建 eos 私有链

docker run --rm \
-d \
--name eosio \
-p 8888:8888 \
-p 9876:9876 \
-v ~/Documents/docker/eos-dev/work:/work \
-v ~/Documents/docker/eos-dev/eosio/data:/mnt/dev/data \
-v ~/Documents/docker/eos-dev/eosio/config:/mnt/dev/config \
-w /eos/contracts \
eosio/eos-dev:v1.4.1  \
/bin/bash -c "nodeos -e -p eosio --plugin eosio::producer_plugin --plugin eosio::history_plugin --plugin eosio::chain_api_plugin --plugin eosio::history_api_plugin --plugin eosio::http_plugin -d /mnt/dev/data --http-server-address=0.0.0.0:8888 --access-control-allow-origin=* --contracts-console --http-validate-host=false"

NOTE:

  • 留意数据卷的权限(包括 selinux 的权限)和路径。
  • 这里使用的是 eosio/eos-dev:v1.4.1,所以 nodeeos 中带有 wallet 字样的插件都不支持了,需要留意。
  • 这里设置容器的工作路径为 /eos/contracts,在这个路径下使用 eos 开发全家桶会好一些。如非必要,不要更换。

启动成功后,通过 docker exec -it eosio /bin/bash 进入容器,操作私有链。

在 eos 私有链上激活 eosio 账户

用户离线生成自己账户的公私钥,但是链上的账户需要已激活的账户协助激活,在本地私有链环境下,可以通过 eosio 这个账户激活。

将私有链的 eosio 账户导入钱包中。

cleos wallet import -n WALLET_NAME --private-key 5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3
  • WALLET_NAME: 需要用来创建账户,部署合约的钱包,如何创建钱包,参考下面的章节
  • 5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3: 私有链上 eosio 的私钥,一般默认是这个。
    输出如下:
imported private key for: EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
  • EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV: 是 eosio 的公钥

用 cleos 创建钱包

私有链上可以有多个钱包,钱包可以导入多个账户私钥。钱包有单独的密码,在创建时指定 --to-console 输出到终端,指定 --file 输出到文件。我们需要保留这个钱包密码。

使用 cleos wallet list 查看有多少钱包。

cleos wallet create -n WALLET_NAME --to-console

WALLET_NAME 替换成你想要的钱包名字,最好是英文字符的。输出如下:

Creating wallet: qyvlik
Save password to use in the future to unlock this wallet.
Without password imported keys will not be retrievable.
"PW5KUAsppczqtHBJT5WGAoupxopdr5R6mt2csFhps8tJKP8hBfVWs"

用 cleos 创建账户

每个账户只能有一个合约,账户可以由别人创建,但是所有权不归创建者。

生成私钥

cleos create key --to-console

输出如下:

Private key: 5JFAUp2DnHV5nZqowvhAV1HhmK92NHYei621dFXBwBNiKpupTpE
Public key: EOS6ZJVW82LmU1R73cid6P169msnsKC5GoHGMBbggJKoaqoLw9N5W

NOTE:

  • 请务必保存好您的私钥,请在安全的地方保存好您的私钥。

账户导入钱包

cleos wallet import -n WALLET_NAME --private-key PRIVATE_KEY
  • WALLET_NAME: 钱包名
  • PRIVATE_KEY: 账户私钥

实际执行如下所示:

cleos wallet import -n qyvlik --private-key 5JFAUp2DnHV5nZqowvhAV1HhmK92NHYei621dFXBwBNiKpupTpE

输出:

imported private key for: EOS6ZJVW82LmU1R73cid6P169msnsKC5GoHGMBbggJKoaqoLw9N5W
  • EOS6ZJVW82LmU1R73cid6P169msnsKC5GoHGMBbggJKoaqoLw9N5W: 是账户公钥

使用 eosio 激活账户

cleos create account EOS_ACCOUNT NEW_EOS_ACCOUNT OWNER_PUB_KEY ACTIVE_PUB_KEY 
  • EOS_ACCOUNT: 已经激活的 eos 账户,这里我们用 eosio 这个账户名
  • NEW_EOS_ACCOUNT: 新的账户名,账户名生成后无法修改
  • OWNER_PUB_KEY: NEW_EOS_ACCOUNT 持有的公钥
  • ACTIVE_PUB_KEY: EOS_ACCOUNT 持有的公钥
    执行例子如下:
cleos create account eosio helloeos  EOS6ZJVW82LmU1R73cid6P169msnsKC5GoHGMBbggJKoaqoLw9N5W EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV

输出如下:

executed transaction: 3296c96e72549133e88fef7dd8bb7218849be15d150ea1b46c202c1dca23aa17  200 bytes  165 us
#         eosio <= eosio::newaccount            {"creator":"eosio","name":"helloeos","owner":{"threshold":1,"keys":[{"key":"EOS6ZJVW82LmU1R73cid6P16...
warning: transaction executed locally, but may not be confirmed by the network yet         ] 

其中的警告不用理会,因为是私有链。

用 eosiocpp 编译合约

eosiocpp 主要有三个功能,一个是新建合约模板,一个是编译,一个是导出 abi 。

eosiocpp都是针对 cpp 文件进行操作的(cpp已经包含了 hpp 文件了)。

在容器中,请切换路径到 /eos/contracts ,在 /eos/contracts 路径下,使用 eosiocpp 编译 abi 的成功率会高一些(玄学)。

eosiocpp -n helloeos

eosiocpp 可以将多个 cpp 编译成一个 wast 文件。

cd helloeos
eosiocpp -o helloeos.wast helloeos.cpp
eosiocpp -g helloeos.abi helloeos.cpp

ps: 现在 eosiocpp 被标记为 deprecated,官方建议使用 https://github.com/EOSIO/eosio.cdt 替代。

使用 cleos 部署合约

cleos set contract YOUR_CONTRACTS_NAME YOUR_CONTRACTS_DICTORY -p YOUR_CONTRACTS_ACCOUNT
  • YOUR_CONTRACTS_NAME: 合约名称
  • YOUR_CONTRACTS_DICTORY: 合约目录
  • YOUR_CONTRACTS_ACCOUNT: 已经存在的 eos 账户

YOUR_CONTRACTS_NAMEYOUR_CONTRACTS_ACCOUNT 是一定要相同的,每个账户只能有一个合约,账户可以由别人创建,但是所有权不归创建者。

cleos set contract helloeos helloeos -p helloeos

输出如下:

Reading WASM from helloeos/helloeos.wasm...
Publishing contract...
executed transaction: 8d84d97ecd67e98a039748ec6517005a993b25962818b711d49cc4f3f27fd4b0  1800 bytes  355 us
#         eosio <= eosio::setcode               {"account":"helloeos","vmtype":0,"vmversion":0,"code":"0061736d01000000013b0c60027f7e006000017e60027...
#         eosio <= eosio::setabi                {"account":"helloeos","abi":"0e656f73696f3a3a6162692f312e30000102686900010475736572046e616d650100000...
warning: transaction executed locally, but may not be confirmed by the network yet         ] 

如果提示 Error 3120003: Locked wallet, 需要解锁eos钱包。cleos wallet unlock -n qyvlik 输入钱包密码。

调用 eos 账户

cleos push action helloeos hi '["helloeos"]' -p helloeos

eos合约开发流程以及编译中遇到的问题

EOS官方cleos钱包入门教程

EOS智能合约开发系列

PS: 据说很多 eos 教程都是用 hello world 和官方示例做的,但是稍微复杂一些合约,很少人能够执行成功。

猜你喜欢

转载自blog.csdn.net/qyvlik/article/details/83143761