1. 程式人生 > >區塊鏈實踐(一) 以太坊網路+geth搭建私有網路實戰

區塊鏈實踐(一) 以太坊網路+geth搭建私有網路實戰

一、乙太網網路
理解以太坊 PrivateNetwork 先要理解以太坊的兩種官方網路, 目前以太坊官方提供了兩種網

  1. 生產環境網路
  2. 測試網路 TestNet

**
1 以太坊生產網路

以太坊的生產網路顧名思義,也就是產生真正有價值的 的以太幣的網路。 目前生產網路目前已經生成了300萬以上的區塊,還在持續生成中。挖礦挖出來的每個以臺幣在10美金以上。 生產環境下的以太坊狀態時如此的(截圖自2017-02-17)

生產環境網路優點
全球化的,部署在Internet環境上的,
智慧合約的程式碼,執行,區塊的呼叫,都可以清晰的檢視到。
部署在生產環境上的智慧合約,全世界任何應用都可以呼叫

缺點:
任何合約執行都會消耗真實的以太幣,也就是真實的現金。不適合開發、除錯和測試,
所有節點是全球化的,速度較慢
且對於部分商業應用來說,只需要一部分節點,例如分散式部署的10-20臺伺服器即可。而不需要遍佈全球的網路。

2 以太坊測試網路 TestNet

以太坊的測試網路也是官方提供的,顧名思義就是專供使用者來開發、除錯和測試的。 上面的合約執行不消耗真實的以太幣。也就是不花錢

所以如果開發簡單的智慧合約的話,用測試網路也就足夠了,使用者可以把更多的精力集中在智慧合約的編寫上。

但因為網路是官方提供的,因此對於以太坊技術的底層實現、Geth的各種引數介面、整個以太坊的技術真實效能的理解就會弱很多。所以從開發的角度來說,一個更好的選擇是Private Network,可以從技術的底層去深入理解以太坊。

測試環境網路優點

合約執行不消耗真實貨幣
全球化的,部署在Internet環境上的,
智慧合約的程式碼,執行,區塊的呼叫,都可以清晰的檢視到。
部署在測試環境上的智慧合約,全世界任何應用都可以呼叫
缺點:

所有節點是全球化的,速度較慢
測試網路不可能作為商業應用的實際落地環境

3 以太坊私有網路 PrivateNetwork

以太坊的私有網路,顧名思義就是由使用者自己通過Geth建立的私有網路,是一個非常適合開發、除錯和測試的網路

優點

方便開發者深入理解以太坊的技術底層
因為節點相對較少,速度較快
使用者可以隨時建立,隨時銷燬,隨時重建一個以太坊網路
隨意的增加節點數目,或者刪除節點,
既可以在伺服器上建立,也可以在自己的windows或者Mac機器上建立,
甚至一臺機器可以建立多個節點,在一臺機器上實現多節點的私有網路。
缺點

因為不是全球化的,只有在私有網路內的節點才能檢視智慧合約的執行、呼叫等。

**

二、實戰搭建私有網路
我們將實戰如何使用 Geth 搭建以太坊的私有網路。Geth的全稱是go-ethereum,是一個以太坊客戶端,用go語言編寫,應該是目前最常用的客戶端。當然以太坊客戶端還有用C++,Ruby,Python,Java等其他多種語言編寫的,不同型別的客戶端是為了滿足不同的需求場景。今天我們主要來介紹geth(發音同guess )的使用。
下面的Geth實戰,在Ubuntu 下進行

Step 1: 建立目錄和genesis.json

在命令列模式建立一個目錄,例如tmpPrivate
建立檔案genesis.json, 並填入如下內容。

{
  "nonce": "0x0000000000000042",
  "timestamp": "0x0",
 "parentHash":"0x0000000000000000000000000000000000000000000000000000000000000000",
  "extraData": "0x0",
  "gasLimit": "0x80000000",
  "difficulty": "0x1",
 "mixhash":"0x0000000000000000000000000000000000000000000000000000000000000000""coinbase": "0x3333333333333333333333333333333333333333",
  "alloc": {     }
}

