1. 程式人生 > >區塊鏈開發筆記——Windows搭建私有鏈最簡單詳細教程

區塊鏈開發筆記——Windows搭建私有鏈最簡單詳細教程

一.安裝go-ethereum客戶端

Go-ethereum客戶端通常被稱為Geth,它是個命令列介面,執行在Go上實現的完整以太坊節點。
附上客戶端的下載連結
Geth下載連結

下載安裝完畢後,需要設定系統的環境變數,然後要在cmd中測試 geth -h,若出現版本資訊則證明安裝成功。
1

安裝成功截圖:
2

二.搭建私有鏈過程

1.創世區塊配置資訊的初始化

首先想要執行一條私有鏈,就必須去定義一個創世區塊,而創世區塊的資訊寫在json配置檔案中,例如下面的genesis.json檔案。

{
  "config": {
        "chainId":
8, "homesteadBlock": 0, "eip155Block": 0, "eip158Block": 0 }, "alloc" : {}, "coinbase" : "0x0000000000000000000000000000000000000000", "difficulty" : "0x1", "extraData" : "", "gasLimit" : "0x2fefd8", "nonce" : "0x0000000000000066", "mixhash" : "0x0000000000000000000000000000000000000000000000000000000000000000", "parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000", "timestamp" : "0x00" }

2.初始化區塊鏈

建立完配置資訊後,需要新建一個目錄data0用來存放區塊鏈資料。
檔案結構如下圖所示:
3

接下來進入privatechain目錄中,執行初始化命令:

cd privatechain
geth --datadir data0 init genesis.json

上面的命令的主體是 geth init,表示初始化區塊鏈,命令可以帶有選項和引數,其中–datadir選項後面跟一個目錄名,這裡為 data0,表示指定資料存放目錄為 data0, genesis.json是init命令的引數。

執行上面的命令,會讀取genesis.json檔案,根據其中的內容,將創世區塊寫入到區塊鏈中。如果看到log資訊中含有Successfully wrote genesis state字樣,說明初始化成功。

3.啟動私有鏈節點

初始化完成後,就有了一條自己的私有鏈,之後就可以啟動自己的私有鏈節點並做一些操作,在終端中輸入以下命令即可啟動節點:

geth --datadir data0 --networkid 1108 console

上面命令的主體是geth console,表示啟動節點並進入互動式控制檯,–datadir選項指定使用data0作為資料目錄,–networkid選項後面跟一個數字,這裡是1108,表示指定這個私有鏈的網路id為1108。網路id在連線到其他節點的時候會用到,以太坊公網的網路id是1,為了不與公有鏈網路衝突,執行私有鏈節點的時候要指定自己的網路id

執行上面的命令後,就啟動了區塊鏈節點並進入了Javascript Console:

這是一個互動式的Javascript執行環境,在這裡面可以執行Javascript程式碼,其中>是命令提示符。在這個環境裡也內建了一些用來操作以太坊的Javascript物件,可以直接使用這些物件。這些物件主要包括:

  • eth:包含一些跟操作區塊鏈相關的方法
  • net:包含以下檢視p2p網路狀態的方法
  • admin:包含一些與管理節點相關的方法
  • miner:包含啟動&停止挖礦的一些方法
  • personal:主要包含一些管理賬戶的方法
  • txpool:包含一些檢視交易記憶體池的方法
  • web3:包含了以上物件,還包含一些單位換算的方法

4.建立賬戶

前面只是搭建了私有鏈,並沒有自己的賬戶,可以在js console中輸入eth.accounts來驗證:

> eth.accounts
[]

此時沒有賬戶,接下來使用personal物件來建立一個賬戶:

> personal.newAccount()
> Passphrase:
> Repeat passphrase:

Passphrase其實就是密碼的意思,輸入兩次密碼後,就建立了一個賬戶。

實驗結果截圖如下:
4

5.檢視賬戶餘額,以及挖礦過程

eth物件提供了檢視賬戶餘額的方法:

> eth.getBalance(eth.accounts[0])
0

目前賬戶的以太幣餘額是0,要使賬戶有餘額,可以從其他賬戶轉賬過來,或者通過挖礦來獲得以太幣獎勵。
5

通過miner.start()來啟動挖礦:

> miner.start(10)

其中start的引數表示挖礦使用的執行緒數。第一次啟動挖礦會先生成挖礦所需的DAG檔案,這個過程有點慢,等進度達到100%後,就會開始挖礦,此時螢幕會被挖礦資訊刷屏。

如果想停止挖礦,並且進度已經達到100%之後,可以在js console中輸入

miner.stop():

注意:輸入的字元會被挖礦刷屏資訊沖掉,沒有關係,只要輸入完整的miner.stop()之後回車,即可停止挖礦。

挖到一個區塊會獎勵5個以太幣,挖礦所得的獎勵會進入礦工的賬戶,這個賬戶叫做coinbase,預設情況下coinbase是本地賬戶中的第一個賬戶:

> eth.coinbase

挖礦結束後的餘額
6
getBalance()返回值的單位是wei,wei是以太幣的最小單位,1個以太幣=10的18次方個wei。要檢視有多少個以太幣,可以用web3.fromWei()將返回值換算成以太幣:

> web3.fromWei(eth.getBalance(eth.accounts[0]),'ether')

7

6.檢視區塊資訊

eth物件封裝了檢視區塊資訊的方法。

檢視當前區塊總數:

> eth.blockNumber

8
通過區塊號檢視區塊:

> eth.getBlock(66)
{
  difficulty: 131968,
  extraData: "0xda83010811846765746888676f312e31312e318777696e646f7773",
  gasLimit: 3191015,
  gasUsed: 0,
  hash: "0x17f2dec76f0f29a3be561b2f566050e10bbd01f8ba5fd615929afe562b6a1c64",
  logsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
  miner: "0x8c37647b237292624f3ca0b354ce7a0e0198abff",
  mixHash: "0x0330c76f9a7a25ae8d70b463c4875cc15bc8ac8272e4ac503d965b0a9340dec0",
  nonce: "0x02169cf41ce684ea",
  number: 16,
  parentHash: "0xf76aeff9759517700003e2c2bd093ec3529039208b321eaa627fa42276ee602c",
  receiptsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
  sha3Uncles: "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
  size: 538,
  stateRoot: "0xe311c49f95ea4fc6304a9e3c2646e2f332e83fc05b0107ff1176e0e97c6fa9c5",
  timestamp: 1541153734,
  totalDifficulty: 2103873,
  transactions: [],
  transactionsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
  uncles: []
}