本文作者:陳進堅
博客地址: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
錢包的兩個公鑰EOS5Fwtc4vnQE8AigimXvHrERrK7XFpycQ8Dijq2611timbVTReDt
和EOS75hPAeMGgAw9FYLTAHqjHyicjW82bB1q9grXqDtCdMDMpe1eoa
分別作爲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