Подписывать и транслировать транзакцию смарт-контракта в сети TRON
Используя клиент node.js, я пытаюсь вызвать функцию смарт-контракта:
- Создание транзакции
- Подписывая это
- Транслировать подписанную транзакцию
Я развернул простой смарт-контракт:
pragma solidity ^0.4.25;
contract Test {
event MyEvent(address sender, string message, uint sessionId, uint value);
event TestEvent(address sender);
constructor() public {
}
function testFunction(string message, uint sessionId)
public
payable {
emit MyEvent(msg.sender, message, sessionId, msg.value);
}
function test2()
public {
emit TestEvent(msg.sender);
}
}
Я успешно вызываю test2
(при отправке пустого массива параметров), но не вызывает testFunction
который принимает параметры. Я пробовал использовать вызов tronweb triggerSmartContract:
async function triggerSmartContract() {
try {
const options = {
feeLimit: 1000000000,
callValue: 50
};
const parameters = [{type: 'string', value: 'test-round-id-1'}, {type: 'uint', value: 12345}];
const issuerAddress = tronWeb.defaultAddress.base58;
const functionSelector = 'testFunction(string, uint)';
let transactionObject = await tronWeb.transactionBuilder.triggerSmartContract (
contract_address,
functionSelector,
options,
parameters,
tronWeb.address.toHex(issuerAddress)
);
if (!transactionObject.result || !transactionObject.result.result)
return console.error('Unknown error: ' + txJson, null, 2);
// Signing the transaction
const signedTransaction = await tronWeb.trx.sign(transactionObject.transaction);
if (!signedTransaction.signature) {
return console.error('Transaction was not signed properly');
}
// Broadcasting the transaction
const broadcast = await tronWeb.trx.sendRawTransaction(signedTransaction);
console.log(`broadcast: ${broadcast}`);
} catch (e) {
return console.error(e);
}
}
Код запускается и создает транзакцию в цепочке блоков, но с результатом FAIL-REVERT OPCODE EXECUTED
. В кошельке с адресом и ключом, которые определены в объекте tronweb, достаточно средств (это не значит, что закончился газ / недостаточно средств). Также функция в смарт-контракте определяется как подлежащая оплате.
Поскольку я могу успешно вызывать любую функцию без параметров, я склонен думать, что проблема связана с тем, как я создаю parameters
массив. Я построилparameters
массив таким образом (пары type
а также value
) после просмотра исходного кода transactionBuilder (строка 833).
Какие-либо предложения?
1 ответ
Была точно такая же проблема. Решение:
- Удалить пробелы в
const functionSelector = 'testFunction(string,uint)';
как советовал малыш - + Изменить
uint
кuint256
Попробуйте писать параметры функции без пробелов.const functionSelector = 'testFunction(string,uint)';
Я читал в документации, которую вы должны писать без пробелов, у меня это сработало на python.