Не удалось взаимодействовать с контрактом в основной сети BSC, но успешно в тестовой сети (но все еще стандартная передача)

Я могу отправить необработанную транзакцию с помощью sendSignedTransaction на адрес контракта в тестовой сети BSC, и она будет успешной, но это просто стандартная транзакция; это не контракт, как я хочу.

Но в основной сети BSC он всегда выходил из строя с ошибкой: Предупреждение! Ошибка при выполнении контракта [выполнение отменено]

Пожалуйста, помогите мне проверить код ниже, а затем сообщите мне, где проблема, какой-либо комментарий, ответ или предположение, добро пожаловать; огромное спасибо.

Для тестовой сети это всегда было успешным, но это была стандартная транзакция, ссылка на изображение . Пока я хочу взаимодействовать с контрактом, в результате должно отображаться поле " Взаимодействовано с (Кому)".

      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, если я использовал _signEncoded в web3.eth.estimateGas, он возвращает ошибку: выполнение отменено: недействительная подпись , я должен использовать _sign для отправки транзакции, но она все равно всегда завершалась ошибкой Предупреждение! Ошибка при выполнении контракта [выполнение отменено] ссылка на изображение

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

1 ответ

Контракт развернут в основной сети

Но фрагмент 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 — это обычная передача, и ее нельзя использовать в моем случае?

The contract.methods.claim(...).call()является сокращением для вызова функции. sendSignedTransaction()может использоваться для отправки транзакции - по умолчанию без вызова какой-либо функции, но вы также можете определить ее dataпараметр для выполнения функции.

Имейте в виду, что есть разница между вызовом (только для чтения; выполняемым functionName().call()в web3) и транзакция (чтение-запись; выполняется functionName().send()функция в сети3). Исходя из контекста вашего вопроса, я предполагаю, что вы хотите отправить транзакцию (выполнение функции), а не выполнить вызов (к claim()функция).

Другие вопросы по тегам