
0. Rückblick
- Sichern Sie das Solana-Ökosystem (1) — Hallo Solana
- Sichern Sie das Solana-Ökosystem (2) — Aufrufe zwischen Programmen
1. Überblick
Im vorherigen Blog haben wir die Implementierung der programmketteübergreifenden Aufrufe über die Funktion invoke und die Funktion invoke_signed vorgestellt. In diesem Beitrag stellen wir ein weiteres grundlegendes Thema vor – Programm-Upgrades.
2. Bereitstellung eines aufrüstbaren Programms
Standardmäßig werden alle bereitgestellten Programme in Solana mit dem BPFLoaderUpgradeable Loader bereitgestellt, was bedeutet, dass sie aktualisiert werden können. Darüber hinaus bietet Solana die Option --final, um sicherzustellen, dass das bereitgestellte Programm unveränderlich ist. In diesem Fall wird der BPFLoader2 Loader verwendet, um das Programm bereitzustellen. Nach der Bereitstellung kann das Programm nicht mehr aktualisiert werden.
Der BPFLoaderUpgradeable Loader verwaltet drei Arten von Konten: Programm-Konten, Programm-Daten-Konten und Puffer-Konten. Im Bereitstellungsprozess wird zuerst ein Puffer-Konto erstellt. Danach lädt die Solana CLI die Bytecodes des Zielprogramms und schreibt sie in das Puffer-Konto. Schließlich werden die im Puffer-Konto gespeicherten Bytecodes in das Programm-Daten-Konto kopiert.
Somit werden Puffer-Konten vom Upgradeable BPF Loader verwendet, um Bytecodes während des Bereitstellungsprozesses temporär zu speichern, Programm-Daten-Konten speichern die tatsächlichen Daten eines Programms, und Programm-Konten fungieren als Proxy, die auf die entsprechenden Programm-Daten-Konten verweisen.
Im Folgenden gehen wir einige Beispiele durch, wie Sie Ihr Programm aktualisieren können. Der gesamte Code in diesem Beitrag finden Sie hier.
2.1 Code-Überprüfung (Rectangle_Area)

In diesem Beispielvertrag definieren wir eine Struktur namens Rectangle, die drei Attribute enthält: width, height und area von Zeile 13 bis Zeile 17. Wir definieren auch eine area()-Funktion für Rectangle. Die Funktion area() berechnet die Fläche des Rechtecks unter Verwendung von width und height.

In der Funktion process_instruction() verwenden wir zuerst die Funktion unpack_u32(), um die width und die height des Rechtecks aus den Instruktionsdaten zu extrahieren (Zeile 45 - Zeile 46). In Zeile 51 wird das Konto, das zur Speicherung der Rechteckdaten verwendet wird, extrahiert. In Zeile 59 deserialisiert die Funktion try_from_slice_unchecked() die Daten des Kontos mit dem Typ der Struktur Rectangle. Als nächstes weisen wir die Daten den entsprechenden Feldern der Struktur zu und berechnen den Flächenwert (Zeile 61 - Zeile 63). Der letzte Schritt ist die Serialisierung der Daten und das Zurückschreiben in das Datenkonto.
Das bereitgestellte Programm finden Sie unter folgendem Link.
https://explorer.solana.com/address/84mMqHRTQT6b2vfsD7XRxVKA3XMd7xoEXFdF6pLNw8y?cluster=testnet
2.2 Transaktion senden

Auf der Client-Seite senden wir zuerst eine Transaktion, um ein Konto für die Datenspeicherung zu erstellen. Wir legen die Speichergröße auf 1.024 Bytes fest, um sicherzustellen, dass sie ausreichend ist.

Anschließend senden wir eine weitere Transaktion, um die Fläche des Rechtecks zu berechnen und sie im Datenkonto zu speichern.
Die Transaktion finden Sie unter folgendem Link.
https://explorer.solana.com/tx/4PybjXGRpuPKpak7FAz4BKMbcQCWmway69zAxtTnpFRuTTg7onyxW7agSe6ETx44iAGexbgnBUa8WdzdTTQSawJ3?cluster=testnet
3. Upgrade
Nun möchten wir eine neue Funktion im Programm hinzufügen, nämlich die Berechnung des Umfangs des Rechtecks.

