Не удалось взаимодействовать с контрактом в основной сети 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()
функция).