la asignación de msg.sender no parece funcionar

La variable de estado es esta:mapping(address=>uint) public userVotes;

ahora tengo una función:

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

la última línea es un evento. Entonces, lo que sucede aquí es que después de ejecutar esta función, coloco una dirección del ejecutor en un mapeo como clave y valor cuando pasó. Luego lo registro.

Tengo otra función donde uso este usuarioVotes

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] );
    }

mire la línea de retorno el último parámetro, userVotes[msg.sender]. Desafortunadamente, siempre devuelve 0. No sé por qué lo hace. Revisé el registro después de ejecutar la primera función y no vi 0. Solo vi el valor real. Por favor ayuda . Si llamo a la función getPresident en remix, devuelve el valor real y no 0.

¿Ha intentado simplificar su código para aislar las partes que cree que están rotas? Intente construir un ejemplo mínimo, completo y verificable . En general, estás usando msg.sendermuy bien en estas situaciones por lo que puedo ver.
La pregunta es por qué el mismo código funciona en remix.
¿Comparado con que? No creo que hayas mencionado en qué plataforma está fallando este código...
Estoy usando web3 para hacer las llamadas a contrato. Cuando implemento el contrato y trato de probarlo usando remix, funciona en remix, pero cuando llamo a la misma función getPresident indicada anteriormente, userVotes[msg.sender] siempre es 0.
Agregue un enlace a la implementación de su contrato. ¿Sabes si tus transacciones se minaron con éxito?
Entonces getPresidentparece funcionar. Lo que no funciona es su código JavaScript que lo llama. No has compartido ese código, pero mi suposición de tiro en la oscuridad es que no estás pasando una fromdirección.
Creo que lo has adivinado bien, amigo mío. No estoy pasando de. Es una función gratuita y la estoy usando como "llamada()". ¿Estas funciones de vista también se pueden pasar "desde: cuenta" desde web3?
Debe publicar una respuesta a su propia pregunta para ayudar a otros que puedan tener un problema similar.

Respuestas (1)

Cualquiera puede necesitarlo.

A veces, puede olvidar pasar una cuenta cuando en realidad está llamando a un método gratuito que solo está devolviendo algo. En mi caso, estaba llamando a una función gratuita (sin gas) y como no usé la transacción de envío, me olvidé de pasar el nombre de la cuenta. Puede pasar la cuenta a la función de llamada como lo haría con la función de envío.