0. Überprüfung
- Das Solana-Ökosystem sichern (1) — Hallo Solana
- Das Solana-Ökosystem sichern (2) — Aufrufe zwischen Programmen
1. Überblick
Im vorherigen Blog haben wir erklärt, wie die programmöbergreifende Aufrufe über die Funktion invoke und die Funktion invoke_signed implementiert werden. In diesem Beitrag stellen wir ein weiteres grundlegendes Thema vor – Programm-Upgrades.
2. Ein aufrüstbares Programm bereitstellen
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 zum Bereitstellen des Programms verwendet. Nach der Bereitstellung kann das Programm nicht aktualisiert werden.
Der BPFLoaderUpgradeable Loader-Programm verwaltet drei Arten von Konten: Programm-Konten, Programm-Daten-Konten und Buffer-Konten. Im Bereitstellungsprozess wird zuerst ein Buffer-Konto erstellt. Danach lädt die Solana CLI die Bytecodes des Zielprogramms und schreibt sie in das Buffer-Konto. Schließlich werden die im Buffer-Konto gespeicherten Bytecodes in das Programm-Daten-Konto kopiert.
Somit werden Buffer-Konten vom Upgradeable BPF Loader verwendet, um die Bytecodes während des Bereitstellungsprozesses temporär zu speichern, Programm-Daten-Konten speichern die tatsächlichen Daten eines Programms, und Programm-Konten fungieren als Proxys, die auf die entsprechenden Programm-Daten-Konten verweisen.
Im Folgenden werden wir einige Beispiele für das Upgrade Ihres Programms durchgehen. Der gesamte in diesem Beitrag verwendete Code ist hier zu finden.
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 17. Wir definieren auch eine Funktion area() für Rectangle. Die Funktion area() dient zur Berechnung der Fläche des Rechtecks anhand 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 zum Speichern der Daten des Rechtecks verwendet wird, extrahiert. In Zeile 59 deserialisiert die Funktion try_from_slice_unchecked() die Daten des Kontos mit dem Typ der Struktur Rectangle. Anschließend weisen wir die Daten den entsprechenden Feldern der Struktur zu und berechnen den Wert der Fläche (Zeilen 61 - 63). Der letzte Schritt ist das Serialisieren 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 in das 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 zum Programm hinzufügen, nämlich die Berechnung des Umfangs des Rechtecks.

Nachdem das aktualisierte Projekt kompiliert wurde, 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 weiterhin 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 zugehörigen Attribute der neuen Struktur (d.h. CurrentRectangle) zu und initialisieren das neue Attribut (d.h. perimeter).

Schließlich berechnen wir den Wert des Umfangs 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. Fazit
In diesem Artikel haben wir vorgestellt, wie ein Programm in Solana aktualisiert werden kann. Wir haben verschiedene Beispiele verwendet, um den detaillierten Prozess zu veranschaulichen. Bleiben Sie dran, weitere Artikel zu Solana werden veröffentlicht.
Lesen Sie andere Artikel dieser Reihe:
- Das Solana-Ökosystem sichern (1) — Hallo Solana
- Das Solana-Ökosystem sichern (2) — Aufrufe zwischen Programmen
- Das Solana-Ökosystem sichern (4) — Kontenvalidierung
- Das Solana-Ökosystem sichern (5) — Multi-Sig
- Das Solana-Ökosystem sichern (6) — Multi-Sig2
- Das Solana-Ökosystem sichern (7) — Typenverwechslung
Über BlockSec
BlockSec ist ein wegweisendes Blockchain-Sicherheitsunternehmen, das 2021 von einer Gruppe weltweit renommierter Sicherheitsexperten gegründet wurde. Das Unternehmen engagiert sich für die Verbesserung der Sicherheit und Benutzerfreundlichkeit der aufkommenden Web3-Welt, um deren Massenadaption zu fördern. Zu diesem Zweck bietet BlockSec Sicherheitsaudits für Smart Contracts und EVM-Ketten, die Phalcon Plattform für Entwicklungssicherheit und proaktive Bedrohungsabwehr, die MetaSleuth Plattform für die Nachverfolgung von Geldern und Untersuchung sowie die MetaSuites Erweiterung für Web3-Entwickler, um effizient in der Krypto-Welt zu surfen.
Bis heute hat das Unternehmen über 300 angesehene Kunden wie MetaMask, Uniswap Foundation, Compound, Forta und PancakeSwap betreut und in zwei Finanzierungsrunden von namhaften Investoren, darunter Matrix Partners, Vitalbridge Capital und Fenbushi Capital, zehn Millionen US-Dollar erhalten.
Offizielle Website: https://blocksec.com/
Offizieller Twitter-Account: https://twitter.com/BlockSecTeam



