开篇小故事:13.37 ETH 的链上留言
还记得 Poly Network 被盗事件吗?一位匿名地址在转账的 input data 里写下一句话:“USDT 已被冻结,别用 USDT 提现。” 黑客当真看懂了这条链上“留言”,反手就给该地址转了 13.37 ETH。这一戏剧性插曲,让“用 ETH 聊天”瞬间火遍中文 Web3 圈。
什么是 Input Data?
核心关键词:以太坊交易、区块链浏览器、交易结构
在以太坊,每一笔交易(Transaction)都附带一段 input data,它决定了交易在 EVM 中具体做什么:
- 如果是一份 合约创建交易,
input data是部署的 EVM 字节码; - 如果是 合约调用交易,
input data就是函数选择器 + 参数; - 如果是 纯 ETH 转账,
input data留空,但你可以自定义文本让它“开口说话”。
拆解 Input Data:看一段十六进制文本如何被 EVM 读懂
1. 结构总览:函数标识符 + 参数
以 ERC-20 转账为例,在区块链浏览器里你能看到一串看起来很乱的十六进制字符:
0xa9059cbb
000000000000000000000000345d8e3a1f62ee6b1d483890976fd66168e390f2
0000000000000000000000000000000000000000000054b7d8ed70650b290000拆成三段你就懂了:
| 小标题 | 内容 | 说明 |
|---|---|---|
| 函数选择器 | 0xa9059cbb | 这是 transfer(address,uint256) 签名的 Keccak-256 哈希前 4 字节 |
| 第一个参数 | 64 位补零后的地址 | 收款人 |
| 第二个参数 | 64 位补零后的数值 | 转账数量 |
2. 为什么是 4 字节?成本省 8 倍!
- 把完整函数签名
transfer(address,uint256)计算 Keccak-256,可得到 32 字节。 - 如果全部带上链,需要 32×68=2176 gas;截断到前 4 字节仅 272 gas,节省 ≈8 倍。
- 由于相同前 4 字节冲突概率极低,无痛压缩。
3. 静态 vs. 动态参数编码
- 静态类型(uint、address、bool)直接左端补 0 到 64 位即可。
动态类型(string, bytes, 变长数组)编码更复杂:
- 先写偏移量指出数据段起点;
- 再写长度;
- 接着拼实际内容。
示例——对 uint256[] 的编码:
0000000000000000000000000000000000000000000000000000000000000060 // offset = 96
...
0000000000000000000000000000000000000000000000000000000000000003 // 长度
00000000000000000000000000000000000000000000000000000000000000a1 // 元素 1
...短地址攻击的“坑”
地址如果最后碰巧是两个 00,前端偷懒把“00”去掉,EVM 会误认为剩下字节是地址,导致把 amount 高位再补 0。于是金额直接 ×256,攻击者瞬间多拿 255 倍币。
记忆口诀:别剪地址尾巴,补零风险大。
用 Input Data 在链上“聊天”的四步曲
以太坊纯转账交易的 input data 原本是空着的,你可以把任何 UTF-8 文本转成十六进制写在里头。操作步骤:
- 打开高级模式
在 MetaMask 设置 → 「高级」→ 开启「显示十六进制数据」开关。 - 准备文本
将你的想说的话(如“HODL to the moon 🚀”)在线转成十六进制,注意最终结果要以0x开头。 - 输入数据并转账
把十六进制字符串贴到「十六进制数据」框,确认后再发送少量 ETH。 - 公开验证
交易打包后,去任意区块链浏览器打开该 tx,查看「Input Data → UTF-8」即可看到全文记录,永久不可篡改。
贴士: 链上存储按字节计费。一句话 20 字节 ≈ 7 K gas,与一笔简单转账相比几乎可以忽略,但别写长文一首歌,那费用可吃不消。
实际场景:Input Data 还能做什么?
- 防伪溯源:食药监局让每一包奶粉都在链上存批次号,厂商无法事后篡改。
- 电子票据验真:财税部门把票据哈希上链,消费者扫描二维码即可验证真伪。
- 学术成果存证:论文、专利指纹写入
input data,时间戳+不可篡改,谁敢抄袭?
常见问题 FAQ
Q1:任何钱包都能自定义 input data 吗?
不是。MetaMask、Rabby 支持,中心化交易所通常屏蔽该字段。
Q2:写中文会被截断吗?
UTF-8 编码后同样适用,但尽量控制长度 ≤ 1 KB,否则 gas 炸裂。
Q3:可以删除或改写已提交的 input data 吗?
无法删除。只要上链,即为永恒,除非全链回滚(概率≈灭霸响指)。
Q4:会不会暴露隐私?
是的,链上信息全世界可见。别写身份证号、银行卡号等敏感内容。
Q5:一笔普通转账若附带较多文字,手续费会增加多少?
额外约 (字节数 × 68-68) gas。写 16 个字的中文大约 48 字节,额外 3,200 gas,当前均价 20 gwei 时 ≈ 0.000064 ETH,不到 1 元人民币。
Q6:为什么说这是“公开信”而不是“私信”?
因为区块链去中心化设计,所有节点都会同步并永久保留这份数据,任何人都可查看。
小结:把区块链当「留言墙」的规则书
input data就是 ETH 世界里的“便签条”。- 任何文本都可编码,做成永不消失的备忘录。
- 切莫乱写敏感内容,切忌手抖弄丢高昂 gas。
- 把事情写简单、写清楚、写好玩,就能像那 13.37 ETH 的故事一样,成为链上传奇。
下次转账前,别急着点“确认”,给未来留一句“到此一游”吧!