建立以太坊私有鏈(一) 節點部署

本篇會需要一些區塊鏈的background knowledge

起碼要知道什麼是

  • 區塊鏈
  • 比特幣
  • 以太坊
  • 比特幣與以太坊的差別
  • 以太坊的智能合約

在操作上比較能catch到每一步的意義

 

前置工作

我們等等會使用到gethpuppeth這兩個工具,介紹一下它們的用途

gethGo語言的產物,能讓電腦在terminal下運行以太坊節點,geth是由Go-Ethereum縮寫來的

puppeth能幫助我們快速寫好私有鏈的創世區塊配置(運行配置)的工具

如果不用puppeth也是可以,但就是要自己寫JSON

網路上很多範例的JSON檔都out of date,在初始化時就一直報錯,光debug就澆滅了學下去的熱情

所以還是推薦用puppeth,反正自geth1.6版本後,安裝時就已經標配puppeth

 

安裝 Geth

跟我一樣是mac的朋友只要敲兩行指令就安裝完成了

brew tap ethereum/ethereum
brew install ethereum

至於其他作業系統,請參考他們的Github說明:ethereum/go-ethereum

 
在terminal執行geth version要有反應才是安裝成功唷

記錄一下在寫本篇時的geth版本

MacBookPro:~ AndyWu $ geth version
Geth
Version: 1.8.12-stable
Architecture: amd64
Protocol Versions: [63 62]
Network Id: 1
Go Version: go1.10.3
Operating System: darwin
GOPATH=
GOROOT=/usr/local/Cellar/go/1.10.3/libexec

 

新增節點資料夾

新增兩個(或多個)資料夾,我們讓一個資料夾放一個節點的data

如果有多台電腦的人可以將一台電腦當作一個節點

比較窮只有一台電腦所以 這邊用一台電腦開多個terminal的方式模擬多個節點示範

把資料夾建在桌面(個人偏好而已)

/
|-- Users
      |-- AndyWu
            |-- Desktop
                  |-- private-chain-node1
                  |-- private-chain-node2

開兩個terminal然後把工作目錄切換到private-chain-node1private-chain-node2資料夾

terminal1 $ cd /Users/AndyWu/Desktop/private-chain-node1
terminal2 $ cd /Users/AndyWu/Desktop/private-chain-node2

前置工作就到這邊告一段落

接下來的command如果是terminal1 $開頭代表是在terminal1鍵入的

terminal2 $代表在terminal2,依此類推

 

為各個節點創立以太坊錢包

在配置我們的創世區塊(Genesis Block)前,先為各個節點創立以太坊錢包(帳戶),爾後才能做挖礦的動作

terminal1 $ geth --datadir ./ account new
terminal2 $ geth --datadir ./ account new

設定完帳戶密碼後,geth會秀出16進位的錢包地址(0x開頭),等等會用到

參數說明:

  • datadir:私有鏈節點的資料夾,如果什麼都不填預設就會apply到主鏈去

 

用puppeth配置創世區塊(Genesis Block)

創世區塊(Genesis Block)是整條區塊鏈的第一個區塊(Block 0)

往後的第二個、第三個、…、第N個區塊都是從創世區塊開始鍵接來的

所以我們要將創世區塊長什麼樣子、多大、多胖、多難挖、是哪條鏈的區塊都先配置定義好

打開新的terminal(terminal3 $),切換工作目錄到桌面,terminal1 $terminal2 $先擱一邊

直接呼叫puppeth配置創世區塊的小工具

幫你的私有鏈取一個名字,以後也可以用這個名字找回今天設定的配置(同台電腦上)

terminal3 $ cd /Users/AndyWu/Desktop
terminal3 $ puppeth
Please specify a network name to administer (no spaces or hyphens, please)
> TestChain

選2,配置新的genesis

What would you like to do? (default = stats)
 1. Show network stats
 2. Configure new genesis
 3. Track new remote server
 4. Deploy network components
> 2

選擇共識機制,誰打包區塊

PoW是先搶先贏的概念,誰先打包好這個Block(挖到礦),誰就是這個block的relay

PoA是指有得到authority的節點才有打包這個Block的權利

既然創的是私有鏈,那就選PoA,規定只有自己人才能維護這個Chain

Which consensus engine to use? (default = clique)
 1. Ethash - proof-of-work
 2. Clique - proof-of-authority
> 2

出一個Block的時間,用預設的就好

How many seconds should blocks take? (default = 15)
> 15

哪些節點有打包Block(挖礦)的權利,填入前面terminal1 $terminal2 $創的錢包(帳戶)地址

填完後再按一次Enter離開

