Skip to content

Solana 私有链与Token

bash
# macOS
brew install solana
bash
solana-keygen new
# 生成私钥文件 ~/.config/solana/id.json

查看账户地址:

bash
solana address

输出:

bash
2LJPdSc2GAsQrkbn8mN1DMPwAi5FEFqnesNLBH9rK41L

Docker 启动私有链docker-compose.yaml

yaml
version: '3.8'

services:
  solana-test-validator:
    image: tchambard/solana-test-validator:latest
    container_name: solana-test-validator
    command: solana-test-validator --ledger ledger
    volumes:
      - /root/docker/solana-test-validator/ledger:/working-dir/ledger:rw
    ports:
      - "8899:8899"
      - "8900:8900"
    restart: unless-stopped

客户端配置:

bash
# Main Net
solana config set --url https://api.mainnet-beta.solana.com
# Dev Net
solana config set --url https://api.devnet.solana.com
# Local Net
solana config set --url http://127.0.0.1:8899
# Private Net
solana config set --url https://dev.flxdu.cn/solana

对账户~/.config/solana/id.json发放空投:

bash
solana airdrop 20

查询sol余额:

bash
solana balance

测试是否可用:

bash
solana ping

创建 Token

装个rust:

bash
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

安装 spl-token CLI

solana 包含了 spl-token 工具,因此只要你安装了 Solana CLI,你就可以直接使用 spl-token 工具。如果你没有安装 Solana CLI,可以通过以下步骤单独安装 spl-token

bash
cargo install spl-token-cli

cargo install 会自动从 Rust 的包管理系统(crates.io)下载并构建 spl-token-cli 工具。

验证安装

安装完成后,可以使用以下命令验证是否安装成功:

bash
spl-token --version

如果安装成功,会显示当前安装的 spl-token-cli 版本。

创建Token

接下来执行命令,都是以~/.config/solana/id.json私钥的身份执行的,如果有花费Sol的操作,均由~/.config/solana/id.json发出交易并支付Gas。

bash
spl-token create-token

输出类似如下:

bash
Creating token 7ojF7rnLawUCKMXVTMmU6aPLfDKKvw9Lzfj24oLB1vXq under program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA

Address:  7ojF7rnLawUCKMXVTMmU6aPLfDKKvw9Lzfj24oLB1vXq
Decimals:  9

Signature: 2Pazt9uhHrbVv9bBdBuw5p6ypiVNtMPJZWh1CZZq6C1axRJszPSP7cZg8nJhdpRLRWSczfbxWM1KERwuYAwqyTPa

收到了代币 ID 和签名。然后我们可以利用代币 ID 来检查代币的发行量:

bash
spl-token supply 7ojF7rnLawUCKMXVTMmU6aPLfDKKvw9Lzfj24oLB1vXq

创建一个代币账户

bash
# /.config/solana/id.json 针对代币 7ojF7rnLawUCKMXVTMmU6aPLfDKKvw9Lzfj24oLB1vXq 的账户地址
spl-token create-account 7ojF7rnLawUCKMXVTMmU6aPLfDKKvw9Lzfj24oLB1vXq

输出:

bash
Creating account EMhH7nif2cGtCbRFzfW5zL7M5gskLZEPEAp98R6QSQCC

Signature: 5YSvadDyYFpLetkkGh8aWibWe46Kf4WeFCZ95wsj12YHPRcjavHAssNBQKsdZ3p6vMV5RYmbZYD8fnJ1YECGmVtR

发行代币

bash
spl-token mint 7ojF7rnLawUCKMXVTMmU6aPLfDKKvw9Lzfj24oLB1vXq 10000000 EMhH7nif2cGtCbRFzfW5zL7M5gskLZEPEAp98R6QSQCC

输出如下:

bash
Minting 10000000 tokens
  Token: 7ojF7rnLawUCKMXVTMmU6aPLfDKKvw9Lzfj24oLB1vXq
  Recipient: EMhH7nif2cGtCbRFzfW5zL7M5gskLZEPEAp98R6QSQCC

Signature: 3pedDzGyHH5FshZKxnyjDTfhKE5cU6CTJqypiQgJPgcBsGhMcxrF4dRCCge7aSze3CCNBW58Z8PN1Gv1hZwbn7w7

检查账户余额: 一旦 mint 完成,你可以检查新代币账户的余额:

bash
# 此命令查询 ~/.config/solana/id.json 拥有代币 7ojF7rnLawUCKMXVTMmU6aPLfDKKvw9Lzfj24oLB1vXq 的数量
spl-token balance 7ojF7rnLawUCKMXVTMmU6aPLfDKKvw9Lzfj24oLB1vXq

