117个版本

0.4.0-dev.11 2024年8月23日
0.4.0-dev.92024年7月17日
0.3.0-beta-dev.252024年3月27日
0.3.0-beta-dev.162023年12月22日
0.0.2-alpha.12021年2月27日

#266 in 神奇豆子

Download history 1637/week @ 2024-05-02 1164/week @ 2024-05-09 1505/week @ 2024-05-16 1606/week @ 2024-05-23 2018/week @ 2024-05-30 1518/week @ 2024-06-06 1557/week @ 2024-06-13 1520/week @ 2024-06-20 1172/week @ 2024-06-27 1187/week @ 2024-07-04 1687/week @ 2024-07-11 1364/week @ 2024-07-18 1465/week @ 2024-07-25 1603/week @ 2024-08-01 948/week @ 2024-08-08 964/week @ 2024-08-15

5,150 每月下载次数
用于 75 个crate(24个直接使用)

Apache-2.0 和可能 AGPL-3.0 WITH mif-exception

180KB
4K SLoC

holo_hash

Project Forum Chat

Twitter Follow 许可证: License: CAL 1.0

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:用于哈希条目。条目可以哈希到ContentHashAgentPubKey

AnyDhtHash:用于哈希任意DHT数据。DHT数据是动作或条目,因此AnyDhtHash可以指代ActionHashEntryHash

序列化

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是一个开源项目。我们欢迎各种参与,并正在积极工作以扩大接受参与的范围。请参阅我们的贡献指南,了解我们的通用实践和参与社区的计划,以及有关代码格式、测试实践、持续集成等方面的具体期望。

许可

License: Apache-2.0

版权(C)2019 - 2024,Holochain基金会

本程序是免费软件:您可以在LICENSE文件(CAL-1.0)提供的许可条款下重新分发和/或修改它。本程序是在希望它将是有用的,但没有任何保证;甚至没有关于其适销性或适用于特定目的的暗示保证。

依赖关系

~3–21MB
~313K SLoC