solidity - forever no puede devolver el saldo de msg.sender

este es mi codigo de contrato

pragma solidity ^0.4.4;
contract IamHongKongTokenBack_00{ 

  // 現在我錢包的地址+Eth量
function SeeMyAddAndETHVar() public constant returns (address, uint) {
    address _myadd = msg.sender;
    return ( _myadd,  _myadd.balance);
}   

// 查看其他地址的Eth量
function SeeSheEthVar(address _InputAdd) public constant returns (address, uint) {
    address _SheAc = _InputAdd;
    return (_SheAc, _SheAc.balance);
}   


}

el SeeMyAddAndETHVaruso es ver mi dirección y cantidad de ETH

y SeeSheEthVares usar la dirección de entrada y ver esta dirección y la cantidad de ETH

Si uso 0X123... la dirección va a este contrato ahora uso la dirección de entrada SeeSheEthVar 0X789... puedo ver la dirección correcta y la cantidad correcta de ETH

pero use SeeMyAddAndETHVar, veré la dirección correcta y la cantidad de ETH del error

tan extraño Cuando cambio uso 0X789... dirección vaya a este contrato puedo ver 0X123... dirección correcta y cantidad correcta de ETH pero 0X789... la dirección es la cantidad de ETH de erroringrese la descripción de la imagen aquí

¿Puedo preguntar dónde está mi problema? ¡Gracias por responder ~!

Respuestas (2)

EDITAR: caso de uso de trabajo de msg.sender.balance en un valor de llamada. El usuario paga gaz (enviando así un tx) para almacenar datos en el almacenamiento del contrato, luego puede recuperar libremente el último valor guardado para su cuenta. Me devolvió el saldo correcto incluso con metamask, lo que demuestra el problema que estoy tratando de explicarle, que necesita enviar un tx para usar msg.sender.balance (con metamask seguro, tal vez otro proveedor funcione):

pragma solidity ^0.4.4;
contract IamHongKongTokenBack_00{ 


//balance stored on call of saveBalance
mapping(address => uint256)  lastBalance;

function saveBalance() public  {
    lastBalance[msg.sender] = msg.sender.balance;
}   


function fetchBalance(address _address) constant public returns (uint256) {
    return lastBalance[_address];
}   


}

Usar msg.sender.balance e intentar devolverlo en una función constante parece fallar.

Yo mismo probé con remix y metamask y no funciona como debería.

Pero si usa una función que cuesta tarifas (llamada) y digamos que almacena el mensaje.remitente.saldo en un evento o lo requiere sobre una suma, funcionará porque se suministró un objeto tx.

Mira esto:

devolver msg.sender.balance no actúa como se esperaba

https://github.com/ethereum/solidity/issues/2325

https://github.com/ethereum/go-ethereum/issues/14989

Ejemplo de uso que me funciona en una función "llamable" (que cuesta gaz ejecutar, modificar el almacenamiento de mi contrato):

require(msg.sender.balance >= 0.01 ether);

Esto funciona para mí, lo que significa que si tengo> = 0.01 eth en mi cuenta llamando a la función que se ejecuta, si no, se revierte y no se ejecuta. Lo que significa que "msg.sender.balance" realmente funciona como debería y contiene allí el saldo correcto del remitente.

Resultado de su código usando metamask como proveedor web3:

0: address: 0xc544[...]
1: uint256: 115792089237316195423570985008687907853269984665640564039457434007913129639935

Mi saldo real es 4.424 ETH, por lo que se supone que devuelve 44240000000000000000 WEI, no esta cadena aleatoria.

(llamar) ¿necesita gasolina?
Sí. Llamar como una constante con metamask no devuelve el saldo correcto, pero como dije, usar una función invocable y usarla como requisito o almacenarla en un evento funciona.
gracias comentarios!! ¿Tal vez podrías decirme un código específico? lo siento porque soy un principiante no se como hacer esto
¡Acabo de hacerlo en mi respuesta!
Marque mi respuesta como correcta si le hice entender correctamente el problema con msg.sender.balance, si no, ¡pregúnteme qué parte no entiende! :)
muchas gracias ~ pero solo puedo devolver bool, lo siento mucho, ¿podrías decirme dónde está mi error?
No es un error. Es que no puede devolver el saldo de la billetera usando una función constante.
¿Revisaste los enlaces?
borré la constante pero es un error
No puede devolver el saldo usando metamask y una constante, está devolviendo datos incorrectos. Incluso si elimina la palabra clave constante, no cambia la lógica de la función. No está enviando ninguna transacción llamándolo, por lo que crea un mal comportamiento de msg.sender.balance con metamask. Por favor, lea en los enlaces que he puesto
Gracias. Quiero mirar de nuevo. ¿Hay alguna forma de ver el saldo en msg.sender?
Puede hacerlo en una función invocable y almacenar en un evento, podrá verlo obteniendo el evento. Como dije, también se puede usar como condición. Simplemente no olvide que debe ser una llamada donde se envíe tx real. Esto es lo que entiendo de lo que he leído y estaba teniendo el mismo problema que ves.
muchas gracias ~ pero todavía no puedo obtener respuestas más específicas. Ya busqué en Google "llamable", pero no puedo ver las respuestas de todos modos. Muchas gracias.
Déjame darte un ejemplo ok
acaba de editar y poner un código válido. Probé y funciona como debería
Dime si lo tienes :)
muchas gracias de nuevo si es un trabajo aunque no le puede gustar la billetera normal pero es valioso~!!!

Honestamente, no entiendo cuál es la pregunta, pero traté de descifrarla y parece que tienes problemas para obtener el saldo en caso de que llames a la función SeeMyAddAndETHVar. De todas formas he probado tu contrato en remix y el comportamiento es correcto

call to IamHongKongTokenBack_00.SeeMyAddAndETHVar

{
    "0": "address: 0x14723a09acff6d2a60dcdf7aa4aff308fddc160c",
    "1": "uint256: 99999999999997000000"
}
call to IamHongKongTokenBack_00.SeeSheEthVar
{
    "0": "address: 0x14723a09acff6d2a60dcdf7aa4aff308fddc160c",
    "1": "uint256: 99999999999997000000"
}
gracias comentarios!! vi sus comentarios, así que pruebo en la red remix VM esto funciona, puede mostrar la cantidad correcta de ETH pero en la red privada y la red ethernet no funciona
¿Está utilizando metamask como proveedor? @mirg
No, no lo eres, agregué el resultado usando metamask como proveedor web3
El problema con este código es que el comportamiento de msg.sender.balance no es correcto usando metamask y una función constante, como muestran mis enlaces. Pero aún se puede usar en una función invocable donde se gasta gas y se suministra TX real.