Web3.py以太坊合约交互 签名前原始交易JSON结构示例
合约交互场景下传入KMS签名前的原始交易结构说明
合约交互的待签名原始交易整体结构和你已掌握的EIP-1559原生ETH转账结构完全兼容,仅需要调整3个字段的取值逻辑,其余字段填充规则和原生转账完全一致,不需要额外新增字段。
字段规则说明
通用字段(与原生ETH转账规则完全一致)
nonce: 发送地址的链上交易序列号,通过链上RPC接口查询当前地址已完成交易的计数获取,整数类型gas: 交易gas消耗上限,整数类型。合约交互的gas消耗普遍高于原生转账,建议在eth_estimateGas返回的预估结果基础上上浮10%-20%,避免因gas不足导致交易失败maxFeePerGas: EIP-1559交易的最大单位gas费用,单位wei,整数类型maxPriorityFeePerGas: EIP-1559交易的矿工优先费,单位wei,整数类型type: 交易类型标识,EIP-1559交易固定填2,整数类型chainId: 目标链的链ID,例如以太坊主网为1、BNB Chain为56,整数类型
合约交互需调整的字段
to: 不再是个人用户的接收地址,填入目标智能合约的部署地址,为0x开头的42位十六进制格式字符串value: 本次调用随交易发送的原生代币数量,单位wei,整数类型。如果调用的合约方法不需要支付原生币(例如普通ERC20转账、授权、合约状态更新类操作),该字段填0即可;如果调用方法要求支付原生币(例如NFT公售mint、原生币质押),填入实际需要支付的金额data: 合约交互的核心字段,不再是原生转账的0x00,填入遵循以太坊ABI编码规则生成的调用数据,格式为0x开头的十六进制字符串,由「4字节的合约方法选择器+ABI编码后的方法入参」两部分拼接组成
实际场景示例
示例1:EIP-1559 ERC20代币转账(以太坊主网转1枚USDC)
{ "nonce": 27, "to": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", "value": 0, "data": "0xa9059cbb000000000000000000000000c3248e87d86b932c09f07d2186c836f27f26c5a100000000000000000000000000000000000000000000000000000000000f4240", "gas": 65000, "maxFeePerGas": 32000000000, "maxPriorityFeePerGas": 2000000000, "type": 2, "chainId": 1 }
字段说明:示例中
to为以太坊主网USDC合约地址,data对应transfer(address to, uint256 amount)方法的编码结果,最后8位十六进制f4240对应十进制1000000,即USDC 6位精度下的1枚代币。
示例2:NFT公售Mint调用(需支付0.01ETH)
{ "nonce": 28, "to": "0xBC4CA0EdA7647A8aB7C2061c2E118A18a936f13D", "value": 10000000000000000, "data": "0x1249c58b", "gas": 180000, "maxFeePerGas": 28000000000, "maxPriorityFeePerGas": 1500000000, "type": 2, "chainId": 1 }
字段说明:示例中
value为0.01ETH对应的wei值,data为无参mint()方法的4字节选择器,无额外入参。
补充说明
data字段不需要手动拼接编码,web3py、web3js、ethers均内置了ABI编码能力:传入合约ABI、目标方法名、方法入参即可自动生成符合规范的data值,直接取出放入交易字典即可- 若为部署新合约场景,
to字段填空字符串"",data字段填入合约初始化字节码+构造函数参数的ABI编码结果,其余字段规则不变 - 若使用传统Legacy类型交易(type=0),仅需将
maxFeePerGas、maxPriorityFeePerGas两个字段替换为gasPrice字段即可,其余字段规则与上述一致
内容的提问来源于stack exchange,提问作者Benzy
相关产品推荐
相关产品推荐