Nachdem das aktualisierte Projekt kompiliert ist, aktualisieren wir das bereitgestellte Programm auf der Kette mit dem folgenden Befehl.
solana program deploy /path/to/program.so --program-id <PROGRAM_ID>
Der Vertrag kann direkt aktualisiert werden und Sie können die zugehörige Transaktion unten einsehen.
https://explorer.solana.com/tx/4Dm9v4zMiijKjQBhatx1D9xbV9PvMLdaonUWLaC2VwzkFvzdgorzbX5vsy4VQ7VxSUmqadftjiDzbyUmXgQchYmk?cluster=testnet
Wir senden dann eine Transaktion an das Programm, um zu überprüfen, ob es erfolgreich aktualisiert wurde. Das Ergebnis zeigt, dass die Funktion gut funktioniert.
Die zugehörige Transaktion finden Sie unten.
https://explorer.solana.com/tx/21c2G7kPVktAtdUFkH3QwGVi7orajRmy5PJo1UxX1mmAMU68eUkNuLzWYJRBaTzwGi5DxeocYjHfpWiU4hcSFtpQ?cluster=testnet
4 Erneutes Upgrade

Dieses Mal möchten wir den berechneten Umfang im Datenkonto speichern. In diesem Fall fügen wir ein weiteres Attribut perimeter zur Struktur Rectangle hinzu (Zeile 18).

Da die Struktur des Datenkontos von der vorherigen abweicht, müssen wir zuerst die Daten aus dem Datenkonto lesen. Wir deserialisieren die gespeicherten Daten mit der ursprünglichen Struktur (d. h. OldRectangle). Danach weisen wir die entsprechenden Attribute der neuen Struktur (d. h. CurrentRectangle) zu und initialisieren das neue Attribut (d. h. perimeter).

Schließlich berechnen wir den Umfang und weisen ihn dem update_account zu, bevor wir ihn in die account_data serialisieren.
Die Transaktion für das Upgrade finden Sie unten.
https://explorer.solana.com/tx/5J3oKxZXtCi755gD7pMnVh48AFvmeVzRLPgJiyNn8JFeCKx1xpAfJtsi34zjyYKJmnMk8LtC3bcwfFSP7H2gtj5o?cluster=testnet
Nach dem Upgrade können wir die im Konto gespeicherten Daten mit dem Befehl solana account <DataAccount> überprüfen. Sie finden die Attribute in den ersten 32 Bytes gespeichert. Der gesamte Upgrade-Prozess ist abgeschlossen.

5. Schlussfolgerung
In diesem Artikel stellen wir vor, wie ein Programm in Solana aktualisiert werden kann. Wir verwenden verschiedene Beispiele, um den detaillierten Prozess zu veranschaulichen. Bleiben Sie dran, weitere Artikel zu Solana werden folgen.
Lesen Sie andere Artikel dieser Serie:
- Sichern Sie das Solana-Ökosystem (1) — Hallo Solana
- Sichern Sie das Solana-Ökosystem (2) — Aufrufe zwischen Programmen
- Sichern Sie das Solana-Ökosystem (4) — Kontenvalidierung
- Sichern Sie das Solana-Ökosystem (5) — Multi-Sig
- Sichern Sie das Solana-Ökosystem (6) — Multi-Sig2
- Sichern Sie das Solana-Ökosystem (7) — Typenverwirrung
Über BlockSec
BlockSec ist ein führendes Unternehmen für Blockchain-Sicherheit, das 2021 von einer Gruppe weltweit anerkannter Sicherheitsexperten gegründet wurde. Das Unternehmen engagiert sich für die Verbesserung der Sicherheit und Benutzerfreundlichkeit der aufstrebenden Web3-Welt, um deren Massenadoption zu fördern. Zu diesem Zweck bietet BlockSec Sicherheitsaudits von Smart Contracts und EVM-Ketten, die Phalcon-Plattform für Sicherheitsentwicklung und proaktive Bedrohungsabwehr, die MetaSleuth-Plattform für Finanzverfolgung und Ermittlungen sowie die MetaSuites-Erweiterung für Web3-Entwickler zur effizienten Navigation in der Krypto-Welt.
Bisher hat das Unternehmen über 300 angesehene Kunden wie MetaMask, Uniswap Foundation, Compound, Forta und PancakeSwap betreut und in zwei Finanzierungsrunden von namhaften Investoren wie Matrix Partners, Vitalbridge Capital und Fenbushi Capital zweistellige Millionenbeträge erhalten.
Offizielle Website: https://blocksec.com/
Offizielles Twitter-Konto: https://twitter.com/BlockSecTeam



