Ubuntu下EOS測試環境(私有鏈)搭建

本文作者:陳進堅
博客地址:https://jian1098.github.io
CSDN博客:https://blog.csdn.net/c_jian
聯繫方式:[email protected]

環境要求

  • Ubuntu 16.04
  • 內存4G以上(官方要求8G,可以通過修改文件降低要求)

編譯安裝

clone源碼

jian@ubuntu:~$ git clone https://github.com/eosio/eos.git --recursive

需要注意的是,MongoDB是EOS的依賴項之一,而在牆內下載該依賴項會失敗,請先科學上網,再開始編譯,否則會無法下載MongoDB導致編譯失敗。

編譯

jian@ubuntu:~$ cd eos
jian@ubuntu:~/eos$ sudo ./eosio_build.sh   #需要3個小時左右,遇到錯誤請往下看

如果提示下面的信息,說明內存達不到要求,至少需要7G以上內存空間

    ......
    Your system must have 7 or more Gigabytes of physical memory installed.
    Exiting now.

將VMware的內存增加到4G多一點,記住要多一點,然後修改./scripts/eosio_build_ubuntu.sh文件,查找7000,將7000修改爲4000即可,意思是將配置要求降低到4G內存。

如果看到下面的5個紅色大字表示已經編譯完成了,除開填坑的時間花了整整4個小時。

