本文讨论了一种新的系统调用,用于检索投票账户在当前纪元的委派股份或整个集群的总股份。这一功能的引入将为链上程序提供重要的数据支持,促进验证者治理等用例的实现,同时避免了存储账户的规模限制。
一个系统调用,用于检索投票账户的委托质押或当前纪元(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
不是空指针:
[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 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!