При вызове функции изменения состояния в цепочке возвращается объект квитанции TX. В браузере Solidity под виртуальной машиной Javascript возвращается возвращаемое значение, если оно задано.
Почему виртуальная машина Javascript ведет себя таким запутанным образом?
Например, следующий контракт содержит функцию изменения состояния, которая возвращает значение.
contract foo {
uint public bar;
function set(uint newbar) public returns (bool)
{
bar = newbar;
return true;
}
}
В виртуальной машине Javascript значение отображается как возвращенное...
Это противоречит поведению контракта в цепочке, который возвращает квитанцию TX. Возвраты IOW не имеют смысла в функции изменения состояния (или я упускаю что-то действительно фундаментальное?)
Возвращаемое поведение Javascript VM может привести к ложному ощущению функциональности, из-за которого автор (например, я, который должен был знать лучше) затем пишет контракты в зависимости от таких возвращаемых значений, но которые не имеют абсолютно никакой функциональности в цепочке...
Другой пример, который работает в виртуальной машине, но ломается в цепочке, - это попытка взаимодействия с «новым» контрактом...
contract foo {
uint public number = 42;
function set(uint num)
{
number = num;
}
}
contract fooFactory {
foo public kungFoo;
function newFoo()
{
kungFoo = new foo();
kungFoo.set(1); // This call will throw on chain yet works in VM
}
}
browser-solidity на Github описывается как «Только для браузера Solidity IDE и среда выполнения». Возврат значений из непостоянных функций — полезная функция IDE, похожая на мгновенное выполнение без необходимости ждать, пока блок будет добыт. Цель используемой виртуальной машины Javascript — упростить и ускорить разработку и отладку.
Недостатком является то, что среда не сохраняется, но надежность браузера может быть прикреплена непосредственно к узлу, такому как Geth (вариант поставщика Web3 ниже), или к «инжектированному Web3», такому как Mist или MetaMask, где можно использовать реальный блокчейн:
о0рагман0о
эт