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 SeeMyAddAndETHVar
uso es ver mi dirección y cantidad de ETH
y SeeSheEthVar
es 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 error
¿Puedo preguntar dónde está mi problema? ¡Gracias por responder ~!
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.
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"
}
no me gusta decirte jeje
btc4cash
no me gusta decirte jeje
btc4cash
btc4cash
no me gusta decirte jeje
btc4cash
btc4cash
no me gusta decirte jeje
btc4cash
no me gusta decirte jeje
btc4cash
no me gusta decirte jeje
btc4cash
btc4cash
btc4cash
no me gusta decirte jeje