3 votes

Signaler et diffuser une transaction de contrat intelligent dans le réseau TRON

À l'aide d'un client node.js, j'essaie d'appeler une fonction de contrat intelligent en :

  1. Créant une transaction
  2. La signant
  3. Diffusant la transaction signée

J'ai déployé un contrat intelligent simple :

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);
    }
}

J'ai réussi à appeler test2 (en envoyant un tableau de paramètres vide) mais j'échoue à appeler testFunction qui prend des paramètres. J'ai essayé en utilisant tronweb triggerSmartContract call :

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('Erreur inconnue : ' + txJson, null, 2);

        // Signature de la transaction
        const signedTransaction = await tronWeb.trx.sign(transactionObject.transaction);

        if (!signedTransaction.signature) {
            return console.error('La transaction n'a pas été correctement signée');
        }

        // Diffusion de la transaction
        const broadcast = await tronWeb.trx.sendRawTransaction(signedTransaction);
        console.log(`diffusion : ${broadcast}`);
    } catch (e) {
        return console.error(e);
    }
}

Le code s'exécute et crée une transaction sur la blockchain mais avec pour résultat FAIL-REVERT OPCODE EXECUTED. Le portefeuille de l'adresse et de la clé qui sont définis dans l'objet tronweb a suffisamment de fonds (ce n'est pas un problème de gaz/insuffisance de fonds). De plus, la fonction dans le contrat intelligent est définie comme payable.

Étant donné que je peux appeler avec succès n'importe quelle fonction sans paramètres, je tends à penser que le problème est lié à la manière dont je construis le tableau de paramètres. J'ai construit le tableau de paramètres de cette manière (paires de type et de valeur) après avoir examiné le code source du transactionBuilder (ligne 833).

Des suggestions ?

1voto

JeyMcKey Points 56

Avait exactement le même problème. Solution:

  1. Supprimez les espaces dans const functionSelector = 'testFunction(string,uint)'; comme l'a conseillé malysh
  2. Changez uint en uint256

0voto

modernToking Points 38

Essayez d'écrire les paramètres de fonction sans espaces. const functionSelector = 'testFunction(string,uint)'; J'ai lu dans la documentation qu'il faut écrire sans espaces, ça a fonctionné pour moi en python.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X