搭建區塊鏈技術開發和執行環境(一)

天府雲創發表於2018-03-16

最近在研究區塊鏈。打算先搭建一個測試環境開始執行。這裡記錄整個搭建過程,供後來人參考。 整體上,分為三個步驟,安裝相關軟體,初始化系統,建立叢集,以及最後一步,挖礦。 我們採用的是以太坊,相對其他區塊鏈,這是一個成熟的環境。 雖然近期有硬分支的事件,對企業應用來說,功能上還算是比較完善的。

安裝部署

1.安裝 Go 環境

如果機器無法上外網,還得配置一下代理。 Ubuntu配置代理的方式網上很多,這裡不介紹。

  curl -O https://storage.googleapis.com/golang/go1.5.1.linux-amd64.tar.gz
  tar -C /usr/local -xzf go1.5.1.linux-amd64.tar.gz
  mkdir -p ~/go; echo "export GOPATH=$HOME/go" >> ~/.bashrc
  echo "export PATH=$PATH:$HOME/go/bin:/usr/local/go/bin" >> ~/.bashrc
  source ~/.bashrc

2.安裝 ethereum

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

在執行 sudo add-apt-repository -y ppa:ethereum/ethereum的時候碰到這個問題:

  root@ubuntu-KVM:~# sudo add-apt-repository -y ppa:ethereum/ethereum
  Cannot add PPA: 'ppa:ethereum/ethereum'.
   Please check that the PPA name or format is correct.

按照Ask Ubuntu 的意見,修改為:

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

3.安裝 solc 編譯器


  sudo add-apt-repository ppa:ethereum/ethereum-qt
  sudo add-apt-repository ppa:ethereum/ethereum
  sudo apt-get update
  sudo apt-get install cpp-ethereum

同樣的,如果碰到PPA Name錯誤的警示,則執行如下操作:


  sudo -E add-apt-repository ppa:ethereum/ethereum-qt
  sudo -E add-apt-repository ppa:ethereum/ethereum
  sudo apt-get update
  sudo apt-get install cpp-ethereum

這樣相關軟體已經安裝完畢。

搭建私鏈

1.啟動geth服務


  geth --datadir "/root/chain" console

其中 datadir用於指定資料目錄。這個目錄不能夠預先建立,否則命令會失敗。 執行結果如下:

Image of Start Geth

2.建立賬號

執行之後,進入geth的互動模式。 接著建立一個賬號,然後退出。 這個賬號用於執行創世操作。 然後exit退出

> personal.newAccount("密碼");
 "0xea5c99831c2e4a0e094facdbac1befcf6c92e543"
> exit

3.建立創世區塊

編譯建立創世區塊所需要的指令碼, 注意alloc下的key需要和上述的賬號保持一致。

  {
  "alloc": {
      "0xea5c99831c2e4a0e094facdbac1befcf6c92e543": {
      "balance": "1000"
    }
  },
 
  "nonce": "0x0000000000000042",
  "difficulty": "0x020000",
  "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "coinbase": "0x0000000000000000000000000000000000000000",
  "timestamp": "0x00",
  "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "extraData": "CNNMoney Jack Ma interview: Wars start when trade stops, 20160902",
  "gasLimit": "0xffffffff"
  }

各個引數的含義如下:

  • mixhash:與nonce配合用於挖礦,由上一個區塊的一部分生成的hash。注意他和nonce的設定需要滿足以太坊的Yellow paper, 4.3.4. Block Header Validity, (44)章節所描述的條件。.

  • nonce: nonce就是一個64位隨機數,用於挖礦,注意他和mixhash的設定需要滿足以太坊的Yellow paper, 4.3.4. Block Header Validity, (44)章節所描述的條件。

  • difficulty: 設定當前區塊的難度,如果難度過大,cpu挖礦就很難,這裡設定較小難度

  • alloc: 用來預置賬號以及賬號的以太幣數量,因為私有鏈挖礦比較容易,所以我們不需要預置有幣的賬號,需要的時候自己建立即可以。

  • coinbase: 礦工的賬號,隨便填

  • timestamp: 設定創世塊的時間戳

  • parentHash: 上一個區塊的hash值,因為是創世塊,所以這個值是0

  • extraData: 附加資訊,隨便填,可以填你的個性資訊

  • gasLimit: 該值設定對GAS的消耗總量限制,用來限制區塊能包含的交易資訊總和,因為我們是私有鏈,所以填最大。

建立資料存放地址並初始化創世塊

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

執行結果如下:Image of creating genesis

4.啟動私鏈

執行如下指令碼

geth --identity "phoenix"  --rpc  --rpccorsdomain "*" --datadir "/root/chain" --port "30303"  --rpcapi "db,eth,net,web3" --networkid 98888 console

