У меня очень простой контракт Solidity:
contract AccessManager {
mapping(address => bool) public registry;
function grantAccess(address assetAddr) {
registry[assetAddr] = true;
}
function isAuthorized(address assetAddr) constant returns (bool) {
return registry[assetAddr];
}
}
Логика проста: всякий раз, когда я вызываю метод grantAccess(...), адрес (переданный в качестве аргумента метода) должен быть добавлен к сопоставлению со значением «истина».
Проблема в том, что этот простой код не работает. После того, как я отправляю транзакцию для выполнения метода grantAccess("0x....."), я вызываю метод isAuthorized("0x....), и он всегда возвращает "false". Я пробовал это с расширением Chrome под названием " Sol" и с .NET Etherum API. Результат всегда один и тот же: метод контракта isAuthorized(...) возвращает "false" независимо от того, что я делаю.
Вот как я вызываю контактные методы в расширении Sol:
Я думаю, что проблема заключается в передаче строки в качестве аргумента адреса, но у меня есть другой контракт, в котором я делаю то же самое, и он отлично работает.
Кто-нибудь сталкивался с подобными проблемами?
Вы запускали свой код локально, в памяти (ВМ) или в блокчейне? Я попробовал ваш код, он работает (0 = false перед предоставлением доступа и 1 = true после)
Попробуйте добавить событие в вашу функцию предоставления доступа;
event ev(bool is_granted)
function grantAccess(address assetAddr) {
registry[assetAddr] = true;
ev(registry[assetAddr]);
}
Поскольку комментарии с описанием решения были перенесены в чат, и с тех пор уже два человека уделили время моему (решенному) вопросу, в качестве ответа напишу краткое изложение того, что произошло.
Вход:
Первоначально мой код содержал событие, которое срабатывало после вызова метода контракта grantAccess(...). Поскольку у меня никогда не было проблем с расширением «Sol» для Chrome, это создавало у меня ложное впечатление, что мои изменения были каким-то образом отменены после завершения выполнения метода.
После того, как @kobigurk протестировал мой код в последней версии браузера-солидности, стало очевидно, что проблема кроется в хромовом расширении "Sol", а не в самом контракте. По какой-то причине расширение "Sol" не может правильно декодировать ответ, полученный от сервера, и постоянно показывает возвращаемое значение по умолчанию ("false" для типа bool, "0" для uint). Я тестировал тот же контракт, но с «uint» в качестве возвращаемого типа из метода «grantAccess» и всегда получал «0». Это означает, что последний байт каким-то образом игнорируется.
Итак, решение простое: клонируйте последний исходный код «browser-solidity» и используйте его вместо chrome-расширения «Sol».
Спасибо всем, кто потратил время, пытаясь мне помочь!
q9f
СКБюргель
Владимир Усарский
q9f
Владимир Усарский