Go-Ethereum

智能合約方法執行期間操作碼“0x1c”無效

  • June 26, 2019

我已經使用 web3j 編寫了一個智能合約來測試來自 java 項目的事件 我已經使用 solc 編譯器版本 0.5.7+commit.6da8b019.Linux.g++ ”準備了 web3j 包裝器 java 類

我正在使用私有乙太坊網路來部署智能合約並在智能合約中執行方法。

智能合約來源是

pragma solidity ^0.5.7;

contract TestEvent {

   // Test Event will be received by java application
   event testEvent(string indexed message);


   function emitTestEvent(
       string  calldata message
   ) 
   external
   {
    emit testEvent(message);
   }
}

執行該方法的Java程式碼是

// Load broken smart contract build by solc version 0.5.7
       TestEvent contract = TestEvent.load("0x673ccae08d3c3f50f111fb9e5870c76bbbf60938",
               web3, credentials,
               GAS_PRICE, GAS_LIMIT);  // contract instance
       if (contract != null){
           TransactionReceipt transactionReceipt = contract.emitTestEvent("Message").send();
           System.out.println(transactionReceipt.toString());
       }

執行 emitTestEvent 方法時 geth 日誌輸出顯示錯誤

“err=“無效的操作碼 0x1c”

在此處輸入圖像描述

我的原始碼有什麼問題?

該操作碼是最近在君士坦丁堡版本中添加到 geth 的。您需要將以下內容添加到您的 genesis 以啟用君士坦丁堡:

    "constantinopleBlock":0,

操作碼0x1cSHR或右移,這是在最近的更新中引入的(更多在這裡)。它在 2019 年 2 月之前不可用。

您的 Java 工具 ( web3j?) 可能已過時並且無法辨識此操作碼。您可以升級到具有君士坦丁堡/聖彼得堡的較新版本。聖彼得堡支持。

引用自:https://ethereum.stackexchange.com/questions/69530