系统调用获取当前 epoch 质押

本文讨论了一种新的系统调用,用于检索投票账户在当前纪元的委派股份或整个集群的总股份。这一功能的引入将为链上程序提供重要的数据支持,促进验证者治理等用例的实现,同时避免了存储账户的规模限制。

摘要

一个系统调用,用于检索投票账户的委托质押或当前纪元(epoch)的总集群质押。

动机

目前,链上程序无法了解当前纪元的质押情况,以及有多少活跃质押被委托给任何投票账户。

如果链上程序能够查询这些数据,将会解除许多用例的限制,比如验证者治理和二次共识机制,这在 Solana 上以前是不可行的。

此外,这将使在 SIMD 0089 中定义的 Feature Gate 程序能够汇总投票账户的质押,以支持待处理的功能门。

考虑的替代方案

SIMD 0056 提出了使用链上 sysvar 账户来存储当前纪元的所有质押。

由于账户数据是有限的,使用 sysvar 账户来存储当前纪元的质押会限制可以存储的条目数量。在未来,一个 Solana 集群中的验证者数量可能会超过这个数字。

通过系统调用暴露纪元质押信息可以避免账户最大大小限制。虽然系统调用方法不像 sysvar 那样提供简单的离线检索,但已有现有方式可以脱链获取纪元质押数据。新设计的优先级应该是使数据能够被链上程序访问。

新术语

无。

详细设计

提议的系统调用规范如下:

/**
 * 检索当前纪元委托给投票账户的总活跃质押,或整个集群的总活跃质押。
 *
 * 如果提供了有效的 `vote_addr` 指针,返回位于 `var_addr` 的 32 字节地址的投票账户的总活跃质押。
 *
 * 如果提供了空指针,返回集群的总活跃质押。
 *
 * @param vote_addr     一个指向 32 字节表示投票地址的指针。
 *                      可以是空指针。
 * @return              一个 64 位无符号整数,表示提供地址的投票账户的总活跃质押。
 */
uint64_t sol_get_epoch_stake(/* r1 */ void const * vote_addr);

控制流

如果 var_addr 不是空指针:

  • 如果出现以下情况,系统调用将中止虚拟机:
    • VM 内存范围 [vote_addr, vote_addr + 32) 中的所有字节不可读。
    • 计算预算超限。
  • 否则,系统调用将返回一个 u64 整数,表示提供地址的投票账户的总活跃质押。 如果提供的投票地址对应的账户不是投票账户或不存在,系统调用将返回 0 表示活跃质押。

如果 var_addr 是空指针:

  • 如果出现以下情况,系统调用将中止虚拟机:
    • 计算预算超限。
  • 否则,系统调用将返回一个 u64 整数,表示当前纪元集群的总活跃质押。

计算单位使用

该系统调用将始终消耗固定数量的计算单位 (CUs),与控制流无关。这个固定数量可以是两个值之一,取决于 var_addr 是否提供了空指针。

如果 var_addr 不是空指针:

syscall_base + floor(PUBKEY_BYTES/cpi_bytes_per_unit) + mem_op_base

如果 var_addr 是空指针:

syscall_base
  • PUBKEY_BYTES:用于 Ed25519 公钥的 32 字节。
  • syscall_base:系统调用的基础成本。
  • cpi_bytes_per_unit:在 CPI 期间每 CU 收取的账户数据字节数。
  • mem_op_base:内存操作系统调用的基础成本。

影响

Dapp 开发者将能够从链上程序内部查询当前纪元的投票账户和集群质押。

安全考虑

这个新系统调用引入了与现有接口中其他系统调用相同的安全考虑,这些调用操作 VM 内存的原始指针,因此必须小心实现。

  • 原文链接: github.com/solana-founda...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
solana-foundation
solana-foundation
江湖只有他的大名,没有他的介绍。