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

Estoy usando MetaMask para conectarme a Rinkeby y estoy implementando los contratos a través de Remix. Cuando llamo a la función returnenderbalance, devuelve

115792089237316195423570985008687907853269984665640564039456084007913129639935

en lugar de mi saldo en Wei. El código está abajo:

pragma solidity ^0.4.11;

contract returnbalance{
    function returnsenderbalance() constant returns (uint){
        return msg.sender.balance;  
    }
}
Puede confirmar el comportamiento con el contrato implementado aquí. No se pudo encontrar una versión de solidez donde no suceda, aunque funciona como se esperaba en la VM de Javascript. actualmente mirando a través del código de bytes
function eventSenderBalance() {SenderBalance(msg.sender, msg.sender.balance); }registra el saldo correcto.
¿Alguien quiere intervenir y describir cómo se resolvió finalmente esto? Estoy pensando en el compilador y tengo curiosidad por los detalles.

Respuestas (2)

Esto está relacionado con:

eth/api_backend.go

func (b *EthAPIBackend) GetEVM(ctx context.Context, msg core.Message, state *state.StateDB, header *types.Header, vmCfg vm.Config) (*vm.EVM, func() error, error) {
===> state.SetBalance(msg.From(), math.MaxBig256)
vmError := func() error { return nil }
context := core.NewEVMContext(msg, header, b.eth.BlockChain(), nil)
return vm.NewEVM(context, state, b.eth.chainConfig, vmCfg), vmError, nil
}

math.MaxBig256 == 115792089237316195423570985008687907853269984665640564039455084007913129639935

Es una constante en Geth( common/math/big.go)

Para dar más contexto, el problema no está en el contrato, sino en el código go-ethereum (el contrato funciona como se esperaba). El problema de github donde se informó. El compromiso donde se arregló está aquí . Ese cambio afectó a otro caso de uso .

este código funciona bien, prueba esto:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

contract returnbalance{
    function returnsenderbalance() view public returns(uint){
        return msg.sender.balance;  
    }
}
El contrato original no tenía un error. Era un error/función en el código geth.