#chunks #arweave #decryption #packing #block #data #entropy

arweave_rs_packing

包含对分块 Arweave 数据进行解包的打包和 Feistel 解密方法

1 个不稳定版本

0.1.0 2024 年 2 月 14 日

#4 in #arweave


用于 arweave_rs_validator

MIT/Apache

51KB
779

包含与打包/解包 arweave 块相关函数的库包。目前用于验证 Arweave 块头中包含的 poapoa2 块。

打包

主要的打包函数是

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