區塊鏈 之 以太坊的那些坑
- 作者:鄒祁峰
- 郵箱:[email protected]
- 日期:2018.04.04
- 轉載請註明來自"祁峰"的CSDN部落格
使用以太坊的過程中遇到不少坑,團隊成員花了不少時間去研究才找到其中的真正原因.希望此篇能為各位在學習以太坊的過程中少走一些彎路.
主題 | 描述 |
---|---|
問題描述 | 編譯以太坊原始碼時, 出現常量超過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值不一致, 則會出現問題描述中的異常. |
解決方案 | 私鏈中的所有節點必須使用完全一致的配置. |