區塊鏈100講:EOS環境搭建入門(私鏈節點-錢包-密鑰-帳號)

image

1

摘要

【本文目標】node

經過本文實踐,能在已編譯的EOS V1.0.5版本環境上,完成私鏈節點啓動,錢包建立,密鑰導入和帳號建立等內容。ios

【前置條件】git

你已完成了EOS編譯,編譯測試成功。未完成的可參考如何在UBUNTU虛擬機上編譯EOS完成環境搭建?(附代碼)完成相關配置。github

【技術收穫】 1)EOS的節點,錢包,密鑰,帳號的概念和理解 2)EOS錢包/帳號的創建和遇到的問題分析及解決方法數據庫

【說明】json

EOS版本尚未穩定下來,即便完成了V1.0.2版本環境搭建的人,到V1.0.5時仍是摔在了坑裏。輝哥經過踩坑分析給你們提供儘量多的知識和解決思路,你們在V1.0.5之後的版本部署可參考文章和以錯誤關鍵字搜索官網的issue網址(https://github.com/EOSIO/eos/issues)獲取更多知識。api

2

EOSIO整體框架

EOSIO有多個程序模塊組成,常常會用到的有如下三個模塊:服務器

下圖是上面三個工具的關係:

image

另外,還有智能合約的編譯工具eosiocpp

3

EOS系統中錢包,密鑰對,帳號,智能合約的關係

相對其餘區塊鏈公鏈,EOS系統的組合關係比較自由,也帶來了理解上的困難。輝哥結合本身的理解,以中國大地上人們最關係的房子爲例,作比喻介紹。

1) 錢包是土豪房東

土豪能夠有不少的房子和各類開門的鑰匙。上海這個城市有不少個土豪房東,因此一個節點能夠建立多個錢包。

cleos wallet create ${參數}

2)鑰匙用來打開房東門的。

鑰匙分爲私鑰和公鑰。公鑰是別人能夠看到的,例以下面圖片是土豪家的橙色鑰匙包,是專門用來存放仁恆濱江的大平層房子鑰匙的,私鑰是鑰匙包裏面實際開門的鑰匙。

你拿到鑰匙包沒有用的,你得拿到鑰匙盒裏面的私鑰才能夠打開土豪家房子大門。

土豪房東能夠把不少的房子配成同樣的鎖,用一對公鑰/私鑰來開門,也能夠不一樣的房子不一樣的鑰匙。

cleos wallet import ${參數} 私鑰

3) 帳戶是房子

房東能夠給多個房子配一對鑰匙(鑰匙包和鑰匙),也能夠不一樣房子配不一樣鑰匙。

另外,一個房子能夠用2把鑰匙打開,一把是owner鑰匙對,一把是active鑰匙對。

房子的owner鑰匙地址表示爲房東的公鑰,表示主人產權歸屬,用它對應的私鑰能夠打開房子,這個鑰匙包是房東連小姨子也不會給的;

房子的active鑰匙對錶示爲房客的公鑰,表示該用戶的私鑰能夠打開房子,房子出租後,房東就把這個鑰匙包給租客了;

cleos create account 節點 帳戶名 Owner的公鑰 Active的公鑰。

4

搭建實操

搭建實操的流程圖以下。

image

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才能夠建立錢包。

成功輸出結果以下:

image

image

(複製代碼點擊「閱讀原文」)

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能夠看到全部參數的幫助說明。

image

image

image

image

image

image

image

image

image

image

image

image

image

image

image

image

image

image

image

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 古千峯Githubhttps://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小時培訓,《白話區塊鏈》做者蔣勇教你快速掌握區塊鏈智能合約開發

image

線下活動推薦

技術工坊|(分享+實踐)1天學會區塊鏈Dapp+代幣開發(西安)

image

相關文章
相關標籤/搜索