[人人有塊鏈-Vol.1] 15分鐘建立你的私人區塊鏈

加密卡麥隆
11 min readJul 5, 2018

--

大家也許還對節點如何挖礦運作、如何執行交易…等等,感到難以理解。身體力行也許是可以讓人最快理解的方式,就讓我們來試著建立一個私人以太坊,更進一步了解這個生態圈的運作方式

看完這篇文章你可以了解到以下幾點:
1) 如何建立一個私人的以太坊(建立於AWS linux)
2) 如何用挖礦賺取回報
3) 帳號之間如何進行匯款交易

*了解以上項目只需要花你15分鐘的時間*

第一步:登入 AWS 帳號,並啟動一台EC2 主機

重點1:選擇Ubuntu OS 作為安裝的 linux 版本

重點2:Instance Type 選擇至少 t2.medium 以上規格(相關文章指出此規格以上比較能讓以太坊正常運作,在這裡先不討論主機規格會對節點造成的影響)

重點3:設置正確的TCP port (節點之間預設互相Peering 的Port 是 30303,故要設定一port range 或單一port 皆可)

重點4:儲存好 key pair 並 launch instance

第二步:安裝以太坊節點

重點1:開啟你電腦裡的Terminal 軟體(中文是"終端機")並使用上一步驟產生的key pair 登入aws 主機(本登入步驟只適用Mac 使用者,如果你是Windows 使用者,建議使用PuTTY 軟體)

使用Terminal 進入存放key pair 的指令可用: cd
以我自己為例:cd /Users/ryanhu/Documents/Ethereum

重點2:安裝節點所需的相關軟體

輸入以下 4個指令

*此處安裝的是PPA(Personal Package Archive) 版本以太坊節點。有開發測試所需要的軟體,且預設不會與整個以太坊同步,可大大降低安裝時間*

$ sudo apt-get install software-properties-common
$ sudo add-apt-repository -y ppa:ethereum/ethereum
$ sudo apt-get update
$ sudo apt-get install ethereum

輸入以下指令以產生一 Genesis.json 檔案(此檔案用於初始化節點)

$ sudo vim Genesis.json

複製貼上下方json 文字於 Genesis.json 裡並存檔(相關設定參數暫不討論,會再另起文章詳細說明,此時只需先記住此節點 chainId 設定是 885(你可變更為任意數字))

*複製好json 文字後可用 :i 指令(分號+i+enter)讓vim 模式變成編輯模式,此時再用ctrl + v 即可貼上*

*貼上後再用:wq 指令(分號+w+q+enter)存檔並離開vim 編輯模式*

{

"config": {

"chainId": 885,

"homesteadBlock": 0,

"eip155Block": 0,

"eip158Block": 0

},

"nonce": "0x0000000000000042",

"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",

"difficulty": "0x200",

"alloc": {},
"coinbase": "0x0000000000000000000000000000000000000000",

"timestamp": "0x00",

"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",

"gasLimit": "0xffffffff",

"alloc": {

}

}

使用geth 指令及 Genesis.json 檔案,開始初始化節點

$ sudo geth init Genesis.json

第三步:開始測試節點

重點1:進入geth console 模式

如果此時你不是管理者身份,無法使用指令,會出現permission denied 的錯誤訊息,所以請先用以下指令切換成管理者身份

$ sudo -s

用geth console 指令進入節點的指令模式。nodiscover 表示不搜尋其它節點與不與其它節點溝通

$ geth --nodiscover console

重點2:替此節點新增第一個帳號

> personal.newAccount()

輸入此指令後,會被要求替此帳號設定密碼。密碼設定完成後,即會產生第一組的public address,也就是所謂的創始帳號

用此指令查看一下第一組address 裡有多少ether

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

雖然一開始創始帳號裡是沒有錢的,但是我們仍然還是有2種方式可以讓此帳號裡有ether:

  1. 在設定Genesis.json 時,指定一筆金額給創始帳號(之後的文章會詳細解說)
  2. 自己挖礦(本教學的其中一個目的,故我們一開始先不給創始帳號任何ether)

重點3:開始挖礦啦!

為了讓挖礦過程中的每個步驟都一目了然,我們先用以下指令離開指令模式

> exit

然後使用以下指令重新進入指令模式。此指令的用意在於讓geth 的每一步驟都輸出到 process.log 這個檔案裡

$ geth --nodiscover console 2>> process.log

這時侯再請打開另一個Terminal 視窗,然後同樣登入此aws instance,並輸入以下指令。此指令可讓你隨時查看最新的log

$ tail -f process.log

於指令視窗輸入以下指令,開始挖礦!

> miner.start()

此時可於log 視窗看出正在為創世區塊產生DAG(Directed Acyclic Graph 演算法,也就是以太坊目前所使用的按術)

