ABI
- ABI(Application Binary Interface,应用二进制接口)是智能合约的接口定义,它描述了智能合约的函数和事件。对于以太坊区块链,ABI 是一个 JSON 格式的对象数组,它定义了如何与已部署的智能合约进行交互。
ABI 的作用:
- 合约交互: 当你使用 Web3.js 或其他以太坊库与智能合约交互时,ABI 告诉库如何构造正确的交易,调用合约中的方法,或解析事件和返回值。
- 输入和输出定义: ABI 明确描述了合约中函数的输入参数类型、输出类型、函数名称以及函数是否改变区块链状态(即是否需要支付
Gas
)。
ABI 的组成部分:
ABI 通常包括以下信息:
- 函数签名:合约中每个函数的名称和参数类型。
- 函数类型:
function
: 普通函数,可能是只读(不修改区块链状态)或写入(会修改状态,需要 Gas)。constructor
: 构造函数,用于部署合约时调用。event
: 事件,用于通知某些操作已发生,通常可以在交易日志中捕获。fallback
或receive
:回退函数,当调用合约但没有指定函数时执行。
- 输入和输出:函数参数的类型和顺序,以及返回值的类型。
- 状态可见性:定义函数是否是
view
(只读)或pure
(纯函数,不读取或修改状态),或者是否需要 Gas。
ABI 示例:
- 假设有一个智能合约,定义了一个
getValue()
函数和一个setValue(uint256)
函数,它们的 ABI 可能像下面这样:
[
{
"constant": true,
"inputs": [],
"name": "getValue",
"outputs": [
{
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_value",
"type": "uint256"
}
],
"name": "setValue",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
}
]
解释:
-
getValue
函数:constant: true
: 表明这是一个只读函数,不会修改区块链状态(即不需要Gas
)。inputs: []
: 没有输入参数。outputs
: 返回一个uint256
类型的值。stateMutability: view
: 表示它是只读的函数。
-
setValue
函数:constant: false
: 表明这是一个可以修改区块链状态的函数(需要Gas
)。inputs
: 需要一个名为_value
的uint256
类型的输入参数。outputs
: 没有输出。stateMutability: nonpayable
: 表示这个函数不会接收以太币(ETH)。
如何获取 ABI:
- 从编译合约时生成:当你使用 Solidity 编译器(如
solc
或 Remix)编译合约时,ABI 会自动生成。
- 从区块链浏览器获取:如果合约已经部署在区块链上(如以太坊主网或测试网),你可以通过区块链浏览器(例如 Etherscan)查找合约,通常 ABI 会在合约页面中提供。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Fetch Contract ABI</title>
</head>
<body>
<h1>Fetch and Display Contract ABI</h1>
<p id="abiData">Fetching ABI data...</p>
<script>