Solana 智能合约终极部署指南:从入门到主网,定制你的专属靓号 Program ID

Solana智能合约终极部署指南:从入门到主网,定制你的专属靓号ProgramID保姆级教程:基于Anchor框架,带你丝滑完成密钥管理、多环境部署与实战避坑还在为Solana合约部署的繁琐流程而头疼吗?还在羡慕别人的项目拥有一个以项目名开头、炫酷又易记的合约地址(Progra

Solana 智能合约终极部署指南:从入门到主网,定制你的专属靓号 Program ID

保姆级教程:基于 Anchor 框架,带你丝滑完成密钥管理、多环境部署与实战避坑

还在为 Solana 合约部署的繁琐流程而头疼吗?还在羡慕别人的项目拥有一个以项目名开头、炫酷又易记的合约地址(Program ID)吗?

本篇文章将为你揭开 Solana 开发的神秘面纱,通过强大的 Anchor 框架,手把手带你从零开始,不仅能轻松部署你的第一个智能合约,更能掌握定制专属靓号地址的独家秘笈!无论你是 Solana 开发新手,还是希望优化部署流程的资深玩家,这篇“保姆级”实操教程都将是你不可错过的宝典。让我们一起告别随机生成的无序地址,让你的项目从一个优雅的 Program ID 开始!

本文是一篇面向 Solana 开发者的全流程实战指南,详细介绍了如何使用 Anchor 框架部署智能合约,并重点讲解了如何为合约设置一个自定义的“靓号”地址(Program ID)。

文章内容覆盖了从生成一个具有特定前缀(如 Red...)的靓号密钥对,到如何将其正确配置到 Anchor 项目的 lib.rsAnchor.toml 文件中的每一步。此外,教程还深入探讨了开发者必备的密钥管理技巧,包括如何从 Phantom 等钱包导出私钥,并生成与 solana-cli 兼容的 .json 密钥文件,同时清晰地辨析了 solana-keygensolana address 命令的差异与适用场景。

最后,文章通过本地网络(Localnet)和开发网络(Devnet)的真实部署案例,演示了完整的部署流程,并指出了在本地环境中可能遇到的权限问题及其解决方案,确保读者能够顺利地将自己的合约发布到 Solana 的公共网络上。

自定义地址(靓号地址)设置成项目合约地址(Program ID)实操 (可省略)

第一步:创建一个以 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 newsolana-keygen grind 生成的都是通用的密钥对。这个密钥对既可以被当成钱包来接收资产,也可以被用来部署合约而成为合约地址。它到底是什么,完全取决于你如何去使用它。

第二步:替换文件

将您用 grind 生成的靓号密钥对文件,复制并重命名,覆盖掉 target/deploy/ 目录下的那个临时文件。

cp -a RedGJbeNejUtP6vMEPDkG55yRf7oAbkMFGeDjXaNfe1.json ../target/deploy/red_packet-keypair.json

第三步:查询程序ID

➜ 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"

使用脚本生成 Solana 密钥文件

默认情况下,anchorsolana 的命令行工具会使用您系统默认的钱包地址,通常位于 ~/.config/solana/id.json。这个钱包地址主要用于支付部署和交易的 Gas 费,并且会成为您部署的程序的升级权限管理者 (Upgrade Authority)。

第一步:从 Phantom 钱包导出私钥

graph TD
A[开始] --> B[设置]
B --> C[管理账户]
C --> D[选择账户]
D --> E[显示私钥]
E --> F[输入密码]
F --> G[勾选 同意风险警告 继续]
G --> H[复制私钥]
H --> I[结束]

image-20250629111221163.png

第二步:使用脚本生成密钥文件(如有可忽略)

从已有的私钥生成 Solana 和 Anchor 工具所需要的 .json 密钥文件。

创建项目并初始化

mkdir solana-wallet-demo && cd solanan-wallet-demo
pnpm init

安装依赖

pnpm add @solana/web3.js bs58

create-wallet.ts 文件

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 (主命令行工具)
核心职责 密钥对管理工具 纯粹的密码学操作 全功能网络交互客户端 与链上状态和配置打交道
核心功能 从一个密钥对文件中提取并显示公钥。它只关心文件本身,不关心任何外部配置。 **显示...

剩余50%的内容订阅专栏后可查看

点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
寻月隐君
寻月隐君
0xE91e...6bE5
不要放弃,如果你喜欢这件事,就不要放弃。如果你不喜欢,那这也不好,因为一个人不应该做自己不喜欢的事。