尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

深入Ethereum ABI编码规则:从32字节字到动态参数,ethereum-input-data-decoder完全指南

深入Ethereum ABI编码规则:从32字节字到动态参数,ethereum-input-data-decoder完全指南 深入Ethereum ABI编码规则从32字节字到动态参数ethereum-input-data-decoder完全指南【免费下载链接】ethereum-input-data-decoderEthereum smart contract transaction input data decoder项目地址: https://gitcode.com/gh_mirrors/et/ethereum-input-data-decoderEthereum ABI 编码规则决定了智能合约交易输入数据的格式4 字节方法标识符、32 字节字对齐、动态参数偏移定位。本指南带你逐条弄懂这些规则并用开源工具 ethereum-input-data-decoderEthereum 合约交易 input 数据解码器把浏览器里的一长串十六进制还原成人类可读的方法名和参数值。1. 为什么需要解码交易 input 数据在区块链浏览器里合约交易的 input 字段通常长这样0x67043cae0000000000000000000000005a9dac9315fdd1c3d13ef8af7fdfeb522db08f02...对新手来说它就像一串天书。但如果你理解Ethereum ABI 编码规则就能看出67043cae是方法标识符后面 32 个字节对应第一个参数地址再后面是金额、时间戳……ethereum-input-data-decoder 正是干这件事的开源库你给它一份合约 ABI 和一段交易数据它自动帮你完成全部解码工作支持 Node.js 和命令行两种用法MIT 协议、基于 ethers。2. 先装起来安装与准备方式一npm 安装推荐新手npm install ethereum-input-data-decoder方式二克隆源码阅读git clone https://gitcode.com/gh_mirrors/et/ethereum-input-data-decoder克隆后建议先看这几个文件核心解码逻辑index.jsTypeScript 类型定义index.d.ts命令行工具cli.js真实交易测试数据test/data/含 0x、1inch、ERC721 等场景的 ABI 与交易数据文件3. 读懂交易 input方法标识符 参数区合约交易数据由两部分组成位置长度作用方法标识符Method ID4 字节8 个十六进制字符标识调用的是哪个方法参数区若干 32 字节字按 ABI 规则编码的函数参数方法标识符怎么来的把方法签名方法名(参数类型1,参数类型2)做 Keccak-256 哈希取前 4 个字节。例如registerOffChainDonation(address,uint256,uint256,string,bytes32)的哈希前 4 字节就是67043cae。解码器内部正是用同样的方式重算每个 ABI 方法的哈希再与数据前 4 字节比对从而锁定目标方法见index.js中的genMethodId函数。 类型相同、只是参数名不同的两个方法方法标识符会不同——签名里用的是类型不是名字。4. 核心规则之一32 字节字与对齐填充ABI 编码的最小单位是32 字节字正好是 EVM 栈上的一个字长。规则很简单每个参数固定占用一个或多个完整 32 字节字数据不足 32 字节 → 左侧补 0地址、短字节串等数据超出 32 字节 → 按整数字节数占位固定长度字节数组。Solidity 类型32 字节字中的存放方式address前 12 字节补 0地址放右侧 20 字节uint256 / int256无符号大端整数恰好占满 32 字节bool占 1 字节其余补 0bytes32恰好占满 32 字节源码里的normalizeAddresses函数会按“每类型 32 字节数组按元素个数翻倍”逐字定位参数这正是 32 字节字对齐规则的直接体现。5. 核心规则之二静态参数 vs 动态参数静态类型长度固定直接把自己的值写进头区。动态类型string、bytes、动态数组头区只写一个32 字节偏移量真实数据放在所有头区之后的尾部区。5.1 偏移量怎么算偏移量以参数区起始位置为基准指向该参数在尾部的真实数据位置。5.2 完整示例registerOffChainDonation测试用例test/data/abi1.jsontest/data/abi1_input_data.txt里这个方法的参数依次是address addr, uint256 timestamp, uint256 chfCents, string currency, bytes32 memo编码布局如下头区 5 个字尾部 1 段数据区域内容值头区 字1address0x...5a9dac9315fdd1c3d13ef8af7fdfeb522db08f02头区 字2uint256 timestamp0x58a202301487012400头区 字3uint256 chfCents0x4029344204852头区 字4string 偏移量0x80前 4 个字 128 字节头区 字5bytes320xf3df...71c8尾部string 长度 数据长度 3 BTC按此规则解码后工具返回{ method: registerOffChainDonation, types: [address, uint256, uint256, string, bytes32], inputs: [ 0x5a9dac9315fdd1c3d13ef8af7fdfeb522db08f02, 1487012400, 4204852, BTC, 0xf3df64775a2dfb6bc9e09dced96d0816ff5055bf95da13ce5b6c3f53b97071c8 ], names: [addr, timestamp, chfCents, currency, memo] }6. 上手解码ethereum-input-data-decoder 使用指南6.1 Node.js API 三步解码const InputDataDecoder require(ethereum-input-data-decoder); // 第 1 步加载 ABI文件路径或 ABI 数组均可 const decoder new InputDataDecoder(abi.json); // 第 2 步传入交易 input0x 开头的十六进制字符串 const result decoder.decodeData(txInput); console.log(result.method, result.inputs);decodeData返回 4 个字段字段含义method匹配到的方法名未匹配到时为nulltypes参数类型列表inputs解码出的参数值大数为 BN 对象names参数名列表另外decodeConstructor(data)可以专门解码合约创建数据里的构造参数工具取数据末尾 32 字节的参数段匹配 ABI 中的constructor参考test/data/contract_creation_data.txt测试用例。6.2 大数BN怎么转成可读数字所有数字都以 BNbig number对象返回避免精度丢失。Solidity 数字最大 256 位而 JavaScript 原生数字只有 64 位直接强转可能截断result.inputs[0].toString(10) // 安全转成十进制字符串 result.inputs[0].toNumber() // 小心超出 64 位会报错或丢精度6.3 如何解码 structtuple与动态数组使用 ABIEncoderV2 的合约如 DEX 订单结构体也能解码三个字段的呈现约定如下字段表示方式示例types元组展开为括号类型串(uint256,address)[]inputs元组值表示为数组[[100, 0xA37d...]]names[元组名, [字段名...]][allOrders, [amount, buyer]]参考用例0x 交易所的marketSellOrderstest/data/0x_exchange.jsontest/data/0x_exchange_data.txt以及 ERC721 的transferFromtest/data/erc721_abi.jsontest/data/erc721_transferfrom_tx_data.txt。测试入口在test/index.js跑npm test即可复现。7. 命令行快速解码CLI 三种输入方式全局安装后可直接用 CLInpm install -g ethereum-input-data-decoder支持三种输入方式命令行实现见cli.js# ① ABI 文件 数据文件 $ ethereum_input_data_decoder --abi token.abi --input data.txt # ② ABI 文件 直接传数据字符串 $ ethereum_input_data_decoder --abi token.abi 0x23b872dd... # ③ 管道输入 $ cat data.txt | ethereum_input_data_decoder --abi token.abi终端输出自动对齐为“类型 参数名 值”三列method registerOffChainDonation address addr 0x5a9dac9315fdd1c3d13ef8af7fdfeb522db08f02 uint256 timestamp 1487012400 uint256 chfCents 4204852 string currency BTC bytes32 memo 0xf3df64775a2dfb6bc9e09dced96d0816ff5055bf95da13ce5b6c3f53b97071c8CLI 还会自动做人性化处理BN 转十进制、address 补回0x前缀、bytes32转十六进制ABI 中找不到匹配方法时输出No matches。项目还自带一个浏览器端 Demo 页面example/index.html粘贴 ABI 和交易数据即可在线试解码。8. FAQ新手常见问题Q我找不到合约的 ABI从哪里获取用 Solidity 编译器从源码生成solc --abi MyContract.sol -o build也可以从各区块链浏览器上合约页面下载。Q能解码合约创建部署交易的输入数据吗可以。工具会自动回退尝试构造器参数解码见 6.1 节说明。Q支持 ABIEncoderV2 吗支持但已知偶有 bug遇到问题请到项目仓库提交 issue 反馈。Q地址为什么没有 0x 前缀API 返回的 address 会去掉0x前缀CLI 会自动补回使用时按需处理即可。9. 总结一张表回顾 ABI 编码规则知识点要点方法标识符方法签名 Keccak-256 哈希的前 4 字节32 字节字最小编码单位不足补 0、超出占整字静态参数值直接写入头区动态参数头区存偏移量尾区存长度 数据大数用 BN 保存toString(10)最安全掌握「4 字节标识 32 字节字 偏移定位」这三条规则你就能看懂绝大多数合约交易的 input 数据再配合 ethereum-input-data-decoder 的 API 或 CLI解码工作只需一行代码或一条命令。去试试吧——把浏览器里复制的一段 input 丢给它链上交互从此不再神秘 【免费下载链接】ethereum-input-data-decoderEthereum smart contract transaction input data decoder项目地址: https://gitcode.com/gh_mirrors/et/ethereum-input-data-decoder创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表