Llamar a la función Smart Contract whoAmI

Tener un contrato inteligente extraído en testnet en la dirección 0x5a6661c75df7de88ba74437a6dc372ccfa72a564 con la siguiente función:

    function whoAmI() constant returns (address) {
        return msg.sender;
    }

debe devolver la llamada siempre. Y eso es lo que estoy tratando de verificar. Funciona bien cuando llamo sincrónicamente desde la consola geth de esta manera:

// creation of contract object
var aContract = web3.eth.contract([{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"kill","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"queryBalanceOf","outputs":[{"name":"balance","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"initialSupply","type":"uint256"}],"name":"MyToken","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"whoAmI","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"payable":false,"type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"}]);

// initiate contract for an address
var sc = aContract.at('0x5a6661c75df7de88ba74437a6dc372ccfa72a564');

// calling function
sc.whoAmI();
    "0x47978a69f410d0f61850c92acdb0d4c464d70937"

El problema viene al intentar llamarlo de forma asíncrona desde otra cuenta así:

sc.whoAmI.sendTransaction({from:"0x3b877e80b5c0b29d88f3768ed4292b35fdd93a9d"});
txHash => "0x5fc3f7454d558ad4bd01294448b45bc7072b46958375fafe32e277a770d48e90"

¿Dónde se almacena el resultado de la transacción? Intentando esto:

eth.getTransactionReceipt("0x5fc3f7454d558ad4bd01294448b45bc7072b46958375fafe32e277a770d48e90")
{
  blockHash: "0xa19553677ede1d1eed791d1658a4229629346f90db5907c14c915dda13926df9",
  blockNumber: 1821495,
  contractAddress: null,
  cumulativeGasUsed: 21612,
  from: "0x3b877e80b5c0b29d88f3768ed4292b35fdd93a9d",
  gasUsed: 21612,
  logs: [],
  root: "31aa355a0a7534b18c7874a31fd78926a6869f0e9e309a972d1b5505405c6421",
  to: "0x5a6661c75df7de88ba74437a6dc372ccfa72a564",
  transactionHash: "0x5fc3f7454d558ad4bd01294448b45bc7072b46958375fafe32e277a770d48e90",
  transactionIndex: 0
}

No pude encontrarlo. ¿Alguna ayuda? ¡Gracias!

¿Está buscando la entrada enviada o los datos devueltos?
Los datos devueltos. Esta función no tiene entrada, excepto por el mismo msg.sender que proviene de la transacción misma.

Respuestas (1)

Supongo que no es posible obtener el valor de retorno de una función cuando se extrae de forma asíncrona. De acuerdo con ¿Cómo obtener valores de retorno cuando se llama a la función con argumento? actualmente no es posible devolver valores de funciones que modifican la cadena de bloques... la única forma de "devolver" información es usando Solidity Events.