Kann Ether nicht in einen Vertrag einzahlen

Ich habe versucht, aus einigen Ressourcen einen Basisvertrag aufzubauen, aber es ist mir nicht gelungen, den Äther in diesen Vertrag einzuzahlen. Im Folgenden ist mein Code, ist es richtig, dass "msg.value" und "address(this).balance" jederzeit 0 sind? Wenn ja, wie kann ich Ether an eine andere Adresse senden? Wenn nicht, wie kann man Geld mit der richtigen Methode einzahlen?

// can get balance
function getOnesBalance(address addr) public view returns (uint){
    return addr.balance;
}

// can get balance
function getMyBalance() public view returns (uint){
    return msg.sender.balance;
}

// 0
function getMyBalance2() public view returns (uint){
    return msg.value;
}
// 0
function getMyBalance3() public view returns (uint){
    return address(this).balance;
}

function deposit(uint _money) public payable {}

function getContractAddr() public view returns (address){
    return msg.sender;
}

function() payable {}
Wie übertragen Sie Ether auf den Vertrag? Vermutlich rufen Sie entweder depositoder die Fallback-Funktion auf. Machst du das per Code? Wenn ja, können Sie diesen Code teilen? Wenn nicht, können Sie uns sagen, wie Sie den Äther übertragen?
getContractAddr()falsch ist, wird die Adresse desjenigen zurückgegeben, der die Funktion aufgerufen hat.

Antworten (1)

ist es richtig, dass "msg.value" und "address(this).balance" jederzeit 0 sind?

Ja, msg.valuehängt von jeder Transaktion ab. Während address(this).balance das an der Vertragsadresse gespeicherte Guthaben zurückgibt.

msg.valueist die Anzahl der mit der Transaktion gesendeten Wei.

Der unten angegebene Vertrag ermöglicht es Ihnen, Ether darauf einzuzahlen und dann die Informationen zu erhalten, wer wie viel eingezahlt hat:

contract MyContract {
    mapping(address => uint256) balances;

    function getOnesBalance(address addr) public view returns (uint){
        return balances[addr];
    }
    function getMyBalance() public view returns (uint){
        return balances[msg.sender];
    }
    function getContractBalance() public view returns (uint){
        return address(this).balance;
    }
    function getContractAddress() public view returns (address){
        return address(this)
    }
    function deposit() public payable {balances[msg.sender]+=msg.value;}
    function() public payable {deposit();}
}

Folgende Korrekturen wurden vorgenommen:

  • deposit: Diese Funktion wird verwendet, um Ether zum Vertrag zu senden
  • function() public payable {deposit();}: Dies ist die Fallback-Funktion, die immer dann ausgeführt wird, wenn der Vertrag Ether erhält.
  • balances[]: Sie müssen den von jemandem hinterlegten Ether in einer anderen Variablen speichern. Hier speichern wir in der benannten Zuordnungbalances
  • getMyBalance: Diese Funktion gibt die Menge an Ether zurück, die von der Person hinterlegt wurde, die diese Funktion aufruft.
  • getContractAddress: Die Vertragsadresse wird mit abgerufen address(this).