本篇文章假设你:
- 已经拥有了 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 连接 pnantom 钱包的时候会显示和命令行相同的地址 - 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
参考: