Kann ein Vertrag auf den Speicher eines anderen Vertrags zugreifen?

Ich habe einen Vertrag mit zahlreichen komplexen Strukturen. Kann ein zweiter Vertrag diese Daten direkt durchlaufen?

Ich kann öffentliche Accessor/Getter-Methoden nicht wirklich verwenden, da es nicht möglich ist, Strukturen extern zu verwenden, also müsste ich die Datenstruktur glätten (wahrscheinlich auch teure Kopien davon machen).

Antworten (2)

Ein Vertrag kann nicht direkt auf den Speicher eines anderen Vertrags zugreifen.

Bei gegebenen Verträgen C1 und C2 kann C1 nur auf den Speicher von C2 zugreifen, indem eine Methode auf C2 aufgerufen wird, die Daten aus dem Speicher von C2 zurückgibt.

Da Sie C2 schreiben, können Sie von C1 aus auf dessen Speicher zugreifen und Fortschritte machen. Eine spezifischere Frage kann helfen, eine spezifischere Antwort zum Entwerfen Ihrer Verträge (Strukturen, Abflachen, Kopien ...) zu geben.


Im Zusammenhang damit gibt es drei Dinge, auf die ein Vertrag von einem anderen Vertrag aus zugreifen kann: Guthaben, Code, Codegröße .

Die zugrunde liegenden Mechanismen dafür sind die folgenden EVM-Opcodes aus dem Yellow Paper :

BALANCE: Guthaben des angegebenen Kontos erhalten

EXTCODECOPY: Code eines Kontos in den Speicher kopieren.

EXTCODESIZE: Holen Sie sich die Größe des Codes eines Kontos.

Laut Pauls Kommentar address.balancefunktioniert Solidity.

Minuspunkt: Sie können auf das Guthaben eines anderen Vertrags zugreifen. address.balance funktioniert AFAICT.
Upvoted, danke für die Erinnerung und ich werde die Antwort aktualisieren, da es auch EXTCODECOPY gibt ...
@eth Was ist, wenn der zweite Vertrag eine Fortsetzung des ersten Vertrags ist, dh ` contract A{ struct egStruct{ uint number; bool value; //.... } mapping (uint => egStruct) structMapping; //...code... } contract b is A { //...code }In diesem Fall ist es auch nicht möglich, auf eine Zuordnung zuzugreifen (die nicht öffentlich ist). Eigentlich wäre meine spezielle Frage: Wenn ich in diesem Fall über die Zuordnung von Vertrag A von Vertrag b auf die Struktur zugreifen möchte, kann ich das dann tun? (Ich habe es versucht und bekomme für alle leere Werte)
@Rajat Schreiben Sie einen Accessor hinein Aund Sie können ihn möglicherweise wie baufrufen super.nameOfAccessor(). Dies würde sich vom direkten bZugriff auf den Speicher unterscheiden.A

Technisch gesehen müssen alle für jeden Vertrag verfügbaren Daten öffentlich verfügbar sein, da jeder einen Knoten betreiben und die gesamte Vertragslaufzeit reproduzieren kann. Das bedeutet, dass es für einen Vertrag durchaus möglich ist, auf die internen Daten eines anderen zuzugreifen, auch wenn es keine eingebaute Möglichkeit dafür gibt.

Die erste Antwort, die mir in den Sinn kommt, ist, einen Orakeldienst mit einer exponierten Methode zu erstellen, die Sie aufrufen können, die die Vertrags-ID und die gewünschten Daten akzeptiert, die Blockchain erneut ausführt oder liest, um sie zu erhalten, und sie an den Aufrufer zurückgibt.

Ich weiß nicht, ob jemand so etwas schon erstellt hat, aber wenn es für Sie von entscheidender Bedeutung ist, die Daten eines anderen Vertrags lesen zu können, könnten Sie es sicherlich tun.

TL;DR Ja, das können Sie, aber Sie müssen einen separaten Orakeldienst erstellen, um dies für Sie zu tun, da es keine integrierte Methode gibt, die dies zulässt.