BlockChain - 私有鏈建立 ( Geth & Node.js )

這篇適合給對於區塊鏈有基本認識的朋友閱讀 ...

 

 

本系列為「徹底瞭解區塊鏈 從私有鏈出發 @夢森林」的會後心得。

 

章節分為三大部分:

  1. BlockChain - 私有鏈建立 ( Geth & Node.js ) [本篇
  2. BlockChain - 私有鏈系統監控
  3. BlockChain - 私有鏈的智能合約(Solidity & Node.js)- 未完工

 

 

本篇不再贅述於知識部分,主要講解建立的技術,

因此對於下列相關知識,建議讀者有初步的了解:

 

目錄:

  1. 環境安裝
  2. 創世區塊
  3. 私鏈管理
  4. 交易與驗證

 

 

 

一、環境安裝

在鏈的部分,我們使用 Geth,由 Go 語言所開發而成,

不過不用擔心,我們不會碰到 Go

 

支援多數平台,到下載頁面點選 「適用於Windows的Geth 1.8.12」。

 

本文系統環境皆以 Windows10 64bit 為主,絕對不是因為買不起 macOS! ... QAQ

 

親,記住,下一步到底。

強迫同意授權。

預設安裝。

預設路徑。

平安喜樂,安裝完成

輸入指令幫助,測試是否安裝成功。

geth -h

 

 

 

二、創世區塊

建立鏈

首先我們隨意命名建立一個資料夾「blockchain」,並進入該資料夾,作為本次區塊鏈的所屬專案,

建立創世區塊 (Genesis Block) 需要一些設定參數,我們將參數寫成 JSON 格式的檔案。

 

什麼是創世區塊?其實就是區塊鏈中第一個區塊,跟創世神什麼的無關。

 

建立參數用檔案 genesis.json,也可從筆者範例專案所下載:

genesis.json

{
    "config": {
        "chainId": 123456,
        "homesteadBlock": 0,
        "eip155Block": 0,
        "eip158Block": 0
    },
    "nonce": "0x0000000000000042",
    "difficulty": "0x020",
    "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
    "coinbase": "0x0000000000000000000000000000000000000000",
    "timestamp": "0x00",
    "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
    "extraData": "0x0000000000000000000000000000000000000000000000000000000000000000",
    "gasLimit": "0xffffff",
    "alloc": {}
}
  • chaindId:區塊鏈的識別 ID。
  • difiiculty:難度參數。
  • coinbase:預設將會是你第一個建立帳號的礦工。
  • gasLimit:交易所使用到的 gas 限制,建議先預設(歸零),避免後續於測試交易發生資金不足
  • alloc:初始帳號與金額。
  • 更多參數的說明請參考 go-ethereum,或是了解原理 Genesis block

 

如果要初始帳號與金額,可參考以下範例:

"alloc": {
  "0x0000000000000000000000000000000000000001": {"balance": "111111111"},
  "0x0000000000000000000000000000000000000002": {"balance": "222222222"}
}

 

接著我們輸入指令,建立我們偉大的創始區塊:

geth --datadir data init genesis.json
  • --datadir:區塊會儲存在 data 資料夾中。
  • init:初始參數所使用的配置檔案 genesis.json

 

目錄結構如下:

 

 

啟動鏈

完成初始後,接著啟動私有鏈。

geth --datadir data --networkid 123456 --rpc --rpccorsdomain "*" --nodiscover --rpcapi="db,eth,net,web3,personal" console
  • --networkid:設定鏈的 ID。
  • --rpc:啟動 rpc 通訊協定功能,如果要佈署「智慧合約」,請務必加入。
  • --rpccorsdomain:允許跨網域的存取調用,「"*"」 代表來自任何網段。
  • --nodiscover:不搜尋其他網段上的節點。
  • --rpcapi:在 rpc 通訊中,提供合約 API 的服務項目。
  • console:將會啟動命令模式,以便後續下達命令。
  • 更多參數說明請翻閱 Management-APIs

 

 

 

 

三、私鏈管理

成功啟動後會進入 console 模式,我們可以輸入一些指令來管理我們的鏈,

go-ethereumWiki 中可以查詢到一些相關指令說明

指令很多記不起來沒關係,其實可以使用 tab,快速按兩下,就會跳出所有相關指令。

 

例如想使用 admin 的指令:

實際 Demo。

 

 

3.1 查看節點資訊

更多說明可查看 Management-APIs#list-of-management-apis

admin.nodeInfo

 

 

3.2 建立新帳號

personal 指令中,使用 newAccount 可以建立使用者,

完整的指令說明可到 Managing-your-accounts#creating-accounts 查看。

personal.newAccount()

然後接著輸入密碼,以及確認密碼,完成建置後會顯示帳號位址

 

你也可以在建立時直接預設密碼:

personal.newAccount("654321")

 

 

3.3 查詢所有帳號

eth.accounts

由於 accounts 是個陣列集合,其實也可以查詢第 N 個索引用戶:

eth.accounts[0]

 

 

3.4 查詢帳號錢包

eth.getBalance(eth.accounts[0])

 getBalance() 是個 function,裡面填入帳號地址

當然地址取得方式可以直接使用 eth.account 獲取。

 

你也可以使用 web3 的 CLI 命令,去查詢帳號地址的錢:

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

 

 

3.5 查詢與設定當前礦工帳號

系統預設礦工帳號會是第一個帳號。

eth.coinbase

 

你也可以修改預設礦工帳號,讓你在挖礦時,錢直接轉到對應帳號。

 

 

3.6 解鎖帳號

每一次交易的時候,例如匯款等,都需要解鎖帳號。

personal.unlockAccount(eth.accounts[0])

unlockAccount() 也是個 function,裡面放入帳號地址

 

解除時會要求輸入用戶密碼。

 

 

3.7 查詢區塊資訊

查詢區塊數量:

eth.blockNumber

 

利用索引值,查詢指定的區塊資訊:

eth.getBlock(0)

 

利用交易地址查詢區塊(本範例為假地址):

eth.getTransaction("0x0c59f431068937cbe9e230483bc79f59bd7146edc8ff5ec37fea6710adcab825")

 

 

3.8 轉帳交易

由於目前帳號皆無金額,後續步驟有挖礦範例,待有收入後我們再進行實際展示。

 

這部分算是很重要的指令,我們使用 sendTranscation 指令進行交易:

eth.sendTransaction({from:eth.accounts[0],to:"0x1222ca94a9064039ac2e892d2ee7ecf955019c0b",value:web3.toWei(3,"ether")})
  • from:來源帳號地址,你可以使用 eth.accounts 指令查詢,或是直接帶入帳號地址。
  • to:交易對象,即為你的目的地址。
  • value:交易內容,其中 3交易金額ether 貨幣單位

 

以下範例為全使用 eth.accounts 的帳號方式進行交易:

eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:web3.toWei(3,"ether")})

 