這裡寫圖片描述

Step 2: 執行命令,建立區塊

切換回命令列,執行命令,製造區塊

geth --datadir "./" init genesis.json

如發現 geth 未安裝,則先進行安裝:

具體安裝:
Install from a package manager

Install on Ubuntu via PPAs

The simplest way to install go-ethereum on Ubuntu distributions is via the built in launchpad PPAs (Personal Package Archives). We provide a single PPA repository that contains both our stable as well as our develop releases for Ubuntu versions trusty, wily, xenial and yakkety.

To enable our launchpad repository please run:

sudo add-apt-repository -y ppa:ethereum/ethereum

After that you can install the stable version of Go Ethereum:

sudo apt-get update
sudo apt-get install ethereum

Or the develop version via:

sudo apt-get update
sudo apt-get install ethereum-unstable

這裡寫圖片描述

這裡寫圖片描述

安裝後,執行創造區塊命令:

geth --datadir "./" init genesis.json

這裡寫圖片描述

Step 3:建立自己的私有鏈條

執行一條最簡單的geth命令,來建立自己的私有鏈條

geth的引數專案很多,有興趣的可以打geth –help 來獲得詳細資訊,我們也會在之後的章節中對關鍵引數項進行說明。
geth --datadir "./" --nodiscover console 2>>geth.log

這裡寫圖片描述

Step 4:在自己的私有鏈條上建立使用者

輸入命令eth.accounts, 我們會發現返回值為[]
這是因為此時雖然以太坊的私有鏈已經被創造出來,但還沒有任何賬戶。

輸入命令personal.newAccount(“xxx”), 該命令將創造一個新的使用者,該使用者的密碼是xxx. 當然使用者也可以將xxx 改為123,或者123456,或者任意密碼
再次輸入命令 eth.accounts, 我們會發現一個新的使用者被建立了出來,這就代表我們已經建立了一個賬戶,重複personal.newAccount() & eth.accounts 我們可以建立若干個賬戶出來

這裡寫圖片描述

Step 5: 輸出區塊鏈的Log

在Step 3中,我們執行的程式碼

geth --datadir "./" --nodiscover console 2>>geth.log

其中的程式碼 console 2>> geth.log 代表將控制檯的一部分輸出,輸出到檔案geth.log上去。

開啟另一個終端,找到geth.log的所在目錄,執行命令 tail -f geth.log 從而持續的輸出以太坊的日誌
整個過程如下圖所示:
這裡寫圖片描述

Step 6: 最重要的一步來了,開始挖礦!

在命令列中執行命令 miner.start(), 開始在我們的區塊鏈上進行挖礦
這裡寫圖片描述

此時Geth.log的輸出應該是這樣的

這裡寫圖片描述

一直等到100%。這個以太坊私有鏈就會正式啟動,並持續不斷的生成出以太坊來。

注意點:
1. 挖礦挖到的ether幣會預設保在第一個賬戶中,即eth.acccounts[0]中。

  1. 挖礦是執行智慧合約的基礎。如果停止挖礦的話,不僅以太幣會停止生成,所有智慧合約的呼叫也會不起作用。

  2. 如果真的要停止挖礦,可以執行命令miner.stop()來停止挖礦

  3. 按上面的命令,應該是可以實現以太坊挖礦的。如果不行的話,有可能就是之前有存在的鏈,此時應該刪除之前的資料。在Mac下即刪除~/.ethash資料夾和裡面的檔案即可

Step 7: 最終當挖礦啟動的時候的日誌是這樣的
這裡寫圖片描述

Step 8: 挖礦啟動後,檢視主賬戶的以太幣數量

acc0 = eth.accounts[0]
eth.getBalance(acc0)

結果只要不為0,那就說明挖礦成功!
這裡寫圖片描述