无法与 BSC 主网中的合约交互,但在测试网中成功(但仍然是标准传输)
Posted
技术标签:
【中文标题】无法与 BSC 主网中的合约交互,但在测试网中成功(但仍然是标准传输)【英文标题】:Could not interact with contract in BSC mainnet but succeed in testnet (but still a standard transfer) 【发布时间】:2022-01-20 08:45:10 【问题描述】:我可以通过 sendSignedTransaction 将原始交易发送到 BSC 测试网上的合约地址,它成功了,但这只是一个标准交易;这不是我想要的合同电话。
但在 BSC 主网上,它总是失败并出现错误:警告!合约执行过程中遇到错误[执行恢复]
请帮我检查下面的代码,然后告诉我问题出在哪里,任何评论,回复或猜测欢迎;非常感谢。
对于测试网,它总是成功,但这是一个标准交易,link to image。虽然我想与合同交互,但结果应显示字段 Interacted With (To)
var minABI = [
"constant": true,
"inputs": [
"name": "_claimer",
"type": "uint256"
,
"name": "_amount",
"type": "uint256"
,
"name": "_sig",
"type": "bytes"
],
"name": "claim",
"outputs": [],
"payable": true,
"stateMutability": "payable",
"type": "function"
];
var web3 = new Web3('https://data-seed-prebsc-1-s1.binance.org:8545'); // testnet
//var web3 = new Web3('https://bsc-dataseed.binance.org:443'); // mainnet
var _from = '0x2151...';
var _to = '0x7f617...';
var _sign = '0x5eddd...';
var PRIVATE_KEY = 'da65f...';
var contract = new web3.eth.Contract(minABI, _to, from: _from);
var _nonce = await web3.eth.getTransactionCount(_from, 'latest');
var _signEncoded = contract.methods.claim(_nonce, '17390000000000000000', _sign).encodeABI();
var esGas = await web3.eth.estimateGas(
"from" : _from,
"nonce" : _nonce,
"to" : _to,
"data" : _signEncoded
);
var sentValue = gasPrice * esGas;
var transaction =
'to': _to,
'value': sentValue,
'gas': esGas,
'nonce': _nonce,
'data': _signEncoded,
;
var signedTx = await web3.eth.accounts.signTransaction(transaction, PRIVATE_KEY);
var tx = await web3.eth.sendSignedTransaction(signedTx.rawTransaction);
对于 mainet,如果我在 web3.eth.estimateGas 中使用了 _signEncoded,它会返回错误:execution reverted: Invalid signature,我必须使用_sign 发送交易,但它仍然总是失败,错误 警告!合约执行过程中遇到错误[执行恢复] link to image
var esGas = await web3.eth.estimateGas(
"from" : _from,
"nonce" : _nonce,
"to" : _to,
"data" : _sign
);
【问题讨论】:
合约地址是什么? 合约地址为 var _to = '0x7f617...'; 我的意思是完整的合约地址。我的目标是探索合约是否部署在测试网上(当您连接到测试网提供商时),以及它是否有经过验证的源代码来检查代码 - 如果没有,至少检查 @ 987654325@函数存在等 合约部署在主网上但未经验证。但我确信 claim() 存在并且有效,因为我使用元掩码来正常声明它,在交易主网显示的函数中带有参数+数据。我也可以使用 bscscan 的字节码反编译器来查看它的声明功能 如果我想调用这个声明还有一件事,我必须通过它的合约调用:contract.methods.claim(_nonce, 'amount', _sign).call() ? sendSignedTransaction 只是正常的数据传输,在我的情况下不能使用?因为我尝试使用 MM,然后在 MM 弹出窗口中复制输入数据,然后使用带有复制数据的 sendSignedTransaction 但仍然失败 【参考方案1】:合约部署在主网上
但 JS sn-p 试图在测试网上调用合约(未部署)。
var web3 = new Web3('https://data-seed-prebsc-1-s1.binance.org:8545'); // testnet
//var web3 = new Web3('https://bsc-dataseed.binance.org:443'); // mainnet
因此,您也需要将其部署在测试网上,或者使用主网(已经部署的地方)web3 提供程序。
如果我想调用这个声明,我必须通过它的合约调用:contract.methods.claim(_nonce, 'amount', _sign).call() ? sendSignedTransaction 只是普通的转账,在我的情况下无法使用?
contract.methods.claim(...).call()
是调用函数的简写。 sendSignedTransaction()
可用于发送交易 - 默认情况下不调用任何函数,但您也可以定义其 data
参数来执行 claim()
函数。
请注意,调用(只读;由 web3 中的 functionName().call()
执行)和事务(读写;由 web3 中的 functionName().send()
函数执行)之间存在差异。根据您的问题的上下文,我猜您想发送一个事务(执行 claim()
函数) - 不执行调用(到 claim()
函数)。
【讨论】:
太奇怪了,我用MM复制输入数据,然后返回错误:未知帐户,代码var _sign = 'data copied from metamask'; contract.methods.claim(_from, 'amount', _sign).send();
使用contract.methods.claim(_from, 'amount', _sign).call();
返回执行恢复:无效签名
与 web3.eth.sendSignedTransaction(signedTx.rawTransaction);
它返回 nonce too low
非常感谢,只需再尝试 1 次 var _nonce = await web3.eth.getTransactionCount('my address', 'latest');
即可成功。我必须使用来自实时主网的 nonce
,而不是来自网站数据库以上是关于无法与 BSC 主网中的合约交互,但在测试网中成功(但仍然是标准传输)的主要内容,如果未能解决你的问题,请参考以下文章
Solana 链中的打字稿错误。 (测试网中的 Solana 交易)