區塊鏈100講:EOS環境搭建入門(私鏈節點-錢包-金鑰-賬號)
1
摘要
【本文目標】
通過本文實踐,能在已編譯的EOS V1.0.5版本環境上,完成私鏈節點啟動,錢包建立,金鑰匯入和賬號建立等內容。
【前置條件】
你已完成了EOS編譯,編譯測試成功。未完成的可參考如何在UBUNTU虛擬機器上編譯EOS完成環境搭建?(附程式碼)完成相關配置。
【技術收穫】
1)EOS的節點,錢包,金鑰,賬號的概念和理解
2)EOS錢包/賬號的建立和遇到的問題分析及解決方法
【說明】
EOS版本還沒有穩定下來,即使完成了V1.0.2版本環境搭建的人,到V1.0.5時還是摔在了坑裡。輝哥通過踩坑分析給大家提供儘可能多的知識和解決思路,大家在V1.0.5以後的版本部署可參考文章和以錯誤關鍵字搜尋官網的issue網址(https://github.com/EOSIO/eos/issues)獲取更多知識。
2
EOSIO總體框架
EOSIO有多個程式模組組成,經常會用到的有以下三個模組:
nodeos - EOSIO核心模組,用於啟動eosio服務,在後臺執行,啟動時可以新增多種外掛plugin。
cleos - 命令列介面錢包工具,見《EOS命令列介面錢包》(https://github.com/eoshackathon/eos_dapp_development_cn/blob/master/docs/eos_command_line_wallet.md),位於eos/build/programs/cleos/cleos
keosd - 管理錢包的各種元件,預設情況下,keosd將隨cleos一起啟動。位於eos/build/programs/keosd
下圖是上面三個工具的關係:
另外,還有智慧合約的編譯工具eosiocpp。
3
EOS系統中錢包,金鑰對,賬號,智慧合約的關係
相對其他區塊鏈公鏈,EOS系統的組合關係比較自由,也帶來了理解上的困難。輝哥結合自己的理解,以中國大地上人們最關係的房子為例,做比喻介紹。
1) 錢包是土豪房東
土豪可以有很多的房子和各種開門的鑰匙。上海這個城市有很多個土豪房東,所以一個節點可以建立多個錢包。
cleos wallet create ${引數}
2)鑰匙用來開啟房東門的。
鑰匙分為私鑰和公鑰。公鑰是別人可以看到的,例如下面圖片是土豪家的橙色鑰匙包,是專門用來存放仁恆濱江的大平層房子鑰匙的,私鑰是鑰匙包裡面實際開門的鑰匙。
你拿到鑰匙包沒有用的,你得拿到鑰匙盒裡面的私鑰才可以開啟土豪家房子大門。
土豪房東可以把很多的房子配成一樣的鎖,用一對公鑰/私鑰來開門,也可以不同的房子不同的鑰匙。
cleos wallet import ${引數} 私鑰
3) 賬戶是房子
房東可以給多個房子配一對鑰匙(鑰匙包和鑰匙),也可以不同房子配不同鑰匙。
另外,一個房子可以用2把鑰匙開啟,一把是owner鑰匙對,一把是active鑰匙對。
房子的owner鑰匙地址表示為房東的公鑰,表示主人產權歸屬,用它對應的私鑰可以開啟房子,這個鑰匙包是房東連小姨子也不會給的;
房子的active鑰匙對錶示為房客的公鑰,表示該使用者的私鑰可以開啟房子,房子出租後,房東就把這個鑰匙包給租客了;
cleos create account 節點 賬戶名 Owner的公鑰 Active的公鑰。
4
搭建實操
搭建實操的流程圖如下。
4. 1 啟動私鏈
1) 啟動keosd
keosd --http-server-address=127.0.0.1:8900
命令列介面錢包程式為 keosd,位於 eos/build/programs/keosd 路徑下,用於儲存交易簽名的私鑰。keosd在本地節點上執行,並將私鑰儲存在本地節點上。
預設情況下,keosd會在目錄 ~/eosio-wallet 中生成一個基礎的配置檔案 config.ini。該配置檔案中的wallet-dir指定了錢包檔案存放目錄。
另外,在執行命令列錢包時,可通過配置命令列引數 --config-dir指定config.ini配置檔案的目錄。該配置檔案中儲存用於接入http連結的伺服器配置http-server-address引數,以及其他用於資源共享的配置引數。
預設情況下,keosd將錢包檔案儲存在 ~/eosio-wallet 目錄下,錢包檔名為:<wallet-name>.wallet。例如,預設錢包檔名為 default.wallet。當建立了其他錢包後,在該目錄下會分別建立每個錢包檔案,例如當建立了一個名稱為"duncanwang"的錢包,會生成一個錢包檔案duncanwang.wallet。錢包檔案可以通過命令列引數--data-dir存放在指定的目錄中。
【預警】從V1.0.5開始,發現要先執行keosd後在執行nodeos才可以建立錢包。
成功輸出結果如下:
(複製程式碼點選“閱讀原文”)
2) 啟動私鏈
在新的命令列視窗輸入以下命令。
cd ~/eos/build/programs/nodeos
./nodeos -e -p eosio --plugin eosio::wallet_plugin --plugin eosio::chain_api_plugin --plugin eosio::history_api_plugin --replay-blockchain
在啟動nodeos時,需要新增引數eosio::wallet_plugin,否則的話,每次節點重啟,之前建立的錢包,賬號都不會載入進來。
--replay-blockchain表示清除資料庫內鏈的狀態,重新執行,它會導致重新啟動時先讀取之前的區塊進行載入。
【注意】 節點關閉後,錢包將會被加鎖。重新啟動nodeos後,需要使用unlock命令解鎖錢包。
例如:
duncanwang@duncanwang:~/eos$ cleos wallet unlock -n duncanwang
password: Unlocked: duncanwang
輸入nodes -help可以看到所有引數的幫助說明。
4.2 建立錢包
cleos wallet create -n duncanwang
建立duncanwang錢包成功,輸出結果如下:
duncanwang@duncanwang:~/eos$ cleos wallet create -n duncanwang
Creating wallet: duncanwang
Save password to use in the future to unlock this wallet.
Without password imported keys will not be retrievable.
"PW5JMZdES2Cds5LsPRUBRo2THEXpbFSM17Xmcd2XWG7XBd49wveTo"
【結果確認】
duncanwang@duncanwang:~$ cleos wallet list
Wallets:
[
"duncanwang *"
]
duanwang錢包已存在了,*表示該賬號已解鎖。
【問題1】 建立錢包重名,但是cleos wallet list看不到
duncanwang@duncanwang:~$ cleos wallet create -n duncanwang
Error 3120001: Wallet already exists
Try to use different wallet name.
【解決方法】
這個主要是執行的命令中沒有匯入錢包--plugin eosio::wallet_plugin這個引數,導致已建立錢包未載入,但是目錄下存在已建立的錢包檔案。
./nodeos -e -p eosio --plugin eosio::chain_api_plugin --plugin eosio::history_api_plugin --replay-blockchain
~/eosio-wallet 目錄下刪除檔案duncanwang.wallet即可重新建立。
【問題2】重啟節點後,cleos wallet list發現已建立的錢包等不存在。
duncanwang@duncanwang:~$ cleos wallet list
Wallets:
[
]
【解決方法1】
執行./nodeos命令時要帶引數--plugin eosio::wallet_plugin
【解決方法2】
後來發現這種方法有時也是不可行,cleos wallet list沒有看到錢包。
採用命令'cleos wallet open -n duncanwang'開啟錢包後,就正常載入進來了。
【問題3】建立錢包時提示keosd已執行,並且無法連線
duncanwang@duncanwang:~$ cleos wallet create -n duncanwang
"/usr/local/bin/keosd" launched
Unable to connect to keosd, if keosd is running please kill the process and try again.
【解決方法】
需要輸入以下命令把keosd重啟下。
ps -ef | grep keosd
kill -9 pid
keosd --http-server-address=127.0.0.1:8900
操作例項如下:
duncanwang@duncanwang:~$ ps -ef | grep keosd
duncanw+ 2439 1 0 07:14 pts/1 00:00:00 /usr/local/bin/keosd --http-server-address=::1:8900
duncanw+ 2441 2389 0 07:16 pts/1 00:00:00 grep --color=auto keosd
duncanwang@duncanwang:~$ kill -9 2439
4.3 錢包匯入系統賬號私鑰
1) 找到eosio的系統賬號的預設公鑰/私鑰對
找到配置檔案,例如以下地址,~/.local/share/eosio/nodeosconfig 的 config.ini,預設的私鑰/公鑰是一樣的。
signature-provider = EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV=KEY:5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3
2),錢包匯入系統賬號私鑰
> cleos wallet import 5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3 -n duncanwang
duncanwang@duncanwang:~/eos$ cleos wallet import 5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3 -n duncanwang
imported private key for: EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
3),檢視系統賬號資訊
以下命令可以檢視eosio系統賬號的金鑰和資源佔用情況。
> cleos get account eosio
duncanwang@duncanwang:~/eos/build$ cleos get account eosio
privileged: true
permissions:
owner 1: 1 EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
active 1: 1 EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
memory:
quota: unlimited used: 60.75 KiB
net bandwidth:
used: unlimited
available: unlimited
limit: unlimited
cpu bandwidth:
used: unlimited
available: unlimited
limit: unlimited
4.4 載入Bios合約
現在我們有一個錢包,並且載入了eosio帳戶的金鑰,我們可以設定一個預設的系統合約。為了開發的目的,可以使用預設的eosio.bios合約。通過此合約,您可以直接控制其他帳戶的資源分配,並呼叫其他特權API。在公開區塊鏈中,這個系統合約將管理其他賬戶的 token 抵押和解抵押操作,以為合約執行預留CPU、網路活動頻寬,以及預留記憶體。
eosio.bios合約可以在你的EOSIO原始碼資料夾中找到:contracts/eosio.bios。下面的命令序列,都假定是在EOSIO原始碼的根目錄執行。但是您可以通過指定完整路徑,從任意位置執行這個命令:${EOSIO_SOURCE}/build/contracts/eosio.bios。
這個命令序列的結果是,cleos發起一個包含兩個操作(actions)的交易(transaction):eosio::setcode和eosio::setabi。
程式碼定義了合約如何執行,abi描述了引數如何在二進位制和json表示之間進行轉換。雖然abi在技術上是可選的,但為了便於使用,所有的EOSIO工具都依賴於它。
輸入命令:
cleos set contract eosio build/contracts/eosio.bios -p eosio
輸出結果,表示本地執行成功。
duncanwang@duncanwang:~/eos$ cleos set contract eosio build/contracts/eosio.bios -p eosio
Reading WAST/WASM from build/contracts/eosio.bios/eosio.bios.wasm...Using already assembled WASM...
Publishing contract...
executed transaction: f4c1cc4e953710645a4849eb41cf92d9d3881c756b227323a3ade221e3807fbb 3720 bytes 12685 us
# eosio <= eosio::setcode {"account":"eosio","vmtype":0,"vmversion":0,"code":"0061736d0100000001621260037f7e7f0060057f7e7e7e7e...
# eosio <= eosio::setabi {"account":"eosio","abi":"0e656f73696f3a3a6162692f312e30050c6163636f756e745f6e616d65046e616d650f7065...
warning: transaction executed locally, but may not be confirmed by the network yet
4.5 建立並匯入新的金鑰對
1)建立新的金鑰對
cleos create key
建立金鑰對的輸出結果。
duncanwang@duncanwang:~/eos$ cleos create key
Private key: 5JZQmnt6ZtEzUADswgKgBwMp9qAwTSNM9JFHPRFu1FjrLjj49g7
Public key: EOS6EHAzvrpQ4wo1BPcAk86X6aGDARZgqTcAq1mJRF1SxEYgNGWN1
2) 匯入新的私鑰
cleos wallet import 5JZQmnt6ZtEzUADswgKgBwMp9qAwTSNM9JFHPRFu1FjrLjj49g7 -n duncanwang
輸出結果如下:
duncanwang@duncanwang:~/eos$ cleos wallet import 5JZQmnt6ZtEzUADswgKgBwMp9qAwTSNM9JFHPRFu1FjrLjj49g7 -n duncanwang
imported private key for: EOS6EHAzvrpQ4wo1BPcAk86X6aGDARZgqTcAq1mJRF1SxEYgNGWN1
3)檢視確認金鑰對是否匯入成功
cleos wallet keys
用於檢視錢包的金鑰對情況。
【輸出結果】
duncanwang@duncanwang:~/eos$ cleos wallet keys
[
"EOS6EHAzvrpQ4wo1BPcAk86X6aGDARZgqTcAq1mJRF1SxEYgNGWN1",
"EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV"
]
4.6 建立新賬號
建立賬號的命令:
cleos create account eosio {new_account} ownerkey {active_key}
其中eosio是超級使用者,需要靠超級使用者來建立其它的新使用者,eosio後面就是你的新使用者的使用者名稱.
除了新的賬號之外,命令後面還有兩個key:
Owner key
Active key
Owner key是什麼意思呢?Owner key表示分配給新賬號的一個Owner認證的公鑰。Active key是分配給新賬號一個Active認證的一個公鑰。
至於這兩個認證,我後面會給詳細介紹,這是兩個主要的許可權。我建立一個賬號,如果這個賬號要有Owner的許可權和Active的許可權,就必須要用這兩個key才能實現。
我們來總結一下剛才的操作,我們剛才操作是呼叫cleos create account建立了一個賬號,這個賬號的命名規則遵守下邊兩個規則:
小於13個字元;
僅包含這些字元:.12345abcdefghijklmnopqrstuvwxyz
另外,剛才給大家說到Owner key和Active key的概念。Owner key的概念就是你賬號的所有控制許可權,你只要有了Owner key,你可以對這個賬號的任何東西做任何的事兒,這是它的所有控制權。
而Active key只掌握了你的賬號資金的訪問許可權,也就是你如果有了Active這個許可權的話,你可以對這個賬號的資金進行轉移,但是你不能轉移這個賬號的所有權,或者不能做超過這個Active許可權其它的權利。
如果簡單的理解,Owner key就是對這個賬號的最高許可權,Active只是用來轉移資金而已。這也是與以太坊智慧合約開發的一個區別,以太坊賬號的許可權其實沒有這麼細分,它就只有一個賬號,我只要有這個賬號的公鑰和私鑰,我就可以做任何事情。
具體操作如下。
cleos create account eosio wangdenghui1 EOS6EHAzvrpQ4wo1BPcAk86X6aGDARZgqTcAq1mJRF1SxEYgNGWN1 EOS6EHAzvrpQ4wo1BPcAk86X6aGDARZgqTcAq1mJRF1SxEYgNGWN1
【錯誤現象】
duncanwang@duncanwang:~/eos$ cleos create account eosio wangdenghui1 EOS6EHAzvrpQ4wo1BPcAk86X6aGDARZgqTcAq1mJRF1SxEYgNGWN1 EOS6EHAzvrpQ4wo1BPcAk86X6aGDARZgqTcAq1mJRF1SxEYgNGWN1
Error 3050000: action exception
【解決方案-查詢賬號】
查詢發現該賬號已存在,之前輝哥建立過,忘記了。
duncanwang@duncanwang:~/eos$ cleos get accounts EOS6EHAzvrpQ4wo1BPcAk86X6aGDARZgqTcAq1mJRF1SxEYgNGWN1
{
"account_names": [
"wangdenghui1"
]
}
> cleos create account eosio boss EOS6EHAzvrpQ4wo1BPcAk86X6aGDARZgqTcAq1mJRF1SxEYgNGWN1 EOS6EHAzvrpQ4wo1BPcAk86X6aGDARZgqTcAq1mJRF1SxEYgNGWN1
建立成功輸出結果:
duncanwang@duncanwang:~/eos$ cleos create account eosio boss EOS6EHAzvrpQ4wo1BPcAk86X6aGDARZgqTcAq1mJRF1SxEYgNGWN1 EOS6EHAzvrpQ4wo1BPcAk86X6aGDARZgqTcAq1mJRF1SxEYgNGWN1
executed transaction: cb6801fe82816f94b447cbfb903ae8e9477f5c99920322d679a9c8c04347e536 200 bytes 367 us
# eosio <= eosio::newaccount {"creator":"eosio","name":"boss","owner":{"threshold":1,"keys":[{"key":"EOS6EHAzvrpQ4wo1BPcAk86X6aGD...
warning: transaction executed locally, but may not be confirmed by the network yet
4.6 總結
至此,基於私鏈環境搭建和準備工作已經完畢,接下來就可以在上面執行"Hello World"智慧合約了。
5
參考文件
1)eoshackathon/eos_dapp_development_cn 古千峰Github(https://github.com/eoshackathon/eos_dapp_development_cn)
2) github官網(https://github.com/EOSIO/eos/wiki)
3)本地環境(https://github.com/EOSIO/eos/wiki/Local-Environment)
本文作者:HiBlock區塊鏈技術佈道群-輝哥
原文釋出於簡書
原文連結:https://www.jianshu.com/p/533f849489b1
加微信baobaotalk_com,加入技術佈道群
線上課程推薦
【線上課程】4節課8小時培訓,《白話區塊鏈》作者蔣勇教你快速掌握區塊鏈智慧合約開發
線下活動推薦
技術工坊|(分享+實踐)1天學會區塊鏈Dapp+代幣開發(西安)
相關文章
- LaravelZero 從零實現區塊鏈(五)錢包、地址與金鑰Laravel區塊鏈
- 區塊鏈錢包操作使用簡單,通過私鑰,即可開啟和操作錢包區塊鏈
- 區塊鏈100講:區塊鏈為什麼叫“區塊”“鏈”?區塊鏈
- 從區塊鏈公司角度,分析區塊鏈錢包區塊鏈
- 區塊鏈錢包之ETH錢包生成區塊鏈
- 歐鏈·寧話區塊鏈第8集《EOS超級節點訪談:EOS Store 下》區塊鏈
- 區塊鏈錢包開發區塊鏈
- 區塊鏈100講:加密貨幣隱私性概述區塊鏈加密
- 區塊鏈應用的金鑰管理區塊鏈
- 區塊鏈錢包之BTC錢包地址生成區塊鏈
- 區塊鏈100講: 區塊鏈共識的確定性區塊鏈
- 區塊鏈100講:區塊鏈中的隨機數區塊鏈隨機
- 區塊鏈錢包科普知識區塊鏈
- 什麼是區塊鏈錢包區塊鏈
- 區塊鏈錢包的技能原理區塊鏈
- 區塊鏈錢包-android篇區塊鏈Android
- 區塊鏈應用:Bitshares 入門(一) 搭建Bitshares本地全量節點(重錢包)區塊鏈
- 區塊鏈錢包支付系統:區塊鏈支付平臺開發區塊鏈
- 長沙讀懂區塊鏈錢包!區塊鏈
- 比特幣的私鑰【區塊鏈生存訓練】比特幣區塊鏈
- 關於區塊鏈錢包的六大重點區塊鏈
- 區塊鏈多幣種錢包開發區塊鏈交易平臺搭建區塊鏈
- 區塊鏈技術開發 區塊鏈錢包交易所開發區塊鏈
- 區塊鏈錢包分析第15期-Kcash區塊鏈
- 區塊鏈錢包開發(Android篇)區塊鏈Android
- 區塊鏈錢包開發與型別區塊鏈型別
- 什麼是區塊鏈錢包開發區塊鏈
- 區塊鏈多鏈錢包開發詳情版丨區塊鏈多鏈錢包系統開發實現技術方案及邏輯區塊鏈
- 即區塊鏈的加密錢包, z金儲存在區塊鏈上, z 產的安全效能相對較高區塊鏈加密
- 區塊鏈錢包系統開發:區塊鏈支付平臺系統開發區塊鏈
- 區塊鏈講解區塊鏈
- Hyperledger Fabric 超級賬本 java開發區塊鏈環境搭建Java區塊鏈
- Kcash區塊鏈錢包系統app開發區塊鏈APP
- 區塊鏈記賬原理區塊鏈
- 區塊鏈2.0以太坊環境搭建區塊鏈
- 區塊鏈之比特幣的私鑰,公鑰和地址是什麼?區塊鏈比特幣
- 區塊鏈100講:Hyperledger Fabric 中的鏈碼(智慧合約)區塊鏈
- 《區塊鏈100問》第51-60節區塊鏈