Частная цепочка: извлечение «данных» из учетной записи?

Я инициировал и заработал транзакцию между двумя аккаунтами. Я также включил поле данных в эту транзакцию. Это просто случайные шестнадцатеричные данные. Вот команда:

eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:web3.toWei(1,"ether"),data:"4e4f"})

Теперь из хеша транзакции я могу получить эти данные (они находятся в поле ввода):

eth.getTransaction("<transaction hash>")
{
  blockHash: "0xfa62730b0f9e310cd07d615b78857e338e845b9098c26f861e2713c5f690497d",
  blockNumber: 15,
  from: "0x37e5a459dbd48d4d9874e13cc334dab30373cece",
  gas: 90000,
  gasPrice: 20000000000,
  hash: "0x2beef248d7d690d95cd1da22c8bf12937d323b197430e5a384cf4259db290bef",
  input: "0x4e4f",
  nonce: 2,
  to: "0xe1e09a6f9504d42e2e63e1b21447f4410159cf24",
  transactionIndex: 0,
  value: 1000000000000000000
}

Но я хочу получить эти данные, используя адрес учетной записи получателя

0xe1e09a6f9504d42e2e63e1b21447f4410159cf24

Мы можем получить баланс этой учетной записи, используя eth.getBalance(account_address) . Вместе с эфиром я отправляю и данные на этот аккаунт (Разве это не так работает?). Итак, существует ли аналогичная функция eth.getData/eth.getInput для поиска данных, полученных учетной записью?
Где эти данные на самом деле хранятся в моем частном блокчейне?

Ответы (1)

Данные, которые вы отправляете, являются частью транзакции, но не «добавляются» в учетную запись. Существует хранилище, связанное с учетными записями (доступ через eth.getStorageAt(address,location)), но оно будет пустым, если контракт не хранит там данные.

Поскольку данные связаны только с транзакцией, а не со счетом, лучший способ получить к ним доступ — использовать фильтры.

var filter = eth.filter({fromBlock:0,toBlock:"latest", address:eth.accounts[1]});
var data = [];
filter.get(function(error,result){
    data.append(eth.getTransaction(result.transactionHash).data);
});

console.log(data)

В качестве альтернативы вы можете создать контракт, который просто записывает все отправленные ему данные:

contract Store {

    bytes[] public data;

    function(){
        data.push(msg.data);
    }
}

Затем просто извлеките данные с помощьюstore.data(index);

Эта строка "var filter = eth.filter({fromBlock:0,toBlock:"latest", address:eth.accounts[1]);" может быть, нужно "}" нет?