Solidität - kann das msg.sender-Guthaben nicht für immer zurückgeben

das ist mein Vertragscode

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);
}   


}

die SeeMyAddAndETHVarVerwendung siehe meine Adresse und ETH-Betrag

und SeeSheEthVarverwendet die Eingabeadresse und sieht diese Adresse und den ETH-Betrag

Wenn ich die Adresse 0X123 ... verwende, gehe jetzt zu diesem Vertrag. Ich verwende die SeeSheEthVar-Eingabeadresse 0X789 ... Ich kann die korrekte Adresse und den korrekten ETH-Betrag sehen

Wenn Sie jedoch SeeMyAddAndETHVar verwenden, wird die korrekte Adresse und der ETH-Fehlerbetrag angezeigt

so seltsam Wenn ich die Verwendung von 0X789 ändere ... Adresse gehe zu diesem Vertrag, kann ich 0X123 sehen ... korrekte Adresse und korrekter ETH-Betrag, aber 0X789 ... Adresse ist beides Fehler ETH-BetragGeben Sie hier die Bildbeschreibung ein

Darf ich fragen wo mein Problem liegt Danke für die Antwort~!!

Antworten (2)

BEARBEITEN: Funktionierender Anwendungsfall des msg.sender.balance auf einem Anrufwert. Der Benutzer zahlt gaz (und sendet damit ein tx), um Daten im Vertragsspeicher zu speichern, und kann dann den zuletzt gespeicherten Wert für sein Konto frei abrufen. Es gibt für mich sogar mit Metamask das richtige Gleichgewicht zurück, was das Problem beweist, das ich Ihnen zu erklären versuche, das Sie benötigen, um ein TX zu senden, um msg.sender.balance zu verwenden (mit Metamask sicher, vielleicht funktioniert es bei anderen Anbietern):

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];
}   


}

Die Verwendung von msg.sender.balance und der Versuch, es in einer konstanten Funktion zurückzugeben, scheint fehlerhaft zu sein.

Ich selbst habe es mit Remix und Metamask versucht und es funktioniert nicht so, wie es sollte.

Aber wenn Sie in einer kostenpflichtigen Funktion (Aufruf) verwenden und sagen wir, Sie speichern die msg.sender.balance in einem Ereignis oder benötigen sie über eine Summe, funktioniert es, weil ein tx-Objekt geliefert wurde.

Prüfe das:

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

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

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

Beispiel für die Verwendung, die für mich in einer "aufrufbaren" Funktion funktioniert (deren Ausführung gaz kostet, die Speicherung meines Vertrags ändern):

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

Dies funktioniert für mich, was bedeutet, wenn ich >= 0,01 eth in meinem Konto habe, das die Funktion aufruft, die es ausführt, wenn nicht, wird es zurückgesetzt und nicht ausgeführt. Was bedeutet, dass die "msg.sender.balance" wirklich so funktioniert, wie sie sollte und dort das korrekte Guthaben des Absenders enthält.

Ergebnis Ihres Codes mit Metamask als web3-Lieferant:

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

Mein tatsächlicher Kontostand beträgt 4,424 ETH, also sollte es 4424000000000000000 WEI zurückgeben, nicht diese zufällige Zeichenfolge.

(Anruf) Brauchen Sie ein Gas?
Jawohl. Das Aufrufen als Konstante mit Metamask gibt nicht das richtige Gleichgewicht zurück, aber wie gesagt, die Verwendung in einer aufrufbaren Funktion und die Verwendung als Anforderung oder das Speichern in einem Ereignis funktioniert.
danke kommentare!! Vielleicht kannst du mir einen bestimmten Code nennen? Es tut mir leid, weil ich ein Anfänger bin und nicht weiß, wie das geht
Gerade in meiner Antwort!
Bitte markieren Sie meine Antwort als richtig, wenn ich Sie das Problem mit msg.sender.balance richtig verstanden habe, wenn nicht, fragen Sie mich einfach, welchen Teil Sie nicht verstehen! :)
vielen Dank ~ aber ich kann nur bool zurückgeben. Es tut mir so leid, dass Sie mir sagen könnten, wo mein Fehler ist.
Es ist kein Fehler. Es ist so, dass Sie das Wallet-Guthaben nicht mit einer konstanten Funktion zurückgeben können.
Hast du die Links überprüft?
Ich habe die Konstante gelöscht, aber es ist ein Fehler
Sie können den Saldo nicht mit Metamask und einer Konstante zurückgeben, da dies nicht korrekte Daten zurückgibt. Selbst wenn Sie das Schlüsselwort Konstante entfernen, ändert es die Funktionslogik nicht. Sie senden keine Transaktion, die es aufruft, daher erzeugt es ein Fehlverhalten von msg.sender.balance mit Metamaske. Bitte lesen Sie in den Links, die ich gesetzt habe
Danke, ich möchte noch einmal nachsehen. Gibt es eine Möglichkeit, das Guthaben in msg.sender zu sehen?
Sie können dies in einer aufrufbaren Funktion tun und in einem Ereignis speichern, das Sie beim Abrufen des Ereignisses sehen können. Wie gesagt kann man auch als Bedingung verwenden. Vergessen Sie nur nicht, dass es sich um einen Anruf handeln muss, bei dem die eigentliche TX gesendet wird. Das verstehe ich aus dem, was ich gelesen habe, und ich hatte das gleiche Problem, wie Sie sehen.
vielen Dank ~ aber ich kann immer noch keine genaueren Antworten bekommen. Ich habe bereits das "Callable" gegoogelt, aber ich kann die Antworten sowieso nicht sehen. Vielen Dank für Ihren Kommentar
Lassen Sie mich Ihnen ein Beispiel geben, ok
gerade bearbeitet und einen gültigen Code eingegeben. Ich habe es getestet und es funktioniert wie es soll
Sag mir, ob du es verstanden hast :)
Nochmals vielen Dank ja, es ist Arbeit, obwohl es die normale Brieftasche nicht mögen kann, aber es ist wertvoll ~!!!

Ehrlich gesagt verstehe ich nicht, was die Frage ist, aber ich habe versucht, sie zu entschlüsseln, und es scheint, als hätten Sie Probleme, das Gleichgewicht zu finden, falls Sie die Funktion aufrufen SeeMyAddAndETHVar. Jedenfalls habe ich Ihren Vertrag auf Remix ausprobiert und das Verhalten ist korrekt

call to IamHongKongTokenBack_00.SeeMyAddAndETHVar

{
    "0": "address: 0x14723a09acff6d2a60dcdf7aa4aff308fddc160c",
    "1": "uint256: 99999999999997000000"
}
call to IamHongKongTokenBack_00.SeeSheEthVar
{
    "0": "address: 0x14723a09acff6d2a60dcdf7aa4aff308fddc160c",
    "1": "uint256: 99999999999997000000"
}
danke kommentare!! Ich habe Ihre Kommentare gesehen, also teste ich im Remix-VM-Netzwerk, dies ist Arbeit, kann den korrekten ETH-Betrag anzeigen, aber im privaten Netzwerk und im Ethernet-Netzwerk funktioniert es nicht
Verwenden Sie Metamask als Lieferant? @mirg
Nein, sind Sie nicht, ich habe das Ergebnis mit Metamask als Web3-Lieferant hinzugefügt
Das Problem mit diesem Code ist, dass das Verhalten von msg.sender.balance bei der Verwendung von Metamask und einer konstanten Funktion nicht korrekt ist, wie meine Links zeigen. Aber es kann immer noch in einer aufrufbaren Funktion verwendet werden, bei der Gas ausgegeben und tatsächlich TX geliefert wird.