哈希方法
- 块哈希 - 从块数据为每个块计算。
- Xorb 哈希 - 从其块哈希为每个 xorb 计算。
- 文件哈希 - 从其块哈希为每个文件计算。
- Term 验证哈希 - 在序列化 shard 时,从该 term 中使用的 xorb 的块哈希为重建中的每个 term 计算。
Xet 协议使用几种不同的哈希类型。
所有引用的哈希都是 32 字节(256 位)长。
块哈希
在切 割数据块后,块哈希通过使用以下密钥(DATA_KEY)的 blake3 密钥哈希计算:
DATA_KEY
[
102, 151, 245, 119, 91, 149, 80, 222, 49, 53, 203, 172, 165, 151, 24, 28, 157, 228, 33, 16, 155, 235, 43, 88, 180, 208, 176, 75, 147, 173, 242, 41
]
Xorb 哈希
Xorbs 由一系列块组成;给定组成 xorb 的一系列块,要计算哈希或 xorb 哈希,我们将使用具有自定义哈希函数的 Merkle 树 数据结构计算 MerkleHash。 xorb 哈希将是 MerkleTree 的根节点哈希。
叶节点哈希是上一节中描述的块哈希。
用于计算内部节点哈希的哈希函数如下:
- 将哈希连接在一起,使得每个块按顺序有一行,格式为
{chunk_hash:x} : {size}\n- 哈希首先以小写十六进制格式(64 个十六进制字符,例如
a3f91d6e8b47c20ff9d84a1c77dcb8e5a91e6fbf2b2d483af6d3c1e90ac57843) - 一个空格、一个冒号、一个空格(
:) - 块长度数字,例如 64000
- 最后是一个换行符
\n字符
- 哈希首先以小写十六进制格式(64 个十六进制字符,例如
- 然后从此字符串中获取字节,并使用以下密钥(INTERNAL_NODE_KEY)计算 blake3 密钥哈希
INTERNAL_NODE_KEY
[
1, 126, 197, 199, 165, 71, 41, 150, 253, 148, 102, 102, 180, 138, 2, 230, 93, 221, 83, 111, 55, 199, 109, 210, 248, 99, 82, 230, 74, 83, 113, 63
]
内部节点数据示例
考虑一个节点有 4 个块,具有以下哈希和长度对:
hash,length (bytes)
1f6a2b8e9d3c4075a2e8c5fd4f0b763e6f3c1d7a9b2e6487de3f91ab7c6d5401,10000
7c94fe2a38bdcf9b4d2a6f7e1e08ac35bc24a7903d6f5a0e7d1c2b93e5f748de,20000
cfd18a92e0743bb09e56dbf76ea2c34d99b5a0cf271f8d429b6cd148203df061,25000
e38d7c09a21b4cf8d0f92b3a85e6df19f7c20435e0b1c78a9d635f7b8c2e4da1,64000
然后为了形成计算内部节点哈希的缓冲区,我们将创建此字符串(注意末尾的 \n 换行符):
"1f6a2b8e9d3c4075a2e8c5fd4f0b763e6f3c1d7a9b2e6487de3f91ab7c6d5401 : 10000
7c94fe2a38bdcf9b4d2a6f7e1e08ac35bc24a7903d6f5a0e7d1c2b93e5f748de : 20000
cfd18a92e0743bb09e56dbf76ea2c34d99b5a0cf271f8d429b6cd148203df061 : 25000
e38d7c09a21b4cf8d0f92b3a85e6df19f7c20435e0b1c78a9d635f7b8c2e4da1 : 64000
"
然后使用 INTERNAL_NODE_KEY 计算 blake3 密钥哈希以获得最终哈希。