交易的 Input Data 怎么读?方法选择器与参数解码 图 1
交易的 Input Data 怎么读?方法选择器与参数解码 · 图 1

Input Data 是什么

区块浏览器交易详情页的 Input Data(或 Input / Data)字段,是一串十六进制数据。对普通转账,它通常是空的;对合约交互,它就是这次操作的”内容本身”——钱包签名确认后广播的就是这段字节。把它读出来,你就知道这笔交易实际要求合约做什么:调用哪个函数、参数是什么。看懂它不需要编程基础,只需要理解它的固定结构。

结构:四个字节选函数,后面全是参数

以太坊合约调用的输入数据从固定的四字节方法选择器开始——它是函数签名字符串哈希的前四个字节,比如大家熟悉的转账函数会以十六进制 0xa9059cbb 开头,紧跟两个 32 字节参数:接收地址(补齐到 32 字节)和数量(链上原始整数)。批量函数、授权函数、交换函数同理,各自有固定的选择器值。主流浏览器会在原始十六进制上方提供解码视图,直接把函数名与参数名罗列出来;这是浏览器拿已知函数签名库做匹配的结果——如果合约函数冷门、参数命名缺失,解码可能显示 unknown0、unknown1 或干脆整段不解码,此时按原始结构自己拆也完全可行。

三种高频核对场景

场景一,核对一次 approve:解码出”approve(spender, amount)“,看 spender 是不是你正要交互的协议合约、amount 换算后是否只是本次交易额度。大额”无限额度”出现在这里,就该改成小额再来一次。场景二,核对一次 swap 或转账被包装的多步操作:解码视图可能显示函数名 multicall 或类似批量入口,展开内部调用列表逐条检查,攻击载荷常藏在批量调用的第二、三条。场景三,验证一笔”看起来成功”的失败:解码出目标函数与参数后,若发现调用对象根本不是你以为的合约,即便状态成功也要警惕——合约可能执行了同名但不同地址的函数。

进阶线索:选择器反查

已知选择器值可以反查函数签名:公共的 4byte 类签名数据库收录了海量常见选择器,把 unknown0x 开头的字节贴进去,命中后就知道真实函数名。反查不到怎么办?回到合约已验证源码(见 Read Contract 函数列表),把函数与参数类型对照原始数据拆分:每 64 个十六进制字符对应一个 32 字节参数,地址看末 40 位,数量按十六进制转十进制再按代币小数位换算。这套手工拆解与解码视图互为校验,是排查”解码视图没写出来的猫腻”的保底手段。平时养成习惯:每次发起重要合约操作之前,先在钱包签名弹窗里看一眼数据预览或调用说明,再把同一串字节贴进浏览器对照——两遍读数一致再放行,比事后追责省心得多。

练习路径:三次拆解练习

第一次,找一笔你自己的普通 ERC-20 转账,确认解码出 transfer(to, amount),手工按 64 字符分段拆一遍 to 和 amount,与解码视图对上。第二次,找一笔 swap,观察它调用的是路由合约、选择器对应哪个交换函数、参数里的路径数组(route)长什么样,理解”交易所没有从你账户划走超额资产”是怎么在数据层体现的。第三次,用一笔失败交易练反向排查:解码函数、查目标合约、对照 revert 信息,三样信息拼出失败原因。三次练完,Input Data 就从乱码变成了有语法的句子。

风险提示

本文是链上数据阅读方法科普,不构成投资建议。解码视图来自第三方标注,存在过期或缺失可能,关键参数务必回到已验证合约源码或手工拆分核对;阅读输入数据不会产生任何资金动作,可放心练习。