谁授权了这笔转账?
从签名交易到区块状态,说明篡改、重放和余额不足的交易为什么会被拒绝。
- 区分私钥签名、交易内容和链上状态
- 解释 Nonce 如何阻止交易重放
- 观察区块打包如何改变余额并留下可验证哈希
- 上一章课程开始
- 本章谁授权了这笔转账?
从签名交易到区块状态,说明篡改、重放和余额不足的交易为什么会被拒绝。
- 下一章交易池怎样处理相同 Nonce 的交易?
先想一想这几个问题
展开答案前,可以先在心里做个判断。与预期不同的内容可以加入复习列表。
Q01签名完全正确,交易为什么还是可能失败?+
签名只证明某个地址授权了这段内容。Nonce、余额、Gas、合约条件和当前状态仍要在执行时验证;授权有效不代表状态转换有效。
链上金融里看似不同的余额、订单和抵押,最后都要落到一件事:节点能不能从一组已确认状态,确定性地验证下一次状态转换。我们从一笔转账开始,不先背共识名词。
一笔交易不是一句“我要转账”
实验室里每个账户都有余额和 Nonce。你创建的交易至少包含四个会被签名的字段:发送方、接收方、金额和 Nonce。签名证明“拥有对应密钥的人授权了这一组具体字段”,但它不会替节点保证余额足够,也不会直接改变账本。
一笔交易如何变成状态?
交易先被签名和广播,再由节点验证并打包进区块。任何一步不满足规则,余额都不会改变。
- Nonce
- 0
- 公钥
- pk_alice_demo
- Nonce
- 0
- 公钥
- pk_bob_demo
- Nonce
- 0
- 公钥
- pk_you_demo
还没有交易。先用正确 Nonce 广播一笔转账。
先看三张账户余额和 Nonce。签名只授权一组具体字段,节点还要在打包时检查 Nonce、余额和状态规则。
还没有区块。交易先在本地 Pending,等节点打包。
- 01
创世状态:三个账户各有 1,000 积分,Nonce 从 0 开始。
拖动滑块可以回到此前的步骤。从那里继续操作时,后续记录会替换为新的操作序列。
交易的生命周期可以拆成四步:
- 签名:发送者用私钥对交易内容生成签名。
- 广播:交易进入节点的 Pending 队列,其他人可以验证签名。
- 打包:区块生产者选择交易并按顺序执行状态转换。
- 确认:区块和状态根被后续区块引用,重放结果保持一致。
Nonce 是账户状态的一部分
如果没有 Nonce,同一笔已签名交易可以被广播很多次,节点可能重复执行转账。Nonce 把交易排成账户自己的序列:账户当前期待 0,成功执行后变成 1,下一笔必须使用 1。
在实验室里先用错误的未来 Nonce 广播,再打包区块。你会看到交易被记录为失败,但余额不变、Nonce 也不跳跃。失败尝试可以出现在区块的交易索引里,状态转换却必须明确区分成功和拒绝。
区块固定顺序,状态根压缩结果
区块不是一个神奇的数据库写入按钮。它保存交易顺序、前一个区块哈希和执行后的状态根。节点从上一个状态逐笔执行交易:扣发送者余额、加接收者余额、递增发送者 Nonce,然后计算新的状态摘要。
如果两个节点拿到相同的前状态和相同顺序,它们应该得到相同的余额、Nonce 和状态根;如果其中一个节点得出不同结果,就说明实现、输入或共识出现了问题。
展开:这一步如何实现
verify(tx):
check signature(tx.from, tx.fields)
check tx.nonce == account[tx.from].nonce
check account[tx.from].balance >= tx.amount
apply(tx):
account[tx.from].balance -= tx.amount
account[tx.to].balance += tx.amount
account[tx.from].nonce += 1
stateRoot = hash(all accounts and nonces)
真实链还需要费用、Gas、签名算法、交易池策略、区块提议和最终性。这里把密码学压缩成确定性签名摘要,把注意力放在状态转换和可重放性上。
账本是其他金融机制的共同底座
预测市场里的抵押锁定、AMM 里的储备变化、代币发行里的总供应和预言机里的最终结果,都可以被看成一串交易作用于状态。理解账本之后,你就能继续追问:谁授权了这次变化?它是否可重放?失败时哪些字段应该回滚?
为什么已经签名的交易,广播后把金额改掉就会被节点拒绝?
用五个问题读懂一笔链上交易
完成实验后,试着解释:
- 签名验证和余额验证分别回答什么问题?
- 为什么 Nonce 要在成功状态转换后递增?
- Pending 交易和已确认交易有什么区别?
- 一个区块如何承诺交易顺序和前一个区块的连续性?
- 为什么状态根可以帮助不同节点发现执行分歧?
这五个问题是理解代币、交易所、借贷和清算的共同入口。更复杂的金融机制不是脱离账本运行,而是把更多可验证的状态和约束叠加在它上面。