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

Aptos网络:广播签名交易前获取交易哈希的步骤求助

在广播前生成Aptos交易哈希的具体实现指南

步骤1的详细操作拆解

原注释提到的步骤1核心是构造哈希消息字节,具体操作如下:

  1. 固定前缀字节:将字符串"RawTransaction"转换为UTF-8编码的字节数组(即b"RawTransaction"),这是Aptos交易哈希计算的固定前缀。
  2. RawTransaction的BCS序列化:
    • 先构造完整的RawTransaction对象,它包含交易核心字段:发送者地址、序列数、过期时间戳、交易Payload(转账/合约调用等操作)、链ID、最大Gas量、Gas单价。
    • 按照Aptos官方的BCS(Binary Canonical Serialization)规范,对RawTransaction对象进行序列化,得到对应字节数组。BCS要求严格按照字段定义的顺序和类型编码,不能调整顺序或遗漏字段。
  3. 拼接字节:将固定前缀字节与序列化后的RawTransaction字节数组拼接,得到步骤1所需的哈希消息字节。

代码示例(Python)

以下是基于BCS规范的简化实现,可根据使用语言调整:

import bcs
from hashlib import sha3_256

# 模拟RawTransaction的BCS序列化逻辑(需严格对应Aptos官方结构体定义)
class RawTransaction:
    def __init__(self, sender, sequence_num, expire_ts, payload, chain_id, max_gas, gas_price):
        self.sender = sender  # 32字节地址字节数组
        self.sequence_num = sequence_num  # 64位无符号整数
        self.expire_ts = expire_ts  # 64位无符号整数(秒级过期时间戳)
        self.payload = payload  # 交易Payload(如Transfer、Script等)
        self.chain_id = chain_id  # 8位无符号整数(测试网/主网均为1)
        self.max_gas = max_gas  # 64位无符号整数
        self.gas_price = gas_price  # 64位无符号整数

    def serialize_bcs(self):
        # 按Aptos官方定义的字段顺序序列化
        return (
            bcs.serialize_bytes(self.sender) +
            bcs.serialize_u64(self.sequence_num) +
            bcs.serialize_u64(self.expire_ts) +
            self.payload.serialize_bcs() +  # Payload需单独实现BCS序列化
            bcs.serialize_u8(self.chain_id) +
            bcs.serialize_u64(self.max_gas) +
            bcs.serialize_u64(self.gas_price)
        )

# 构造示例RawTransaction
sample_tx = RawTransaction(
    sender=b"\x00"*32,  # 替换为实际发送者地址
    sequence_num=5,
    expire_ts=1718000000,
    payload=...,  # 替换为实际交易Payload(如转账的TransferPayload)
    chain_id=1,
    max_gas=2000000,
    gas_price=100
)

# 步骤1:构造哈希消息
prefix = b"RawTransaction"
tx_bcs_bytes = sample_tx.serialize_bcs()
hash_input = prefix + tx_bcs_bytes

# 步骤2:SHA3-256哈希计算
hash_result = sha3_256(hash_input).digest()

# 步骤3:生成最终交易哈希
transaction_hash = "0x" + hash_result.hex()
print(transaction_hash)

关于失效文档链接的说明

原注释中的Transaction枚举链接无法访问,实际上计算交易哈希依赖的是RawTransaction结构体而非Transaction枚举。你可以直接查看aptos-core源码中的aptos-types/src/transaction/raw_transaction.rs文件,获取该结构体的完整字段定义和BCS序列化规则。

内容的提问来源于stack exchange,提问作者hamed.k

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 20:13:12