[100%] Built target print_floats


	 _______  _______  _______ _________ _______
	(  ____ \(  ___  )(  ____ \\__   __/(  ___  )
	| (    \/| (   ) || (    \/   ) (   | (   ) |
	| (__    | |   | || (_____    | |   | |   | |
	|  __)   | |   | |(_____  )   | |   | |   | |
	| (      | |   | |      ) |   | |   | |   | |
	| (____/\| (___) |/\____) |___) (___| (___) |
	(_______/(_______)\_______)\_______/(_______)

	EOSIO has been successfully built. 00:38:51

	To verify your installation run the following commands:

	export PATH=${HOME}/opt/mongodb/bin:$PATH
	/home/jian/opt/mongodb/bin/mongod -f /home/jian/opt/mongodb/mongod.conf &
	cd /home/jian/eos/build; make test

	For more information:
	EOSIO website: https://eos.io
	EOSIO Telegram channel @ https://t.me/EOSProject
	EOSIO resources: https://eos.io/resources/
	EOSIO Stack Exchange: https://eosio.stackexchange.com
	EOSIO wiki: https://github.com/EOSIO/eos/wiki

編譯完成後安裝

jian@ubuntu:~/eos$ cd build
jian@ubuntu:~/eos/build$ sudo make install

在./programs這個文件夾中可以找到eos的幾個核心程序

  • nodeos: 區塊鏈服務器節點生成組件。nedeos的配置文件位於~/Library/Application Support/eosio/nodeos/config文件夾中,區塊數據存儲在文件~/Library/Application Support/eosio/nodeos/data
  • cleos: 和區塊鏈交互的接口命令
  • keosd: EOS 錢包,作用是存儲私鑰,以便cleos用以簽署交易併發送到區塊鏈中。keosd在本機運行,並且將私鑰存儲在本地。keosd會隨着cleos自動啓動。
  • eosio-launcher:節點網絡組成和部署的應用

啓動節點

jian@ubuntu:~/eos/build$ cd ~/eos/build/programs/nodeos
jian@ubuntu:~/eos/build/programs/nodeos$ sudo ./nodeos -e -p eosio -d /data/eos --plugin eosio::chain_api_plugin --plugin eosio::history_api_plugin --plugin eosio::bnet_plugin --contracts-console --filter-on "*" --access-control-allow-origin "*" --max-transaction-time=1000 --verbose-http-errors 

參數說明:

-p:表示使用了 本地測試系統提供的原始賬戶 eosio 賬戶的權限

-d:區塊數據存放目錄

–plugin:插件

-e:開啓Stale Production,即即便當前時間已經超過規定的區塊生產時限,也繼續產生

–plugin eosio::chain_api_plugin:開啓區塊鏈JSON API插件。

–plugin eosio::history_api_plugin:開啓歷史數據插件,有了這個插件,便能查詢許多不在State中的數據,譬如一個公鑰所對應的所有賬戶等等。

–contracts-console:開啓合約控制檯。如果不開啓的話,合約中調用print函數輸出的信息將會不可見。

–filter-on “*”:開啓所有賬戶的歷史紀錄。默認狀態下,節點不會記錄賬戶的歷史數據,從而使得命令cleos get actions返回空。

–access-control-allow-origin “*”:允許任意域名跨域訪問API,如果不開啓,在dApp開發中,網站會報錯。

上面的啓動命令比較長,可以將參數寫入配置文件

jian@ubuntu:~/eos/build/programs/cleos$ cd ~/.local/share/eosio/nodeos/config
jian@ubuntu:~/.local/share/eosio/nodeos/config$ vi config.ini 

修改或新增以下內容:

	# 下面是修改的
    enable-stale-production = true # 修改false爲true
    filter-on = *
    producer-name = eosio
    
    # 下面的插件是新增的,加在文件最後
    # Load the block producer plugin, so you can produce blocks
    plugin = eosio::producer_plugin
    # As well as API and HTTP plugins
    plugin = eosio::chain_api_plugin
    plugin = eosio::http_plugin
    # This will be used by the validation step below, to view history
    plugin = eosio::history_api_plugin
    plugin = eosio::bnet_plugin

然後啓動節點

jian@ubuntu:~/eos/build$ cd ~/eos/build/programs/nodeos
jian@ubuntu:~/eos/build/programs/nodeos$ sudo ./nodeos

停止節點

按下Ctrl+C即可停止節點

導入私鑰

首先我們需要創建一個默認的錢包,請記住的到的私鑰

jian@ubuntu:~$ cd ~/eos/build/programs/cleos
jian@ubuntu:~/eos/build/programs/cleos$ sudo ./cleos wallet create --to-console
"/home/jian/eos/build/programs/keosd/keosd" launched
Creating wallet: default
Save password to use in the future to unlock this wallet.
Without password imported keys will not be retrievable.
"PW5JXUScSE7QnskHEjuwXBVwfYnjozaHFC6MA4ouDrLX9L7XZNkzF"

這裏創建了錢包名爲default,密碼爲"PW5JXUScSE7QnskHEjuwXBVwfYnjozaHFC6MA4ouDrLX9L7XZNkzF"的錢包。

打開錢包看看有什麼內容 (如果錢包已經鎖定,需要先解鎖錢包):

jian@ubuntu:~/eos/build/programs/cleos$ sudo ./cleos wallet keys
[
  "EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV"
]

可以看到新創建的錢包中有一個密鑰對,這是唯一的初始帳戶eosio的主密鑰對,不要將上述主密鑰與你將來添加的密鑰混淆。

進入配置文件

jian@ubuntu:~/eos/build/programs/cleos$ cd ~/.local/share/eosio/nodeos/config
jian@ubuntu:~/.local/share/eosio/nodeos/config$ vi config.ini 

找到這一行

signature-provider = EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV=KEY:5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3

這是指定了默認區塊產生者eosio的公私鑰對,其中公鑰爲:EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV

相對應的私鑰爲:5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3

爲什麼錢包中已經有密鑰對了還要再添加?

每個EOS帳戶都擁有owner(所有者)和active(活動權限)兩個權限,因此,在大多數情況下,需要創建兩個密鑰,以便可以將一個密鑰與每個權限相關聯。

首先創建兩個密鑰對

jian@ubuntu:~$ cd ~/eos/build/programs/cleos
jian@ubuntu:~/eos/build/programs/cleos$ sudo ./cleos create key --to-console
Private key: 5JxhYZZnFJJMRrf7KkSHNLFq2LM4eZigJfeKXXYSa1TvPMdWtLc
Public key: EOS5Fwtc4vnQE8AigimXvHrERrK7XFpycQ8Dijq2611timbVTReDt

jian@ubuntu:~/eos/build/programs/cleos$ sudo ./cleos create key --to-console
Private key: 5JXNT5zRfFDwzc7mKmd3AiYjT9dvfDosiFAo1drkneY6TrhTRUp
Public key: EOS75hPAeMGgAw9FYLTAHqjHyicjW82bB1q9grXqDtCdMDMpe1eoa

然後依次將兩個Private key導入到創建的默認錢包中

jian@ubuntu:~/eos/build/programs/cleos$ sudo ./cleos wallet import --private-key 5JxhYZZnFJJMRrf7KkSHNLFq2LM4eZigJfeKXXYSa1TvPMdWtLc
imported private key for: EOS5Fwtc4vnQE8AigimXvHrERrK7XFpycQ8Dijq2611timbVTReDt
jian@ubuntu:~/eos/build/programs/cleos$ sudo ./cleos wallet import --private-key 5JXNT5zRfFDwzc7mKmd3AiYjT9dvfDosiFAo1drkneY6TrhTRUp
imported private key for: EOS75hPAeMGgAw9FYLTAHqjHyicjW82bB1q9grXqDtCdMDMpe1eoa

可以看到導入私鑰後會自動給出對應的公鑰。

在次打開默認錢包可以看到默認錢包中已經有3個密鑰對了

jian@ubuntu:~/eos/build/programs/cleos$ sudo ./cleos wallet keys
[
  "EOS5Fwtc4vnQE8AigimXvHrERrK7XFpycQ8Dijq2611timbVTReDt",
  "EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV",
  "EOS75hPAeMGgAw9FYLTAHqjHyicjW82bB1q9grXqDtCdMDMpe1eoa"
]

發行代幣

在部署eosio.EOStem合約之前,必須先創建如下賬戶,創建賬號使用eosio的公私鑰對:

EOStemAccounts = [
    'eosio.bpay',
    'eosio.msig',
    'eosio.names',
    'eosio.ram',
    'eosio.ramfee',
    'eosio.saving',
    'eosio.stake',
    'eosio.token',
    'eosio.upay',
]

創建命令如下:

sudo ./cleos create account eosio eosio.bpay EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV;
sudo ./cleos create account eosio eosio.msig EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV;
sudo ./cleos create account eosio eosio.names EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV;
sudo ./cleos create account eosio eosio.ram EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV;
sudo ./cleos create account eosio eosio.ramfee EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV;
sudo ./cleos create account eosio eosio.saving EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV;
sudo ./cleos create account eosio eosio.stake EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV;
sudo ./cleos create account eosio eosio.token EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV;
sudo ./cleos create account eosio eosio.upay EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV;

執行的結果如下:

executed transaction: 9da6a67895e9efc1a794e4beae1f8134e6a3a0e866a5092cdfb55f77b7642c5d  200 bytes  192 us
#         eosio <= eosio::newaccount            {"creator":"eosio","name":"eosio.upay","owner":{"threshold":1,"keys":[{"key":"EOS6MRyAjQq8ud7hVNYcfn...
warn  2018-11-28T03:33:33.304 thread-0  main.cpp:482                  print_resuwarning: transaction executed locally, but may not be confirmed by the network yet
......

接下來將代幣合約部署到eosio.token賬戶中:

jian@ubuntu:~/eos/build/programs/cleos$ cd ~/eos/build/contracts  # 進入編譯後的合約目錄
jian@ubuntu:~/eos/build/contracts$ sudo ~/eos/build/programs/cleos/cleos set contract eosio.token ./eosio.token

#執行結果:
Reading WASM from ./eosio.token/eosio.token.wasm...
Publishing contract...
executed transaction: 69b358aab5d199797aa8165b5969646881aed401ea03b2b6def43affdd183f3e  8104 bytes  27919 us
#         eosio <= eosio::setcode               {"account":"eosio.token","vmtype":0,"vmversion":0,"code":"0061736d01000000017e1560037f7e7f0060057f7e...
#         eosio <= eosio::setabi                {"account":"eosio.token","abi":"0e656f73696f3a3a6162692f312e30010c6163636f756e745f6e616d65046e616d65...
warn  2018-11-28T03:41:50.674 thread-0  main.cpp:482                  print_resuwarning: transaction executed locally, but may not be confirmed by the network yet

創建1億個EOS代幣(這裏的EOS幣相當於主網中的EOS):

jian@ubuntu:~/eos/build/contracts$ sudo ~/eos/build/programs/cleos/cleos push action eosio.token create '["eosio","10000000000.0000 SYS",0,0,0]' -p eosio.token

#執行結果:
executed transaction: cb0973dfa4a52dd0c99ef56834c84d391dda565a4aeeafaaafaef5642190f4e4  120 bytes  1436 us
#   eosio.token <= eosio.token::create          {"issuer":"eosio","maximum_supply":"100000000.0000 EOS"}
warn  2018-11-28T03:44:50.857 thread-0  main.cpp:482                  print_resuwarning: transaction executed locally, but may not be confirmed by the network yet

發行代幣,數量:10000000000,代幣符號:EOS。

jian@ubuntu:~/eos/build/contracts$ sudo ~/eos/build/programs/cleos/cleos push action eosio.token issue '["eosio","10000000000.0000 EOS","issue"]' -p eosio

# 執行結果
executed transaction: 59f8a3fe587335f5c3ebdd12ac7a39f638cf028966a6efa2250f1244e82f178d  128 bytes  1288 us
#   eosio.token <= eosio.token::issue           {"to":"eosio","quantity":"10000000000.0000 EOS","memo":"memo"}
warn  2018-11-28T03:54:16.092 thread-0  main.cpp:482                  print_resuwarning: transaction executed locally, but may not be confirmed by the network yet

查詢代幣數量

jian@ubuntu:~/eos/build/contracts$ sudo ~/eos/build/programs/cleos/cleos get currency balance eosio.token eosio

10000000000.0000 EOS

創建賬號

在EOS中,爲了控制權限,創建賬號是需要指定一個創建者的,例如默認錢包的創建者是eosio,所以創建default賬號中含有eosio的私鑰。

創建賬戶的格式如下:

cleos create account AUTHORIZING_ACCOUNT NEW_ACCOUNT OWNER_KEY ACTIVE_KEY
  • authorizing_account 是新賬戶的創建者。在此教程中,由於我們運行的是一個單節點測試網絡,所以我們擁有一個名爲eosio的系統賬戶,因此我們使用eosio作爲新賬戶的創建者

  • new_account 是要創建的賬戶名稱

  • owner_key 是賬戶owner權限的公鑰

  • active_key 是賬戶active權限的公鑰

我們使用account1作爲新賬戶名稱,使用eosio作爲新賬戶的創建者,使用之前生成並導入default錢包的兩個公鑰EOS5Fwtc4vnQE8AigimXvHrERrK7XFpycQ8Dijq2611timbVTReDtEOS75hPAeMGgAw9FYLTAHqjHyicjW82bB1q9grXqDtCdMDMpe1eoa分別作爲owner權限和active權限的公鑰,注意這裏是使用公鑰!!!

jian@ubuntu:~/eos/build/programs/cleos$ sudo ./cleos create account eosio account1 EOS5Fwtc4vnQE8AigimXvHrERrK7XFpycQ8Dijq2611timbVTReDt EOS75hPAeMGgAw9FYLTAHqjHyicjW82bB1q9grXqDtCdMDMpe1eoa

我這裏報錯了,因爲交易是需要RAM資源的。如果沒有報錯請忽略下面一步。

Error 3080001: Account using more than allotted RAM usage
Error Details:
account account1 has insufficient ram; needs 2996 bytes has 0 bytes

將創建命令改爲下面的才能成功

jian@ubuntu:~/eos/build/programs/cleos$ sudo ./cleos  system newaccount eosio account1 EOS5Fwtc4vnQE8AigimXvHrERrK7XFpycQ8Dijq2611timbVTReDt EOS75hPAeMGgAw9FYLTAHqjHyicjW82bB1q9grXqDtCdMDMpe1eoa --stake-net '0 EOS' --stake-cpu '0 EOS' --buy-ram-kbytes 3 -x 30


executed transaction: 5171d92b16934b8a773a57e617aba5443f5394551cba376eb2d61788ea7460b4  248 bytes  1448 us
#         eosio <= eosio::newaccount            {"creator":"eosio","name":"account1","owner":{"threshold":1,"keys":[{"key":"EOS5Fwtc4vnQE8AigimXvHrE...
#         eosio <= eosio::buyrambytes           {"payer":"eosio","receiver":"account1","bytes":3072}
#   eosio.token <= eosio.token::transfer        {"from":"eosio","to":"eosio.ram","quantity":"0.4447 SYS","memo":"buy ram"}
#         eosio <= eosio.token::transfer        {"from":"eosio","to":"eosio.ram","quantity":"0.4447 SYS","memo":"buy ram"}
#     eosio.ram <= eosio.token::transfer        {"from":"eosio","to":"eosio.ram","quantity":"0.4447 SYS","memo":"buy ram"}
#   eosio.token <= eosio.token::transfer        {"from":"eosio","to":"eosio.ramfee","quantity":"0.0023 SYS","memo":"ram fee"}
#         eosio <= eosio.token::transfer        {"from":"eosio","to":"eosio.ramfee","quantity":"0.0023 SYS","memo":"ram fee"}
#  eosio.ramfee <= eosio.token::transfer        {"from":"eosio","to":"eosio.ramfee","quantity":"0.0023 SYS","memo":"ram fee"}
warn  2018-12-05T10:49:19.302 thread-0  main.cpp:482                  print_resuwarning: transaction executed locally, but may not be confirmed by the network yet

查詢剛剛創建的賬號:

jian@ubuntu:~/eos/build/programs/cleos$ sudo ./cleos get account account1

created: 2018-12-05T10:49:19.500
permissions: 
     owner     1:    1 EOS5Fwtc4vnQE8AigimXvHrERrK7XFpycQ8Dijq2611timbVTReDt
     active    1:    1 EOS75hPAeMGgAw9FYLTAHqjHyicjW82bB1q9grXqDtCdMDMpe1eoa
memory: 
     quota:     2.982 KiB    used:     2.926 KiB  

net bandwidth: 
     delegated:       0.0000 SYS           (total staked delegated to account from others)
     used:                 0 bytes
     available:            0 bytes
     limit:                0 bytes

cpu bandwidth:
     delegated:       0.0000 SYS           (total staked delegated to account from others)
     used:                 0 us   
     available:            0 us   
     limit:                0 us   

鎖定錢包

jian@ubuntu:~/eos/build/programs/cleos$ sudo ./cleos wallet lock -n jian
Locked: jian

keosd會在沒有錢包指令的15分鐘後自動鎖定錢包,可以在~/eosio-wallet/config.ini中進行時長修改。可以設置一個超大數來取消這項功能。如果設爲0,將會導致錢包永久鎖定。

解鎖錢包

沒有-n指定錢包名會解鎖默認錢包,默認錢包解鎖密碼是"導入私鑰"中創建錢包時得到的PW開頭的私鑰

jian@ubuntu:~/eos/build/programs/cleos$ sudo ./cleos wallet unlock -n jian
password: Unlocked: jian

再次查看錢包,可以看到有*號表示已經解鎖了

jian@ubuntu:~/eos/build/programs/cleos$ sudo ./cleos wallet list
Wallets:
[
  "default",
  "jian *"
]

發送交易

轉100個幣到account1賬號中

jian@ubuntu:~/eos/build/programs/cleos$ sudo ./cleos push action eosio.token transfer '["eosio", "account1","100.0000 EOS","memo"]' -p eosio

查詢account1賬號的餘額

jian@ubuntu:~/eos/build/programs/cleos$ sudo ./cleos get currency balance eosio.token account1
100.0000 EOS

參考文章

https://www.jianshu.com/nb/24907261

https://zhuanlan.zhihu.com/p/40009564

https://blog.csdn.net/littlefool5201314/article/details/79869114

https://www.jianshu.com/p/13c7bddacfd9

https://www.bcskill.com/index.php/archives/21.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章