Programme deployen
Dieser Leitfaden setzt Kenntnisse zu folgenden Themen voraus:
- Solana-Kontenmodell
- Solana-Programme im Allgemeinen
- Entwicklung benutzerdefinierter Solana-Programme
Loader-v3 und Loader-v4
Derzeit findet ein Übergang von Loader-v3 (program-Unterbefehl) zu Loader-v4 (program -v4-Unterbefehl) statt, da Loader-v3 eingestellt wird.
Für neue Deployments verwenden Sie bitte solana program-v4 deploy
anstelle von
solana program deploy
.
Um ein bestehendes Programm zu migrieren (was im Wesentlichen ein erneutes Deployment ist):
solana program migrate ./target/deploy/your_program-keypair.json
Vorbereitung
Zuerst muss das Programm gebaut werden (kompiliert, verlinkt, gestrippt).
cargo +solana build --target sbpf-solana-solana --release
Dieser Schritt muss vor jedem erneuten Deployment durchgeführt werden.
Überprüfen Sie, ob auf dem Standard-Zahlerkonto ausreichend Guthaben proportional zur Größe der ausführbaren Datei verfügbar ist:
du -h ./target/deploy/your_program.sosolana balance
Zusätzlich hat jedes Programm ein Programmkonto und eine Programm-ID, welche die Adresse dieses Programmkontos ist. Das Folgende generiert ein Keypair für das Programmkonto:
solana-keygen new -o ./target/deploy/your_program-keypair.json
Dies muss nur einmal pro Programm durchgeführt werden und wird für spätere erneute Deployments desselben Programms wiederverwendet.
Die Toolchain enthielt eine Abkürzung, die jedoch auslaufen wird / veraltet ist:
cargo-build-sbf
Erstmalige Deployment
Jetzt kann die ausführbare Datei auf das Programmkonto hochgeladen werden:
Loader-v3
Der Parameter heißt program-id
, obwohl er den Dateipfad eines Keypairs
erwartet:
solana program deploy ./target/deploy/your_program.so --program-id ./target/deploy/your_program-keypair.json
Loader-v4
solana program-v4 deploy ./target/deploy/your_program.so --program-keypair ./target/deploy/your_program-keypair.json
Redeployment
Das erneute Hochladen einer anderen ausführbaren Datei auf dasselbe Programmkonto wird diese überschreiben/ersetzen. Für Redeployments wird jedoch nur die Programm-ID (pubkey des Programm-keypairs) benötigt, nicht das gesamte Keypair, da der Signer das Upgrade-Authority-Keypair ist.
Loader-v3
Dies ist genau dasselbe wie beim ersten Deployment:
solana program deploy ./target/deploy/your_program.so --program-id ./target/deploy/your_program-keypair.json
Wenn die alte ausführbare Datei kürzer war als die neue, könnte es notwendig sein, das programdata account zuerst zu vergrößern:
solana program extend ./target/deploy/your_program.so <ADDITIONAL_BYTES>
Loader-v4
Beachten Sie, dass beim ersten Deployment program-keypair
verwendet wurde,
während beim Redeployment stattdessen program-id
verwendet wird:
solana program-v4 deploy ./target/deploy/your_program.so --program-id ./target/deploy/your_program-keypair.json
Priorisierung eines Uploads
In Zeiten hoher Auslastung gibt es einige zusätzliche Flags, die Sie zur Unterstützung bei der Programm-Bereitstellung verwenden können:
--with-compute-unit-price
: Legt den Compute-Unit-Preis für die Transaktion fest, in Schritten von 0,000001 Lamports (Mikro-Lamports) pro Compute-Unit. Verwenden Sie die Priority Fee API von Helius, um eine Schätzung der zu setzenden priority fee zu erhalten.--use-rpc
: Sendet Schreibtransaktionen an den konfigurierten RPC anstatt an Validator-TPUs. Dieses Flag erfordert eine stake-weighted RPC- Verbindung wie Helius oder Triton. Dieses Flag kann auch als Standard konfiguriert werden mit:solana config set --url <RPC_URL>
.--max-sign-attempts
: Maximale Anzahl von Versuchen, Transaktionen zu signieren oder neu zu signieren nach Ablauf des Blockhash. Wenn Transaktionen, die während des Programm-Deployments gesendet wurden, nach Ablauf des ursprünglich gewählten aktuellen Blockhash noch nicht bestätigt sind, werden diese Transaktionen mit einem neuen aktuellen Blockhash neu signiert und erneut gesendet. Verwenden Sie diese Einstellung, um die maximale Anzahl von Transaktions-Signierungsiterationen anzupassen. Jeder Blockhash ist etwa 60 Sekunden gültig, was bedeutet, dass die Verwendung des Standardwerts von 5 dazu führt, dass Transaktionen für mindestens 5 Minuten gesendet werden oder bis alle Transaktionen bestätigt sind, je nachdem, was zuerst eintritt.
Fortsetzen eines Uploads
Es ist möglich, dass ein Upload hängen bleibt oder abgebrochen wird.
Loader-v3
Wenn das Deployment eines Programms fehlschlägt, bleibt ein hängendes
Zwischen-Buffer-Account mit einem Guthaben ungleich Null zurück. Um dieses
Guthaben zurückzugewinnen, können Sie ein fehlgeschlagenes Deployment
fortsetzen, indem Sie denselben Zwischen-Buffer für einen neuen Aufruf von
deploy
bereitstellen.
Bei Deployment-Fehlern wird eine Fehlermeldung angezeigt, die die seed-Phrase angibt, die zur Wiederherstellung des generierten Zwischen-Buffer-Keypairs benötigt wird:
==================================================================================Recover the intermediate account's ephemeral keypair file with`solana-keygen recover` and the following 12-word seed phrase:==================================================================================valley flat great hockey share token excess clever benefit traffic avocado athlete==================================================================================To resume a deploy, pass the recovered keypair asthe [BUFFER_SIGNER] to `solana program deploy` or `solana program write-buffer'.Or to recover the account's lamports, pass it as the[BUFFER_ACCOUNT_ADDRESS] argument to `solana program drain`.==================================================================================
Um das keypair wiederherzustellen:
solana-keygen recover -o ./target/deploy/buffer-keypair.json
Geben Sie bei Aufforderung die 12-Wörter-seed-Phrase ein.
Geben Sie dann einen neuen deploy
Befehl ein und spezifizieren Sie den Buffer:
solana program deploy ./target/deploy/your_program.so --program-id ./target/deploy/your_program-keypair.json --buffer ./target/deploy/buffer-keypair.json
Loader-v4
Es ist möglich, einen Upload an einem bestimmten Byte-Offset fortzusetzen:
solana program deploy ./target/deploy/your_program.so --program-id ./target/deploy/your_program-keypair.json --start-offset <BYTES_UPLOADED_SO_FAR>
Finalisierung
Dies ist eine irreversible Aktion.
Ein Programm kann unveränderlich gemacht werden, indem seine Upgrade-Authority entfernt wird.
Loader-v3
solana program set-upgrade-authority ./target/deploy/your_program-keypair.json --final
Loader-v4
solana program finalize --program-id ./target/deploy/your_program-keypair.json
Anstatt Programme zu überschreiben, ist es auch möglich, Benutzern die Wahl zu lassen, welche Version eines Programms sie verwenden möchten, indem eine verknüpfte Liste finalisierter Programme erstellt wird:
solana program finalize --program-id ./target/deploy/your_program-keypair.json --next-version ../your_newer_program/target/deploy/your_newer_program-keypair.json
Schließen
Bei Programmen, die unter Loader-v3 bereitgestellt wurden, können nur ihr programdata account, die Buffer-Accounts und die darin gesperrten Gelder zurückgefordert werden. Das program account zusammen mit der Programm-ID und den speziell im program account gesperrten Geldern sind festgesetzt.
Programme, die unter loader-v4 bereitgestellt wurden, können mit ihrem Programm-Konto geschlossen werden, wobei ihre Programm-ID und ihre gesperrten Gelder wieder für andere Zwecke verfügbar werden.
Loader-v3
Dies ist eine irreversible Aktion für Programme, die mit loader-v3 bereitgestellt wurden.
Beachten Sie, dass sobald ein Programm geschlossen ist, seine Programm-ID nicht wiederverwendet werden kann. Der Versuch, ein Programm mit einer zuvor geschlossenen Programm-ID bereitzustellen, führt zu einem Fehler. Wenn Sie ein Programm nach dem Schließen erneut bereitstellen müssen, müssen Sie eine neue Programm-keypair-Datei generieren.
Um ein einzelnes programdata account zu schließen:
solana program close ./target/deploy/your_program-keypair.json
Um alle Buffer-Accounts zu schließen, die mit der aktuellen Authority verknüpft sind:
solana program close --buffers
Loader-v4
solana program-v4 close --program-id ./target/deploy/your_program-keypair.json
Metadaten inspizieren
Der Unterbefehl show
listet die Metadaten eines Programms auf.
Eine Beispielausgabe sieht so aus:
Program Id: 3KS2k14CmtnuVv2fvYcvdrNgC94Y11WETBpMUGgXyWZLOwner: BPFLoaderUpgradeab1e11111111111111111111111ProgramData Address: EHsACWBhgmw8iq5dmUZzTA1esRqcTognhKNHUkPi4q4gAuthority: FwoGJNUaJN2zfVEex9BB11Dqb3NJKy3e9oY3KTh9XzCULast Deployed In Slot: 63890568Data Length: 5216 (0x1460) bytes
Program Id
ist die Adresse, auf die im Feldprogram_id
einer Anweisung verwiesen werden kann, wenn ein Programm aufgerufen wird.Owner
: Der Loader, mit dem dieses Programm bereitgestellt wurde.ProgramData Address
ist das programdata account, das mit dem Programm-Konto verknüpft ist und den ausführbaren Code des Programms enthält (nur loader-v3).Status
:retracted
,deployed
oderfinalized
(nur loader-v4).Authority
ist die Upgrade-Authority des Programms.Last Deployed In Slot
ist der slot, in dem das Programm zuletzt bereitgestellt wurde.Data Length
ist die Größe des für Deployments reservierten Speicherplatzes. Der tatsächlich vom aktuell bereitgestellten Programm genutzte Speicherplatz kann geringer sein.
Loader-v3
Um ein bestimmtes Programm anzuzeigen:
solana program show ./target/deploy/your_program-keypair.json
Um die Liste der Programme anzuzeigen, die mit der Standard-Authority bereitgestellt wurden:
solana program show --programs
Um alle Buffer-Accounts unabhängig von der Authority anzuzeigen:
solana program show --buffers --all
Um eine andere Authority anzugeben:
solana program show --programs --buffer-authority ~/.config/solana/authority-keypair.jsonsolana program show --buffers --buffer-authority ~/.config/solana/authority-keypair.json
Loader-v4
Um ein bestimmtes Programm anzuzeigen:
solana program-v4 show --program-id ./target/deploy/your_program-keypair.json
Um die Liste der Programme anzuzeigen, die mit der Standard-Authority bereitgestellt wurden:
solana program-v4 show --all
Um die Liste der Programme anzuzeigen, die mit einer bestimmten Authority bereitgestellt wurden:
solana program-v4 show --authority ~/.config/solana/authority-keypair.json
Herunterladen der ausführbaren Datei
Manchmal ist es nützlich, ein Programm herunterzuladen und zu vergleichen, um sicherzustellen, dass es eine bekannte ausführbare Datei enthält. Die heruntergeladene Datei kann gekürzt, gehasht und mit dem Hash der ursprünglichen Programmdatei verglichen werden.
Loader-v3
solana program dump ./target/deploy/your_program-keypair.json ./target/deploy/your_program.so
Loader-v4
solana program download ./target/deploy/your_program.so --program-id ./target/deploy/your_program-keypair.json
Fortgeschritten: Authority-Übertragung
Das Recht, ein bestimmtes Programm zu ändern, liegt bei seiner Authority. Diese Authority kann auf ein anderes keypair übertragen werden, ohne das Programm-keypair zu ändern, sodass die Programm-ID gleich bleibt. Darüber hinaus kann eine einzelne Authority mehrere program accounts kontrollieren.
Wenn während des ersten Deployments nicht ausdrücklich angegeben, wird das Standard-keypair als Authority verwendet. Deshalb war es in den obigen Schritten beim erneuten Deployment eines Programms nicht erforderlich, eine Authority explizit anzugeben.
Eine explizite Authority ist nützlich für Offline-Signierung und von mehreren Entitäten verwaltete Programme.
Zunächst muss ein keypair für die Authority generiert werden:
solana-keygen new -o ~/.config/solana/authority-keypair.json
Loader-v3
Die Authority kann während des Deployments angegeben werden:
solana program deploy ./target/deploy/your_program.so --upgrade-authority ~/.config/solana/authority-keypair.json
Oder nach dem Deployment und unter Verwendung des Standard-keypairs als aktuelle Authority:
solana program set-upgrade-authority ./target/deploy/your_program-keypair.json --new-upgrade-authority ~/.config/solana/authority-keypair.json
Oder nach dem Deployment und unter Angabe der aktuellen Autorität:
solana program set-upgrade-authority ./target/deploy/your_program-keypair.json --upgrade-authority ~/.config/solana/authority-keypair.json --new-upgrade-authority ~/.config/solana/new_authority-keypair.json
Loader-v4
Die Autorität kann während des Deployments angegeben werden:
solana program-v4 deploy ./target/deploy/your_program.so --program-keypair ./target/deploy/your_program-keypair.json --authority ~/.config/solana/authority-keypair.json
Oder nach dem Deployment und unter Verwendung des Standard-Keypairs als aktuelle Autorität:
solana program-v4 transfer-authority --program-id ./target/deploy/your_program-keypair.json --new-authority ~/.config/solana/authority-keypair.json
Oder nach dem Deployment und unter Angabe der aktuellen Autorität:
solana program-v4 transfer-authority --program-id ./target/deploy/your_program-keypair.json --authority ~/.config/solana/authority-keypair.json --new-authority ~/.config/solana/new_authority-keypair.json
Fortgeschritten: Zweistufiges Redeployment mit einem Buffer
Anstatt direkt auf das Programm-Konto hochzuladen, kann die ausführbare Datei zuerst auf ein Buffer-Account hochgeladen und dann in einem zweiten Schritt (dem eigentlichen Re-/Deployment) auf das Programm-Konto übertragen werden. Dies ist nützlich für Offline-Signierung und von mehreren Entitäten verwaltete Programme, wie z.B. eine DAO-Abstimmung zur Auswahl oder Ablehnung einer hochgeladenen ausführbaren Datei vor dem eigentlichen Redeployment.
Beachten Sie, dass die Verwendung von Buffer-Accounts die während des Upload-Prozesses benötigten Mittel ungefähr verdoppelt, da zwei Konten gleichzeitig jeweils eine ausführbare Datei enthalten.
Zunächst muss ein Keypair für das Buffer-Account erstellt werden:
solana-keygen new -o ~/.config/solana/buffer-keypair.json
Das Buffer-Account kann für verschiedene Uploads wiederverwendet werden und ist nicht an ein bestimmtes Programm-Konto gebunden.
Loader-v3
solana program write-buffer ./target/deploy/your_program.so --buffer ~/.config/solana/buffer-keypair.jsonsolana program deploy --program-id ./target/deploy/your_program-keypair.json --buffer ~/.config/solana/buffer-keypair.json
Loader-v4
solana program-v4 deploy ./target/deploy/your_program.so --buffer ~/.config/solana/buffer-keypair.jsonsolana program-v4 deploy --program-id ./target/deploy/your_program-keypair.json --buffer ~/.config/solana/buffer-keypair.json
Fortgeschritten: Offline-Signierung
Einige Sicherheitsmodelle erfordern die Trennung des Signierungsprozesses von der Transaktionsübertragung, sodass die Signierungsschlüssel vollständig von jedem Netzwerk getrennt sein können, auch bekannt als Offline-Signierung.
Beachten Sie, dass nur Redeployments im Offline-Modus durchgeführt werden können. Das erste Programm-Deployment muss von einem Online-Gerät aus durchgeführt werden, und nur nachfolgende Programm-Redeployments können die Offline-Signierung nutzen.
Ein typisches Setup würde aus zwei verschiedenen Signern bestehen:
- Online-Signer (Fee-Zahler und Autorität des Buffer-Accounts)
- Offline-Signer (Autorität des Programm-Kontos)
Der allgemeine Prozess ist eine zweistufige Neubereitstellung mit einigen Extras:
- (online) ein neues Programm erstellen
- (online) die Berechtigung an den Offline-Signer übertragen
- (online) Puffer erstellen und eine ausführbare Datei hochladen
- (optional) die Inhalte des Puffers auf der Blockchain überprüfen
- (offline) eine Transaktion signieren, um das Programm mit dem Puffer neu
bereitzustellen
--blockhash <VALUE> --sign-only
- (online) diese Signatur verwenden, um die Neubereitstellungstransaktion zu
übertragen
--blockhash <VALUE> --signer <OFFLINE_SIGNER_PUBKEY>:<OFFLINE_SIGNER_SIGNATURE>
Suchen Sie einen aktuellen blockhash
und fügen Sie ihn ein, um die
Offline-Transaktionssignatur zu generieren. Der blockhash
läuft nach etwa 60
Sekunden ab. Wenn Sie es nicht rechtzeitig geschafft haben - holen Sie einfach
einen neuen Hash und wiederholen Sie den Vorgang bis zum Erfolg, oder erwägen
Sie die Verwendung von dauerhaften Transaktions-Nonces.
Is this page helpful?