You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Rust中打印ethers库U256/H160/H256的完整十六进制字符串?

问题描述

我正在使用Rust语言及ethers crate从EVM链读取日志,处理交易哈希与地址时,这些数据以U256、H160、H256对象形式存在。以下是示例代码:

use ethers::prelude::{Log};
use ethers::types::{Address, H160, H256, U256};

async fn print_log_details(&self, log: &Log) {
    let block_number = log.block_number.unwrap();
    let from: H160 = Address::from(log.topics[1]);
    let to: H160 = Address::from(log.topics[2]);
    let token_id: U256 = U256::decode(log.topics[3]).unwrap();
    let transaction_hash: H256 = log.transaction_hash.unwrap();

    dbg!(log.clone());
    println!(
        "block_number = {}, from = {}, to = {}, tokenId = {}, transactionHash = {}",
        block_number, from, to, token_id, transaction_hash
    );
}

当前代码输出中,from、to和transactionHash会被截断显示,例如:

block_number = 13032069, from = 0x6035…df49, to = 0x4a6e…e5ec, tokenId = 3061, transactionHash = 0xa520…bddf

我希望在println中以完整十六进制形式显示这些值,而非截断形式。

解决方案

ethers crate中的H160(地址)和H256(交易哈希)类型实现了fmt::LowerHex和fmt::UpperHex trait,通过指定格式说明符即可输出完整的十六进制字符串:

  • {:#x}:输出带0x前缀的完整小写十六进制
  • {:x}:输出不带前缀的完整小写十六进制
  • {:#X}/{:X}:对应大写十六进制格式

修改后的println代码如下:

println!(
    "block_number = {}, from = {:#x}, to = {:#x}, tokenId = {}, transactionHash = {:#x}",
    block_number, from, to, token_id, transaction_hash
);

修改后输出会变为完整的十六进制格式:

block_number = 13032069, from = 0x603503a11a37acb6e9d8ff2423c29d135255df49, to = 0x4a6ead6446265533b6b5257bbfb450e1cdfae5ec, tokenId = 3061, transactionHash = 0xa520f3d255140abeb8cec33764a3a1c0ccbcf9496a934e25f1bbf004667cbddf

这些类型的默认Display实现为了可读性做了截断处理,而Hex格式化trait会直接输出所有字节对应的完整十六进制内容。


内容的提问来源于stack exchange,提问作者99problems

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 12:25:29