题目
产品要做「加速」与「取消」两笔交易,开发发现有的用户点下去之后两笔都失败;同时代码里用 nonce 大于 0 判断「这是老用户」,把刚创建的合约账户和刚完成有效 EIP-7702 授权的 EOA 都误判成了老用户。请从 nonce 的语义出发解释这两件事。
考察目标
- nonce 作为账户级顺序与重放保护计数器的作用。
- 交易发送、合约创建与 EIP-7702 授权对 nonce 的改变。
- nonce 在交易替换、加速与取消中的作用。
- 用 nonce 做用户判断时的边界。
说明 nonce 作为账户级顺序与重放保护计数器的作用,以及交易发送、合约创建与 EIP-7702 授权如何改变它。
产品要做「加速」与「取消」两笔交易,开发发现有的用户点下去之后两笔都失败;同时代码里用 nonce 大于 0 判断「这是老用户」,把刚创建的合约账户和刚完成有效 EIP-7702 授权的 EOA 都误判成了老用户。请从 nonce 的语义出发解释这两件事。
nonce 是账户级的顺序与重放保护计数器:同一账户下,相同 nonce 的交易在一条链上至多有一笔被打包。它并不等同于「已发送交易数」:交易发送者的 nonce 随交易处理递增,合约创建会让新账户的 nonce 在执行初始化代码前置为 1,EIP-7702 的有效授权也会让 authority 的 nonce 加一。读取 nonce 使用 eth_getTransactionCount。实现差异与工程取舍见深入回答。
发现这道题有问题? 反馈此题