1 个不稳定版本
0.1.0 | 2024 年 2 月 14 日 |
---|
#4 in #arweave
51KB
779 行
包含与打包/解包 arweave 块相关函数的库包。目前用于验证 Arweave 块头中包含的 poa
和 poa2
块。
打包
主要的打包函数是
pub fn compute_entropy(
input: &[u8],
randomx_program_count: usize,
randomx_vm: Option<&RandomXVM>,
) -> [u8; RANDOMX_ENTROPY_SIZE] {
...
}
它接受一个字节缓冲区,并对其进行 RandomX 哈希以生成一个临时存储区。目前 RANDOMX_ENTROPY_SIZE
是 256Kib,即 Arweave 块的大小。
每个块熵的 input
来自以下共识方法。
pub fn get_chunk_entropy_input(
chunk_offset: U256,
tx_root: &H256,
reward_addr: &H256
) -> [u8; 32] {
let mut chunk_offset_bytes: [u8; 32] = [0; 32];
chunk_offset.to_big_endian(&mut chunk_offset_bytes);
let mut hasher = sha::Sha256::new();
hasher.update(&chunk_offset_bytes);
hasher.update(tx_root.as_bytes());
hasher.update(reward_addr.as_bytes());
hasher.finish()
}
chunk_offset
是块在 weave 数据集中的绝对偏移量,而 tx_root
来自包含块的块。目前 tx_root
在验证过程中从 BlockIndex
获取。
解密
Arweave 块是通过结合块的原始 256KiB 字节和 256KiB 的 RandomX 熵来打包的。要打包块,使用 feistel 块密码将块的原始字节和熵结合在一起。要从打包的块中获取原始字节,意味着生成打包块的 randomX 熵,并将其用作 feistel 解密原始块字节的输入。
依赖项
~8–13MB
~252K SLoC