无法与 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 交易)

如何在以太坊网络上发布自己的代币

Truffle 合约验证无法在 BSC 测试网上运行

BSC(币安智能链)主网链部署

为啥合约是在 ropsten 上启动,而不是 BSC 测试网上的 remix?

rabbitmq官网中的php测试helloworld的代码是不是有问题