Я экспериментирую с Solidity Browser
Вот код моего контракта:
контракт Тест { отображение (адрес => uint256) weismap; функция bet(uint voice) оплачиваемая возвращает (uint256 weis) { если (msg.value==0) бросить; weismap[msg.sender]= msg.value; вернуть weismap[msg.sender]; } Функция test() возвращает (uint myVote) { вернуть 1; } }
Если я установлю значение транзакции 1
,создайте контракт и вызовите функцию bet с 1 в качестве параметра
функция выполняется успешно.
Если после этого я вызову функцию test(), я получу
Исключение виртуальной машины: неверный JUMP
Любая идея, о том, что не так?
Вам нужно добавить constant
ключевое слово в test()
функцию, например:
pragma solidity ^0.4.0;
contract Test {
mapping (address => uint256) weismap;
function bet(uint vote) payable returns (uint256 weis) {
if (msg.value==0)
throw;
weismap[msg.sender]= msg.value;
return weismap[msg.sender];
}
function test() constant returns (uint myVote) {
return 1;
}
}
Вызов bet(...)
со значением 2. Обратите внимание, что я также отправляю 2 эфира с транзакцией:
Теперь я звоню test()
И оставил значение 2 . Этот вызов test()
терпит неудачу, так как константная функция вызывается как транзакция, а не чтение значений из блокчейна:
Если я вызываю test()
И я установил пустое значение , этот вызов test()
завершается успешно, поскольку константная функция вызывается как чтение значений из блокчейна:
geth 1.4.11-stable
. Ответ обновлен с более подробной информацией.
Ксавье Лепретр B9lab
Гёндер