Which accounts are allowed to seal? (mandatory at least one)
> 0xXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
> 0xYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
>

設定哪些節點的帳戶預設就有ETH(以太幣),一樣填入前面terminal1 $terminal2 $創的錢包(帳戶)地址

填完後再按一次Enter離開

Which accounts should be pre-funded? (advisable at least one)
> 0xXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
> 0xYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
>

為這個私有鏈選一個ID,就隨便選個幸運數字吧

Specify your chain/network ID if you want an explicit one (default = random)
> 123456

現在創世區塊配置的JSON檔已經建好了,把它匯出

What would you like to do? (default = stats)
 1. Show network stats
 2. Manage existing genesis
 3. Track new remote server
 4. Deploy network components
> 2

 1. Modify existing fork rules
 2. Export genesis configuration
 3. Remove genesis configuration
> 2

Which file to save the genesis into? (default = TestChain.json)
> genesis.json
INFO [07-24|22:56:42.934] Exported existing genesis block 

What would you like to do? (default = stats)
 1. Show network stats
 2. Manage existing genesis
 3. Track new remote server
 4. Deploy network components
> 

Ctrl + C結束puppeth,回到桌面就可以找到剛剛匯出的genesis.json了

 

將配置檔套用在節點

有了genesis.json這個創世區塊配置檔,我們把它套用在剛剛那兩個節點的資料夾,private-chain-node1及private-chain-node2

參數說明:

  • datadir:私有鏈節點的資料夾
  • init:做節點初始化的動作,並將後面接的JSON檔配置套用到該節點資料夾
terminal3 $ geth --datadir private-chain-node1 init genesis.json
terminal3 $ geth --datadir private-chain-node1 init genesis.json

套用成功後即可關閉terminal3 $

回到terminal1 $terminal2 $,把節點start up,開始運行

參數說明:

  • datadir:私有鏈節點的資料夾
  • networkid:剛剛前面配置檔設定的幸運數字
  • port:在本機listen的port,不同電腦間可以設一樣,但今天在同一台電腦操作,所以不能重複
  • nodiscover:設置為私有鏈,不被網路上其他人主動搜尋到
  • console:節點start up後使用console mode,不加的話就會是log mode只能看記錄不能打指令操作
terminal1 $ geth --datadir ./ --networkid 123456 --port 8000 --nodiscover console
terminal2 $ geth --datadir ./ --networkid 123456 --port 8001 --nodiscover console

成功了,鍵入admin.nodeInfo可以查看各自的節點資訊

 

連接兩個節點

雖然剛剛start up了兩個節點,但兩個節點互不相識

admin.peers查看,可以看到返回空值

我們需要當媒人,搓合兩個節點一起維護一條鏈♡

 
記下terminal1 $的enode

terminal1 $> admin.nodeInfo.enode

terminal2 $呼叫admin.addPeer(),讓terminal2 $去拜訪terminal1 $

參數要填剛剛記下的enode

terminal2 $> admin.addPeer("enode://64715674a27331d1b6678dbfca5b8460c8c611f49572b8154a69ea85f4f682091ee12b5f9b8df756074fe62b80c765c68d6954417f7dbbc6483d1d2db06c6718@127.0.0.1:8001")

現在,不管在terminal1 $還是terminal2 $鍵入net.peerCount,就可以看到有1個除了自己以外的節點

鍵入admin.peers,會顯示更詳細除了自己以外的節點資訊

 
下一篇,將會介紹如何將智能合約部署至區塊鏈上

 

P.S.

如果是在不同電腦上要互相連接節點的話,記得將enode URL的[::]換成IP位址

 

一些在Geth中常用的指令

創立新帳戶(錢包)

personal.newAccount()

查看節點訊息

admin.nodeInfo

挖礦

開始挖礦 miner.start()
停止挖礦 miner.stop()

查看目前礦工帳戶地址

eth.coinbase

修改礦工帳戶地址

miner.setEtherbase(帳戶地址)

查看account列表中的所有帳戶地址

eth.accounts

查看account列表中的第0個帳戶地址

eth.accounts[0]

查看帳戶餘額

eth.getBalance(帳戶地址)

解鎖帳戶

personal.unlockAccount(帳戶地址)
使用帳戶資金前需要先解鎖

轉帳

eth.sendTransaction({from:"來源帳戶地址", to:"目的地帳戶地址", value:web3.toWei(金額, "ether")})

查看最新的區塊編號

eth.blockNumber

用交易查看區塊資訊

eth.getTransaction("交易hash碼")

通過區塊編號查看區塊資訊

eth.getBlock(區塊編號)


發佈留言