區塊鏈開發筆記——Windows搭建私有鏈最簡單詳細教程
一.安裝go-ethereum客戶端
Go-ethereum客戶端通常被稱為Geth,它是個命令列介面,執行在Go上實現的完整以太坊節點。
附上客戶端的下載連結
Geth下載連結
下載安裝完畢後,需要設定系統的環境變數,然後要在cmd中測試 geth -h,若出現版本資訊則證明安裝成功。
安裝成功截圖:
二.搭建私有鏈過程
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用來存放區塊鏈資料。
檔案結構如下圖所示:
接下來進入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其實就是密碼的意思,輸入兩次密碼後,就建立了一個賬戶。
實驗結果截圖如下:
5.檢視賬戶餘額,以及挖礦過程
eth物件提供了檢視賬戶餘額的方法:
> eth.getBalance(eth.accounts[0])
0
目前賬戶的以太幣餘額是0,要使賬戶有餘額,可以從其他賬戶轉賬過來,或者通過挖礦來獲得以太幣獎勵。
通過miner.start()來啟動挖礦:
> miner.start(10)
其中start的引數表示挖礦使用的執行緒數。第一次啟動挖礦會先生成挖礦所需的DAG檔案,這個過程有點慢,等進度達到100%後,就會開始挖礦,此時螢幕會被挖礦資訊刷屏。
如果想停止挖礦,並且進度已經達到100%之後,可以在js console中輸入
miner.stop():
注意:輸入的字元會被挖礦刷屏資訊沖掉,沒有關係,只要輸入完整的miner.stop()之後回車,即可停止挖礦。
挖到一個區塊會獎勵5個以太幣,挖礦所得的獎勵會進入礦工的賬戶,這個賬戶叫做coinbase,預設情況下coinbase是本地賬戶中的第一個賬戶:
> eth.coinbase
挖礦結束後的餘額
getBalance()返回值的單位是wei,wei是以太幣的最小單位,1個以太幣=10的18次方個wei。要檢視有多少個以太幣,可以用web3.fromWei()將返回值換算成以太幣:
> web3.fromWei(eth.getBalance(eth.accounts[0]),'ether')
6.檢視區塊資訊
eth物件封裝了檢視區塊資訊的方法。
檢視當前區塊總數:
> eth.blockNumber
通過區塊號檢視區塊:
> 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: []
}