---
title: 见证领导人
---

见证领导人做较少的工作便能产生有效的区块。 其任务是处理区块交易，对有效交易进行分类和过滤，将它们排列成条目，并广播每一个单元条目。 每个验证者只需要重新组装块并重新审查格式正确的条目即可。 见证领导人在执行任何存储区之前，执行的内存工作要比每个验证者处理的交易多3倍。

## 基本原理

正常的验证者需要进行2次加载和2次存储。 有了这个见证领导人，只需要1个负载即可。 因此在生成该区块之前，验证者的工作量要少4倍。 存储操作可能比读取操作更昂贵。

当重新审查阶段开始处理相同的交易时，可以审查历史证明的有效性，并且所有条目对于并行执行都是安全的。 已被加载以生成该块的费用帐户可能仍在内存中，因此额外的负载应处于预热状态，并且成本可能会平摊。

## 费用账户

[费用账户](../terminology.md#fee_account) 支付的交易费用被包括在区块中。 领导者仅需要验证费用帐户是否有余额来支付费用。

## 余额缓存

在领导者连续出块的持续时间内，领导者为所有已处理的费用帐户创建一个临时余额缓存。 缓存是从公钥到"Lamport"的映射。

在第一个程序段开始时，余额缓存为空。 在最后一个区块的末尾，缓存将被销毁。

在整个缓存期间，余额缓存查找必须引用相同的基叉。 在区块与区块交界处，可以在重播阶段完成对前一个块的验证之后，将缓存与基叉一起重置。

## 余额检查

在进行余额检查之前，领导者会验证交易中的所有签名。

1. 确认帐户未使用且区块哈希有效。
2. 检查收费帐户是否存在于高速缓存中，或从"accounts_db"加载帐户并将"Lamport"余额存储在高速缓存中。
3. 如果余额少于费用，请取消交易。
4. 从余额中减去费用。
5. 对于交易中的所有属于信用借记并被指示引用的密钥，将其余额在缓存中减少为0。 帐户费用被声明为贷方借方，但是只要未在任何指令中使用该帐户费用，其余额就不会减少为0。

## 领导者重播

领导者将需要重新广告播区块，作为标准重播阶段操作的一部分。

## 带连续区块的领导者重播

可以安排一个领导者连续生产多个块。 在那种情况下，领导者可能会在广播第一个区块的重播阶段时产生下一个区块。

领导者完成重播阶段后，可以通过清除余额缓存来重置余额缓存，并重新设置缓存，该缓存可以在下一个块中变为活动状态。

## 重置余额缓存

1. 在区块的开头，如果未初始化余额缓存，则将余额缓存的基叉设置为区块的父代，并创建一个空缓存。
2. 如果缓存已初始化，请检查区块的父级是否有一个新的冻结账本，该冻结账本比余额缓存的当前基叉要新。
3. 如果存在比缓存的基本派生更新的父代，请将缓存重置为父代。

## 对客户端的影响

相同的费用帐户可以在同一区块中多次重复使用，直到指令将其用作贷方借方一次为止。

每秒传输大量交易的客户应使用专用的费用帐户，该费用帐户在任何指令中均不得用作贷方借方。

一旦将帐户费用用作贷方借方，它将无法进行余额检查，直到重置余额缓存为止。
