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 连接 pnantom 钱包的时候会显示和命令行相同的地址
    • 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
加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。