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
The Decentralization Dilemma: Cascading Risk and Emergency Power in the KelpDAO Crisis
Security Insights

The Decentralization Dilemma: Cascading Risk and Emergency Power in the KelpDAO Crisis

This BlockSec deep-dive analyzes the KelpDAO $290M rsETH cross-chain bridge exploit (April 18, 2026), attributed to the Lazarus Group, tracing a causal chain across three layers: how a single-point DVN dependency enabled the attack, how DeFi composability cascaded the damage through Aave V3 lending markets to freeze WETH liquidity exceeding $6.7B across Ethereum, Arbitrum, Base, Mantle, and Linea, and how the crisis forced decentralized governance to exercise centralized emergency powers. The article examines three parameters that shaped the cascade's severity (LTV, pool depth, and cross-chain deployment count) and provides an exclusive technical breakdown of Arbitrum Security Council's forced state transition, an atomic contract upgrade that moved 30,766 ETH without the holder's signature.

Weekly Web3 Security Incident Roundup | Apr 13 – Apr 19, 2026
Security Insights

Weekly Web3 Security Incident Roundup | Apr 13 – Apr 19, 2026

This BlockSec weekly security report covers four attack incidents detected between April 13 and April 19, 2026, across multiple chains such as Ethereum, Unichain, Arbitrum, and NEAR, with total estimated losses of approximately $310M. The highlighted incident is the $290M KelpDAO rsETH bridge exploit, where an attacker poisoned the RPC infrastructure of the sole LayerZero DVN to fabricate a cross-chain message, triggering a cascading WETH freeze across five chains and an Arbitrum Security Council forced state transition that raises questions about the actual trust boundaries of decentralized systems. Other incidents include a $242K MMR proof forgery on Hyperbridge, a $1.5M signed integer abuse on Dango, and an $18.4M circular swap path exploit on Rhea Finance's Burrowland protocol.

Weekly Web3 Security Incident Roundup | Apr 6 – Apr 12, 2026
Security Insights

Weekly Web3 Security Incident Roundup | Apr 6 – Apr 12, 2026

This BlockSec weekly security report covers four DeFi attack incidents detected between April 6 and April 12, 2026, across Linea, BNB Chain, Arbitrum, Optimism, Avalanche, and Base, with total estimated losses of approximately $928.6K. Notable incidents include a $517K approval-related exploit where a user mistakenly approved a permissionless SquidMulticall contract enabling arbitrary external calls, a $193K business logic flaw in the HB token's reward-settlement logic that allowed direct AMM reserve manipulation, a $165.6K exploit in Denaria's perpetual DEX caused by a rounding asymmetry compounded with an unsafe cast, and a $53K access control issue in XBITVault caused by an initialization-dependent check that failed open. The report provides detailed vulnerability analysis and attack transaction breakdowns for each incident.