Solana智能合约终极部署指南:从入门到主网,定制你的专属靓号ProgramID保姆级教程:基于Anchor框架,带你丝滑完成密钥管理、多环境部署与实战避坑还在为Solana合约部署的繁琐流程而头疼吗?还在羡慕别人的项目拥有一个以项目名开头、炫酷又易记的合约地址(Progra
保姆级教程:基于 Anchor 框架,带你丝滑完成密钥管理、多环境部署与实战避坑
还在为 Solana 合约部署的繁琐流程而头疼吗?还在羡慕别人的项目拥有一个以项目名开头、炫酷又易记的合约地址(Program ID)吗?
本篇文章将为你揭开 Solana 开发的神秘面纱,通过强大的 Anchor 框架,手把手带你从零开始,不仅能轻松部署你的第一个智能合约,更能掌握定制专属靓号地址的独家秘笈!无论你是 Solana 开发新手,还是希望优化部署流程的资深玩家,这篇“保姆级”实操教程都将是你不可错过的宝典。让我们一起告别随机生成的无序地址,让你的项目从一个优雅的 Program ID 开始!
本文是一篇面向 Solana 开发者的全流程实战指南,详细介绍了如何使用 Anchor 框架部署智能合约,并重点讲解了如何为合约设置一个自定义的“靓号”地址(Program ID)。
文章内容覆盖了从生成一个具有特定前缀(如 Red...
)的靓号密钥对,到如何将其正确配置到 Anchor 项目的 lib.rs
和 Anchor.toml
文件中的每一步。此外,教程还深入探讨了开发者必备的密钥管理技巧,包括如何从 Phantom 等钱包导出私钥,并生成与 solana-cli
兼容的 .json
密钥文件,同时清晰地辨析了 solana-keygen
和 solana address
命令的差异与适用场景。
最后,文章通过本地网络(Localnet)和开发网络(Devnet)的真实部署案例,演示了完整的部署流程,并指出了在本地环境中可能遇到的权限问题及其解决方案,确保读者能够顺利地将自己的合约发布到 Solana 的公共网络上。
Red
开头的、易于识别的程序ID (Program ID)➜ solana-keygen grind --starts-with Red:1
Searching with 12 threads for:
1 pubkey that starts with 'Red' and ends with ''
Searched 1000000 keypairs in 1s. 0 matches found.
Searched 2000000 keypairs in 2s. 0 matches found.
Searched 3000000 keypairs in 4s. 0 matches found.
Searched 4000000 keypairs in 6s. 0 matches found.
Searched 5000000 keypairs in 7s. 0 matches found.
Wrote keypair to RedGJbeNejUtP6vMEPDkG55yRf7oAbkMFGeDjXaNfe1.json
使用 solana-keygen grind
命令生成以特定前缀开头的 Solana 密钥对
solana-keygen new
和 solana-keygen grind
生成的都是通用的密钥对。这个密钥对既可以被当成钱包来接收资产,也可以被用来部署合约而成为合约地址。它到底是什么,完全取决于你如何去使用它。
将您用 grind
生成的靓号密钥对文件,复制并重命名,覆盖掉 target/deploy/
目录下的那个临时文件。
cp -a RedGJbeNejUtP6vMEPDkG55yRf7oAbkMFGeDjXaNfe1.json ../target/deploy/red_packet-keypair.json
➜ solana address -k ./target/deploy/red_packet-keypair.json
RedGJbeNejUtP6vMEPDkG55yRf7oAbkMFGeDjXaNfe1
lib.rs
文件从你的靓号密钥对中复制出公钥(地址),然后粘贴到 src/lib.rs
文件顶部的 declare_id!
宏里面。
use anchor_lang::prelude::*;
declare_id!("RedGJbeNejUtP6vMEPDkG55yRf7oAbkMFGeDjXaNfe1");
Anchor.toml
文件将新地址更新到项目配置文件中。这能确保你的测试和客户端代码能正确找到程序。
# Anchor.toml
[programs.Mainnet]
red_packet = "RedGJbeNejUtP6vMEPDkG55yRf7oAbkMFGeDjXaNfe1"
[programs.devnet]
red_packet = "RedGJbeNejUtP6vMEPDkG55yRf7oAbkMFGeDjXaNfe1"
[programs.localnet]
red_packet = "RedGJbeNejUtP6vMEPDkG55yRf7oAbkMFGeDjXaNfe1"
默认情况下,anchor
和 solana
的命令行工具会使用您系统默认的钱包地址,通常位于 ~/.config/solana/id.json
。这个钱包地址主要用于支付部署和交易的 Gas 费,并且会成为您部署的程序的升级权限管理者 (Upgrade Authority)。
graph TD
A[开始] --> B[设置]
B --> C[管理账户]
C --> D[选择账户]
D --> E[显示私钥]
E --> F[输入密码]
F --> G[勾选 同意风险警告 继续]
G --> H[复制私钥]
H --> I[结束]
从已有的私钥生成 Solana 和 Anchor 工具所需要的 .json
密钥文件。
mkdir solana-wallet-demo && cd solanan-wallet-demo
pnpm init
pnpm add @solana/web3.js bs58
import { Keypair } from "@solana/web3.js";
import bs58 from "bs58";
import fs from "fs";
// --- 步骤 1: 在这里粘贴你的 Base58 格式私钥 ---
const privateKeyBase58 =
"5xcxxxxxxxxxxxxxxxxxxxxxxxx";
try {
// 步骤 2: 将 Base58 私钥解码为字节数组 (Uint8Array)
const secretKeyBytes = bs58.decode(privateKeyBase58);
// 步骤 3: 从解码后的密钥创建 Keypair 对象
// Keypair.fromSecretKey 会自动处理,无论输入是32字节的纯私钥还是64字节的密钥对
const keypair = Keypair.fromSecretKey(secretKeyBytes);
// 步骤 4: 将完整的密钥对(64字节)转换为数组格式
const keypairArray = Array.from(keypair.secretKey);
// 步骤 5: 将数组写入 .json 文件
const fileName = "6SWBzQWZndeaCKg3AzbY3zkvapCu9bHFZv12iiRoGvCD.json";
fs.writeFileSync(fileName, JSON.stringify(keypairArray));
console.log(`✅ 文件 ${fileName} 已成功生成!`);
console.log(`🔑 你的钱包地址 (公钥) 是: ${keypair.publicKey.toBase58()}`);
console.log("请验证这个地址是否与您预期的地址一致。");
} catch (error) {
if (error instanceof Error) {
console.error("❌ 生成失败,请检查你的私钥格式是否正确。", error.message);
} else {
console.error("❌ 生成失败,请检查你的私钥格式是否正确。", error);
}
}
Code/Solana/solana-wallet-demo is 📦 1.0.0 via ⬢ v23.11.0 on 🐳 v28.2.2 (orbstack)
➜ ts-node src/create-wallet.ts
✅ 文件 6SWBzQWZndeaCKg3AzbY3zkvapCu9bHFZv12iiRoGvCD.json 已成功生成!
🔑 你的钱包地址 (公钥) 是: 6SWBzQWZndeaCKg3AzbY3zkvapCu9bHFZv12iiRoGvCD
请验证这个地址是否与您预期的地址一致。
脚本执行后,同样会生成一个 .json
文件,并且会打印出对应的钱包地址(公钥),您可以用来核对是否正确。
Code/Solana/solana-wallet-demo is 📦 1.0.0 via ⬢ v23.11.0 on 🐳 v28.2.2 (orbstack)
➜ solana-keygen pubkey 6SWBzQWZndeaCKg3AzbY3zkvapCu9bHFZv12iiRoGvCD.json
6SWBzQWZndeaCKg3AzbY3zkvapCu9bHFZv12iiRoGvCD
Code/Solana/solana-wallet-demo is 📦 1.0.0 via ⬢ v23.11.0 on 🐳 v28.2.2 (orbstack)
➜ solana address -k 6SWBzQWZndeaCKg3AzbY3zkvapCu9bHFZv12iiRoGvCD.json
6SWBzQWZndeaCKg3AzbY3zkvapCu9bHFZv12iiRoGvCD
简单来说:solana-keygen
是一个专科医生,只负责处理密钥对;而 solana
是一个全科医生,负责所有与链上交互的事情,查询地址只是它众多功能中的一项。
下面我们用一个表格来详细对比:
特性 | solana-keygen pubkey ... |
solana address -k ... |
---|---|---|
工具归属 | solana-keygen |
solana (主命令行工具) |
核心职责 | 密钥对管理工具 纯粹的密码学操作 | 全功能网络交互客户端 与链上状态和配置打交道 |
核心功能 | 从一个密钥对文件中提取并显示公钥。它只关心文件本身,不关心任何外部配置。 | **显示... |
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!