通过sol源代码获取abi

有时候我们的到了合约的sol源代码,但是需要abi。通过abi调用合约中的方法。本文介绍几种方法。

solc编译

通过solc contract.sol --abi 即可获得abi。如下所示,在当前目录下存在两个sol文件,分别是Random.solSetup.sol。合约代码如下所示:
Randmon.sol

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// SPDX-License-Identifier: UNLICENSED

pragma solidity 0.8.15;

contract Random {

bool public solved = false;

function _getRandomNumber() internal pure returns (uint256) { // chosen by fair dice roll.
return 4; // guaranteed to be random.
}

function solve(uint256 guess) public {
require(guess == _getRandomNumber());
solved = true;
}
}

Setup.sol

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// SPDX-License-Identifier: UNLICENSED

pragma solidity 0.8.15;

import "./Random.sol";

contract Setup {

Random public random;

constructor() {
random = new Random();
}

function isSolved() public view returns (bool) {
return random.solved();
}
}

通过solc Setup.sol --abi得到输出如下:

1
2
3
4
5
6
7
8
======= Random.sol:Random =======
Contract JSON ABI
[{"inputs":[{"internalType":"uint256","name":"guess","type":"uint256"}],"name":"solve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"solved","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]

======= Setup.sol:Setup =======
Contract JSON ABI
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"isSolved","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"random","outputs":[{"internalType":"contract Random","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

remix

通过将代码上传到remix,编译完成之后,在编译的右下角的按钮的地方也可以得到abi文件;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
[
{
"inputs": [
{
"internalType": "uint256",
"name": "guess",
"type": "uint256"
}
],
"name": "solve",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "solved",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
}
]

合约地址

如果知道了合约地址,并且合约是verify的,就可以直接在etherscan中获取到对应的abi。以无聊猴的nft合约地址为例.BoredApeYachtClub (BAYC),在这个页面就可以找到Contract ABI,复制即可。

参考

  1. https://www.cloudhadoop.com/solidity-get-abi-json-file/
文章作者: Oooverflow
文章链接: https://www.oooverflow.com/2022/08/25/abi-from-source-code/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Oooverflow