Allureluoli 二月FEBRUARY

区块链国赛笔记 07|读懂 Solidity ABI、调用输入与 FISCO 交易回执

拿到 ABI 和回执之后,要能分清函数描述、输入编码、事件以及执行结果。尤其不要把不同链的 status 约定直接套用。

本文由个人备赛旧笔记整理,整理日期为 2026-11-03。命令、输出和测试记录属于当时的实验环境;本文未重新搭建整套环境验证。

阅读前先确认

FISCO BCOS 回执中 status 为 0 表示成功;gasUsed 是消耗的 Gas 数量,不能直接理解成 wei。output 为空也不必然表示失败。

合约ABI

Application Binary Interface

ABI是智能合约与外部世界交互的接口规范,它定义了如何与合约进行数据编码和解码的规则。

组成核心要素:

  • 函数签名:
    • 函数选择器的签名包含函数名和规范化参数类型,不包含返回类型;ABI 条目另有返回值描述
  • 事件定义
    • 事件名和参数 包括indexed
  • 错误定义
    • 自定义错误类型
  • 构造函数
    • 合约部署时的初始化函数
  • 回退函数
    • 处理未匹配函数调用的默认函数

示例:

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
[
{
"inputs": [
{"internalType": "address", "name": "_companyAddress", "type": "address"},
{"internalType": "string", "name": "_companyName", "type": "string"},
{"internalType": "uint256", "name": "_creditAsset", "type": "uint256"}
],
"name": "addCompany",
"outputs": [{"internalType": "bool", "name": "", "type": "bool"}],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{"internalType": "address", "name": "_accepterAddress", "type": "address"},
{"internalType": "uint8", "name": "_receiptType", "type": "uint8"},
{"internalType": "uint8", "name": "_transferType", "type": "uint8"},
{"internalType": "uint256", "name": "_amount", "type": "uint256"}
],
"name": "createReceipt",
"outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}],
"stateMutability": "nonpayable",
"type": "function"
},
{
"anonymous": false,
"inputs": [
{"indexed": true, "internalType": "address", "name": "companyAddress", "type": "address"},
{"indexed": false, "internalType": "string", "name": "companyName", "type": "string"},
{"indexed": false, "internalType": "uint256", "name": "creditAsset", "type": "uint256"}
],
"name": "CompanyAdded",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{"indexed": true, "internalType": "uint256", "name": "receiptId", "type": "uint256"},
{"indexed": false, "internalType": "address", "name": "sender", "type": "address"},
{"indexed": false, "internalType": "address", "name": "accepter", "type": "address"},
{"indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256"}
],
"name": "ReceiptCreated",
"type": "event"
}
]

分段解析:

1
2
3
4
5
6
7
8
9
10
11
{
"inputs": [
{"internalType": "address", "name": "_companyAddress", "type": "address"},
{"internalType": "string", "name": "_companyName", "type": "string"},
{"internalType": "uint256", "name": "_creditAsset", "type": "uint256"}
],
"name": "addCompany",
"outputs": [{"internalType": "bool", "name": "", "type": "bool"}],
"stateMutability": "nonpayable",
"type": "function"
}
  • 函数名:addCompany

  • 参数 ;_companyAddress、_companyName、_creditAsset 以及相应的参数类型

  • 输出: 类型布尔

  • 状态可变性:nonpayable

1
2
3
4
5
6
7
8
9
10
11
12
{
"inputs": [
{"internalType": "address", "name": "_accepterAddress", "type": "address"},
{"internalType": "uint8", "name": "_receiptType", "type": "uint8"},
{"internalType": "uint8", "name": "_transferType", "type": "uint8"},
{"internalType": "uint256", "name": "_amount", "type": "uint256"}
],
"name": "createReceipt",
"outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}],
"stateMutability": "nonpayable",
"type": "function"
}
  • 函数名:createReceipt

  • 参数:_accepterAddress、_receiptType、_transferType、_amount

  • 状态可变性:stateMutability

  • 输出类型:uint256

1
2
3
4
5
6
7
8
9
10
11
{
"anonymous": false,
"inputs": [
{"indexed": true, "internalType": "uint256", "name": "receiptId", "type": "uint256"},
{"indexed": false, "internalType": "address", "name": "sender", "type": "address"},
{"indexed": false, "internalType": "address", "name": "accepter", "type": "address"},
{"indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256"}
],
"name": "ReceiptCreated",
"type": "event"
}
  • 事件名:ReceiptCreated
  • 参数:receiptId、sender、accepter、amount

合约调用参数解析

交易回执

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{
"version": 0, // 版本号:交易或合约的版本标识,0通常表示初始版本或基础版本
"contractAddress": "", // 合约地址:新部署合约的地址,空字符串表示这是普通交易而非合约部署交易
"checksumContractAddress": "", // 校验和合约地址:包含大小写校验的合约地址格式,用于地址验证
"gasUsed": "7587", // 使用的Gas量:交易执行消耗的 Gas 数量,不是 wei 金额
"status": 0, // 交易状态:FISCO BCOS 中 0 表示成功,非 0 表示失败
"blockNumber": 4, // 区块高度:交易被打包所在的区块编号
"output": "0x", // 输出数据:交易执行的返回值,空值表示无返回数据或执行失败
"transactionHash": "0x113e88e1c7a17a06e3aca4bb91a799a5167e46db8ca360bfd2b96fa385079659", // 交易哈希:交易的唯一标识符
"logEntries": [], // 日志条目:交易执行过程中产生的事件日志数组,空数组表示无事件触发
"input": "0xbff6d8660000000000000000000000000000000000000000000000000000000003f940aa", // 输入数据:调用合约函数的选择器和参数编码
"from": "0xa2572d2d293a2cb07e8b50f4dc3b573abf50bba2", // 发送方地址:交易发起者的以太坊地址
"to": "0x4721d1a77e0e76851d460073e64ea06d9c104194", // 接收方地址:交易接收者的以太坊地址或合约地址
"transactionProof": null, // 交易证明:用于跨链或轻客户端的Merkle证明,null表示未提供
"receiptProof": null, // 回执证明:交易回执的Merkle证明,null表示未提供
"txProof": null, // 交易证明:另一种格式的交易证明,null表示未提供
"txReceiptProof": null, // 交易回执证明:交易和回执的组合证明,null表示未提供
"extraData": "", // 额外数据:自定义的附加信息字段,空字符串表示无额外数据
"message": "Success", // 状态消息:交易执行的文字描述,"Success"表示成功
"statusOK": true, // 状态检查:布尔值,true表示交易执行成功且被确认
"hash": "0x2137cc9c895b128b4fd43ebbe749eec2f95b50031e5449b7428b578508300079" // 哈希值:可能是区块哈希或另一个标识符
}

核对资料

复现时的自查

  • 记录自己实际使用的版本、配置和缺失依赖。
  • 对照本篇关键步骤,保存命令或调用结果,并解释结果代表什么。
  • 对失败或与原记录不一致的情况保留错误信息,不把历史输出当成自己的验证结果。

返回系列导读 · 上一篇 · 下一篇

评论COMMENTS