0

我可以通过 sendSignedTransaction 将原始交易发送到 BSC 测试网上的合约地址,它成功了,但这只是一个标准交易;这不是我想要的合同电话。

但是在 BSC 主网上,它总是失败并出现错误:警告!合约执行过程中遇到错误[执行恢复]

请帮我检查下面的代码,然后告诉我哪里有问题,任何评论,回复或猜测欢迎;非常感谢。

对于 testnet,它总是成功,但它是一个标准交易,链接到 image。虽然我想与合同互动,但结果应显示与(至)互动的字段

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它会返回错误:执行恢复:无效签名,我必须使用_sign发送交易,但它仍然总是失败并出现错误警告!合约执行过程中遇到的错误 [执行恢复] 链接到图像

var esGas = await web3.eth.estimateGas({
     "from"      : _from,
     "nonce"     : _nonce, 
     "to"        : _to,
     "data"      : _sign
});
4

1 回答 1

0

部署在主网上的合约

但是 JS 片段试图在测试网上调用合约(它没有部署)。

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()函数。

请注意,调用(只读;由functionName().call()web3 中的执行)和事务(读写;由functionName().send()web3 中的函数执行)之间存在差异。根据您的问题的上下文,我猜您想发送事务(执行claim()函数)-而不是执行调用(对claim()函数)。

于 2021-12-18T12:21:47.533 回答