同步器流量
全局同步器上的流量核算、费用与监控。
全局同步器上的流量统计、费用和监控
同步器的使用会给 SV 带来运营成本。为了分摊这些成本,提高运营 SV 的激励,并使网络上的拒绝服务攻击变得没有吸引力,超出特定免费base rate 级别的同步器使用将收取所谓的 同步器费用 费用,以 Canton Coin 支付。为了支持此功能,Sequencer跟踪每个同步器成员的可用和消耗的流量(最相关的是:所有验证者参与者)。每当参与者的免费(基本速率)和付费(额外)流量都耗尽时,Sequencer就会拒绝尝试写入。
SV,或更具体地说,SV 参与者和Mediator拥有无限流量,因此本身无需支付同步器费用。然而,共同确保全局同步器的费用配置合理并符合网络的运营目标是SV运营商责任的一部分。
流量统计;什么算作流量?
Sequencer跟踪验证者参与者使用的流量。在这种情况下,Traffic指的是来自参与者的必须是sequenced的所有消息,即Sequencer组必须排序、持久化(直到修剪间隔)并传递给接收者(通常是Mediator和其他参与者)的消息。
最突出的是,流量用于 Daml 工作流程,作为 Canton 事务处理协议 的一部分。这包括:
- 确认请求;当参与者发起分类账交易的提交时发送。
- 确认回复;发送给托管交易利益相关者的参与者。
请注意,不仅自定义 Daml 工作流程会计入流量支出,而且自动“内置”工作流程(例如奖励收集)也会计入流量支出。
除了与 Daml 工作流相关的消息之外,参与者还将流量用于以下用途:
- 提交拓扑交易,例如分配新方或审查新上传的 DAR 包。
- 交换定期的
ACS承诺以确保它们同步。
在内部,Sequencer为每个验证者参与者维护各种计数器,这些计数器对应于接下来介绍的更容易看到的流量参数。在较高的层面上,Sequencer会跟踪:
- 可用基础速率(base rate)流量余额。基本速率被定义为时间窗口内的突发量,因此即使完全耗尽,可用的基本速率流量平衡也会在(“窗口”长)不活动期后完全恢复。
- 可用的额外流量余额。这是已经付费的流量。额外的流量余额仅在基础速率(base rate)流量余额完全耗尽时消耗;即,始终首先消耗基础速率(base rate)流量余额。
当基本速率和额外流量平衡均不可用于参与者时,Sequencer将拒绝进一步尝试提交消息以进行排序,直到基本速率流量平衡恢复或参与者的额外流量平衡达到顶峰为止。请注意,为了防止充值死锁,验证者应用程序将在某些情况下中止账本提交,即使仍然存在一些流量平衡。这仅适用于验证者应用程序本身的提交!如果您针对验证者运行另一个应用程序,我们建议您监视流量平衡,并在流量耗尽时暂停该应用程序。
流量统计是“按参与者”进行的;同一参与者上托管的所有各方共享相同的流量平衡。
流量参数
```bash theme={"theme":{"light":"github-light","dark":"github-dark"}}
curl -X POST --header "Content-Type: application/json" -d "{}" https://scan.sv-1.dev.global.canton.network.sync.global/api/scan/v0/amulet-rules | jq ".amulet_rules_update.contract.payload.configSchedule.initialValue.decentralized同步器.fees"
```
上面的命令将返回一个类似于以下内容的 JSON 对象:```json theme={"theme":{"light":"github-light","dark":"github-dark"}}
"fees": {
"baseRate流量Limits": {
"burstAmount": "400000",
"burstWindow": {
"microseconds": "1200000000"
}
},
"extra流量Price": "60.0",
"readVsWriteScalingFactor": "4",
"minTopupAmount": "200000"
}
```
这表示 `同步器FeesConfig` Daml 数据类型的编码实例。有关这些字段的详细信息,请参阅 Daml API 文档。在这里给出一个概述:
* `baseRate流量Limits`:定义同步器流量的免费层。验证者可以在`burstWindow`时间窗口内使用最多`burstAmount`字节的流量,而不会产生费用。可用的免费流量会定期恢复,并且在完全不活动 `burstWindow` 后始终会达到最大值 (`burstAmount`)。请注意,即使没有触发账本提交,参与者仍可能会消耗一些流量作为正常操作的一部分(请参阅上面的`流量_accounting`)。
* `extra流量Price`:免费套餐之外的额外流量的价格,以美元/MB 计价。价格按照当前美元汇率以`CC`收取。汇率由 SV 通过中值投票决定,并记录在可从 Scan 获得的当前`OpenMiningRound`合约上。要根据当前开放的挖矿轮次查询当前的 CC 价格(美元),您可以检查 Scan UI 或使用以下命令(需要安装 [jq](https://jqlang.org/)):
```bash theme={"theme":{"light":"github-light","dark":"github-dark"}}
curl -X POST --header "Content-Type: application/json" -d "{\"cached_open_mining_round_contract_ids\":[], \"cached_issuing_round_contract_ids\":[]}" https://scan.sv-1.dev.global.canton.network.sync.global/api/scan/v0/open-and-issuing-mining-rounds | jq ".open_mining_rounds | values[] | .contract.payload | {round, amuletPrice}"
```
* `readVsWriteScalingFactor`:指定用于将同步器消息传递给每个接收者的附加流量平衡扣除(从发送者的余额中)的权重。传递消息会给 SV 带来实际成本,即使该成本远小于排序和持久化消息的成本。 `readVsWriteScalingFactor`以基点(万分之一)为单位指定,即值为1意味着每需要传送给接收者1000个字节,将收取0.1个字节的流量。例如:在 4 倍的情况下,有 10 个收件人的 1 MB 消息将从发送参与者的流量余额中提取 `1,000,000 * (1 + 10 * 0.004) = 1,040,000` 字节。
* `minTopupAmount`:购买额外流量时必须购买的最低流量。保持该值相当高可确保 SV 可以分摊执行充值操作的成本,即保护它们免受因处理非常小的充值而产生的不成比例的开销。
与 `AmuletRulesConfig` 的所有部分一样,`同步器FeesConfig` 由 SV 通过账本投票设置,作为 DSO 治理的一部分。 SV 操作文档包含用于确定其中一些参数的良好值的指针。
```bash theme={"theme":{"light":"github-light","dark":"github-dark"}}
curl -X POST --header "Content-Type: application/json" -d "{}" https://scan.sv-1.test.global.canton.network.sync.global/api/scan/v0/amulet-rules | jq ".amulet_rules_update.contract.payload.configSchedule.initialValue.decentralized同步器.fees"
```
上面的命令将返回一个类似于以下内容的 JSON 对象:
```json theme={"theme":{"light":"github-light","dark":"github-dark"}}
"fees": {
"baseRate流量Limits": {
"burstAmount": "400000",
"burstWindow": {
"microseconds": "1200000000"
}
},
"extra流量Price": "60.0",
"readVsWriteScalingFactor": "4",
"minTopupAmount": "200000"
}
```
这表示 `同步器FeesConfig` Daml 数据类型的编码实例。有关这些字段的详细信息,请参阅 Daml API 文档。在这里给出一个概述:* `baseRate流量Limits`:定义同步器流量的免费层。验证者可以在`burstWindow`时间窗口内使用最多`burstAmount`字节的流量,而不会产生费用。可用的免费流量会定期恢复,并且在完全不活动 `burstWindow` 后始终会达到最大值 (`burstAmount`)。请注意,即使没有触发账本提交,参与者仍可能会消耗一些流量作为正常操作的一部分(请参阅上面的`流量_accounting`)。
* `extra流量Price`:免费套餐之外的额外流量的价格,以美元/MB 计价。价格按照当前美元汇率以`CC`收取。汇率由 SV 通过中值投票决定,并记录在可从 Scan 获得的当前`OpenMiningRound`合约上。要根据当前开放的挖矿轮次查询当前的 CC 价格(美元),您可以检查 Scan UI 或使用以下命令(需要安装 [jq](https://jqlang.org/)):
```bash theme={"theme":{"light":"github-light","dark":"github-dark"}}
curl -X POST --header "Content-Type: application/json" -d "{\"cached_open_mining_round_contract_ids\":[], \"cached_issuing_round_contract_ids\":[]}" https://scan.sv-1.test.global.canton.network.sync.global/api/scan/v0/open-and-issuing-mining-rounds | jq ".open_mining_rounds | values[] | .contract.payload | {round, amuletPrice}"
```
* `readVsWriteScalingFactor`:指定用于将同步器消息传递给每个接收者的额外流量平衡扣除(从发送者的余额中)的权重。传递消息会给 SV 带来实际成本,即使该成本远小于排序和持久化消息的成本。 `readVsWriteScalingFactor`以基点(万分之一)为单位指定,即值为1意味着每需要传送给接收者1000个字节,将收取0.1个字节的流量费用。例如:在 4 倍的情况下,有 10 个收件人的 1 MB 消息将从发送参与者的流量余额中提取 `1,000,000 * (1 + 10 * 0.004) = 1,040,000` 字节。
* `minTopupAmount`:购买额外流量时必须购买的最低流量。保持该值相当高可确保 SV 可以分摊执行充值操作的成本,即保护它们免受因处理非常小的充值而产生的不成比例的开销。
与 `AmuletRulesConfig` 的所有部分一样,`同步器FeesConfig` 由 SV 通过账本投票设置,作为 DSO 治理的一部分。 SV 操作文档包含用于确定其中一些参数的良好值的指针。
```bash theme={"theme":{"light":"github-light","dark":"github-dark"}}
curl -X POST --header "Content-Type: application/json" -d "{}" https://scan.sv-1.global.canton.network.sync.global/api/scan/v0/amulet-rules | jq ".amulet_rules_update.contract.payload.configSchedule.initialValue.decentralized同步器.fees"
```
上面的命令将返回一个类似于以下内容的 JSON 对象:
```json theme={"theme":{"light":"github-light","dark":"github-dark"}}
"fees": {
"baseRate流量Limits": {
"burstAmount": "400000",
"burstWindow": {
"microseconds": "1200000000"
}
},
"extra流量Price": "60.0",
"readVsWriteScalingFactor": "4",
"minTopupAmount": "200000"
}
```
这表示 `同步器FeesConfig` Daml 数据类型的编码实例。有关这些字段的详细信息,请参阅 Daml API 文档。在这里给出一个概述:
* `baseRate流量Limits`:定义同步器流量的免费层。验证者可以在`burstWindow`时间窗口内使用最多`burstAmount`字节的流量,而不会产生费用。可用的免费流量会定期恢复,并且在完全不活动 `burstWindow` 后始终会达到最大值 (`burstAmount`)。请注意,即使没有触发账本提交,参与者仍可能会消耗一些流量作为正常操作的一部分(请参阅上面的`流量_accounting`)。* `extra流量Price`:免费套餐之外的额外流量的价格,以美元/MB 计价。价格按照当前美元汇率以`CC`收取。汇率由 SV 通过中值投票决定,并记录在可从 Scan 获得的当前`OpenMiningRound`合约上。要根据当前开放的挖矿轮次查询当前的 CC 价格(美元),您可以检查 Scan UI 或使用以下命令(需要安装 [jq](https://jqlang.org/)):
```bash theme={"theme":{"light":"github-light","dark":"github-dark"}}
curl -X POST --header "Content-Type: application/json" -d "{\"cached_open_mining_round_contract_ids\":[], \"cached_issuing_round_contract_ids\":[]}" https://scan.sv-1.global.canton.network.sync.global/api/scan/v0/open-and-issuing-mining-rounds | jq ".open_mining_rounds | values[] | .contract.payload | {round, amuletPrice}"
```
* `readVsWriteScalingFactor`:指定用于向每个接收者传送同步器消息的附加流量平衡扣除(从发送者的余额中)的权重。传递消息会给 SV 带来实际成本,即使该成本远小于排序和持久化消息的成本。 `readVsWriteScalingFactor`以基点(万分之一)为单位指定,即值为1意味着每需要传送给接收者1000个字节,将收取0.1个字节的流量费用。例如:在 4 倍的情况下,有 10 个收件人的 1 MB 消息将从发送参与者的流量余额中提取 `1,000,000 * (1 + 10 * 0.004) = 1,040,000` 字节。
* `minTopupAmount`:购买额外流量时必须购买的最低流量。保持该值相当高可确保 SV 可以分摊执行充值操作的成本,即保护它们免受因处理非常小的充值而产生的不成比例的开销。
与 `AmuletRulesConfig` 的所有部分一样,`同步器FeesConfig` 由 SV 通过账本投票设置,作为 DSO 治理的一部分。 SV 操作文档包含用于确定其中一些参数的良好值的指针。
流量平衡如何与交易提交交互
以下是提交交易的流量统计实践示例:
- 交易已提交。
- 流量管理器(在Sequencer上)检查您节点的基本速率(即免费)流量平衡和您已购买的流量。
- 您的基本费率流量中包含自您上次提交以来累积的流量。该累计是时间线性的,计算为在
burstWindow时间后达到burstAmount。 - 如果您有足够的基本速率流量,您的提交将被排序。您的基本费率流量余额将因交易而减少,而您的额外流量余额则保持不变。
- 如果您没有足够的基本速率流量,但您的额外流量足以支付差额,则您的提交将被排序。您的基本费率流量余额已耗尽,剩余的额外流量余额将被扣除。
- 如果以上都不满足,则提交失败。
- 无论任何情况,如果您未提交
burstWindow交易,您的基础费率流量余额将全额补充至burstAmount。这至少可以让你再次购买流量,避免陷入没有足够流量来补充额外流量的情况。
成功的排序并不一定意味着交易被完全接受。有关这些情况的说明以及如何最好地避免它们,请参阅下面的流量_wasted。
流量充值;如何“购买”流量?
“购买流量”围绕两个主要部分解决:
- 账本上的
Member流量合约(Daml API 文档)跟踪每个验证者的流量状态,并在花费 CC 购买流量时(自动)更新。最重要的是,账本上的Member流量合约跟踪为该验证者购买的额外流量总量。 - 跟踪可用流量和已用流量的Sequencer内流量状态。 SV 根据他们在账本上观察到的
Member流量状态更新Sequencer中的流量状态,从而确保支付的流量费用转化为实际流量余额的增加。每当流量被消耗时,Sequencer还会自行更新Sequencer内的流量状态(请参阅流量_accounting)。验证者应用程序包含内置的充值自动化功能,可以自动购买流量以满足预先配置的吞吐量需求。运营商配置目标吞吐量(每秒字节数)和最小充值间隔(秒);只要满足以下两个条件,自动化就会购买target throughput × minimum top-up interval字节:
- 额外流量余额已低于充值总额,且
- 自上次充值以来,至少已过了最小充值间隔。
后一个条件是一种保障措施:在出现错误或攻击导致提交失控的情况下,它使操作员有机会在 CC 迅速耗尽之前进行干预。这是运营商需要管理的一个权衡:较短的间隔可以降低充值之间流量耗尽的风险,但会增加 CC 在运营商有时间注意到之前被快速花掉的风险;较长的间隔可以让操作员有更多时间注意到问题,但会增加流量不足的风险。这两种故障模式在实践中都会发生:节点可能会停止交易,因为它耗尽了流量,或者因为它耗尽了 CC 来购买更多。
此外,为了防止充值交易因流量余额已耗尽而失败,如果余额低于预定义金额,验证者应用程序将中止分类账提交。
如需配置内置充值自动化,请参阅 Kubernetes 验证者部署指南或相应的 Docker-compose 指南。配置购买流量的替代方法(例如使用第三方服务)超出了本文档的范围。
浪费流量
Wasted 流量 定义为已排序但不会传递给接收者的同步器事件。对于需要缴纳流量费的验证者来说,浪费流量意味着对最终未传递的消息收取了流量费用。并非所有失败的提交都会导致流量浪费:仅当同步器事件在排序后但交付前被拒绝时,才会发生流量浪费。由于以下因素,一定程度的流量浪费是预料之中且不可避免的:
- 提交请求放大。使用 BFT Sequencer连接的参与者会在超时后重试提交请求,以确保在面对无响应的Sequencer时快速交付;如果处理速度比平常慢但Sequencer没有故障,则重复请求将被视为浪费流量。
- 排序层内的消息重复,通常与瞬时网络问题或负载峰值有关。
- 参与者/应用程序端重复提交,例如在从备份恢复后或在某些崩溃后进行追赶时。
验证者视角
鼓励验证者运营商调查多次提交失败的原因。如上所述,并不是所有提交失败都会导致流量浪费,有些流量浪费是不可避免的。但是,如果流量浪费率在某个时间点显着增加,则需要引起注意。
Splice 发行版包含一个关于 同步器 Fees (验证者 view) 的 Grafana 仪表板,以帮助监控与流量相关的指标。该仪表板上的Rejected Event 流量面板对于确定浪费流量的比率特别重要。 (将鼠标悬停在面板标题中的 ⓘ 符号上可获取所显示数据的精确描述。)
SV视角
鼓励 SV 操作员监控所有同步器成员之间的浪费流量(例如通过Sequencer指标报告),以检测浪费流量显着增加和/或以全局方式增加的情况。 Splice 发行版包含一个关于 同步器 Fees (SV view) 的 Grafana 仪表板(可能会有所帮助),以及专注于验证者参与者的警报定义。请注意,浪费的流量与 SV 本身关系不大,因为 SV 组件的流量不受限制。另请注意,SV 中介器和Sequencer在其常规操作中浪费了流量:它们大量使用聚合提交,其中Sequencer从一组发送者收集消息,并且一旦对单个提交的阈值进行排序后,仅向每个接收者传递一条消息;对超出聚合阈值的单独提交进行排序,将其视为浪费流量。尽管如此,如果 SV 组件突然出现浪费流量的显着增加,这可能表明存在应该调查的实际问题。
本文由 CC Privacy Club 根据 Canton Network 官方文档(CC-BY-4.0)整理翻译,仅供学习;实现细节以官方最新版本为准。