Подписывать и транслировать транзакцию смарт-контракта в сети TRON

Используя клиент node.js, я пытаюсь вызвать функцию смарт-контракта:

  1. Создание транзакции
  2. Подписывая это
  3. Транслировать подписанную транзакцию

Я развернул простой смарт-контракт:

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 ответ

Была точно такая же проблема. Решение:

  1. Удалить пробелы в const functionSelector = 'testFunction(string,uint)'; как советовал малыш
  2. + Изменить uint к uint256

Попробуйте писать параметры функции без пробелов.const functionSelector = 'testFunction(string,uint)'; Я читал в документации, которую вы должны писать без пробелов, у меня это сработало на python.

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