本篇會需要一些區塊鏈的background knowledge
起碼要知道什麼是
- 區塊鏈
- 比特幣
- 以太坊
- 比特幣與以太坊的差別
- 以太坊的智能合約
在操作上比較能catch到每一步的意義
前置工作
我們等等會使用到geth
及puppeth
這兩個工具,介紹一下它們的用途
geth
是Go語言
的產物,能讓電腦在terminal下運行以太坊節點,geth
是由Go-Ethereum
縮寫來的
而puppeth
能幫助我們快速寫好私有鏈的創世區塊配置(運行配置)的工具
如果不用puppeth
也是可以,但就是要自己寫JSON
檔
網路上很多範例的JSON
檔都out of date,在初始化時就一直報錯,光debug就澆滅了學下去的熱情
所以還是推薦用puppeth
,反正自geth
1.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-node1
及private-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(區塊編號)