在eos私有鏈上開發 eos 合約
在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_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
輸入錢包密碼。
呼叫 eos 賬戶
cleos push action helloeos hi '["helloeos"]' -p helloeos
PS: 據說很多 eos 教程都是用 hello world
和官方示例做的,但是稍微複雜一些合約,很少人能夠執行成功。