等待幾分鐘後,節點就會開始進行挖礦

經過幾分鐘的挖礦,一但有區塊被挖取完畢,此時用指令再次查看帳號餘額會發現已經有ether 在內

挖礦測試完畢。此時可用以下指令讓節點停止挖礦

> miner.stop()

第四步:新增另一個節點,用於測試帳號之間的交易

重點1:重覆以上的第一步(登入 AWS 帳號,並啟動一台EC2 主機)及第二步(安裝以太坊節點

*於第二步安裝節點時,Genesis.json 裡的 chain id 仍需指定為885。故於此教學,直接複製第一個節點的Genesis.json 的內容即可*

重點2:也在第2個節點裡創立一個新的帳號

重點3:讓此2節點互相關聯 (Peering)

可以分別在兩個節點視窗輸入以下指令,查看目前有哪些節點與自己Peering

> admin.peers

可以看得出來2個節點的結果均顯示為空,沒有任何的節點與之相關聯

開始關聯2個節點

用以下指令在 “第1個節點” 取得節點資料

> admin.nodeInfo.enode

*enode 指的就是 Ethereum node*

以我的例子來說,第1個節點的資料長這樣

“enode://ddbae8da7bbcc5002341e919d05a88707dc15ea13ed5638c1297d8c6f744bb2232f7e0900833f0f2646ee7a97db011af83e8df3203fadec550779813dcb3a102@[::]:30303?discport=0”

此時請打開 “第2個節點” 的視窗,並依照你自己的節點資料,輸入如下指令

> admin.addPeer("enode://ddbae8da7bbcc5002341e919d05a88707dc15ea13ed5638c1297d8c6f744bb2232f7e0900833f0f2646ee7a97db011af83e8df3203fadec550779813dcb3a102@123.456.789.888:30303?discport=0")

*把[::] 換成第1個節點的IP,port 用 30303。此處範例我的IP是123.456.789.888*

*此指令的用意,是要告訴第2個節點讓它去Peering 第1個節點*

*可以在aws instance 的頁面找到第1個節點的IP*

此時再分別去2個節點視窗輸入以下指令,可以看出目前2個節點已互相關聯(只需要作1次,讓Node 2 peering Node 1 即可)

> admin.peers

重點4:開始讓2個節點互相轉帳吧

目前只有第1個節點有ether 所以我們先打開節點1 的視窗,然後再次輸入以下指令確認一下ether 金額

> web3.fromWei(eth.getBalance(eth.coinbase), "ether")

輸入以下指令解鎖創始帳號 (需先輸入密碼解鎖帳號,否則無法轉帳)

> personal.unlockAccount(eth.coinbase)

輸入以下指令讓Node 1 的創始帳號轉帳400 ether 給Node 2 的創始帳號 (請更換成你自己Node 2的創始帳號)

> eth.sendTransaction({from: eth.coinbase, to: "0x504008e1d457B7DAa4F247F51e7Bcc1F209E017e", value: web3.toWei(400, "ether")})

忘了自己Node 2的創始帳號是什麼嗎?進到節點2 後,可以輸入以下指令查詢

> eth.coinbase

還記得我們剛才有開了個可以監看所有步驟的log 視窗嗎?打開它,你可以看到轉帳的指令有確實送出

但此時仍然尚未轉帳成功,可以到節點2 去查看ether 餘額,仍然是為0

為什麼呢?因為目前2個節點都沒有啟動礦工挖礦,所以交易轉帳不會被確認,節點2 自然也就收不到應該有的ether

再次用以下指令讓節點開始挖礦吧此時不論用節點1 或節點2 啟動挖礦都能夠確認完成交易,但為了證明ether 是由節點1 轉帳過去,故我們仍然是由節點1 來進行挖礦)

> miner.start()

過一點時間後 (我大概等不到30秒) 再去查看節點2 的餘額

有!錢!了!

以上就是本次的教學文章,有任何問題歡迎提出批評指教,也請持續支持關注密幣電報 :)

持續追蹤,強化認知

我們打從心裏認定密幣電報是你的最佳選擇,密幣電報提供的資訊有幾種

  1. 踏入幣圈的最短捷徑,3句話讓你快速吸收幣圈即時新聞
  2. 到底該對誰有信心?每週五提供您國際唯一虛擬貨幣評價資訊,強化你的分析觀點
  3. 不可錯過的幣圈資訊,都將持續以深入淺出的角度為您解析

加入密幣電報 Line@頻道

加入密幣電報 Telegram

--

--

加密卡麥隆

對新知著迷、對技術偏執,徹頭徹尾的程式怪宅,卻企圖用最短的文字,將遠在光年之外的科技,直直傳達到你內心深處