如何在Rust中将H256拆分为u32、u112、u112

mm9b1k5b  于 2022-12-19  发布在  其他
关注(0)|答案(1)|浏览(154)

H256类型的0x638d0490000000004b7cdeca2fe41a1b6411000000158fb5610df6aa553bfedb
https://docs.rs/ethers/0.17.0/ethers/types/struct.H256.html#
它是EVM上的一个存储槽,一个存储槽是uint 256,但是在那里,三个不同的值被打包到一个存储槽中(这就是EVM的工作原理),所以uint 112 + uint 112 + uint 32被打包到uint 256中,我需要对其进行反向工程。
希望获得:

  1. 0x638d049
  2. 0x4b7cdeca2fe41a1b6411
  3. 0x158fb5610df6aa553bfedb
    然后将(1,2,3)转换为(u32,u128,u128)- u128,作为与uint 112最接近的一个。
    尝试了一些填充,但似乎不是最佳的(循环通过)。
axr492tv

axr492tv1#

你可以像这样使用位移位手动提取它们:

use num::BigUint;
fn main() {
    let a = BigUint::parse_bytes(b"638d0490000000004b7cdeca2fe41a1b6411000000158fb5610df6aa553bfedb", 16).unwrap();
    println!("0x{a:x}");
    let x = a.clone() >> (2*112);
    let y = (a.clone() >> 112) & ((BigUint::from(1u8) << 112) - 1u8);
    let z = a.clone() & ((BigUint::from(1u8) << 112) - 1u8);
    println!("0x{x:x}");
    println!("0x{y:x}");
    println!("0x{z:x}");
}

相关问题