本篇文章假設你:
- 已經擁有了 solana 的基礎知識
- 有使用 Anchor 編程的基本經驗
- 已經安裝了 solana 相關的命令行工具
- 有一個 ledger 硬體錢包
-
查看 ledger 的 Wallet ID
- 當你將多個 ledger 連接到同一台計算機時,可以使用 Wallet ID 來指定要使用的 ledger 錢包
- 如果你只打算在計算機上使用單個 ledger,則無需包含 Wallet ID
solana-keygen pubkey usb://ledger
-
查看 SOL 錢包地址
- 查看 SOL 錢包的命令行:
# 查看第1個地址 solana-keygen pubkey usb://ledger?key=0/0 # 查看第2個地址 solana-keygen pubkey usb://ledger?key=1/0 # 查看第3個地址 solana-keygen pubkey usb://ledger?key=2/0
- 命令行需要指定 keypair url, 格式為
usb://ledger?key=<DERIVATION_PATH>
- 如果有多個 ledger, 需要指定 WALLET_ID, 則為
usb://ledger/<WALLET_ID>?key=<DERIVATION_PATH>
- 如果有多個 ledger, 需要指定 WALLET_ID, 則為
- 其中
DERIVATION_PATH
為了和 phantom 錢包保持一致,使用x/0
, 這樣 ledger 連接 phantom 錢包的時候會顯示和命令行相同的地址 - Keypair URL 參數在ZSH中被忽略,需要修改
~/.zshrc
, 添加一行unsetopt nomatch
-
如果有多個 ledger, 可以根據 keypair url 反向查詢 WALLET_ID, 例如:
solana resolve-signer usb://ledger?key=1/0 # DwWogDGHNM5wNxcwjkroMeK83NTLpZ7ZtEbtCSrxMKNZ即為你的WALLET_ID usb://ledger/DwWogDGHNM5wNxcwjkroMeK83NTLpZ7ZtEbtCSrxMKNZ?key=1'/0'
-
設定 sol network
- 此處我設定的是localhost, 也可以根據實際使用情況設定 devnet 和 mainnet-beta
- 先本地啟動一個 test validator 作為 localhost 網路
pkill solana-test-validator rm -rf test-ledger/ solana-test-validator
- 設定 sol 網路和默認錢包
# network可以是mainnet-beta, testnet, devnet, localhost export network=localhost solana config set --url $network # 設定我本地的~/.config/solana/id.json為默認的錢包,後面會用到這個錢包 solana config set --keypair ~/.config/solana/id.json solana config get
-
使用普通的 keypair 熱錢包,創建一個 buffer account
- 為什麼要先使用普通的 keypair 熱錢包,因為
- 部署 solana 合約需要將 program 字節碼上鏈,每筆交易最大 1K, 通常要發 500 + 筆交易,結果可能有:
- ledger 錢包受不了,連續按幾百上千次,, 這幾乎不可能
- ledger 錢包不支持這種方式來部署合約
- 控制台會輸出 buffer account 地址 BUFFER_ADDRESS
solana program write-buffer target/deploy/curve_launchpad.so \ --keypair ~/.config/solana/id.json Buffer: 3qMNULQwNWQPKKT29WPmjnfSbcpXCFSoYwZg5yLCbwty # 如果想刪除buffer account並取回sol solana program close -k ~/.config/solana/id.json --buffers
- 為什麼要先使用普通的 keypair 熱錢包,因為
-
轉移 buffer authority 給 ledger 錢包
- 執行命令行
solana program set-buffer-authority <BUFFER_ADDRESS> \ --new-buffer-authority <LEDGER_PUBKEY> 比如ledger錢包地址為LdJx7GAVbb9JhaPMvLEDEZb3Fjk16Bv5R4f8qzMUQeG, 命令行如下: solana program set-buffer-authority 3qMNULQwNWQPKKT29WPmjnfSbcpXCFSoYwZg5yLCbwty \ --new-buffer-authority LdJx7GAVbb9JhaPMvLEDEZb3Fjk16Bv5R4f8qzMUQeG Account Type: Buffer Authority: LdJx7GAVbb9JhaPMvLEDEZb3Fjk16Bv5R4f8qzMUQeG
-
接下來,可以使用 ledger 部署 solana 程序
- 使用 ledger 錢包部署合約,使用 buffer account 中的字節碼
_ 其中 usb://ledger?key=0/0 對應的地址為 LdJx7GAVbb9JhaPMvLEDEZb3Fjk16Bv5R4f8qzMUQeG, 將其設定為 solana 程序的 upgrade 權限
solana program deploy \ --program-id target/deploy/curve_launchpad-keypair.json \ --buffer 3qMNULQwNWQPKKT29WPmjnfSbcpXCFSoYwZg5yLCbwty \ --upgrade-authority usb://ledger?key=0/0 Program Id: AAR4w5eyv8JXrDvmB1EJE9QmxP24KaPyRUiZU5M8pAeZ Signature: ua19eg9EQFcgTKVn5ZHjL1JB3s4mPYYUC7f4At6bnoXSrTKqm3RZABj3JbcwtsjUYEFTrS6bCGet6SUr2PaCyyk
- 查詢程序狀態
solana program show AAR4w5eyv8JXrDvmB1EJE9QmxP24KaPyRUiZU5M8pAeZ Program Id: AAR4w5eyv8JXrDvmB1EJE9QmxP24KaPyRUiZU5M8pAeZ Owner: BPFLoaderUpgradeab1e11111111111111111111111 ProgramData Address: 8nH1bnwoqbuipTWaX25pg6tDWfvDoFs1yErFTCFR39SB Authority: LdJx7GAVbb9JhaPMvLEDEZb3Fjk16Bv5R4f8qzMUQeG # upgrade權限 Last Deployed In Slot: 937 Data Length: 506936 (0x7bc38) bytes Balance: 3.52947864 SOL
- 使用 ledger 錢包部署合約,使用 buffer account 中的字節碼
-
如果合約已經部署,可以使用 ledger 升級 solana 程序
- 先使用普通 keypair 錢包 buffer account
solana program write-buffer target/deploy/curve_launchpad.so \ --keypair ~/.config/solana/id.json Buffer: 9suJnc9cY7ZFiNPe39me1wsNqxsM9HnrokouNTnqWVV
- 再轉移 buffer authority 給 ledger 錢包
solana program set-buffer-authority <BUFFER_ADDRESS> \ --new-buffer-authority <LEDGER_PUBKEY> 比如 solana program set-buffer-authority 9suJnc9cY7ZFiNPe39me1wsNqxsM9HnrokouNTnqWVV \ --new-buffer-authority LdJx7GAVbb9JhaPMvLEDEZb3Fjk16Bv5R4f8qzMUQeG Account Type: Buffer Authority: LdJx7GAVbb9JhaPMvLEDEZb3Fjk16Bv5R4f8qzMUQeG
- 使用 ledger 錢包升級程序,其中 <PROGRAM_ADDRESS> 指定要升級的 Program Id, 此處為 AAR4w5eyv8JXrDvmB1EJE9QmxP24KaPyRUiZU5M8pAeZ
solana program deploy --program-id <PROGRAM_ADDRESS> \ --buffer <BUFFER_ADDRESS> \ --upgrade-authority <LEDGER_PUBKEY> 比如 solana program deploy \ --program-id AAR4w5eyv8JXrDvmB1EJE9QmxP24KaPyRUiZU5M8pAeZ \ --buffer 9suJnc9cY7ZFiNPe39me1wsNqxsM9HnrokouNTnqWVV \ --upgrade-authority usb://ledger?key=0/0 Program Id: AAR4w5eyv8JXrDvmB1EJE9QmxP24KaPyRUiZU5M8pAeZ Signature: 2zgdmJGwHwEogZArPnL9zju6LtJqXpCgTHtMw78aUmXEmgJEgi5tdFQPFNSNzoVk7cqLxVWBthoSQa1dZRqMzUvQ
- 查看程序狀態
solana program show AAR4w5eyv8JXrDvmB1EJE9QmxP24KaPyRUiZU5M8pAeZ Program Id: AAR4w5eyv8JXrDvmB1EJE9QmxP24KaPyRUiZU5M8pAeZ Owner: BPFLoaderUpgradeab1e11111111111111111111111 ProgramData Address: 8nH1bnwoqbuipTWaX25pg6tDWfvDoFs1yErFTCFR39SB Authority: LdJx7GAVbb9JhaPMvLEDEZb3Fjk16Bv5R4f8qzMUQeG # upgrade權限 Last Deployed In Slot: 1474 Data Length: 506936 (0x7bc38) bytes Balance: 3.52947864 SOL
參考: