Вызов функции смарт-контракта whoAmI

Наличие смарт-контракта, добытого в тестовой сети по адресу 0x5a6661c75df7de88ba74437a6dc372ccfa72a564 со следующей функцией:

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

всегда должен возвращать вызывающего абонента. И это то, что я пытаюсь проверить. Я нормально работаю при синхронном вызове из консоли geth следующим образом:

// 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"

Проблема возникает при попытке вызвать его асинхронно из другой учетной записи, например:

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

Где хранится результат транзакции? Попытка этого:

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

Я не мог найти его. Любая помощь? Спасибо!

вы ищете отправленный ввод или возвращенные данные?
Возвращаемые данные. У этой функции нет входных данных, кроме того самого msg.sender, который исходит от самой транзакции.

Ответы (1)

Я предполагаю, что невозможно получить возвращаемое значение функции при асинхронном майнинге. В соответствии с Как получить возвращаемые значения при вызове функции с аргументом? в настоящее время невозможно вернуть значения из функций, которые изменяют блокчейн... единственный способ «вернуть» информацию — это использовать Solidity Events.