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.2 | 2023年7月27日 |
#43 在 #proof
7,599 每月下载量
在 125 个 crate 中使用(直接使用8个)
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