💼 需要智能合约审计? 查看我们的GitHub →

从vechain的golang实现深入一条交易的生命周期

组建交易的数据 交易一般从我们的钱包(比如MetaMask)开始,比如用户A想发送一笔转账到用户B,在和钱包的交互过程中用户只需要输入用户B的链上地址0xBBB,转账的金额Amount,点击确认为这笔交易签名就可以像节点发送交易信息了。 在这个过程中钱包为用户默认设置了很多参数来减少用户交互的复杂度,从vechain L1我们深入理解下具体的一笔交易的参数: body = { "chainTag": 246, # 主网固定 74 (十进制),testnet 是 39 "blockRef": block_ref, # 8字节 hex "expiration": 720, # 720个块后过期 ≈ 2小时 "clauses": [ { "to": TO_ADDRESS, "value": AMOUNT_WEI, # wei 单位 "data": "0x" # 普通转账填 0x } ], "gasPriceCoef": 128, # 0-255,128 是标准 "gas": 21000, # 普通转账固定 21000 "dependsOn": None, "nonce": int(time.time() * 1000) # 随意,但不能重复(毫秒时间戳就行) } blockRef 在 VeChain 交易里是一个非常重要的字段,作用是防止重放攻击指定这笔交易最早可以被哪个区块打包。 chainTag是根据测试或者主网的固定参数。 clauses 是 VET 或 VTHO 交易的核心概念,它代表这笔交易里包含的一个或多个子操作。 gasPriceCoef 是 VeChain 独有的一个字段,它决定了你这笔交易的 实际 gas 价格 是当前网络基础 gas 价格的多少倍。 VeChain 里这个 gas 字段的作用是设置最大愿意消耗的 gas 数量上限。转账的时候设置21000,需要调用合约进行复杂的操作的时候需要提高上限来保证交易不会因为gas限制而revert。 # 3. 用 thor-devkit 构建并签名交易 tx = transaction.Transaction(body) private_key_bytes = bytes.fromhex(PRIVATE_KEY_HEX) signature = secp256k1.sign(tx.get_signing_hash(), private_key_bytes) tx.set_signature(signature) # 4. 得到 raw(发送用的十六进制字符串) raw = "0x" + tx.encode().hex() print("Raw transaction:") print(raw) print() # 5. 发送交易 send_resp = requests.post( NODE_URL + "/transactions", json={"raw": raw} ) if send_resp.status_code == 200: txid = send_resp.json()["id"] print("交易已广播!") print(f"TxID: {txid}") else: print("发送失败:") print(send_resp.status_code, send_resp.text) 我们使用python对数据打包签名,然后选择一个共用的节点,调用节点上的/transactions路由,发送raw数据就可以发送交易数据进行广播了。 ...

October 22, 2025 · coffiasd