Wenn die Funktion eines Vertrags eine Funktion eines anderen Vertrags darin aufruft, ist die Adresse des Vertrags die msg.sender?

Beispielsweise verfügt ein Crowdsale-Vertrag über eine Funktion, die ein ERC20-Token namens „Token“ erstellt, wobei ein Token-Vertrag verwendet wird, der bereits weiter oben im bereitgestellten Code definiert ist. Der Konstruktor enthält

token = createTokenContract();

Und die Methode createTokenContract() enthält:

function createTokenContract() internal returns (TierToken) {
    return new ERC20Token();
}

Wenn es sich innerhalb einer kostenpflichtigen Funktion im Crowdsale befindet, ruft es jetzt eine Funktion von "Token" in meinem Crowdsale-Vertrag auf, wie z

token.transfer(beneficiary, tokenAmount);

Wer ist innerhalb dieses Anrufs der msg.sender? Die Übertragungsfunktion stammt aus der OpenZeppelins-Implementierung und enthält daher:

    function transfer(address _to, uint256 _value) public returns (bool success) {
      require(_to != address(0)); //not sending to burn address
      require(_value <= balances[msg.sender]); // If the sender has sufficient funds to send
      require(_value>0);// and the amount is not zero or negative

      // SafeMath.sub will throw if there is not enough balance.
      balances[msg.sender] = balances[msg.sender].sub(_value);
      balances[_to] = balances[_to].add(_value);
      Transfer(msg.sender, _to, _value);
      return true;
   }

Ist dieser Absender bei diesen Kontostandsprüfungen und -übertragungen, bei denen balances[msg.sender] verwendet wird, jetzt die Adresse des Crowdsale-Vertrags, der den Aufruf dieser Funktion enthielt? Oder ist der Absender der Benutzer, der den Ether an den Vertrag gesendet hat (der dann die Token-Funktion aufgerufen hat)?

Dies mag einfach sein, aber ich kann dies in den Dokumenten in Bezug auf msg.sender in Bezug auf Verträge, die Funktionen anderer Verträge aufrufen, nicht gut erklärt finden.

Danke für jede Hilfe.

Antworten (1)

Wenn die Funktion eines Vertrags eine Funktion eines anderen Vertrags darin aufruft, ist die Adresse des Vertrags die msg.sender?

Jawohl.

tx.originist das externe Konto, das die Transaktion gesendet hat.

Aus Solidity-Dokumenten:

msg.sender (Adresse): Absender der Nachricht (aktueller Anruf)

tx.origin (Adresse): Absender der Transaktion (vollständige Aufrufkette)