本文将以合约名 helloeos
进行书写。钱包名为 qyvlik
。
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:
nodeeos
中带有 wallet
字样的插件都不支持了,需要留意。/eos/contracts
,在这个路径下使用 eos
开发全家桶会好一些。如非必要,不要更换。启动成功后,通过 docker exec -it eosio /bin/bash
进入容器,操作私有链。
用户离线生成自己账户的公私钥,但是链上的账户需要已激活的账户协助激活,在本地私有链环境下,可以通过 eosio
这个账户激活。
将私有链的 eosio
账户导入钱包中。
cleos wallet import -n WALLET_NAME --private-key 5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3
WALLET_NAME
: 需要用来创建账户,部署合约的钱包,如何创建钱包,参考下面的章节5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3
: 私有链上 eosio
的私钥,一般默认是这个。imported private key for: EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
: 是 eosio
的公钥私有链上可以有多个钱包,钱包可以导入多个账户私钥。钱包有单独的密码,在创建时指定 --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 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
: 是账户公钥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
主要有三个功能,一个是新建合约模板,一个是编译,一个是导出 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 set contract YOUR_CONTRACTS_NAME YOUR_CONTRACTS_DICTORY -p YOUR_CONTRACTS_ACCOUNT
YOUR_CONTRACTS_NAME
: 合约名称YOUR_CONTRACTS_DICTORY
: 合约目录YOUR_CONTRACTS_ACCOUNT
: 已经存在的 eos 账户YOUR_CONTRACTS_NAME
和 YOUR_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
输入钱包密码。
cleos push action helloeos hi '["helloeos"]' -p helloeos
eos合约开发流程以及编译中遇到的问题
EOS官方cleos钱包入门教程
EOS智能合约开发系列
PS: 据说很多 eos 教程都是用 hello world
和官方示例做的,但是稍微复杂一些合约,很少人能够执行成功。