En un proyecto de trufas, tengo una función de contrato inteligente como se muestra a continuación:
function add_something(string memory _firstName, string memory _lastName) external returns (address) { // Do some updates etc return someAddress; } Después de implementar el contrato inteligente con el comando de truffle migrate de truffle, quiero ejecutar un script JS para llamar a algunas funciones en el contrato inteligente implementado. ( truffle exec add.js )
const MyContract = artifacts.require("MyContract"); module.exports = async function(callback) { let accounts = await web3.eth.getAccounts(); let instance = await MyContract.deployed(); let result = await instance.add_something("Stack", "Overflow", {from: accounts[0]}); console.log(result);Esperado : quiero tener el valor de retorno (dirección) en el resultado.
Real : el resultado contiene el siguiente objeto de recibo de transacción:
{"tx":"0x2e5b2fb1a9dd023be04e12f73fcea3cab84214258be71ac2f76b86c58e485433","receipt":{"transactionHash":"0x2e5b2fb1a9dd023be04e12f73fcea3cab84214258be71ac2f76b86c58e485433","transactionIndex":0,"blockHash":"0xbdbef8e9b38cd66748eca51809869185deb61d00bb0f93916f76ee5594ca945d","blockNumber":45,"from":"0x75c1df3c54b6eb371169737fb62f2c5b7c178479","to":"0x786676da2567c51c83b56888e48030fa5fea0e03","gasUsed":2406988,"cumulativeGasUsed":2406988,"contractAddress":null,"logs":[],"status":true,"logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","rawLogs":[]},"logs":[]}Intenté usar .methods, call() y send(), pero obtuve los siguientes errores:
let result = await instance.add_something("Stack", "Overflow", {from: accounts[0]}).call(); TypeError: instance.add_something(...).call is not a functionSugiera una solución adecuada para leer el valor de retorno de una función de contrato inteligente sin visualización.
Si entendí tu pregunta correctamente, deberías considerar usar eventos. En circunstancias normales, las funciones de solidez no devuelven un valor para empezar, pero los eventos pueden cambiar eso.
contract Test { event someEvent(string _someString); function doSomething()public external { emit someEvent("This is some event"); } }También puedes pasar una variable como esta
function doSomething(string _somethingGoesHere)public external { emit someEvent(_somethingGoesHere); }Luego puede ir al código JavaScript y leer el resultado o más bien la salida así
var abi = /* abi as generated using compiler */; var Test = web3.eth.contract(abi); /* Deploy your contract and save the address*/ var testContract = Test.at("0x1234...ab67" /* address */); var event = testContract.doSomething(function(error, result) { if (!error)console.log(result); });Esto fue que no necesita usar ningún valor de retorno o una función de vista, en su lugar, simplemente lee lo que se devuelve o más bien se emite desde el evento Solidity