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

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

最近在開發一個基於Ethereum區塊鏈的應用,於是上網搜尋資料,發現網上資料太少,由於這項技術在國內較少人研究,許多問題都無法找到答案,我將這兩天自己的總結寫出來,希望能幫到大家。

概述
目前Hyperledge fabric的開發環境是使用一個執行在Vagrant裡的Ubuntu映像,並在裡邊依次執行若干Docker容器。 從概念上說,就是在一個主機上啟動了一個虛擬機器,然後在其上依次啟動Docker容器。
Host -> VM -> Docker
這個模型允許開發者利用他們自己喜歡的作業系統和編輯器來開發,與此同時呢,又可以讓系統執行在一個與開發團隊一致的受控環境中。
  • 注:你的主機不能執行在虛擬機器中。如果你嘗試執行在虛擬機器中,會得到一個條啟動錯誤資訊(VT-x不可用)。

準備項
  • Git client
  • Go - 1.6 or later
  • Vagrant - 1.7.4 or later
  • VirtualBox - 5.0 or later
  • 在BIOS中開啟虛擬化(Virtualization)選項
注:Note: 虛擬化(Virtualization)選項一般在BIOS的CPU或安全設定中。
步驟
設定GOPATH環境變數
請確保你正確設定了你主機上的GOPATH環境變數. 正確設定了之後,你就能夠在主機和虛擬機器上構建程式碼了。

首先我們要下載以太坊的客戶端工具,我參考的是網上的視訊《明說》http://ethcast.com/v1,由於我對這方面沒有任何的基礎完全按照視訊的內容進行操作下載的是go語言的客戶端。

推薦其他方法:hyperledger 區塊鏈 環境搭建與測試 - https://www.jianshu.com/p/f0b569097ed4

環境搭建

本次的以太坊環境是用go語言開發,虛擬機器內部執行的是javascript. 可能有人不太理解,舉個例子,java虛擬機器本身就是用c開發的(windows平臺上),但是執行在虛擬機器之上執行的是java語言。

環境準備

一臺能聯網的Ubuntu64位機器(已經安裝git),如果是其他機器型別,請參考其他安裝教程,點我

開始安裝

兩種安裝方式,任意選擇一種(建議使用第一種):

第一種使用 Personal Package Archives 直接安裝,命令如下:

1
2
3
4
sudo apt-get install software-properties-common
sudo add-apt-repository -y ppa:ethereum/ethereum
sudo apt-get update
sudo apt-get install ethereum

第二種安裝方式,使用原始碼安裝,自己用go語言進行編譯,命令如下:

1.下載原始碼

1
git clone https://github.com/ethereum/go-ethereum

 

2.安裝go的執行環境,參考本文
3.繫結執行環境到go

1
sudo apt-get install -y build-essential golang

 

4.進入到原始碼目錄中,開始編譯原始碼

1
2
cd go-ethereum
make geth

 

5.執行

1
build/bin/geth

 

初步探索

進入虛擬機器並輸出日誌

1
get --dev console 2>> geth-log

主介面:
圖片名稱

日誌介面:
圖片名稱

全域性變數

其中有一些是全域性變數,你可以認為是javascript的全域性變數,全域性變數擁有自己的方法和函式。
如下eth變數:

圖片名稱

如下的的personal變數:

圖片名稱

下面對使用者操作,對礦機的操作,轉賬操作,挖礦操作,實際都在運用這些全域性變數中的引數,然後穿上適當的方法。

賬戶操作

1.建立新賬戶

1
personal.newAccount('123456')

 

建立成功後,會展示建立成功的地址,其中上面的表示式中,中間傳入的123456為密碼

2.檢視一下系統有的使用者

1
eth.accounts

 

圖片名稱

因為我之前有個使用者,所以在有兩個使用者

3.為使用者取一個別名,很顯然如果操作上面的字串地址是很不方面的,所以下面對字串使用者進行取別名,因為是js語言,所以可以直接使用,如下:

1
2
user1 = eth.accounts[0]
user2 = eth.accounts[1]

 

如果你在檢視user1.則如下,已經成功賦值
圖片名稱

4.對賬戶進行解鎖,為了安全起見,一般一個使用者在建立的時候都是出於鎖定的狀態,有日誌狀態可以看到,如下

ehcoo

對賬戶進行解鎖的命令

1
personal.unlockAccount(user2,'123456')

 

開始挖礦

挖礦的過程,主要是對miner這個全域性變數進行操作
ehcoo

開始之前我們檢查一下賬戶user1和user2的金額,你會發現兩者的金額都為0