各引數說明如下:

  • identity :區塊鏈的標示,隨便填寫,用於標示目前網路的名字

  • init :指定創世塊檔案的位置,並建立初始塊

  • datadir :設定當前區塊鏈網路資料存放的位置

  • port:網路監聽埠,預設是8080

  • rpc:啟動rpc通訊,可以進行智慧合約的部署和除錯。它在geth中通常被預設啟用。

  • rpcapi: 設定允許連線的rpc的客戶端,一般為db,eth,net,web3

  • networkid: 設定當前區塊鏈的網路ID,用於區分不同的網路,是一個數字

  • console:啟動命令列模式,可以在Geth中執行命令

此外,還可以使用如下引數:

  • nodiscover : 使用這個命令可以確保你的節點不會被非手動新增你的人發現。否則,你的節點可能被陌生人的區塊鏈無意新增,如果他和你有相同的初始檔案和網路ID。

  • maxpeers : 如果你不希望其他人連線到你的測試鏈,可以使用maxpeers 0。反之,如果你確切知道希望多少人連線到你的節點,你也可以通過調整數字來實現。

  • rpcapi : 這個命令可以決定允許什麼API通過RPC進入。在預設情況下,geth可以在RPC啟用web3介面。請注意在RPC/IPC介面提供API,會使每個可以進入這個介面(例如dapp’s)的人都有許可權訪問這個API。注意你啟用的是哪個API。Geth會預設啟用IPC介面上所有的API,以及RPC介面上的db,eth,net和web3 API。

  • rpccorsdomain : 這個可以指示什麼URL能連線到你的節點來執行RPC定製端任務。務必謹慎,輸入一個特定的URL而不是wildcard ( * ),後者會使所有的URL都能連線到你的RPC例項。

啟動後介面如下,游標停留在最後的命令列上,可以執行以太坊命令。 可以看到Listening on [::]:30303Welcome to the Geth JavaScript console!的提示,說明已經啟動成功

注意:如果想將Ubuntu作為永久區塊鏈節點使用,當使用nohup命令時,Geth啟動引數console必須去掉,否則Geth會自動停止。

執行結果如下:Image of startup

5.檢視節點資訊

常用命令:

  • net.listening:檢視網路是否在監聽;
  • admin.peers: 檢視當前連線的節點。 目前還是空的。
  • admin.nodeInfo:檢視當前節點的資訊。

執行:

> admin.nodeInfo

得到當前節點資訊如下:


{
  enode: "enode://dfd047d64a3d8c9d9c2834bc8c3bbf41a79e6797956fa99469b872d97a7978e4e7a6d9605ec6e77164515f6f09d979999ca3ef91eebcd2a6c91ebdfe167de094@[::]:30303",
  id: "dfd047d64a3d8c9d9c2834bc8c3bbf41a79e6797956fa99469b872d97a7978e4e7a6d9605ec6e77164515f6f09d979999ca3ef91eebcd2a6c91ebdfe167de094",
  ip: "::",
  listenAddr: "[::]:30303",
  name: "Geth/v1.5.0-unstable/linux/go1.5.1/phoenix",
  ports: {
    discovery: 30303,
    listener: 30303
  },
  protocols: {
    eth: {
      difficulty: 131072,
      genesis: "0xaab381212b8108c488c8d21c06042a9081b94bfb87665110520d3c295626e79b",
      head: "0xaab381212b8108c488c8d21c06042a9081b94bfb87665110520d3c295626e79b",
      network: 98888
    }
  }
}

注意enode節點,這是當前節點的標識。 後續會用到這個值。

6.檢視賬戶資訊

在建立創世節點時,我們建立了個預設賬戶。可以通過如下命令檢視賬戶餘額。


> eth.accounts
["0x4b691e86c622127ed8e1d49899ad8c1d19834327"]
> primary=eth.accounts[0]
"0x4b691e86c622127ed8e1d49899ad8c1d19834327"
> balance = web3.fromWei(eth.getBalance(primary), "ether");
20

配置第二臺私鏈伺服器

第二臺私鏈伺服器,需要把第一臺的步驟基本都要重複一遍。兩臺伺服器配置一樣才可以通訊。 需要改變的地方是:

  1. 第三步建立genesis.json的時候,完全使用第一臺伺服器的配置,不要用新建的account來建立。

  2. 需要將第一臺伺服器新增到靜態節點列表中。

7.新增靜態節點列表

在{datadir}下新增檔案 static-nodes.json,內容如下:

