使用ledger部署和升级solana合约

本篇文章假设你:

已经拥有了 solana 的基础知识

有使用 Anchor 编程的基本经验

已经安装了 solana 相关的命令行工具

有一个 ledger 硬件钱包

查看 ledger 的 Wallet ID

当你将多个 ledger 连接到同一台计算机时，可以使用 Wallet ID 来指定要使用的 ledger 钱包

如果你只打算在计算机上使用单个 ledger，则无需包含 Wallet ID

Copy
solana-keygen pubkey usb://ledger

查看 SOL 钱包地址

查看 SOL 钱包的命令行:

Copy
# 查看第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>

其中DERIVATION_PATH 为了和 phantom 钱包保持一致，使用 x/0, 这样 ledger 连接 pnantom 钱包的时候会显示和命令行相同的地址

Keypair URL 参数在ZSH中被忽略，需要修改~/.zshrc, 添加一行 unsetopt nomatch

如果有多个 ledger, 可以根据 keypair url 反向查询 WALLET_ID, 例如:

Copy
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 网络

Copy
pkill solana-test-validator
rm -rf test-ledger/
solana-test-validator

设置 sol 网络和默认钱包

Copy
# 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

Copy
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

转移 buffer authority 给 ledger 钱包

执行命令行

Copy
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 权限

Copy
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

查询程序状态

Copy
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 升级 solana 程序

先使用普通 keypair 钱包 buffer account

Copy
solana program write-buffer target/deploy/curve_launchpad.so \
--keypair ~/.config/solana/id.json

Buffer: 9suJnc9cY7ZFiNPe39me1wsNqxsM9HnrokouNTnqWVV

再转移 buffer authority 给 ledger 钱包

Copy
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

Copy
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

查看程序状态

Copy
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

参考:

Deploy a Solana Program with the CLI