1
2
eth.getBalcance(user1)
eth.getBalcance(user2)

開始挖礦,命令如下:

1
miner.start()

 

停止挖礦命令:

1
miner.stop()

 

開始挖礦後臺輸出挖礦日誌:
ehcoo

執行一會後你去檢視使用者的賬戶金額

ehcoo

發現第一個賬戶中已經含有金額。也就是說預設是挖到了第一個賬戶中。

轉賬測試

現在我們模擬從第一個賬戶像第二個賬戶轉賬的命令

1
eth.sendTransaction({from:user1,to:user2,value:8})

 

ehcoo

需要說明的是轉賬後,賬戶2並沒有立即收到錢,而在是挖礦之後才收到的,主要原因是當前的交易還沒有併入到區塊鏈中,我們從日誌中可以獲取相關資訊

ehcoo

像地址0x0b52…寫的的交易0xab24..,在區塊8中才寫入,我們可以檢視區塊8進行驗證

ehcoo


下面是客戶端操作的一些命令

檢視賬戶餘額:eth.getBalance(user1)
檢視當前的區塊號:eth.blockNumber()
開啟日誌:tail -f file_to_log_output(新視窗中開啟)
挖礦命令:miner.start()
停止挖礦:miner.stop()

轉賬命令:eth.sendTransaction({from :user1,to:user2,value:web3.toWei(3,"ether")})
此時執行挖礦命令會報錯因為user1時預設鎖定的,我們應該先解鎖賬戶

personal.unlockAccount("0xshbfksugfksjb24sfsd","123456")//引數分別是賬戶和密碼

之後重新執行轉賬命令,轉賬需要挖礦進行確認


在上述操作完成之後我開始搭建ethereum中一個框架truffle,這個框架安裝整整花費我3天的時間才完成,基本上所有的問題都在這上面,所以我重點描述這方面

首先安裝truffle之前我們要先安裝nodejs和npm(git在後面的安裝中會用到,必須安裝)

安裝命令         
[plain] view plain copy
  1. <span style="font-size:18px;">        sudo apt-get install git  
  2.         sudo apt-get install nodejs-legacy  
  3.         sudo apt-get install npm</span>  



注意:我們安裝的nodejs和npm必須是較新的版本,不然在之後安裝truffle的時候會出問題,下面提供升級的方法

升級版本
   
[plain] view plain copy
  1. <span style="font-size:18px;">    sudo npm cache clean -f  
  2.     sudo npm install -g n  
  3.     sudo n stable</span>  

安裝solc和solc-cli
   
[plain] view plain copy
  1. <span style="font-size:18px;">    sudo npm install -g solc solc-cli --save-dev</span>  



因為我們要在geth中使用solidity編譯,所以還要安裝solc二進位制包

   
[plain] view plain copy
  1. <span style="font-size:18px;">    sudo add-apt-repository ppa:ethereum/ethereum  
  2.     sudo apt-get update  
  3.     sudo apt-get install solc</span>  


接下來我們安裝testrpc

testrpc不同於geth,geth是真正的以太坊環境,testrpc是在本地使用記憶體模擬的一個以太坊環境,對於開發除錯來說更為方便快捷,當你的合約在testrpc中測試通過後再部署到geth中去


安裝testrpc
  
[plain] view plain copy
  1. <span style="font-size:18px;">      sudo npm install -g ethereumjs-testrpc</span>  

安裝truffle
  
[plain] view plain copy
  1. <span style="font-size:18px;">      sudo npm install -g truffle</span>  

可能遇到的問題:truffle安裝失敗的概率很高,還會報很多錯誤
解決辦法:使用淘寶映象安裝可順利安裝

[plain] view plain copy
  1. <span style="font-size:18px;">npm config set registry https://registry.npm.taobao.org  
  2. npm install -g truffle  
  3. ln -s /usr//local/nodejs/node-v7.0.4/bin/truffle /usr/local/bin/truffle</span>  


根據網上的教程我們安裝truffle成功後先建立一個資料夾

mkdir test

進入該資料夾中

cd test

我們先執行truffle init 命令

網上介紹執行之後資料夾中會生成一下檔案和資料夾

app、contracts、migrations、test、truffle.js


但是我們發現我們的資料夾中並沒有app資料夾,當時我抱著試一試的想法繼續按照網上的教程進行操作

注:以下操作並沒有成功

執行 truffle compile命令,發現出現些許問題,沒有理會繼續執行


開啟我們的testrpc,重新啟動一個新的控制檯輸入testrpc即可


在原來的test資料夾下執行truffle migrate命令


