Solidity
用 Java 編譯智能合約
我想用 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()