Привет всем!
Изучаю 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 (т.к. контракт хранит старое значение).
Коллеги, объясните плиз. Или может есть хороший гайд, который это проясняет?
Спасибо