сопоставление для msg.sender, похоже, не работает

переменная состояния такова:mapping(address=>uint) public userVotes;

теперь у меня есть функция:

function votePresident(uint _id) external {
        presidents[_id-1].voteCount++;
        userVotes[msg.sender] = _id;
        Voter(msg.sender, _id, userVotes[msg.sender]);
    }

последняя строка - событие. Итак, что здесь происходит, так это то, что после выполнения этой функции я помещаю адрес исполнителя в сопоставление в качестве ключа и значения, которое он передал. Затем я регистрирую это.

У меня есть другая функция, где я использую этот userVotes

function getPresident(uint _index) public view returns (uint, string, uint, string, uint) {
        President storage president = presidents[_index];
   return (president.voteCount, president.hashImage, president.id, president.name, userVotes[msg.sender] );
    }

посмотри в строке возврата последний параметр, userVotes[msg.sender]т.к. К сожалению, он всегда возвращает 0. Я не знаю, почему он это делает. Я проверил журнал после выполнения первой функции и не увидел 0. Я просто увидел фактическое значение. Пожалуйста помоги . Если я вызываю функцию getPresident в remix, она возвращает фактическое значение, а не 0.

Пытались ли вы упростить свой код, чтобы изолировать части, которые, по вашему мнению, не работают? Попробуйте создать минимальный, полный и проверяемый пример . В общем, вы используете msg.senderпросто отлично в этих ситуациях, насколько я вижу.
Вопрос в том, почему на remix работает один и тот же код.
По сравнению с чем? Я не думаю, что вы упомянули, на какой платформе этот код не работает...
Я использую web3 для звонков на контракт. Когда я развертываю контракт и пытаюсь протестировать его с помощью ремикса, он работает с ремиксом, но когда я вызываю ту же самую функцию getPresident, указанную выше, userVotes[msg.sender] всегда равен 0.
Добавьте ссылку на развертывание вашего контракта. Знаете ли вы, успешно ли добыты ваши транзакции?
Так getPresidentвроде работает. Что не работает, так это ваш код JavaScript, который его вызывает. Вы не поделились этим кодом, но я предполагаю, что вы не передаете fromадрес.
Я думаю, ты угадываешь это правильно, мой друг. Я не перехожу от. Это бесплатная функция, и я использую ее как «вызов()». могут ли эти функции просмотра также передаваться "из: учетной записи" из web3?
Вы должны опубликовать ответ на свой вопрос, чтобы помочь другим, которые могут столкнуться с подобной проблемой.

Ответы (1)

Кому-то это может понадобиться.

Иногда вы можете забыть передать учетную запись, когда на самом деле вызываете бесплатный метод, который просто что-то возвращает. В моем случае я вызывал бесплатную (без газа) функцию, и поскольку я не использовал транзакцию отправки, я забыл передать имя учетной записи. Вы можете передать учетную запись в функцию вызова так же, как и в функцию отправки.