如何在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
相关产品推荐
相关产品推荐

