Web3.js通过Metamask调用合约mint方法数值异常及交易哈希解读疑问
交易传递给智能合约的逻辑
- 你构造的
transactionParameters就是交易的核心信息,调用eth_sendTransaction后MetaMask会先校验交易格式、请求用户签名,再将签名后的交易广播到以太坊节点 - 节点验证交易签名、发送账户余额足够支付交易总费用后,会把交易纳入待打包队列,矿工打包进区块后交易就正式写入链上,合约方法也会对应执行
- 交易里的
data字段就是调用合约的核心内容:前4字节是mint函数的选择器,你当前的0xa0712d68是正确的,后面补零的64位内容是uint256类型的铸造数量参数,你当前的参数对应铸造1个NFT,也是正确的
支付价格显示0E的修复方案
你代码里存在两个错误导致价格异常:
- 调用的合约地址填错:你给出的目标合约地址是
0xeaf59acf00435857d4d0e26e2b48948b86a8a8ca,但你代码里to字段填的是无关地址,先替换为正确的合约地址 - 转账金额计算错误:以太坊交易里
value的单位是wei,1 ETH = 10^18 wei,0.5 ETH对应的wei值是500000000000000000,转十六进制为0x6f05b59d3b20000,替换你原来的value字段即可。如果要支持用户自定义铸造数量,总value要按「0.5 ETH * 铸造数量」计算后再转十六进制。
交易哈希的解读方法
调用eth_sendTransaction返回的txHash是这笔交易的唯一标识:
- 交易哈希是对交易所有字段(nonce、gasPrice、gas、to、value、data、from、链ID)做Keccak256哈希得到的64位十六进制字符串,每笔交易的哈希都是唯一的
- 你可以用它查询交易的全链路状态:待打包、已打包(交易成功/失败)、实际消耗的手续费、合约执行的事件日志等
- 交易上链后可以调用
eth_getTransactionReceipt接口获取交易回执,回执里的status字段为1表示交易执行成功,0表示交易执行失败。
优化后的代码示例
const onPurchase = async (mintCount = 1) => { // 单个NFT价格0.5ETH = 5e17 wei,计算总支付金额 const totalValue = BigInt(5e17) * BigInt(mintCount); const transactionParameters = { to: '0xeaf59acf00435857d4d0e26e2b48948b86a8a8ca', // 替换为正确合约地址 from: window.ethereum.selectedAddress, // 动态读取当前连接的钱包地址,不要写死 value: '0x' + totalValue.toString(16), // 自动计算总金额的十六进制 data: '0xa0712d68' + mintCount.toString(16).padStart(64, '0'), // 动态拼接参数 // gas和gasPrice可以不填,MetaMask会自动估算最优值,避免手动设置导致交易失败 }; const txHash = await window.ethereum.request({ method: 'eth_sendTransaction', params: [transactionParameters], }); console.log('交易已发送,哈希:', txHash); // 后续可以轮询eth_getTransactionReceipt接口确认交易是否上链成功 }
内容的提问来源于stack exchange,提问作者SimonStern
相关产品推荐
相关产品推荐

