#statement #store #key #signature #public-key #proof #field

no-std sp-statement-store

一个包含与声明存储相关的原语(polkadot v1.15.0)的 crate

21 个版本 (重大变更)

18.0.0 2024年7月18日
17.0.0 2024年6月21日
16.0.0 2024年5月23日
15.0.0 2024年4月30日
0.1.0-dev.22023年7月27日

#43#proof

Download history 1967/week @ 2024-04-29 1553/week @ 2024-05-06 1453/week @ 2024-05-13 2165/week @ 2024-05-20 2178/week @ 2024-05-27 2279/week @ 2024-06-03 1813/week @ 2024-06-10 1562/week @ 2024-06-17 2908/week @ 2024-06-24 1057/week @ 2024-07-01 1450/week @ 2024-07-08 2929/week @ 2024-07-15 1490/week @ 2024-07-22 1841/week @ 2024-07-29 1951/week @ 2024-08-05 2221/week @ 2024-08-12

7,599 每月下载量
125 crate 中使用(直接使用8个)

Apache-2.0

1MB
15K SLoC

声明存储

声明存储是一个离线数据存储,用于存储通过 RPC 和 OCW 访问的已签名的声明。

节点持有一定数量的声明,并通过账户 ID 证明其真实性。OCW 可以将项目放入数据存储(带有有效签名)中,任何它们控制的账户。用户还可以通过 RPC 提交预先签名的声明。声明也可以通过链上逻辑通过链上事件提交。

在运行时中添加了一个新的系统事件 NewStatement。此事件允许链上的任何账户声明他们希望为存储做出声明。在节点存储和广播中,声明将伴随块的哈希和事件在其中的索引,实质上取代了真正的签名。

声明包括可选的认证证明(例如签名)和多个字段。对于没有证明的声明,节点会以限速的方式随机传播声明,以最小化被不守规矩的节点淹没的机会。这些声明通常会被节点忽略,除非它们被多个不同的对等节点传播,或者如果对等节点以某种方式付费(例如传播有价值的内容)。

每个字段实际上是一个键/值对。字段必须排序,并且相同的字段类型不得重复。根据哪些键存在,客户端可以对消息进行索引,以便于检索。

正式来说,Statement 等同于类型 Vec<Field>,而 Field 是 SCALE 编码的枚举类型。

  • 0: AuthenticityProof(Proof):消息的签名。对于不能从签名和消息数据中导出公钥的加密,这将还包括签名者的公钥。消息数据是消息字段的所有字段,除了签名外拼接在一起 没有 Vec 通常会隐含的长度前缀。这样可以在不重新编码声明的条件下推导出签名。
  • 1: DecryptionKey([u8; 32]):用于解密声明数据的解密密钥标识符。如果没有此字段,则应将 Data 视为未加密。
  • 2: Priority(u32):优先级指定符。优先级较高的声明应该被保留,这可能会以牺牲优先级较低的声明为代价,如果多个声明来自同一发送者且在持久性或传输方面竞争。
  • 3: Channel([u8; 32]):通道标识符。一次应只保留给定通道的一个消息(优先级最高的那个)。在考虑未签名的声明时,节点应忽略此字段。
  • 4: Topic1([u8; 32])):第一个主题标识符。
  • 5: Topic2([u8; 32])):第二个主题标识符。
  • 6: Topic3([u8; 32])):第三个主题标识符。
  • 7: Topic4([u8; 32])):第四个主题标识符。
  • 8: Data(Vec<u8>):通用数据段。没有特殊含义。

证明定义为SCALE编码的枚举

  • 0: Sr25519{ signature::: [u8; 64], signer:: [u8; 32] }
  • 1: Ed25519{ signature::: [u8; 64], signer:: [u8; 32] )
  • 2: Secp256k1Ecdsa{ signature::: [u8; 65], signer:: [u8; 33] )
  • 3: OnChain{ who::: [u8; 32], block_hash::: [u8; 32], event_index:: u64 }

潜在用途

潜在用途多种多样,包括

  • 环签名聚合;
  • 消息传递;
  • 状态通道;
  • 推迟多方交易初始“广告”阶段;
  • 发布预映数据,其哈希值在链上引用;
  • 有效地将费用支付转移给第二方。

许可证:Apache-2.0

依赖项

~16–29MB
~483K SLoC