没有源代码是否可以获取合约的ABI?

jjr*_*edv 1 blockchain ethereum solidity web3js

是否可以在没有源代码的情况下获取已知合约地址的ABI?

我发现的唯一方法是使用 etherscan 的 API,但它仅适用于经过验证的合约。

Pat*_*ins 8

简单回答:不


长答案:也许吧。ABI 是从源代码生成的,但如果您知道函数是什么,则可以自己“创建”ABI。

合约的ABI代表应用程序二进制接口,它只是定义了如何与智能合约交互。

例如,也许你不知道合约的源代码是什么,但你知道它有一个transfer函数。您可以“制作”ABI 只要:

[
  {
  "constant":false,
  "inputs":[
    {"name":"_to","type":"address"},
    {"name":"_value","type":"uint256"}
  ],
  "name":"transfer",
  "outputs":[
    {"name":"success",
    "type":"bool"}
  ],
  "payable":false,
  "stateMutability":"nonpayable",
  "type":"function"
  }
]
Run Code Online (Sandbox Code Playgroud)

或者使用已编译的接口,因为已编译的接口将输出 ABI。

pragma solidity ^0.8.8;

interface ContractInterface {
  function transfer(address to, uint256 value) external returns (bool success);
}
Run Code Online (Sandbox Code Playgroud)

由于 ABI 和接口不必涵盖智能合约能够实现的每一项功能。

此外,还有诸如反编译器之类的东西,它们尝试反编译字节码以找出合同是什么,这样您就可以获得 ABI。