Контракт с отображением (адрес-> логическое значение) не работает должным образом

У меня очень простой контракт 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:

AccessManager Sol

Я думаю, что проблема заключается в передаче строки в качестве аргумента адреса, но у меня есть другой контракт, в котором я делаю то же самое, и он отлично работает.

Кто-нибудь сталкивался с подобными проблемами?

Комментарии не для расширенного обсуждения; этот разговор был перемещен в чат . :-)
Я не могу восстановить вашу проблему. Я скопировал вставил ваш точный код в ethereum.github.io/browser-solidity/#version=0.3.6 и могу правильно выставить и получить права доступа (попробуйте, например, скопируйте вставить адрес самого контракта и обведите "", чтобы сделать убедитесь, что у вас есть действующий адрес).
Привет Себастьян! Мы уже решили этот вопрос. Решение описано в комментариях. К сожалению, @5chdn переместил все комментарии в чат, и теперь эта информация «де-факто» удалена, потому что никто не читает чаты :D Короче говоря: это ошибка в расширении Chrome, основанная на надежности браузера. Он не расшифровывает ответы серверов правильно. Последняя версия браузера-солидности делает это правильно.
@VolodymyrUsarskyy Пожалуйста, не размещайте свой ответ в сообщении или комментариях к вашему вопросу (или в чате: P). Совершенно нормально ответить на свой вопрос . Это поможет пользователям в будущем, которые могут столкнуться с теми же проблемами. Спасибо!
На самом деле, это не было реальным решением моей проблемы. Мы только что обнаружили, что расширение Chrome содержит ошибку :) Но я опубликовал всю историю в качестве ответа, чтобы все могли видеть, что было сделано. Спасибо!

Ответы (2)

Вы запускали свой код локально, в памяти (ВМ) или в блокчейне? Я попробовал ваш код, он работает (0 = false перед предоставлением доступа и 1 = true после)

введите описание изображения здесь

Попробуйте добавить событие в вашу функцию предоставления доступа;

  event ev(bool is_granted)
  function grantAccess(address assetAddr) {
        registry[assetAddr] = true;
        ev(registry[assetAddr]);
    }
Привет Бадр! Спасибо за ваш вклад. Проблема решена, решение описано в комментариях. К сожалению, комментарии были перемещены в чат :( Короче говоря: я думаю, что это ошибка в расширении Chrome, основанная на надежности браузера. Она не декодирует ответы серверов правильно. Последняя версия браузера-солидности делает это, как и ожидалось. Событие присутствует в исходном коде и был запущен, как и ожидалось, но расширение «Sol» продолжало показывать неправильные результаты (что действительно сбивало с толку).

Поскольку комментарии с описанием решения были перенесены в чат, и с тех пор уже два человека уделили время моему (решенному) вопросу, в качестве ответа напишу краткое изложение того, что произошло.

Вход:

  1. проблема наблюдалась в расширении Chrome "Sol", которое основано на надежности браузера.
  2. Я смог воспроизвести этот баг только при работе на приватном блокчейне. В режиме «локальный (виртуальный) блокчейн» все работало как положено.

Первоначально мой код содержал событие, которое срабатывало после вызова метода контракта grantAccess(...). Поскольку у меня никогда не было проблем с расширением «Sol» для Chrome, это создавало у меня ложное впечатление, что мои изменения были каким-то образом отменены после завершения выполнения метода.

После того, как @kobigurk протестировал мой код в последней версии браузера-солидности, стало очевидно, что проблема кроется в хромовом расширении "Sol", а не в самом контракте. По какой-то причине расширение "Sol" не может правильно декодировать ответ, полученный от сервера, и постоянно показывает возвращаемое значение по умолчанию ("false" для типа bool, "0" для uint). Я тестировал тот же контракт, но с «uint» в качестве возвращаемого типа из метода «grantAccess» и всегда получал «0». Это означает, что последний байт каким-то образом игнорируется.

Итак, решение простое: клонируйте последний исходный код «browser-solidity» и используйте его вместо chrome-расширения «Sol».

Спасибо всем, кто потратил время, пытаясь мне помочь!