以太坊 DApp 開發-Geth 私鏈環境搭建-Ubuntu 平臺

NO IMAGE

 以太坊 DApp 開發-Geth 私鏈環境搭建-Ubuntu 平臺

一、安裝前的準備

1.1 檢視當前 CPU 架構

在終端中執行以下命令,確定是 32 位架構還是 64 位架構:

~$ uname –p
x86_64

如果你看到輸出 x86_64,那麼就是 64 位系統,否則是 32 位。

1.2 下載工具確保你安裝了下載工具 wget:

~$ wget –V
GNU Wget 1.17.1 built on linux-gnu

如果還沒有安裝 wget,使用 apt-get 來安裝

~$ sudo apt-get install wget

二、安裝 DApp 開發環境

2.1 安裝 Node.js

首先根據你的 ubuntu 是 32 位還是 64 位,分別下載丌同的預編譯版本,我們使用官方長期支援的 8.10.0LTS 版本:

64 位:

~$ wget https://nodejs.org/dist/v8.10.0/node-v8.10.0-linux-x64.tar.gz

32 位:

~$ wget https://nodejs.org/dist/v8.10.0/node-v8.10.0-linux-x86.tar.gz

然後解壓到當前目錄,

以 64 位為例:

~$ tar zxvf node-v8.10.0-linux-x64.tar.gz

然後接下來修改.bashrc 來設定相關的環境變數:

~$ echo "export NODE_HOME=$HOME/node-v8.10.0-linux-x64" >> .bashrc
~$ echo "export NODE_PATH=$NODE_HOME/lib/node_modules" >> .bashrc
~$ echo "export PATH=$NODE_HOME/bin:$PATH" >> .bashrc

最後重新載入.bashrc(或者重新登陸)來使 node 生效:

~$ source .bashrc

現在,你可以使用 node 了:

~$ node –v
v8.10.0

2.2安裝 Geth

在終端執行以下命令:

~$ wget https://gethstore.blob.core.windows.net/builds/geth-linux-amd64-1.8.3-329ac18e.tar.gz
~$ mv get-linux-amd64-1.8.3-329ac18e geth
~$ echo export PATH=$HOME/geth:$PATH >> .bashrc
~$ soure .bashrc

安裝完畢後,執行命令驗證安裝成功:

~$ geth version
Geth
Version: 1.8.3-stable

2.3安裝 solidity 編譯器

~$ npm install –g solc

安裝完畢後,執行命令驗證安裝成功

~$ solcjs –version
0.40.2 commit.3155dd80.Emscripten.clang

2.4安裝 web3

~$ npm install –g [email protected]

安裝驗證:

~$ node –p 'require("web3")'
{[Function: Web3] 
providers:{…}}

2.5 安裝 truffle 框架

執行以下命令安裝 truffle 開發框架:

~$ npm install –g truffle

驗證安裝:

~$ truffle version
Truffle v4.1.3 (core 4.1.3)

2.6 安裝 webpack

執行以下命令安裝 webpack:

~$ npm install –g [email protected]

驗證安裝

~$ webpack –v
3.11.0

三、執行私鏈節點

3.1 創世塊配置

建立一個節點目錄 node1,並在其中建立私鏈的創世塊配置檔案:

~$ mkdir node1
~$ cd node1
~/node1$ touch private.json

然後編輯內容如下:

{
"config": {
"chainId": 7878,
"homesteadBlock": 0,
"eip155Block": 0,
"eip158Block": 0
},
"difficulty": "200",
"gasLimit": "2100000",
"alloc": {
"7df9a875a174b3bc565e6424a0050ebc1b2d1d82": { "balance": "300000" },
"f41c74c9ae680c1aa78f42e5647a62f353b7bdde": { "balance": "400000" }
}
}

config.chainId 用來宣告以太坊網路編號,選擇一個大於 10 的數字即可。

difficulty 用來宣告挖礦難度,越小的值難度越低,也就能更快速地出塊

3.2 初始化私鏈節點

執行 geth 的 init 命令初始化私鏈節點:

~/node1$ geth --datadir ./data init private.json

這會在當前目錄下建立 data 目錄,用來儲存區塊資料及賬戶資訊:

~/node1$ ls
data private.json

可以上述命令寫到一個指令碼 init.sh 裡,這樣避免每次都輸入那麼多記不住的東西:

~/node1$ touch init.sh
~node1$ chmod  x init.sh

編輯內容如下:

#!/bin/bash
geth --datadir ./data init private.json

在部署下一個節點時,就可以直接執行這個指令碼迚行初始化了。例如,在另一臺機器上:

~/node1$ ./init.sh

3.3啟動私鏈節點

從指定定的私鏈資料目錄啟動並設定一個丌同的網路編號來啟動節點:

~/node1$ geth --rpc --datadir ./data --networkid 7878 console

同樣,你可以用一個指令碼 console.sh 來簡化啟動節點時的輸入:

~/node1$ touch console.sh
~/node1$ chmod  x console.sh

編輯內容如下:

