Der Unterschied zwischen Vertragsadresse und Wallet-Adresse

Haftungsausschluss: Dies ist eine ziemlich lange Frage.

Nach meinem Verständnis sind Vertragsadresse und Brieftaschenadresse zwei grundlegend unterschiedliche Konzepte, wobei die einzige Gemeinsamkeit darin besteht, dass sie beide als hexadezimale Darstellung einer 160-Bit-Zahl angegeben werden.

Der Unterschied ist nachfolgend beschrieben:

Wenn ein Vertrag bereitgestellt wird, wird er einer eindeutigen Adresse zugewiesen, dh kein anderer Vertrag in der Kette kann dieser Adresse zugewiesen werden.

Nehmen Sie außerdem an, dass der Vertrag Zustandsvariablen (global) mit einer Gesamtgröße von X Bytes enthält (einschließlich der vom Solidity-Compiler hinzugefügten Auffüllung).

Wenn ein Vertrag das nächste Mal in der Kette bereitgestellt wird, wird er notwendigerweise an der Adresse des vorherigen Vertrags + X oder höher zugewiesen.

Jeder Vertrag belegt also „echten“ Speicher.

Eine Wallet-Adresse hingegen ist „flach“.

Es speichert keine Daten, sodass zwei Wallets technisch gesehen zwei aufeinanderfolgende Adressen haben können.

Während also die Zustandsvariablen eines Vertrags "direkt nach" der Adresse des Vertrags zugewiesen werden, wird das Geld, das eine Brieftasche enthält, nicht "direkt nach" der Adresse der Brieftasche zugewiesen, und tatsächlich wird es überhaupt nicht zugewiesen.

Stattdessen wird das Geld, das ein Wallet enthält, in einem oder mehreren ERC20-Verträgen der Wallet-Adresse zugeordnet.

Angenommen, ich habe eine Brieftasche mit 20 CoffeeCoins an der Adresse 0x1234....

Dann bedeutet dies, dass auf der Kette ein ERC20-Vertrag bereitgestellt wird, der diese Informationen speichert:

contract CoffeeCoin is ERC20Basic {
    mapping(address => uint256) balances;
    ...
}

Und in diesem Vertrag, balances[0x1234...] = 20.

Eine geringfügige Auswirkung des oben beschriebenen Unterschieds:

Eine Wallet-Adresse da draußen kann gleich einer Vertragsadresse da draußen sein.

Ich glaube, dass im Fall von Blockchain das Wort Adresse wahrscheinlich besser geeignet ist, um neben Vertrag als neben Brieftasche verwendet zu werden (während die Verwendung für beide zunächst diese Verwirrung schafft).

Eine Wallet-Adresse ist eigentlich nichts anderes als ein öffentlicher Schlüssel.

Liege ich mit jeder der oben gemachten Behauptungen richtig?

Ist mein Verständnis des Unterschieds zwischen Vertragsadresse und Wallet-Adresse richtig?

Ich freue mich über jeden konstruktiven Kommentar.

Danke dir.

Welches sind die nicht vertragsbasierte Eth Wallet oder App, die eine nicht vertragsbasierte Wallet haben. In Blockchain ist eth Wallet vertragsbasierte Wallet oder nicht vertragsbasierte Wallet?

Antworten (2)

Eine Kontoadresse – entweder ein externes Konto (das sogenannte Wallet) oder ein Vertragskonto – ist nicht dasselbe wie eine Speicheradresse. Es ist nicht möglich zu wissen, was bei "Vertragsadresse + X" vorhanden ist, da Kontoadressen keine Zuordnung zu einem zusammenhängenden Stückspeicher sind.

Sehen Sie sich als Einführung das Gesamtbild (wörtlich) hier an: https://ethereum.stackexchange.com/a/6413/52

Eine Adresse fungiert als Schlüssel zum Zustandsversuch der Blockchain. Die Blattknoten dieses Tries sind Kontodatenstrukturen. Die Datenstruktur enthält:

  • eine Nonce
  • ein Gleichgewicht
  • eine Speicherwurzel
  • ein Codehash

Nach meinem Verständnis sind Vertragsadresse und Brieftaschenadresse zwei grundlegend unterschiedliche Konzepte.

Die Adressen liefern nur einen Schlüssel zum Status-Trie, also verhalten sie sich auf die gleiche Weise und sollten als gleich betrachtet werden.

Der Hauptunterschied besteht darin, dass die Kontodatenstruktur für einen Vertrag einen Eintrag für codehash enthält , was bedeutet, dass ausführbarer Code vorhanden ist, der ausgeführt werden kann. Für ein externes Konto gibt es nur einen Saldo und eine Nonce.

Der Speicherzustand des Vertrags – dh seine variablen Zustände usw. – wird in einem anderen Trie gespeichert, wobei die Wurzel dieses Tries die Speicherwurzel ist, die in der zuvor erwähnten Kontodatenstruktur zu finden ist. Dieser Versuch ist eine Schlüssel:Wert-Zuordnung und ist wahrscheinlich das, woran Sie denken, wenn Sie "Vertragsadresse + X" erwähnen. Ja, wenn Änderungen am Speicher des Vertrages vorgenommen werden, wird in diesem Trie weiterer Speicher benötigt. Es ist nur so, dass wir uns in der Organisationshierarchie weiter nach unten bewegt haben, weg von der anfänglichen Verwendung der Adresse als primäres Mittel zur Identifizierung eines Kontos. Dies sind zwei verschiedene Adressräume.

Eine Wallet-Adresse da draußen kann gleich einer Vertragsadresse da draußen sein.

Das kann nicht passieren. An einer bestimmten (Konto-)Adresse in der Kette kann nur ein Konto existieren. (Was passieren kann , ist, dass viele private Schlüssel derselben Adresse zugeordnet werden können, aber das ist orthogonal zu dem, was Sie fragen.)

Eine Wallet-Adresse ist eigentlich nichts anderes als ein öffentlicher Schlüssel.

Er wird aus den letzten 20 Bytes des keccak256()Hashs des öffentlichen Schlüssels abgeleitet.

Siehe: Wie werden Ethereum-Adressen generiert?

Vielen Dank für die sehr ausführliche Antwort. Ich sehe jetzt, dass viele der Behauptungen, die ich aufgestellt habe, und das Bild, das ich dargestellt habe, falsch waren, weil ich Verträge auf die "traditionelle" Art betrachtet habe, ausführbare Bilder, Speicherplatzlayout usw. zu betrachten. Ich vermute das Auf der Implementierungsebene mag einiges davon tatsächlich korrekt sein, aber wie Sie sagten - ich habe versucht, Dinge auf einer höheren Ebene darzustellen, und auf dieser Ebene ist diese Art der Darstellung falsch. Danke dir!

In Javascript,

EOA (Wallet-Adresse):'0x' + keccak256(publicKey).slice(-40)

Wie oben kann die Brieftaschenadresse durch einen öffentlichen Schlüssel erreicht werden. 1) hash es mit keccak256. 2) Slice ganz rechts 20 Bytes (40 Wörter). 3) Fügen Sie ein '0x'-Präfix hinzu

Vertragsadresse:'0x' + keccak256(rlp.encode([sender, nonce])).toString('hex').slice(-40)

Wie oben kann die Vertragsadresse durch die Nonce des Absenders und die Adresse des Absenders erreicht werden. 1) Absenderadresse und Absender-Nonce mit rlp verschlüsseln. 2) hash es mit keccak256. 3) Schneiden Sie die 20 Bytes (40 Wörter) ganz rechts ab. 4) Fügen Sie ein '0x-Präfix hinzu.

Sie können auf dieser Seite https://blockchains.tools/contractAddress?l=ETH überprüfen, ob Sie selbst eine Vertragsadresse generiert haben

Sie können auch selbst überprüfen, wie Sie EOA aus einem öffentlichen Schlüssel generieren.

1) Holen Sie sich einen öffentlichen Schlüssel von dieser Seite, https://blockchains.tools/key?l=ETH 2) Fügen Sie den öffentlichen Schlüssel in die keccak256-Eingabe ein. https://blockchains.tools/keccak256?l=GENERAL 3) Überprüfen Sie, ob die 20 Bytes ganz rechts (40 Wörter) mit der in Schritt 1 generierten Adresse identisch sind

:)

Sieht so aus, als wären die Links tot :/ Ansonsten danke, dass du das gepostet hast.