Вопрос про транзации Etherium (чтение данных, измененных транзакцией)
От: Lonely Dog Россия  
Дата: 30.10.18 17:24
Оценка:
Привет всем!

Изучаю etherium и solidity, пишу всякие тестовые контракты и не могу понять следующую вещь. Пусть у меня в контракте есть функция:

uint value;
function setValue(uint newValue) public {
  value = newValue;
}

function getValue() public view returns(uint) {
  return value;
}


Контракт задеплоен в geth через truffle. Еще есть клиент на node.js (использующий web3.js). Вызвал я из него setValue. Это ведь транзакция (т.к. изменяет состояние контракта) и выполняется асинхронно. Т.е. когда-нибудь будет замайнена. И я так понимаю, value будет обновлено после этого. Т.е. возможна ситуация, когда вызов getValue вернет старое значение? Если да, то как с этим бороться?

У меня поведение странное. Если я деплою контракт в truffle develop, и в консоли вызываю setValue, потом getValue, я получаю правильное значение. Если же вызываю из JS, то получаю старое значение. Т.е. похоже на то, что я описал выше. Но ведь это бред...

Ладно, ок. Пускай у нас будет другой контракт, скажем вот такой:

uint value = 0;
function init(uint newValue) public {
  value = newValue;
}

function doIt() public  {
  require(value > 0);
  value = value / 2;
}


Здесь то все еще веселее. Вызвал я init(1), транзакция ушла. Но пока она не замайнилась, я не смогу вызвать doIt (т.к. контракт хранит старое значение).

Коллеги, объясните плиз. Или может есть хороший гайд, который это проясняет?

Спасибо
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.