Solidity

以程式方式獲取智能合約 ABI 和字節碼

  • March 7, 2022

我有 ERC20 進口契約,而 solc 無法編譯進口契約。我已經嘗試過truffle compile,它工作正常並生成 ABI。我想通過以程式方式編譯它(不使用終端)來獲取智能合約文件 ABI。最好的方法是什麼?

有 Truffle 和 Hardhat 之類的工具,但有時它們可能對 solc 版本很挑剔。

有主要的 npm 包“solc”。您可以像任何其他節點包一樣在本地安裝它。然後編寫一個使用包特性的 .js 腳本,如下所示:

const path = require("path");
const fs = require("fs");
const solc = require("solc");

const contractPath = path.resolve(__dirname, "contracts", "MyContract.sol");
const source = fs.readFileSync(contractPath, "utf8");
let compileOutput = solc.compile(source, 1)

我包含了“路徑”變數,以向您展示 Solidity 文件可以儲存在任何地方;在這種情況下,根據程式碼,它們應該位於一個名為“contracts”的文件夾中,與您執行此 javascript 的級別相同。

|-- contracts/
 \-- MyContract.sol
compile.js

**重要提示:**我相信,Solidity 經常發生變化,並且被 solc.compile() 函式轉儲的對象“compileOutput”的結構也發生了變化。但是,它應該包含一個“契約”鍵,允許您檢索字節碼和 ABI(介面)。

這些子對象可以保存或在前端程式碼中使用,或者您可以“導出”它們並將編譯腳本連結到部署腳本中。通過在部署開始時導入編譯腳本,您可以獲得最新版本的 ABI 和字節碼,因為編譯腳本將執行,並且導出/導入會傳遞您想要使用的編譯輸出中的任何對象.

使用節點執行。

node compile.js

它是獲取solidity合約的程式碼ABI,這裡solidity程式碼儲存在一個變數中:-bytecode``contract-name``contract

var solc = require('solc');

var contract=`
   //SPDX-License-Identifier:MIT
   pragma solidity ^0.8.0;
   contract hello{
      string public hii='hello world';
      function update(string memory message) public{hii=message;}
   }`

var input = {
 language: 'Solidity',
 sources: {'test.sol': {content: contract}},
 settings: {outputSelection: {'*': {'*': ['*']}}}
}

var output = JSON.parse(solc.compile(JSON.stringify(input)));

for (var contractName in output.contracts['test.sol']) {
   console.log('contractName: ',contractName)
   console.log('bytecode: ',output.contracts['test.sol'][contractName].evm.bytecode.object )
   console.log('abi :', output.contracts['test.sol'][contractName].abi)
}

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