#!/bin/bash
geth --rpc \
--rpcaddr 0.0.0.0 \
--rpccorsdomain "*" \
--datadir ./data \
--networkid 7878 \
console

rpcaddr 引數用來宣告節點 RPC API 的監聽地址,設為 0.0.0.0 就可以從其他機器訪問API 了;

rpccorsdomain 引數是為了解決 web3 從瀏覽器中跨域呼叫的安全限制問題。

以後啟動節點,只要直接執行這個指令碼即可:

~/node1$ ./console.sh

3.4 賬戶管理

3.4.1 檢視賬戶列表

在 geth 控制檯,使用 eth 物件的 accounts 屬性檢視目前的賬戶列表:

> eth.accounts
[]

因為我們還沒有建立賬戶,所以這個列表還是空的。

3.4.2 建立新賬戶

在 geth 控制檯,使用 personal 物件的 newAccount()方法建立一個新賬戶,引數為你自己選擇的密碼:

> personal.newAccount('78787878')
0xd8bcf1324d566cbec5d3b67e6e14485b06a41d49

輸出就是新建立的賬戶地址(公鑰),你的輸出丌會和上面的示例相同。

geth 會儲存到資料目錄下的 keystore 檔案中。密碼要自己記住,以後還需要用到。

3.4.3 查詢賬戶餘額

在 geth 控制檯,使用 personal 物件的 getBalance()方法獲取挃定賬戶的餘額,引數為賬戶地址:

> eth.getBalance(eth.accounts[0])
0

或者者直接輸入賬戶地址:

> eth.getBalance('0xd8bcf1324d566cbec5d3b67e6e14485b06a41d49')
0

新建立的賬戶,餘額果然為 0。

3.4.4 挖礦

沒錢的賬戶什麼也幹不了,需要挖礦來掙點錢。

在 geth 控制檯執行 miner 物件的 start()方法來啟動挖礦:

> miner.start(1)

等幾分鐘以後,檢查賬戶餘額:

> eth.getBalance(eth.accounts[0])
26950000000

錢不少了,2695ETH 了,目前市值將近 500 萬人民幣了,哈。

執行 miner 物件的 stop()方法停止挖礦:

> miner.stop()
3.4.5 解鎖賬戶

在部署合約時需要一個解鎖的賬戶。

在geth控制檯使用personal物件的unlockAccount()方法來解鎖挃定的賬戶,引數為賬戶地址和賬戶密碼(在建立賬戶時挃定的那個密碼):

> eth.unlockAccount(eth.accounts[0],'78787878')
true

四、構建示例專案

4.1 新建 DApp 專案

執行以下命令建立專案目錄並迚入該目錄:

~$ mkdir demo
~$ cd demo

然後用 webpack 模版初始化專案骨架結構:

~/demo$ truffle unbox webpack
Downloading…
Unpacking…
Setting up…
Unbox successful. Sweet!

4.2 安裝專案依賴的 NPM 包

執行以下命令安裝 nmp 包:

~/demo$ npm install

4.3 修改 truffle 配置

truffle.js 中,修改 port 為 8545,因為 geth 預設在 8545 埠監聽:

module.exports = {
networks:{
development: {
…
port: 8545
…
}
}
}

4.4 啟動節點

在另一個終端,執行以下命令啟動節點軟體,以便部署合約並執行交易:

~$ cd node1
~/node1$ ./console.sh
>

注意:為了在節點上部署合約,別忘了啟動 geth 後先解鎖賬戶:

> personal.unlockAcount(eth.accounts[0],'78787878')
true

4.5 編譯合約

執行以下命令編譯專案合約:

~/demo$ truffle compile

4.6 部署合約

執行以下命令來部署合約:

~/demo$ truffle migrate

如果你之前忘了在 geth 控制檯解鎖賬戶,會看到如下錯誤,參考前面說明迚行解鎖即可:

…
Error: authentication needed: password or unlock

如果已經正確地解鎖了賬戶,你會看到部署過程停止在如下狀態:

Replacing Migrations…
… 0x3088762a5bc9…

這是因為 truffle 在等待部署交易提交,但是我們在私鏈中還沒有啟動挖礦。

現在切換回 geth 終端視窗,檢視交易池的狀態:

> txpool.status
{
pending:1,
queued:0
}

果然有一個掛起的交易!啟動挖礦就是了:

> miner.start(1)

稍等小會兒,再檢視交易池的狀態:

> txpool.status
{
pending:0,
queued:0
}

交易已經成功提交了。

我們可以停止挖礦了,因為它太佔 CPU 了:

> miner.stop()

現在切換回 truffle 那個終端,部署過程也正確地執行完了。

4.7 啟動 DApp

執行以下命令來啟動 DApp:

~/demo$ npm run dev

在瀏覽器裡訪問 http://localhost:8080 即可如果你希望從別的機器也可以訪問你的 DApp 應用,

修改一下 package.json:

{
scripts:{
"dev": "webpack-dev-server –-host 0.0.0.0"
}
}