區塊鏈——在Ubuntu16.04下搭建以太坊私有鏈網絡
安裝環境
打開終端,依次輸入以下命令
sudo apt-get update
sudo apt-get install software-properties-common
sudo add-apt-repository -y ppa:ethereum/ethereum
sudo add-apt-repository -y ppa:ethereum/ethereum-dev
sudo apt-get update
sudo apt-get install ethereum
安裝完成後,輸入geth -h,如果有列出信息則說明安裝成功,可查看列出信息,方便後續的操作
創建創世區塊
作爲區塊鏈, 鏈子總要有個頭,所以需要創建一個創世塊作爲頭部,纔好往下添加,創世文件名稱命名爲gen_hbt.json,內容如下,爲json格式
{
"config": {
"chainId": 20191111,
"homesteadBlock": 0,
"eip150Block": 0,
"eip155Block": 0,
"eip158Block": 0
},
"coinbase" : "0x0000000000000000000000000000000000000000",
"difficulty" : "0x20000",
"extraData" : "",
"gasLimit" : "0xffffffff",
"nonce" : "0x0000000000000042",
"mixhash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
"parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
"timestamp" : "0x00",
"alloc" : {}
}
文件內容字段說明如下
- 其中gasLimit應填的比較大,否則在接下去測試轉賬時會提示錯誤,提示超出gasLimit
- alloc爲爲預置賬號充值以太幣,這些一般是在ico階段參與的用戶,可以在創世塊中爲這些初期支持用戶分發以太幣
- 打開終端,cd到搭建一個文件夾中,在終端中輸入
geth --datadir ./data01 init gen_hbt.json
出現Successfully表示初始化成功了,其中geth/chaindata中存放的是區塊數據,keystore中存放的是賬戶數據。
啓動geth私有鏈客戶端
在終端輸入:
geth --syncmode full --datadir ./data01 --identity "my etherum" --ipcdisable --allow-insecure-unlock --rpc --rpccorsdomain "*" --rpcapi "db,eth,net,web3" --rpcport "8545" --port "30303" --networkid 20191111 --nodiscover console 2>>geth01.log
如果想將Ubuntu作爲永久區塊鏈節點使用,當使用nohup命令時,Geth啓動參數console必須去掉,否則Geth會自動停止。
使用不同的端口,記得要加—ipcdisable參數,否則會報錯,因爲同時打開兩個geth進程
創建賬戶
在控制檯中輸入
personal.newAccount("123456")
,注意“123456”就是密碼了,請自行更改爲其他的字符串。
爲什麼要創建賬戶?
因爲接下去要挖礦,沒有賬戶是挖不了礦的,因爲挖礦成功後,系統會獎勵5個ETH,需要有賬戶接受獎勵。
挖礦
在控制檯輸入
miner.start()
開始挖礦。括號裏填數字,如miner.start(1)
表示1個線程,默認是4個線程
停止挖礦
miner.stop()
挖到一個區塊就停止
miner.start();admin.sleepBlocks(1);miner.stop()
添加節點(在本地ubuntu添加服務器ubuntu的節點)
-
在服務器上
在服務器上按同樣的命令搭建一個以太坊私有鏈節點,並在服務器上執行命令獲取當前節點的地址:
admin.nodeInfo.enode
查詢服務器的ip地址:10.10.70.208 -
在本地
複製服務器上的節點地址,並將其中的127.0.0.1 改成之前查到的服務器上的ip地址10.10.70.208,然後在本地終端中通過
admin.addPeer("其他節點的地址")
進行連接
即請注意這張圖中的服務器地址與上一張圖中的服務器地址的區別:127.0.0.1 改成了之前查到的服務器上的ip地址10.10.70.208
可以通過net.peerCount
查詢連接的節點個數
轉賬
eth.sendTransaction({from:支付方帳號, to:接收方帳號,value:以太幣數量})
如:
設置轉賬金額
amount = web3.toWei(5, 'ether')
解鎖賬戶
personal.unlockAccount(eth.accounts[0])
或者
personal.unlockAccount(eth.accounts[0], "lyh001", 300)
# "lyh001"是密碼, 300是解鎖時間,0表示沒有限制
發送交易
eth.sendTransaction({from:eth.accounts[0], to:"0x94e3d08df19b19dc1dac61d4bf7354013fdad9fc", value:amount})
查看待確定交易
eth.getBlock("pending", true).transactions
> eth.getBlock("pending", true).transactions
[{
blockHash: "0xe0665773366b0664e668ee268928cc9631764483b5729983705d45157dc62df8",
blockNumber: 5139,
from: "0x96742c1819ae615e8fe1d5a1c67d647572355ddb",
gas: 10000000,
gasPrice: 1000000000,
hash: "0x3cbdc1dcd06eb7f7f46e1d45b8ea0fe786cd4a84bafa6b7fe24b4721696ee0ff",
input: "0x60fe47b10000000000000000000000000000000000000000000000000000000000001f77",
nonce: 7,
r: "0x1aaa6ae78df9d07638f7796dd1aadf28f0cbaced17aa4c2ec5c1f7eca4aaa86e",
s: "0x6b9abcc784fdac3773ca246dc37fc694bbf2711ecf4c9d536575059f9a3ff42c",
to: "0x15e618f0df946009f290924637507ccc0e446b9f",
transactionIndex: 0,
v: "0x2682f32",
value: 0
}]