创建一个账户2,用于接收转账:

bash
solana-keygen new -o solana2.key

账户2要创建针对此地址的代币账户:

bash
spl-token create-account 7ojF7rnLawUCKMXVTMmU6aPLfDKKvw9Lzfj24oLB1vXq

转账:

bash
# 从 ~/.config/solana/id.json 向 AX7iQ6senZ5NxDf6P63NGX2G7KTdywNuCtsSjDG9fuww 转出代币 7ojF7rnLawUCKMXVTMmU6aPLfDKKvw9Lzfj24oLB1vXq,数量100
spl-token transfer --fund-recipient 7ojF7rnLawUCKMXVTMmU6aPLfDKKvw9Lzfj24oLB1vXq 100 AX7iQ6senZ5NxDf6P63NGX2G7KTdywNuCtsSjDG9fuww

输出:

bash
Transfer 100 tokens
  Sender: EMhH7nif2cGtCbRFzfW5zL7M5gskLZEPEAp98R6QSQCC
  Recipient: AX7iQ6senZ5NxDf6P63NGX2G7KTdywNuCtsSjDG9fuww
  Recipient associated token account: AzHb1tc4dbKjYhYr2krkKjjedwXGFuWzYz4vzFPwQ96i
  Funding recipient: AzHb1tc4dbKjYhYr2krkKjjedwXGFuWzYz4vzFPwQ96i

Signature: bKVqSEtB6miMAgDuJikJcr4STgmuPHksM1Zj8sbeWVAvBhJqPSNkYd3NxUJa2aX9miuKv2jtcZDtdz4uwNNmGvX

查询默认账户余额:

bash
spl-token balance 7ojF7rnLawUCKMXVTMmU6aPLfDKKvw9Lzfj24oLB1vXq
# 输出 9999900

查询账户2余额:

bash
spl-token balance 7ojF7rnLawUCKMXVTMmU6aPLfDKKvw9Lzfj24oLB1vXq --owner AX7iQ6senZ5NxDf6P63NGX2G7KTdywNuCtsSjDG9fuww
# 输出 100

添加流动性

通过Raydium来添加流动性,raydium在主网和开发网上都部署了相关程序,地址在这里:https://docs.raydium.io/raydium/protocol/developers/addresses。

Raydium 的网站虽然允许设置自定义RPC连接,但是他仅支持主网,也就是说自定义RPC连接也必须是指向主网的RPC链接。

image-20250122030559977

solana 私有链 Nginx 反向代理

Docker 启动私有链之后,可以使用 Nginx 做反向代理:

nginx
   location /solana {
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_read_timeout 600s;
        proxy_send_timeout 600s;

        if ($http_upgrade = "websocket") {
            proxy_pass http://host.docker.internal:8900;
            break;
        }

        proxy_pass http://host.docker.internal:8899;
    }

Base58 私钥转 JSON

python
import base58
import json
from solders.keypair import Keypair


def base58_to_json(private_key_base58: str) -> list:
    # 将 Base58 编码的私钥转换为字节
    private_key_bytes = base58.b58decode(private_key_base58)

    # 确保私钥长度是 64 字节
    if len(private_key_bytes) != 64:
        raise ValueError("私钥长度不正确,应为 64 字节")

    # 创建一个 Solana Keypair 对象
    keypair = Keypair.from_bytes(private_key_bytes)
    pubkey = json.loads(keypair.pubkey().to_json())
    secretkey = list(keypair.secret())
    return secretkey + pubkey


# 将包含私钥和公钥的 JSON 数据转换回 Base58 编码的私钥字符串。
def json_to_base58(key: list) -> str:
    # 提取密钥信息
    if not isinstance(key, list) or len(key) != 64:
        raise ValueError("输入的 JSON 数据格式不正确,应为包含 64 个字节的列表")

    # 将密钥列表转换为字节数组
    private_key_bytes = bytes(key)

    # 确保长度为 64 字节
    if len(private_key_bytes) != 64:
        raise ValueError("密钥字节数组长度不正确,应为 64 字节")

    # 编码为 Base58
    private_key_base58 = base58.b58encode(private_key_bytes).decode("utf-8")
    return private_key_base58


if __name__ == "__main__":
    key_base58 = ""  # 私钥 Base58 字符串
    assert (len(key_base58) != 0)
    res = base58_to_json(key_base58)
    outputFile = "keypair_devnet.json"
    with open(outputFile, "w") as f:
        json.dump(res, f)

    with open(outputFile, "r") as f:
        assert json_to_base58(json.load(f)) == key_base58

修改私钥配置:

bash
solana config set --keypair keypair_devnet.json