Solidity

用 Java 編譯智能合約

  • June 28, 2018

我想用 Java 編譯一個智能合約(solidity 程式碼)。目前我正在使用 web3j 庫。當我執行該方法時web3j.ethCompileSolidity(contract),出現以下錯誤:The method eth_compileSolidity does not exist/is not available

我創建了以下程式碼來在執行時編譯智能合約:

EthCompileSolidity ethCompileSolidity = web3j.ethCompileSolidity(contract).send();
Map<String, EthCompileSolidity.Code> compiledSolidity = ethCompileSolidity.getCompiledSolidity();

該方法web3j.ethGetCompilers()也不起作用。它返回以下錯誤:The method eth_compileSolidity does not exist/is not available

Github上,我讀到了一些關於不推薦使用的 eth_compile 方法的內容。

還有沒有辦法使用這個庫在 Java 中編譯智能合約?

你是對的,因為不推薦使用 eth_compile

沒有簡單的方法可以解決它。你可以:

  • 在您的開發機器上降級 geth 版本
  • 使用差異創建自定義版本的 geth 並將其保存在您的分支中

我通過從我的 java 程式碼執行 solc 執行檔(我正在執行 Windows 作業系統)得到它。我從https://github.com/ethereum/solidity/releases下載了 solc.exe ,把它放在我的類路徑中並使用以下程式碼:

List<String> commandParts = Lists.newArrayList("path.to.solc.exe", "--bin", "path.to.sol.file");
//loading solc.exe file
InputStream fileURL = MyClass.class.getResourceAsStream(pathToFile)
solcFile = File.createTempFile("solc", "exe");
FileUtils.copyInputStreamToFile(fileURL, solcFile); // FileUtils of org.apache.commons.io
ProcessBuilder processBuilder = new ProcessBuilder(commandParts)
       .directory(executable.getParentFile());
processBuilder.environment().put("LD_LIBRARY_PATH",
       executable.getParentFile().getCanonicalPath());

Process process = processBuilder.start();

記得關閉你的流(fileURL),編譯輸出取自process.getInputStream(),如果編譯失敗錯誤取自process.getErrorStream()

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