區塊鏈 12 | 自製一個以太坊私有鏈(一)
建立以太坊私有鏈並挖礦
安裝Go-Ethereum
在建置私有鏈前,需要安裝Go-Ethereum這個套件
- Mac
$ brew tap ethereum/ethereum$ brew install Ethereum
- Windows
download at https://geth.ethereum.org/downloads/
- Linux
$ sudo apt-get install software-properties-common$ sudo add-apt-repository -y ppa:ethereum/ethereum$ sudo apt-get update$ sudo apt-get install Ethereum
安裝好後檢查一下,在終端輸入
$ geth version
如果有 geth 的資訊跑出來才算成功
新增節點資料夾
首先建立區塊鏈的節點,並取得帳戶地址。
在桌面新增2個(或多個)資料夾作為節點目錄,每個目錄下各自保存節點的帳號、區塊鏈訊息。
為什麼要建立2個呢?
因為在以太坊 主要網路中 是多個節點彼此連結,並且同步更新最新的狀態。所以我們在私有鏈網路建立最少的多個,也就是2個,來觀察這種同步情形。
Ex: 把資料夾建在桌面
|--Desktop
|--node1
|--node2
開2個終端並分別把工作目錄切換到 node1、node2 底下
創立以太坊錢包
為各個節點創立以太坊錢包(帳戶)才能挖礦
- node1
node1 $ geth --datadir ./ account new
- node2
node2 $ geth --datadir ./ account new
設定完帳戶密碼後(要記好) ,geth會秀出16進位的錢包地址(0x開頭),要記下來,等等會用到。
用puppeth配置創世區塊
要搭建一個私有鏈¸必須先定義第一個區塊(創世區塊)的內容。創世區塊是整條區塊鏈的第一個區塊(Block 0)。往後的第2個、第3個、…、第N個區塊都是從創世區塊開始鍵接的。
打開新的terminal,切換工作目錄到桌面。node1 $、node2 $先擱一邊。
直接使用puppeth配置創世區塊的小工具。Puppeth是以太坊客戶端提供的一個可以在自有環境中快速搭建以太坊私鏈的工具。
為私有鏈取一個名字,名字不可使用 空白、連字號、大寫。
哪些節點有挖礦的權利?填入前面node1 、node2 的錢包(帳戶)地址。
哪些節點需要預先注入資金?填入前面node1 、node2 的錢包(帳戶)地址。
Ctrl + C結束puppeth,回到桌面就可以找到剛剛匯出的json檔了。
有了test.json這個創世區塊配置檔,接下來要為區塊鏈設置節點。
初始化節點
Desktop $ geth --datadir node1 init test.jsonDesktop $ geth --datadir node2 init test.json
初始化之後,會在 node1及node2 資料夾中看到:“keystore(存放帳戶資訊)”和”geth(存放區塊資訊)”這兩個資料夾。
運行節點
回到node1 $、node2 $,把節點start up,開始運行。
Node1 $ geth --datadir ./ --networkid 12345 -–port 8000 --nodiscover consolenode2 $ geth --datadir ./ --networkid 12345 –-port 8001 --nodiscover console
成功後,代表已經進入節點。鍵入admin.nodeInfo可以查看各自的節點資訊
參數說明
- datadir:指定存放區塊鏈節點資料的資料夾
- networkid:剛剛配置檔設定的私鏈ID, networkid 大家一定都要用同一個值才可以互相連線。
- port:在本機listen的port,不同電腦間可以設一樣,但今天在同一台電腦操作,所以不能重複
- nodiscover:設置為私有鏈,不被網路上其他人主動搜尋到
- console:節點start up後使用console mode,不加的話就會是log mode只能看記錄不能打指令操作
連接兩個節點
雖然剛剛start up了兩個節點,但兩個節點互不相識。用admin.peers查看,可以看到返回空值。因此需要將兩個節點連接起來。
加入節點, geth指令為:
admin.addPeer(enode://<id>@<ip>:<port>)
查看並記下node1 $的enode
node1 $ > admin.nodeInfo.enode
將node1 $的 enode 填入 admin.addPeer(“enode”)中,如下:
node2 $ > admin.addPeer("enode://64715674a27331d1b6678dbfca5b8460c8c611f49572b8154a69ea85f4f682091ee12b5f9b8df756074fe62b80c765c68d6954417f7dbbc6483d1d2db06c6718@127.0.0.1:8000")
複製整段,到node2 $ 貼上。
現在,不管在node1 $還是node2 $鍵入net.peerCount,就可以看到返回1,那個就是除了自己以外的節點。輸入admin.peers,會顯示更詳細的節點資訊。
要注意的是,要將@後面的ip位置要用127.0.0.1,因為我們是在同一台電腦上操作,所以用ip使用127.0.0.1。
另一個要注意的是,使用 node1的 nodeInfo 貼到 node2 的 addpeer。還有,退出節點後,peers的連接會清除。所以每次進入節點都要再設定一次。
如果想節點在斷開節點後自動重新連接,可以透過以下方式配置永久靜態節點 (static node):
在node1(node2)/geth中新增一個json檔“ static-nodes.json”
static-nodes.json 裡面是一個array,裡面放 string — enode 資訊,用逗號隔開
["enode://64715674a27331d1b6678dbfca5b8460c8c611f49572b8154a69ea85f4f682091ee12b5f9b8df756074fe62b80c765c68d6954417f7dbbc6483d1d2db06c6718@127.0.0.1:8000","enode://id@ip:port"]
配置 static-nodes.json 的話就不用使用admin.addPeer()的方式加入節點了。運行節點後,節點就會自動連接配置檔中設定好的節點了。
開始挖礦
miner.start()
挖礦之前需調用personal.unlockAccount()解鎖帳戶
node1/ node2 $ > personal.unlockAccount(eth.coinbase , password , duration)
- duration default 300 seconds
- 有時效性,過一段時間又要再解鎖一次
要如何一次解鎖?在啟動節點時在指令中多帶兩個參數 unlock
和 allow-insecure-unlock 解鎖地址。unlock後面接要解鎖的
account address。
node2 $ geth --datadir ./ --networkid 12345 --port 8000 --unlock 0xD452eC5f19669c220c2be79Fa0Cf69427dC3dbB7 --allow-insecure-unlock
--nodiscover console
注意:
- 如果是用 admin.addPeer()的方式加入節點,退出節點後,peers的連接會清除。所以需要再設定一次。
- 如果是用static-nodes.json的方式加入節點就可以直接miner。
設定完成就可以啟動挖礦了: miner.start()
Geth常用指令
- 查看節點訊息: admin.nodeInfo
- 開始挖礦: miner.start()
- 停止挖礦: miner.stop()
- 查看目前帳戶地址: eth.coinbase
- 查看帳戶餘額: eth.getBalance(帳戶地址) = eth.getBalance(eth.coinbase)
- 查看最新的區塊編號:eth.blockNumber
- 加入節點: admin.addPeer(enode://<id>@<ip>:<port>)
- 送交易: eth.sendTransaction({from:sender, to:receiver, value: amount})