如何从以太坊交易数据中解码正负int256类型整数?
解码Solidity int256类型的正负整数
原理说明
Solidity中int256采用256位补码存储:
- 正数:直接以无符号十六进制表示,最大值为
2^255 - 1 - 负数:最高位(二进制第256位)为1,对应十六进制字符串的第一个字符≥
8,需通过补码规则转换为负数:负数 = 无符号整数 - 2^256
通用解码函数(Python)
def decode_int256(hex_str): # 移除可能的0x前缀 hex_str = hex_str.lstrip('0x') # 确保是64位十六进制(int256固定长度) assert len(hex_str) == 64, "int256 must be 64 hex characters" # 转成无符号整数 unsigned = int(hex_str, 16) # 判断是否为负数:超过int256的最大值2^255 -1 max_positive = 2**255 - 1 if unsigned > max_positive: return unsigned - 2**256 return unsigned
结合交易解析代码使用
用这个函数处理amount0和amount1,无需提前判断正负:
# 你的原始交易数据(已移除0x) data = "ffffffffffffffffffffffffffffffffffffffffffffffe653efdc88fa14d9d000000000000000000000000000000000000000000000001c574ce6000000000000000000000000000000000000000000000000011ad1d847f2d99bd6b83ba95c0000000000000000000000000000000000000000000000023b32292becc65a2200000000000000000000000000000000000000000000000000000000000007c8" # 解析amount0(前64位) amount0_hex = data[0:64] amount0 = decode_int256(amount0_hex) # 解析amount1(接下来64位) amount1_hex = data[64:128] amount1 = decode_int256(amount1_hex) # 验证你的断言 assert amount1 == 522799489731071574016 # amount0的结果应为-318000000000000000000 assert amount0 == -318000000000000000000
示例验证
你的amount0十六进制字符串ffffffffffffffffffffffffffffffffffffffffffffffe653efdc88fa14d9d:
- 转无符号整数为
115792089237316195423570985008687907853269984665640564039457584007913129639613 - 减去
2^256(即115792089237316195423570985008687907853269984665640564039457584007913129639936) - 得到结果
-318000000000000000000,符合Swap事件中amount0为负表示代币流出的逻辑
内容的提问来源于stack exchange,提问作者baba
相关产品推荐
相关产品推荐