[
"enode://dfd047d64a3d8c9d9c2834bc8c3bbf41a79e6797956fa99469b872d97a7978e4e7a6d9605ec6e77164515f6f09d979999ca3ef91eebcd2a6c91ebdfe167de094@第一個節點的IP地址:30303"
]

執行如下指令碼啟動節點:

geth --identity "phoenix"  --rpc  --rpccorsdomain "*" --datadir "/root/chain" --port "30303"  --rpcapi "db,eth,net,web3" --networkid 98888 console

啟動成功後,檢視當前連線的節點:


> admin.peers
[{
    caps: ["eth/62", "eth/63"],
    id: "dfd047d64a3d8c9d9c2834bc8c3bbf41a79e6797956fa99469b872d97a7978e4e7a6d9605ec6e77164515f6f09d979999ca3ef91eebcd2a6c91ebdfe167de094",
    name: "Geth/v1.5.0-unstable/linux/go1.5.1/phoenix",
    network: {
      localAddress: "10.15.244.204:56808",
      remoteAddress: "10.15.244.203:30303"
    },
    protocols: {
      eth: {
        difficulty: 131072,
        head: "0xaab381212b8108c488c8d21c06042a9081b94bfb87665110520d3c295626e79b",
        version: 63
      }
    }
}]

挖礦

激動人心的時刻到了。 作為一個偽金融圈人士,最大的夢想,古時候叫擁有一個聚寶盆,現在叫擁有一個印鈔權,在數字貨幣時代,叫擁有一個挖礦機。 自己搭建的區塊鏈,想怎麼挖就怎麼挖吧。

私鏈啟動起來之後,挖礦其實很簡單了。 首先必須保證的有一個賬號:


> eth.accounts
["0x1b39aa2446de648dd6928a759c542690cc32757b"]
> eth.getBalance(eth.accounts[0]).toNumber();
0

賬號裡沒錢。 那就開始挖吧。挖礦其實很簡單,一個命令就開始了。預設的,挖到的錢,都放在當前賬號中。如果有多個賬號,預設的放到第一個賬號中。 在geth環境下,執行:


> miner.start();

或者執行命令列:


geth --mine --minerthreads=4

minerthreads用來指定執行的執行緒數。預設為當前CPU的核數。 如果有多個賬號,可以指定挖礦收入放到第幾個賬號,注意編號是從0開始的:


miner.setEtherbase(eth.accounts[0])

或者命令列執行:


geth --etherbase 0 --mine  2>> geth.log // 0 is index: first account by creation order OR
geth --etherbase '0x1b39aa2446de648dd6928a759c542690cc32757b' --mine 2>> geth.log

半小時後,檢視下賬戶餘額:


> eth.getBalance(eth.accounts[0]).toNumber();
1.5971875e+21

話說, e+21,那是多大的數字啊??一輩子還沒見過這麼多錢。 頭條的同學們,記得幫忙點贊啊。

【補充】從0開始搭建區塊鏈開發環境視訊  http://www.8btc.com/video/104371


以太坊生態系統中的工具和技術

如果你是一個以太坊或區塊鏈的新手開發者,那麼你可能正費力地(至少我是)試圖瞭解以太坊生態系統中的所有工具和技術。 所以在開始學習以太坊之時,我決定簡單介紹一下你經常遇到的各種元件。 希望這將有助於您全面地瞭解以太坊生態系統,以及每一部分是如何聯絡在一起。

1 . 以太坊 
以太坊是一個聰明的智慧合約區塊鏈,您可以在上面建立去中心化的應用程式(稱為DApp)。 如果您是技術專家,這本白皮書值得一讀:
https://github.com/ethereum/wiki/wiki/White-Paper.

如果您之前已經建立了Web應用程式,我寫了一篇文章,比較了以太坊區塊鏈和Web應用程式架構,這可能有助於更深入地瞭解以太坊。

