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

如何从以太坊交易数据中解码正负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:

  1. 转无符号整数为115792089237316195423570985008687907853269984665640564039457584007913129639613
  2. 减去2^256(即115792089237316195423570985008687907853269984665640564039457584007913129639936)
  3. 得到结果-318000000000000000000,符合Swap事件中amount0为负表示代币流出的逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 05:05:09