區塊鏈 之 以太坊的那些坑

使用以太坊的過程中遇到不少坑,團隊成員花了不少時間去研究才找到其中的真正原因.希望此篇能為各位在學習以太坊的過程中少走一些彎路.

主題描述
 
問題描述編譯以太坊原始碼時, 出現常量超過int64的表示範圍
問題原因

go版本過低.

解決方案

升級go版本 >= 1.9.2

 
問題描述

在某個節點上提交的交易無法同步到私鏈上的其他節點.

問題原因

以太坊的版本過低.

解決方案

升級版本到1.8及以上版本.

 
問題描述

一個賬號同時在多個終端(各類錢包、console、truffle等)上提交交易請求, 出現交易在pending中堆積,一直無法被處理.

問題原因

nonce值亂序造成的。從0開始計數,傳送一筆nonce對應加1。當前面的nonce處理完成之後才會處理後面的nonce。

● 當nonce太小(小於之前已經有交易使用的nonce值),交易會被直接拒絕。

● 當nonce太大,交易會一直處於佇列之中,這也就是導致我們上面描述的問題的原因;

● 當傳送一個比較大的nonce值,然後補齊開始nonce到那個值之間的nonce,那麼交易依舊可以被執行。

● 當交易處於queue中時停止geth客戶端,那麼交易queue中的交易會被清除掉。

解決方案

避免以上操作情況。

 
問題描述

賬號發起交易時出現如下錯誤資訊:

error: replacement transaction underpriced

問題原因

nonce值問題。

該賬號Ethereum客戶端中已經有一幣處於pending狀態的交易。

新的一筆交易擁有pending狀態交易相同的nonce值。新的交易的gas price太小,無法覆蓋pending狀態的交易。

解決方案

通常情況下,覆蓋掉一筆處於pending狀態的交易gas price需要高於原交易的110%。 有效管理nonce值遞增。

 
問題描述

檢視以太坊平臺日誌中出現如下錯誤資訊:

Failed RLPx handshake

問題原因

當前節點admin.peers列表的節點不存在或已結束執行.

注:當前節點admin.peers列表可通過static-nodes.json或admin.addPeer()加入.

解決方案

檢查admin.peers中的節點是否不存在或已結束執行.

 
問題描述

共識演算法選擇POA時, 配置檔案coinbase為一個非0值. 啟動以太坊節點後, 出現如下提示:

“beneficiary in checkpoint block non-zero”.

問題原因

共識演算法為POA時, 配置檔案中欄位coinbase必須為:0x0000000000000000000000000000000000000000, 否則出現問題描述中的異常情況.

解決方案

將欄位coinbase設定為: 0x0000000000000000000000000000000000000000

 
問題描述

使用Go語言呼叫智慧合約轉賬(如:”代幣”)時, 程式提示”gas required exceeds allowance or always failing transaction”.

問題原因

設定的交易Gas不足.

解決方案

提交交易前, 將Tranasctor.GasLimit設定為一個較大的值. 但該值又”不能大於”配置檔案gensis.json中的gasLimit欄位的值.

正確程式碼如下所示:

 
問題描述

使用Go語言呼叫智慧合約進行”以太幣”轉賬時, 卻提示失敗.

以太坊節點日誌資訊如下:

VM returned with error err=”evm: execution reverted”.

問題原因

欄位Transactor.Value指明授予智慧合約動用該賬戶以太幣的最大值. 如果智慧合約動用的以太幣數量超過Transactor.Value的值, 則會報錯.

解決方案

提交交易前, 需將Transactor.Value設定為一個合理值.

正確程式碼如下:

 
問題描述

以太坊日誌中出現如下錯誤資訊:

Ethereum handshake failed id=7c0a7fc6b6ceee92 conn=staticdial err=”Genesis block mismatch – 7fcd7cd9578a5e2c (!= 6c364b3b9143c1eb)

問題原因

節點加入到私鏈叢集時會進行握手操作, 而握手的過程會對配置檔案的MD5值進行校驗, 只有校驗通過後, 才能將節點加入到機群中.

如果發現MD5值不一致, 則會出現問題描述中的異常. 

解決方案 私鏈中的所有節點必須使用完全一致的配置.