Albert

Albert

twitter

使用ledger部署和升級solana合約

本篇文章假設你:

  • 已經擁有了 solana 的基礎知識
  • 有使用 Anchor 編程的基本經驗
  • 已經安裝了 solana 相關的命令行工具
  • 有一個 ledger 硬體錢包
  1. 查看 ledger 的 Wallet ID

    • 當你將多個 ledger 連接到同一台計算機時,可以使用 Wallet ID 來指定要使用的 ledger 錢包
    • 如果你只打算在計算機上使用單個 ledger,則無需包含 Wallet ID
    solana-keygen pubkey usb://ledger
    
  2. 查看 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>
      1. 如果有多個 ledger, 需要指定 WALLET_ID, 則為 usb://ledger/<WALLET_ID>?key=<DERIVATION_PATH>
    • 其中DERIVATION_PATH 為了和 phantom 錢包保持一致,使用 x/0, 這樣 ledger 連接 phantom 錢包的時候會顯示和命令行相同的地址
    • Keypair URL 參數在ZSH中被忽略,需要修改~/.zshrc, 添加一行 unsetopt nomatch
  3. 如果有多個 ledger, 可以根據 keypair url 反向查詢 WALLET_ID, 例如:

    solana resolve-signer  usb://ledger?key=1/0
    
    # DwWogDGHNM5wNxcwjkroMeK83NTLpZ7ZtEbtCSrxMKNZ即為你的WALLET_ID
    usb://ledger/DwWogDGHNM5wNxcwjkroMeK83NTLpZ7ZtEbtCSrxMKNZ?key=1'/0'
    
  4. 設定 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
    
  5. 使用普通的 keypair 熱錢包,創建一個 buffer account

    • 為什麼要先使用普通的 keypair 熱錢包,因為
      1. 部署 solana 合約需要將 program 字節碼上鏈,每筆交易最大 1K, 通常要發 500 + 筆交易,結果可能有:
      2. ledger 錢包受不了,連續按幾百上千次,, 這幾乎不可能
      3. 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
    
    
  6. 轉移 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
    
  7. 接下來,可以使用 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
    
  8. 如果合約已經部署,可以使用 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
    

參考:

  1. Deploy a Solana Program with the CLI
載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。