Wie wir bei @Alchemy das absolut gas-effizienteste Smart-Konto in der Geschichte der Smart-Konten entwickelt und gestartet haben. 🕶️ Alles aus einer Idee, die etwa 3 Jahre alt ist. Damals ahnte ich nicht, dass dies den Nutzern enorme Geldsummen sparen würde.
Im Mai 2023 gab es diesen Hype auf Twitter über Proxys (z.B. ERC1967, Klone usw.) Die Leute hatten unveränderliche Variablen, aber sie wollten Proxys. Das war unmöglich zu machen – aber einige von uns nahmen die Herausforderung an. Das Problem war jedoch nicht die EVM. Es war, wie wir über Proxys dachten.
Also bauten wir es - es tauchten mehrere Versionen auf. Meine und @wighawag folgten beide dem gleichen Konzept - wir konnten einfach die unveränderlichen Elemente anhängen, indem wir das designierte Speicherstück in das Ende des zurückgegebenen Bytecodes bei der Konstruktion kopierten. Der eigentliche Code war ziemlich kurz und bündig.
(Du kannst hier meine alte Implementierung sehen, die ich vor 3 Jahren aus Spaß gebaut habe, lol: )
Es gab auch zwei Möglichkeiten, auf die unveränderlichen Argumente zur Laufzeit zuzugreifen. Die erste – meine Methode – war einfach, den Bytecode des Proxys ab einem konstanten Offset zu lesen. Einfach! Lade einfach die Unveränderlichen in den Speicher und dekodiere sie gemäß dem Schema, das du eingerichtet hast.
Die zweite war viel komplexer, aber etwas gaseffizienter und extrem interessant. Die Idee war, dass du die Unveränderlichen an jeden Aufruf anhängst, den der Proxy delegiert. Das führt zu günstigeren unveränderlichen Zugriffen auf Kosten der Komplexität und höheren Grundgaspreisen.
Interessanterweise hat Solady (die Bibliothek, die wir jetzt verwenden, benutze mein kleines Demo nicht in der Produktion, heh) ursprünglich den zweiten Ansatz gewählt! Aber jetzt haben wir uns alle auf Einfachheit geeinigt, ich kenne keine calldata-erweiternden Unveränderlichen in der Produktion, und Solady wählt denselben Ansatz, den ich verwendet habe.
Wie hängt das also mit Konten zusammen? Der grundlegendste und häufigste Anwendungsfall von Smart Accounts besteht darin, dass sie von einem anderen Unterzeichner "besessen" werden. Typischerweise würde man dies tun, indem man das Smart Account mit der Adresse des Eigentümers initialisiert. Aber mein Bruder onchain, es gibt einen besseren Weg.
Du hast es wahrscheinlich schon herausgefunden – wir fügen einfach die Adresse des Unterzeichners an den Bytecode des Proxys an. Einfach. Dann überspringen wir die Initialisierung komplett. Einfach. Und die Implementierung weiß genau, wo sich dieser Eigentümer im Bytecode befindet (noch besser, Solady kümmert sich darum für uns).
Und voilà, das leistungsstärkste Smart-Konto, das je gebaut wurde, ist jetzt auch günstiger als ein Uniswap-Tausch. Was können wir daraus lernen?
1. Verfolge immer deine Neugier Es hätte vielleicht niemals ein intelligentes Konto gegeben, das diese Technologie nutzt, wenn wir nicht vor Jahren die Idee der Klone mit unveränderlichen Argumenten verfolgt hätten – nur weil wir sie interessant fanden.
2. Es gibt fast immer eine einfache Lösung Wenn du die Komplexität nicht vermeiden kannst, teile die Komplexität in kleinere, einfachere Teile auf. Du solltest in der Lage sein, deinen gesamten Code jemandem zu erklären, der neu im Codebase ist. Wenn du das nicht kannst, ist deine Lösung mit Sicherheit zu komplex.
3. Es gibt tatsächlich nichts, was dich aufhält. Wenn du eine Idee hast, wie man etwas besser machen kann, tu es. Es gibt nichts, was dich aufhält. Ich dachte, das könnte funktionieren, habe es ausprobiert, und es hat funktioniert. Du bist zu unglaublichen Dingen fähig, wenn du nur aufhören würdest, dich selbst zurückzuhalten, Anon.
Ist Ihr Stack schon zu tief? Ich hoffe, dieser Thread war einigermaßen interessant. Wenn du es nett fandest, sei ein Kumpel und kontaktiere deinen Jungen mit einem Like, damit ich mehr als 5 Leute mit meinen Beiträgen hier erreichen kann. Auch die Benchmarks 😸 Wir sind nicht nur billig im Einsatz.
5,47K