Back to Blog

Sicheres Solana-Ökosystem (3) — Programm-Upgrade

March 27, 2022
5 min read

0. Überprüfung

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:


Ü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

Sign up for the latest updates
~$15.9M Lost: Trusted Volumes & More | BlockSec Weekly
Security Insights

~$15.9M Lost: Trusted Volumes & More | BlockSec Weekly

This BlockSec bi-weekly security report covers 11 notable attack incidents identified between April 27 and May 10, 2026, across Sui, Ethereum, BNB Chain, Base, Blast, and Berachain, with total estimated losses of approximately $15.9M. Three incidents are analyzed in detail: the highlighted $1.14M Aftermath Finance exploit on Sui, where a signed/unsigned semantic mismatch in the builder-fee validation allowed an attacker to inject a negative fee that was converted into positive collateral during settlement; the $5.87M Trusted Volumes RFQ authorization mismatch on Ethereum; and the $5.7M Wasabi Protocol infrastructure-to-contract-control compromise across multiple EVM chains.

Newsletter - April 2026
Security Insights

Newsletter - April 2026

In April 2026, the DeFi ecosystem experienced three major security incidents. KelpDAO lost ~$290M due to an insecure 1-of-1 DVN bridge configuration exploited via RPC infrastructure compromise, Drift Protocol suffered ~$285M from a multisig governance takeover leveraging Solana's durable nonce mechanism, and Rhea Finance incurred ~$18.4M following a business logic flaw in its margin-trading module that allowed circular swap path manipulatio

~$7.04M Lost: GiddyDefi, Volo Vault & More | BlockSec Weekly
Security Insights

~$7.04M Lost: GiddyDefi, Volo Vault & More | BlockSec Weekly

This BlockSec weekly security report covers eight attack incidents detected between April 20 and April 26, 2026, across Ethereum, Avalanche, Sui, Base, HyperLiquid, and MegaETH, with total estimated losses of approximately $7.04M. The highlighted incident is the $1.3M GiddyDefi exploit, where the attacker did not break any cryptography or use a flash loan but simply replayed an existing on-chain EIP-712 signature with the unsigned `aggregator` and `fromToken` fields swapped out for a malicious contract, demonstrating how partial signature coverage turns any historical signature into a generic permit. Other incidents include a $3.5M Volo Vault operator key compromise on Sui, a $1.5M Purrlend privileged-role takeover, a $413K SingularityFinance oracle misconfiguration, a $142.7K Scallop cross-pool index injection, a $72.35K Kipseli Router decimal mismatch, a $50.7K REVLoans (Juicebox) accounting pollution, and a $64K Custom Rebalancer arbitrary-call exploit.