À l'aide d'un client node.js, j'essaie d'appeler une fonction de contrat intelligent en :
- Créant une transaction
- La signant
- 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 ?