вернуть msg.sender.balance не так, как ожидалось

Я использую MetaMask для подключения к Rinkeby и развертываю контракты через Remix. Когда я вызываю функцию returnenderbalance, она возвращает

115792089237316195423570985008687907853269984665640564039456084007913129639935

а не мой баланс в Вэй. Код ниже:

pragma solidity ^0.4.11;

contract returnbalance{
    function returnsenderbalance() constant returns (uint){
        return msg.sender.balance;  
    }
}
Можно подтвердить поведение с развернутым здесь контрактом. Не удалось найти версию Solidity, в которой этого не происходит, хотя в виртуальной машине Javascript он работает должным образом. в настоящее время просматривает байт-код
function eventSenderBalance() {SenderBalance(msg.sender, msg.sender.balance); }регистрирует правильный баланс.
Кто-нибудь хочет присоединиться и описать, как это было в конечном итоге решено? Я думаю о компиляторе и мне любопытны подробности.

Ответы (2)

Это связано с:

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

Является константой в Geth( common/math/big.go)

Чтобы дать больше контекста, проблема не в контракте, а в коде go-ethereum (контракт работает как положено). Проблема с github , о которой сообщалось. Коммит, где это было исправлено, находится здесь . Это изменение затронуло другой вариант использования .

этот код работает нормально, попробуйте это:

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

contract returnbalance{
    function returnsenderbalance() view public returns(uint){
        return msg.sender.balance;  
    }
}
В исходном контракте не было ошибок. Это была ошибка/особенность в коде geth.