2 . Geth
Geth是由以太坊基金會提供的官方客戶端軟體。它是用Go程式語言編寫的。 這個軟體包幾個值得了解的元件:

  • Geth 守護程式
    當您啟動Geth 守護程式時,它將連線到網路中的以太坊節點,並下載同步區塊。 它將不斷與其他節點進行通訊,以使其區塊不斷更新至最新。 它還具有挖掘區塊並將交易新增到塊鏈的能力,驗證並執行區塊中的交易。 它還可以充當伺服器,您可以通過RPC來訪問暴露的API介面。

  • Geth 終端 (https://github.com/ethereum/go-ethereum/wiki/geth)
    這是一個命令列工具,可以讓您連線到正在執行的節點,並執行各種操作,如建立和管理帳戶,查詢區塊鏈,簽署並將交易提交給區塊鏈等等。

  • Mist 瀏覽器 
    這是一個用於與您的節點通訊的桌面應用程式。 您使用 Geth 終端 執行的任何操作都可以通過此圖形使用者介面來完成。

3 . Parity
Parity 是對以太坊協議的另一個很好的實現,並且是用Rust程式語言編寫的。 這是一個由一家名為Parity Inc (https://parity.io/)的公司來維護的非官方客戶端。任何人都可以實現這個客戶端軟體,並加入以太坊網路。 您可以按照本黃皮書 (https://ethereum.github.io/yellowpaper/paper.pdf) 中的規範來實施您自己的客戶端!

4 . Web3.js
就像你用 geth,mist 瀏覽器等等,來與以太坊節點進行通訊,還有一個名為Web3.js的javascript庫,可以用來與一個節點進行互動。 由於它是一個 JavaScript 庫,您可以使用它來構建基於Web的dapps。

5 . Solidity
Solidity是用於編寫在以太坊區塊鏈上執行的智慧合約的最流行的程式語言。 它是一種高階語言,當編譯轉換為 EVM 位元組碼。 這與 Java 非常相似,其中有諸如 Scala,Groovy,Clojure,JRuby等JVM語言。所有這些編譯都生成在JVM(Java虛擬機器)中執行的位元組碼。 只要遵循規範,你也可以建立一個像 Solidity 這樣的語言,編譯成的 EVN 執行的位元組碼。

還有一個非常棒的瀏覽器,它基於IDE,您可以在這裡編寫合同、編譯和部署到區塊鏈: http://remix.ethereum.org/

6 . Truffle/Embark

就像您擁有Ruby on Rails,Python / Django等Web應用程式開發框架一樣,Truffle 和 Embark 是用於開發以太坊 DApps的兩個最常用的框架。 它們抽象出在區塊鏈上編譯和部署合同的許多複雜的東西。

7 . Metamask
如果你在經常關注以太坊社群,你一定會聽過 Metamask 。 它是一個用於與以太坊節點進行互動的Chrome 外掛。 讓全世界的人都執行一個節點與區塊鏈互動是不切實際的。 所以,Metamask會擁有一部分節點。 你只需要安裝 Metamask ,它就會自動連線到他們的節點。

8 . ENS
ENS 以太坊域名服務是以太坊世界的DNS。 就像你將 IP 地址對映到可讀取的名稱一樣,您可以將任何以太坊合約或錢包地址對映到一個易讀的名稱。
例如: 146.115.22.177 → google.com. 您不需要在瀏覽器中輸入IP地址,而是輸入google.com就可以解析該IP地址。
例如: 0x80C013d980aB049471c88E1603b8b4a60E03295C 是我的錢包地址。如果你想轉給我一些以太幣,你並不需要記住這個地址。 一旦 ENS 啟動,我可能會將其對映到mvmurthy.eth,你可以很輕鬆地用它給我轉錢 :)。
9 . Swarm
區塊鏈能很好地儲存少量的資料。 如果您要儲存病歷,銷售合同或是需要公開時間戳的大型檔案,該怎麼辦?在區塊鏈中儲存資料的代價很大,同時它不可擴充套件。 Swarm 解決了這個問題。 Swarm 是一個去中心化的內容儲存和分發服務。 您可以將它視為 CDN,但它並不是在一家公司的伺服器上託管的所有 CDN,而是通過網際網路在計算機上分發。 就像執行一個以太坊節點一樣,來執行一個 Swarm 節點連線到 Swarm 網路。
當您將一個以太坊合同部署到區塊鏈時,您會獲得ABI (https://github.com/ethereum/wiki/wiki/Ethereum-Contract-ABIJSON介面(類似於API的合約介面)。)的部署地址和 當您希望有人使用您的合約時,您必須提供部署的地址和ABI。 將來,ABI會儲存在Swarm中,所以每個人都可以通過檢視以太坊地址來查詢ABI。
10 . IPFS
IPFS(Inter Planetary檔案系統)在概念上與Swarm完全相似。 它是一個去中心化的儲存系統。 它與以太坊沒有直接關聯,但可與以太坊整合。
您可以在以下網址閱讀Swarm和IPFS之間的區別: https://github.com/ethersphere/go-ethereum/wiki/IPFS-&-SWARM
11 . Whisper
你可能聽到很多關於 Whisper的談論,但是在以太坊生態系統中,它是一項有趣的技術。 它是Dapps與其他......互動的互通協議。 點選以下網址閱讀更多關於Whisper的內容: https://github.com/ethereum/wiki/wiki/Whisper

下圖嘗試把所有的東西放在一起:

希望以上能讓您對以太坊生態系統有一個概括性的瞭解,並能深入地、更好地瞭解它。

相關文章