當發送交易後,可以使用 txpool 查看所有交易狀況:

txpool.status

 

上圖為後來有很多錢的時候補貼圖片。

 

 

3.9 挖礦

這是最重要的環節了,本挖礦為使用 CPU

 

3.9.1 開始挖礦

輸入以下指令即可開始挖礦人生

miner.start(1)
  • 參數為 CPU 使用數

 

3.9.2 停止挖礦

miner.stop()

 

也許你會疑惑,終端機不斷地刷新內容,要如何暫停?

 

...... 別管這麼多,直接輸入 miner.stop() 就好。

面對這些訊息干擾,閉上眼睛深呼吸,想想妹妹就打出來囉。 

 

 大不了直接把終端機關掉。

 

當挖了不少後,重新查詢區塊,數量也會確實增加!

eth.blockNumber

 

 

 

四、交易與驗證

 

終於讀到第四章,爬到這層了,卻遇到了一個大魔王......

 

 

 

 

 

 

 

 

 

因為帳號沒錢,無法完成轉帳的實作啊啊啊啊啊啊!!!!!

因此從現在開始,放置 Play 三分鐘,開始挖礦,以便後續能練習實際交易。

miner.start(4)

 

做到這邊,建議您起個身子,泡杯咖啡,上個廁所,鏟鏟貓屎。

 

 

 

 

 

 

 

 

「不久之後  忍者哈特利」的圖片搜尋結果

  • 不久之後。

 

 

 

4.1 查看錢包

看一下錢包,錢錢多多。

由於剛剛筆者將預設礦工設定為 帳號1,因此挖到的錢都在這個帳號上。

 

 

4.2 轉帳交易

我們將轉帳 3 ether,從「帳號1」到「帳號0

eth.sendTransaction({from:eth.accounts[1],to:eth.accounts[0],value:web3.toWei(3,"ether")})

 

你也許應該是從「帳號0」到「帳號1」,如果你沒動到預設礦工帳號。

 

 

4.3 開始挖礦

完成轉帳後,當然就是要由礦工去計算驗證,

因此繼續我們的挖礦之旅

miner.start(4)

 

 

4.4 驗證交易

很快的,我們暫停一下挖礦來查看交易是否成功。

miner.stop()
txpool.status

 

所有的準備工作與佇列都為 0,代表完成工作了~

 

接著查看「帳號0」的錢包:

eth.getBalance(eth.accounts[0])

 

哦哦哦!是錢錢!

會這麼多錢,因為後來筆者又把預設礦工帳號改為「帳號0」亂挖一陣子。

 

 

 

※、結語

本篇到目前為止,分享了從建立挖礦,以及交易的整個流程,

相信大家都熟悉了!

 

本篇相關指令以及綱要皆放置於 Github 上:

 

而以上流程都是在終端機下完成,實在是沒什麼感覺,

下一篇將會簡單分享一下使用工具去呈現 GUI 私鏈的整個運作狀況。

 

 

有勘誤之處,不吝指教。ob'_'ov