1. 程式人生 > >【以太坊系列-001】基於以太坊的私有鏈環境搭建-以及搭建過程的問題記錄

【以太坊系列-001】基於以太坊的私有鏈環境搭建-以及搭建過程的問題記錄

本文是基於virtalbox的ubuntu1804(ubuntu-18.04.1-server-amd64,不要使用live-server安裝)的虛擬機器環境,配置是1核2GB記憶體(建議記憶體越多越好)。

本文基於網上的文件,加上自己安裝部署過程遇到的問題,進行了整理。

安裝geth

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

# geth version
WARN [10-26|17:42:12.025] Sanitizing cache to Go's GC limits       provided=1024 updated=664
Geth
Version: 1.8.17-stable
Git Commit: 8bbe72075e4e16442c4e28d999edee12e294329e
Architecture: amd64
Protocol Versions: [63 62]
Network Id: 1
Go Version: go1.10.1
Operating System: linux
GOPATH=
GOROOT=/usr/lib/go-1.10
# solc --version
solc, the solidity compiler commandline interface
Version: 0.4.25+commit.59dbf8f1.Linux.g++

第一部分 簡單操作

Step 1: 建立目錄和genesis.json

在命令列模式建立一個目錄,例如geths ,這裡geths目錄命名任意。

命令:mkdir geths

然後在ubuntu目錄下會出現一個geths資料夾。

繼續進入到該資料夾目錄下,建立一個檔案,genesis.json, 檔名也可以任意。

genesis.json 檔案內容:

(注意版本太早的複製進去,執行會出錯,可以適當更改內容)

# mkdir -p /home/data
# cd /home/data
# cat genesis.json
{

  "nonce": "0x0000000000000042",
  "difficulty": "0x020000",
  "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "coinbase": "0x0000000000000000000000000000000000000000",
  "timestamp": "0x00",
  "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "extraData": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa",
  "gasLimit": "0xffffffff",
  "config": {"chainId": 15, "homesteadBlock": 0, "eip155Block": 0, "eip158Block": 0},
  "alloc": { }
}

如果上述的難道太大,導致無法生成區塊,可以降低難度

"difficulty" : "0x400", 

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

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

進入到geths 目錄下,執行命令

# geth --datadir data init genesis.json

此時當前geths目錄下面會新增出兩個資料夾geth和keystore

geth中儲存的是區塊鏈的相關資料

keystore中儲存的是該鏈條中的使用者資訊

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

# geth --networkid 123456 --rpc --rpccorsdomain "*" --nodiscover console >>geth.log

注意這裡輸出列印日誌到log檔案中

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

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

輸入命令personal.newAccount("test001"),該命令將創造一個新的使用者,該使用者的密碼是xxx. 當然使用者也可以將test001改為123,或者123456,或者任意密碼

再次輸入命令 eth.accounts, 我們會發現一個新的使用者被建立了出來,這就代表我們已經建立了一個賬戶,重personal.newAccount() & eth.accounts 我們可以建立若干個賬戶出來

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

在命令列中執行命令 miner.start(), 開始在我們的區塊鏈上進行挖礦

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

注意點:

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

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

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

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

5. 通常有人出現miner.start()返回null,,並且沒有資訊刷屏,就停留在null,, 原因回到step 3 你將輸出結果列印到日誌log,所以無法顯示,exit 退出, 重新執行geth --datadir "./" --nodiscover console 即可。

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

acc0 = eth.accounts[0]

eth.getBalance(acc0)

結果只要不為0,那就說明挖礦成功!

退出挖礦:miner.stop()

退出當前geth ,執行:exit

重新執行geth, 直接進入到step 3, 不需要執行前兩步了。

第二部分 操作遇到的問題以及一些簡單命令

1、一直無法產生區塊

可以使用以下新的創世區塊,來降低挖礦難度,然後全部重新初始化,最好新搞環境,以免資料殘留