再執行truffle serve

之後訪問localhost:8080

操作成功的話會顯示如下介面



但是我們訪問時發現介面顯示 cannot get connect



以上是完全按照教程執行,但是並沒有成功

為了解決這個問題在網上搜尋了很久,最後發現問題是網上教程使用的truffle是2.x的版本,而我們現在下載的版本是3.x的,3.x的版本與2.x的有許多改動,但是網上並沒有3.x的教程,苦尋無果的情況下我只好將版本回退到2.x,網上搜到這樣一條命令



若要安裝 truffle 2 版本
[plain] view plain copy
  1. <span style="font-size:18px;">npm install -g truffle@2.1.1 (編譯過程出現其他問題)</span>  


解除安裝 後重新安裝
[plain] view plain copy
  1. <span style="font-size:18px;">npm uninstall truffle  
  2. <span>npm install -g truffle@~2.1.1 (解決上述問題)</span>  
  3. </span>  

按照命令操作以後果然回退到2.x的版本(npm執行非常慢,大家一定要有耐心)

興高采烈的執行 truffle init命令(重新新建一個空的資料夾)

果然沒有問題生成了app、contracts、migrations、test、truffle.js這幾個檔案

接著執行

[plain] view plain copy
  1. <span style="font-size:18px;">truffle compile</span>  



結果

Could not find expected contract or library in ‘ConvertLib.sol’: contract or library ‘ConvertLib’ not found.
Compilation failed. See above.

實在沒辦法了,弄個框架就這麼麻煩嗎


好在最後在https://bitshuo.com/topic/58a55366598da39107dd7e81中找到解決方法


其實好多人從3.x版本回退到2.x版本後都遇到和我一樣的問題,解決的方法讓我崩潰,升級到3.x版本但是在專案資料夾中執行


[plain] view plain copy
  1.   
[plain] view plain copy
  1. <span style="font-size:18px;">truffle init webpack</span>  


抱著試試看的態度執行


[plain] view plain copy
  1. sudo npm install -g truffle  


將版本升級到3.x之後執行


[plain] view plain copy
  1. truffle init webpack  

果然生成的檔案中包含app資料夾,並且其中有一個README.md其中有操作步驟
First run truffle compile, then run truffle migrate to deploy the contracts onto your network of choice (default “development”).
Then run npm run dev to build the app and serve it on http://localhost:8080
按照上述步驟執行後終於獲得成功




現在我將整個正確的步驟貼出來


1.安裝truffle
   1.1 安裝git和npm


[plain] view plain copy
  1. sudo apt-get install git  
  2. sudo apt-get install nodejs-legacy  
  3. sudo apt-get install npm  

 1.2 升級版本

[plain] view plain copy
  1. sudo npm cache clean -f  
  2. sudo npm install -g n  
  3. sudo n stable  


1.3安裝solc和solc-cli


1.4安裝solc二進位制包
    

[plain] view plain copy
  1. sudo add-apt-repository ppa:ethereum/ethereum  
  2. sudo apt-get update  
  3. sudo apt-get install solc  


1.5安裝testrpc
    
[plain] view plain copy
  1. sudo npm install -g ethereumjs-testrpc  

1.6安裝truffle
    
[plain] view plain copy
  1. sudo npm install -g truffle  

1.7  控制檯輸入truffle得到相應的提示則說明成功



2 執行truffle命令
   2.1新建專案資料夾

[plain] view plain copy
  1. mkdir  linux  


2.2進入資料夾中
[plain] view plain copy
  1. cd linux  


3.3執行一系列命令
[plain] view plain copy
  1. truffle init  webpack  

[plain] view plain copy
  1. <span style="font-size:18px;"></span>  

truffle compile




testrpc(在新的控制檯視窗中執行)

[plain] view plain copy
  1. <span style="font-size:18px;"></span>  


truffle migrate




npm run dev



至此操作結束,開啟瀏覽器輸入 localhost:8080就能看到期望的轉賬demo介面

總結

本文快速搭建了一個以太坊的環境,並進一步探索了賬戶操作,轉賬,挖礦等操作,其中主要參考了汪曉明老師的教程。

[參考文件]
1、區塊鏈開發環境搭建_百度文庫 https://wenku.baidu.com/view/1bc7901932687e21af45b307e87101f69e31fbb6.html

2、搭建基於以太坊的私有鏈環境 -  http://blog.csdn.net/sportshark/article/details/51855007

3、區塊鏈開發環境搭建總結 -  http://blog.csdn.net/wjx342529/article/details/70148987

相關文章