Javascript

如何從 solc.compile 獲取 ABI?(^0.6.4)

  • June 1, 2020

在 pragma solidity ^0.6.4;

我寫了一個合約,可以得到如下字節碼:

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

const inboxPath = path.resolve(__dirname, "contracts", "Inbox.sol");
const source = fs.readFileSync(inboxPath, "utf8");

var input = {
 language: "Solidity",
 sources: { "test.sol": { content: source } },
 settings: {
   outputSelection: {
     "*": {
       "*": ["*"]
     }
   }
 }
};
var output = JSON.parse(solc.compile(JSON.stringify(input)));

for (var contractName in output.contracts["test.sol"]) {
 console.log(
   contractName +
     ": " +
     output.contracts["test.sol"][contractName].evm.bytecode.object
 );
}

此程式碼返回字節碼,但我不知道如何訪問 ABI 程式碼。

您在這裡所做的只是從 JSON 映射中獲取“字節碼”。

輸出.契約

$$ “test.sol” $$$$ contractName $$.evm.bytecode.object

上面的程式碼片段進入:contracts -> .sol file -> file_name object -> evm -> bytecode

如果您仔細查看此 console.log:

console.log(output.contracts["test.sol"]["test"]);

你會注意到它包含 1)abi 2)devdoc 3)evm 並且在 evm 裡面有彙編程式碼和其他東西。

如果你想獲取 abi,​​你需要做的就是:

console.log(output.contracts["test.sol"]["test"].abi);

這將為您提供如下結果:

[
 {
   inputs: [ [Object], [Object], [Object], [Object] ],
   name: 'addAdminData',
   outputs: [],
   stateMutability: 'nonpayable',
   type: 'function'
 },
 {
   inputs: [ [Object], [Object], [Object], [Object], [Object], [Object] ],
   name: 'addUserData',
   outputs: [],
   stateMutability: 'nonpayable',
   type: 'function'
 },
 {
   inputs: [ [Object], [Object], [Object], [Object] ],
   name: 'addVendorData',
   outputs: [],
   stateMutability: 'nonpayable',
   type: 'function'
 }
]

這就是你的 ABI。

如果你想要字節碼,你可以使用:

console.log(output.contracts["test.sol"]["test"]["evm"].bytecode);

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