cat genesis.json
{ 
    "config": {
            "chainId": 22, 
            "homesteadBlock": 0, 
            "eip155Block": 0, 
            "eip158Block": 0 
    },
    "alloc" : {},
    "coinbase" : "0x0000000000000000000000000000000000000000", 
    "difficulty" : "0x400", 
    "extraData" : "", 
    "gasLimit" : "0x2fefd8", 
    "nonce" : "0x0000000000000038", 
    "mixhash" : "0x0000000000000000000000000000000000000000000000000000000000000000", 
    "parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000", 
    "timestamp" : "0x00" 
}

重新初始化創世塊

# mkdir -p /home/data
# cd /home/data
# geth --datadir data init genesis.json

2、及時修改了難度也挖不到礦,換條geth啟動命令

# 可以嘗試使用以下命令進行挖礦
# --dev 表示自動建立一個賬戶並直接開始挖礦(當前沒用),--dev.period 1表示不用等有交易了才挖,如果設成0的話沒有交易挖礦就是null
# geth --identity "TestNode" --rpc --rpcport "8545" --datadir data --port "30303" --rpccorsdomain "*" --dev.period 1 --nodiscover

提示資訊有個 /home/data/data/geth.ipc:
INFO [11-16|09:04:20.745] IPC endpoint opened                      url=/home/data/data/geth.ipc
INFO [11-16|09:04:20.880] HTTP endpoint opened                     url=http://127.0.0.1:8545    cors=* vhosts=localhost

使用geth attach 連線到geth客戶端(--datadir /home/data/data)
# geth attach --datadir /home/data/data

3、常用操作

1)建立賬戶
personal.newAccount("lyh001")
personal.newAccount("lyh002") 
2) 獲取餘額
eth.getBalance(eth.accounts[0])
eth.getBalance(eth.accounts[1])
3) 數值轉換
web3.fromWei(eth.getBalance(eth.coinbase), "ether")
web3.fromWei(eth.getBalance(eth.accounts[1]), "ether")
4) 開始挖礦
miner.start(1)
5) 停止挖礦
miner.stop()
6) 只挖一個礦,就停止
miner.start(1);admin.sleepBlocks(1);miner.stop();

4、轉賬

1)解鎖
personal.unlockAccount(eth.accounts[0], "lyh001", 300)
2)轉賬
eth.sendTransaction({from: eth.accounts[0], to: eth.accounts[1], value: web3.toWei(1, "ether")})
3)檢視餘額不變
web3.fromWei(eth.getBalance(eth.coinbase), "ether")
web3.fromWei(eth.getBalance(eth.accounts[1]),"ether")
4)檢視未確認交易
此時如果沒有挖礦,用 txpool.status 命令可以看到本地交易池中有一個待確認的交易,
可以使用 eth.getBlock("pending", true).transactions檢視當前待確認交易。
eth.getBlock("pending", true).transactions
5)啟動礦工:
miner.start(1)
6)直到
Mined stale block
7)檢視變化
web3.fromWei(eth.getBalance(eth.coinbase), "ether")
web3.fromWei(eth.getBalance(eth.accounts[1]),"ether")
8)指定挖礦賬戶
挖到一個區塊會獎勵以太幣,挖礦所得的獎勵會進入礦工的賬戶,這個賬戶叫做 coinbase,
預設情況下 coinbase 是本地賬戶中的第一個賬戶,可以通過 miner.setEtherbase() 將其他賬戶設定成 coinbase。

5、檢視區塊資訊

5.1) 檢視當前區塊總數:
> eth.blockNumber
4

5.2) 通過區塊號檢視區塊

 > eth.getBlock(4)

5.3)檢視交易資訊

> eth.getTransaction("0xe784696d88186ee6d6b2d89665a776d1467f16f813b68a267379ee823efcea48")

5.4)部署合約出現 exceeds block gas limit undefined

這是由於創世塊中gasLimit設定過小,可以重新設定gasLimit

"gasLimit" : "0xffffffff", 

參考: