Vertrag zwischen erben

Hinweis: Solidität ignoriert Basisverträge, die bereits durchsucht wurden. Bei der Vererbung auf mehreren Ebenen werden mehr als eine Eltern-Kind-Beziehung generiert. Sie können die Argumente in der Vererbungsliste direkt angeben: Verträge in Solidität ähneln Klassen in objektorientierten Sprachen. Sie enthalten persistente Daten in Zustandsvariablen und Funktionen, die diese Variablen ändern können. Wenn Sie eine Funktion in einem anderen Vertrag (Instanz) aufrufen, wird ein EVM-Funktionsaufruf ausgeführt und somit der Kontext so umgeschaltet, dass auf Zustandsvariablen nicht zugegriffen werden kann. Intern werden Konstruktorargumente ABI-codiert nach dem Code des Vertrags selbst übergeben, aber Sie müssen sich nicht darum kümmern, wenn Sie web3.js verwenden. Im folgenden Code gibt Solidity den Fehler “Linearisierung des Vererbungsdiagramms unmöglich”. Wenn ein Vertrag von mehreren Verträgen erbt, wird nur ein einzelner Vertrag auf der Blockchain erstellt, und der Code aus allen Basisverträgen wird in den erstellten Vertrag kopiert. Eine weitere vereinfachende Möglichkeit, dies zu erklären, ist, dass, wenn eine Funktion aufgerufen wird, die mehrmals in verschiedenen Verträgen definiert wird, die angegebenen Basen von rechts nach links (von links nach rechts in Python) in einer Tiefen-ersten Art und Weise durchsucht werden, die bei der ersten Übereinstimmung angehalten wird. Wenn ein Basisvertrag bereits durchsucht wurde, wird er übersprungen. Ein Vertrag ohne zahlbare Fallback-Funktion kann Ether als Empfänger einer Coinbase-Transaktion (auch Miner-Block-Belohnung genannt) oder als Ziel einer Selbstzerstörung erhalten. Verträge können “von außen” über Ethereum-Transaktionen oder aus Solidity-Verträgen erstellt werden. Bibliotheken ähneln Verträgen, aber ihr Zweck ist, dass sie nur einmal an einer bestimmten Adresse bereitgestellt werden und ihr Code mit der FUNKTION DELEGATECALL (CALLCODE until Homestead) der EVM wiederverwendet wird.

Das bedeutet, dass, wenn Bibliotheksfunktionen aufgerufen werden, ihr Code im Kontext des aufrufenden Vertrags ausgeführt wird, d.h. dies auf den aufrufenden Vertrag verweist, und insbesondere auf den Speicher aus dem aufrufenden Vertrag zugegriffen werden kann. Da eine Bibliothek ein isoliertes Stück Quellcode ist, kann sie nur dann auf Zustandsvariablen des aufrufenden Vertrags zugreifen, wenn sie explizit angegeben werden (andernfalls hätte sie keine Möglichkeit, sie zu benennen).