题目
产品要求你在 DApp 里做一个「交易预览」面板:用户点发送之前,要看到这笔交易会做什么、给谁、花多少。设计评审时有人问:除了金额,还有哪些字段需要在预览里体现?哪些字段由用户意图决定,哪些由钱包或节点补全?
请给出一份字段清单,并说明每个字段的含义与容易出现的问题。
考察目标
- 逐个理解交易字段的含义、单位与作用。
- 区分「用户意图决定的字段」与「钱包或节点补全的字段」。
- 说明字段变化为什么会改变签名内容与交易哈希。
逐项说明交易字段的含义、单位与约束,区分待签名摘要与签名后的序列化载荷,并解释字段变化为什么会改变签名摘要与交易哈希。
产品要求你在 DApp 里做一个「交易预览」面板:用户点发送之前,要看到这笔交易会做什么、给谁、花多少。设计评审时有人问:除了金额,还有哪些字段需要在预览里体现?哪些字段由用户意图决定,哪些由钱包或节点补全?
请给出一份字段清单,并说明每个字段的含义与容易出现的问题。
交易的核心字段包括:to 是接收地址或调用目标,为空表示部署合约;value 是随交易发送的金额,单位是 wei;data(也叫 input)是 calldata;nonce 是账户的交易序号;gasLimit 是允许消耗的上限;费用字段随交易类型变化,legacy 交易使用 gasPrice,EIP-1559 类型使用 maxFeePerGas 与 maxPriorityFeePerGas。from 是签名者地址,不在待签名摘要的字段列表中,由签名恢复得到;待签名摘要覆盖的任一字段变化,都会改变签名与交易哈希。实现差异与工程取舍见深入回答。
【协议保证】to 表示接收地址或调用目标;to 为空表示这笔交易用于部署合约(依据:EIP-1474 §eth_call 的 to 参数说明;EIP-1559 §Specification 的 payload 字段)。
【协议保证】value 的单位是 wei,随交易发送的金额以最小单位参与构造(依据:EIP-1474 §eth_call、§eth_sendTransaction 的参数说明)。
【协议保证】data(input)承载调用信息或部署代码;调用时它是函数选择器与编码后的参数(依据:Solidity ABI 规范 §Function Selector、§Argument Encoding)。
【协议保证】以 EIP-1559 类型为例,待签名摘要覆盖 chainId、nonce、费用字段、gasLimit、destination、amount、data 与 accessList;摘要不包含 signature_y_parity、signature_r、signature_s(依据:EIP-1559 §Specification 的签名摘要公式)。
【协议保证】nonce 是账户当前交易序号,也是交易序列化字段之一;它不能无条件解释为「已发送交易数」,因为 EIP-7702 的有效授权也会增加授权账户的 nonce(依据:EIP-1559 §Specification 的 payload 字段;EIP-7702 §Specification)。
【协议保证】gasLimit 是这笔交易允许消耗的上限;交易有效性要求余额覆盖上限费用,未用部分退回(依据:EIP-1559 §Specification)。
【协议保证】签名完成后,完整序列化交易载荷在摘要字段之后附加 signature_y_parity、signature_r 与 signature_s;from 不作为序列化输入字段写入交易,而是从签名恢复得到(依据:EIP-1559 §Specification 的 payload 列表)。
【协议保证】费用字段的形式由交易类型决定:legacy 交易使用 gasPrice,EIP-1559 类型使用 maxFeePerGas 与 maxPriorityFeePerGas(依据:EIP-2718 §Specification;EIP-1559 §Abstract、§Backwards Compatibility)。
【协议保证】待签名摘要中任一字段发生变化,都会产生不同的签名与交易哈希(依据:EIP-1559 §Specification 的签名摘要公式)。
【工程经验】预览面板展示的字段与提交给钱包的字段应当同源:展示用的金额、目标与 calldata 由同一份构造结果生成,避免两次计算出现偏差(依据:工程经验,无规范依据)。
【工程经验】金额以最小单位参与运算,展示时再按精度格式化;界面上的 ether 数值不适合直接进入构造流程(依据:工程经验,无规范依据)。
value,忽略单位是 wei。data,调用打到了不相关的目标。gasLimit 当作实际消耗量写进费用展示。from 当作可自由编辑的输入字段,忽略它由签名决定。to 为空与 to 指向一个没有代码的地址,两种情况下分别会发生什么?nonce 由谁决定?这对重试与替换交易的设计有什么影响?to、value、data、nonce、gasLimit 的基本含义。value 的单位是 wei,to 为空表示部署。from 的恢复过程。发现这道题有问题? 反馈此题