return msg.sender.balance verhält sich nicht wie erwartet

Ich verwende MetaMask, um eine Verbindung zu Rinkeby herzustellen, und ich stelle die Verträge über Remix bereit. Wenn ich die Funktion returnsenderbalance aufrufe, kehrt sie zurück

115792089237316195423570985008687907853269984665640564039456084007913129639935

eher als mein Guthaben in Wei. Der Code ist unten:

pragma solidity ^0.4.11;

contract returnbalance{
    function returnsenderbalance() constant returns (uint){
        return msg.sender.balance;  
    }
}
Kann das Verhalten mit dem hier bereitgestellten Vertrag bestätigen. Es konnte keine Solidity-Version gefunden werden, bei der dies nicht der Fall ist, obwohl es in der Javascript-VM wie erwartet funktioniert. Durchsucht gerade den Bytecode
function eventSenderBalance() {SenderBalance(msg.sender, msg.sender.balance); }protokolliert den korrekten Saldo.
Möchte sich jemand einmischen und beschreiben, wie dies letztendlich gelöst wurde? Ich denke Compiler und neugierig auf die Details.

Antworten (2)

Dies hängt zusammen mit:

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

Ist eine Konstante in Geth (common/math/big.go)

Um mehr Kontext zu geben, liegt das Problem nicht im Vertrag, sondern im Go-Ethereum-Code (der Vertrag funktioniert wie erwartet). Das GitHub-Problem , wo es gemeldet wurde. Der Commit, in dem es behoben wurde, ist hier . Diese Änderung betraf einen anderen Anwendungsfall .

Dieser Code funktioniert gut, versuchen Sie Folgendes:

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

contract returnbalance{
    function returnsenderbalance() view public returns(uint){
        return msg.sender.balance;  
    }
}
Der ursprüngliche Vertrag hatte keinen Fehler. Es war ein Bug/Feature im Geth-Code.