自己動手部署以太坊聯盟鏈
阿新 • • 發佈:2019-01-22
------------------------------------------------------
# 假設已經在Ubunbu 14.04 LTS上安裝好了以太坊客戶端Geth------------------------------------------------------
## 使用Geth部署以太坊聯盟鏈
* 以太坊Geth客戶端提供了以太坊協議相關的許多功能,使用者只需對創世區塊、Geth引數等進行配置,就可以在自己搭建一個私有的以太坊聯盟鏈網路。下面以同一臺Ubuntu系統PC為例,使用Geth搭建一個以太坊聯盟鏈網路。
## 創世區塊檔案genesis.json
__創世區塊檔案genesis.json是區塊鏈最重要的識別標誌之一__,每一條區塊鏈都有唯一識別的創世區塊檔案,如果兩臺機器啟動Geth時所選用的創世區塊檔案不同,就無法被識別為同一條區塊鏈的成員。因此,同一條聯盟鏈中的所有節點必須使用同一份創世區塊檔案進行初始化配置。
下面是一個創世區塊檔案genesis.json的示例。
{
"config": {
"chainId": 110,
"homesteadBlock": 0,
"eip155Block": 0,
"eip158Block": 0
},
"alloc" : {
"0x< # 某賬戶地址A # >": {"balance": "1000000000000000000"},
"0x< # 某賬戶地址B # >": {"balance": "2000000000000000000"},
"0x< # 某賬戶地址C # >": {"balance": "3000000000000000000"}
},
"coinbase" : "0x0000000000000000000000000000000000000000",
"difficulty" : "0x400",
"extraData" : "",
"gasLimit" : "0x2fefd8",
"nonce" : "0x0000000000000000",
"mixhash" :
"0x0000000000000000000000000000000000000000000000000000000000000000",
"parentHash" :
"0x0000000000000000000000000000000000000000000000000000000000000000",
"timestamp" : "0x00"
}
其中,config中的內容是區塊鏈相關的基本配置引數,最重要的是鏈編號chainId,這是用於標識該區塊鏈的編號,這裡設為110。alloc中為以太坊賬戶資訊,可以留空,等待部署完成後再啟動以太坊建立賬戶,也可以預先配置好以太坊賬戶及其餘額,這裡的賬戶餘額是以wei為單位。其下的coinbase是聯盟鏈挖礦的收益賬戶,可以設定為零地址,留到執行以太坊挖礦之前再設定。difficulty是初始的挖礦難度,可以設定為較低數值,如0x400。gasLimit為每個區塊所消耗的Gas限制。其餘的如extraData、nonce、mixhash、parentHash以及timestamp等均可以設定為零或留空。
## 初始化配置
建立完創世區塊檔案之後,接下來需要建立以太坊聯盟鏈賬戶。以太坊賬戶由一對公私鑰組成,使用者首先設定賬戶密碼,然後使用Geth由賬戶密碼生成一對公私鑰,再由公鑰生成賬戶地址,最後將賬戶地址新增到創世區塊檔案genesis.json中。
具體操作如下:
* 開啟一個以太坊節點
> geth --datadir testNet console
* 檢視網路中賬戶資訊
> eth.accounts
[]
賬戶為空
* 建立以太坊賬戶
> personal.newAccount()
輸入密碼即可建立以太坊賬戶
> eth.accounts
["0x15e504a51e91ee6250412e595a00b49b9d4cab1d"]
賬戶建立成功!
將該地址複製到genesis.json的alloc引數中。
## 建立聯盟鏈節點
然後將genesis.json檔案和testNet資料夾複製傳輸到另外虛擬機器中,並將testNet重新命名為testNet1。接下來使用以下命令建立聯盟鏈節點。
> geth --datadir ./testNet1 init ./genesis.json
## 搭建聯盟鏈網路
### 獲取完整節點地址
在每臺機器上完成聯盟鏈節點初始化配置之後,接下來需要將各個節點連線起來。首先要確認網路連通並且各機器的防火牆已正確配置,Geth所使用的埠正常開放(Geth常用埠有8545、30303等),然後在每個節點上使用以下命令啟動Geth並獲取節點的地址。
> geth --datadir ./testNet1 --networdid 110 console
然後輸入:
> admin.nodeInfo.enode
enode返回的節點資訊格式如下,包含節點的公鑰地址和Geth埠號(預設為30303)。
"enode://8f3333a83d31763a36ec9fbb0a402a5473a409b0b3fe43d32f65c7d6619e52842
將其中的“[::]”部分替換為該機器的公網IP地址,即可得到該節點的完整地址。
### 建立靜態節點檔案
在任一節點的.\testNet\geth 目錄下建立靜態節點檔案static-nodes.json,並寫入其他節點的完整地址資訊,格式如下:
[
"enode://< node1 public key >@< node1 IP address >:< node1 port >",
"enode://< node2 public key >@< node2 IP address >:< node2 port >",
]
在每個節點的機器上使用以下命令啟動Geth並檢視已連線上的其他節點資訊。其中,datadir引數為聯盟鏈的資料儲存目錄,每次啟動時必須指定,否則預設使用公有鏈資料儲存目錄,即連線到以太坊公有鏈上;networkid引數為所連線的網路編號,這一編號需與創世區塊檔案中的chainId引數一致。如果初始化過程正確且網路狀況正常,各節點Geth客戶端啟動後會按照 __靜態節點檔案__中的節點地址自動搜尋連線其他節點。
> admin.peers
如果其他節點仍未連線上,可以使用動態的方法新增節點。
> admin.addPeer("enode://< node public key >@< node IP address >:< node port >")
節點相互連線之後就完成了聯盟鏈網路的搭建。
## 測試聯盟鏈
首先使用以下命令開啟一個節點進行挖礦,其中etherbase引數為指定挖礦所得的以太幣收益賬戶,這裡的以太幣只能在該聯盟鏈的賬戶中使用,與公有鏈上的以太幣是完全分隔開的; miner.start的引數為指定的挖礦執行緒數,由於聯盟鏈挖礦難度低,只需開啟一條執行緒即可。
> eth.setEtherbase(eth.accounts[0])
> miner.start(2)
如果要停止挖礦可以使用以下命令:
> miner.stop()
由於在genesis.json中挖礦難度初始值設定很低,並且以太坊自身有自動調節挖礦難度的機制,因此在聯盟鏈中挖礦的速度很快,消耗的算力也較低,挖礦收益賬戶很快就會收到很多以太幣。不過需要注意的是,挖礦也需要初始化過程,在挖出第一個區塊之前,節點需要用大約一分鐘的時間生成一個DAG有向圖,之後大約兩三秒鐘就能生成一個區塊。
挖礦節點開啟之後,在另外一個節點上輸入密碼解鎖賬戶並在該賬戶上傳送交易資訊。以下示例為第二個預設賬戶向第三個預設賬戶轉賬 1 ether,返回該交易資訊的雜湊值。
> personal.unlockAccount(eth.accounts[1])
> eth.sendTransaction({from:eth.accounts[1],to:eth.accounts[2],value:1*1e18})
------------------------------------------------------------------------------
本文參考<<以太坊技術詳解與實戰>>
-----------------------------------------------------------------------------