117个版本
新 0.4.0-dev.11 | 2024年8月23日 |
---|---|
0.4.0-dev.9 | 2024年7月17日 |
0.3.0-beta-dev.25 | 2024年3月27日 |
0.3.0-beta-dev.16 | 2023年12月22日 |
0.0.2-alpha.1 | 2021年2月27日 |
#266 in 神奇豆子
5,150 每月下载次数
用于 75 个crate(24个直接使用)
180KB
4K SLoC
holo_hash
holo_hash::HoloHash是霍洛链的哈希框架。
请注意,并非所有霍洛哈希都是像在“内容寻址”应用程序中预期的那样简单的内容哈希。主要的例外是AgentPubKey
,它只是密钥本身,以启用自证明签名。作为一个例外,它也被特别命名,即不以“Hash”结尾。
哈希类型
每个霍洛哈希都有一个哈希类型。哈希类型有两种口味:原始 和 复合
原始哈希类型
每个原始哈希类型都与它关联一个独特的3字节前缀,以便在任何环境中轻松区分哈希。这些前缀是multihash兼容的。原始类型是
哈希类型 | 霍洛哈希别名 | 前缀 |
---|---|---|
Agent | AgentPubKey | uhCAk |
Entry | 条目哈希 | uhCEk |
DhtOp | DhtOpHash | uhCQk |
Dna | DnaHash | uhC0k |
NetId | NetIdHash | uhCIk |
动作 | 动作哈希 | uhCkk |
Wasm | DnaWasmHash | uhCok |
"HoloHash别名"列列出了为引用每种HoloHash提供的类型别名。例如,ActionHash
是以下类型别名
pub type ActionHash = HoloHash<hash_type::Action>;
(列出的前缀是base64表示形式)
复合哈希类型
复合哈希类型用于上下文中,其中几个原始哈希类型中的任何一个都是有效的。它们作为Rust枚举实现。复合类型包括
EntryHash
:用于哈希条目。条目可以哈希到ContentHash
或AgentPubKey
。
AnyDhtHash
:用于哈希任意DHT数据。DHT数据是动作或条目,因此AnyDhtHash可以指代ActionHash
或EntryHash
。
序列化
HoloHash实现了Display
,提供了以用户友好的字符串形式访问哈希的to_string()
函数。它还提供了允许您解析此字符串表示形式的字符串类型的TryFrom。
HoloHash包括一个4字节(或u32)的dht“位置”,具有双重用途。 - 它在解析字符串表示时用作校验和。 - 它用作我们dht分片算法中的u32。
HoloHash实现了SerializedBytes,以使其易于跨越ffi屏障,如Wasm和UI WebSocket。
示例
use holo_hash::*;
use std::convert::TryInto;
use holochain_serialized_bytes::SerializedBytes;
let entry: EntryHash =
"uhCEkWCsAgoKkkfwyJAglj30xX_GLLV-3BXuFy436a2SqpcEwyBzm"
.try_into()
.unwrap();
assert_eq!(3860645936, entry.get_loc());
let bytes: SerializedBytes = entry.try_into().unwrap();
assert_eq!(
"{\"type\":\"EntryHash\",\"hash\":[88,43,0,130,130,164,145,252,50,36,8,37,143,125,49,95,241,139,45,95,183,5,123,133,203,141,250,107,100,170,165,193,48,200,28,230]}",
&format!("{:?}", bytes),
);
高级
计算哈希需要时间 - 在futures上下文中,我们不希望阻塞。HoloHash提供了同步(阻塞)和异步(非阻塞)的哈希API。
use holo_hash::*;
let entry_content = b"test entry content";
let content_hash = EntryHash::with_data_sync(entry_content.to_vec()).into();
assert_eq!(
"EntryHash(uhCEkhPbA5vaw3Fk-ZvPSKuyyjg8eoX98fve75qiUEFgAE3BO7D4d)",
&format!("{:?}", content_hash),
);
有时您不希望重新哈希数据
use holo_hash::*;
// pretend our pub key is all 0xdb bytes
let agent_pub_key = vec![0xdb; 32];
let agent_id: HoloHash = AgentPubKey::from_raw_32(agent_pub_key).into();
assert_eq!(
"AgentPubKey(uhCAk29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uTp5Iv)",
&format!("{:?}", agent_id),
);
贡献
Holochain是一个开源项目。我们欢迎各种参与,并正在积极工作以扩大接受参与的范围。请参阅我们的贡献指南,了解我们的通用实践和参与社区的计划,以及有关代码格式、测试实践、持续集成等方面的具体期望。
- 在论坛上与我们联系
许可
版权(C)2019 - 2024,Holochain基金会
本程序是免费软件:您可以在LICENSE文件(CAL-1.0)提供的许可条款下重新分发和/或修改它。本程序是在希望它将是有用的,但没有任何保证;甚至没有关于其适销性或适用于特定目的的暗示保证。
依赖关系
~3–21MB
~313K SLoC