1. 程式人生 > >在eos私有鏈上開發 eos 合約

在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_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 和官方示例做的,但是稍微複雜一些合約,很少人能夠執行成功。