核心概念

合约参考

Solana 合约定义

权威定义: 本文档是 Microcosm Solana 合约的单一真相源。

最后更新: 2026-02-02

状态: ✅ 8 个合约全部主网部署完成,Token 使用 SPL Token + Metaplex Metadata,MCC Mint Authority 已放弃 (None),MCD Mint Authority 保留

2026-02-02: 🔄 SPL Token + Metaplex 迁移完成 - MCC/MCD 从 Token-2022 切换到 SPL Token,解决 Solscan/钱包 Logo 显示问题

2026-01-30: Reincarnation 合约添加 USDT 支持 - 所有稳定币视为等价 (1 USDC = 1 USDT = 1 USD)

2026-01-29: 主网部署完成 - 8 个合约部署

2026-01-23: MCD Token 合约新增账户关闭指令 - close_user_mcd_account 支持僵尸账户租金回收

2026-01-21: MCD Token 合约新增白名单功能 - 3 个白名单管理指令 + consume_mcd 自动验证

2026-01-20: Reincarnation 合约升级完成 - 新增 execute_mining + execute_monthly_cycle 指令


一、已部署合约

1.1 合约概览

⚠️ 重要概念区分

  • Token Mint = 代币本身的账户地址,由 SPL Token 程序管理
  • 业务合约 Program ID = 我们开发的 Anchor 程序(铸造/分发/消费等业务逻辑)
  • 两者完全不同!Token Mint 重新部署会变,业务合约升级时 Program ID 不变

业务合约 (我们开发的 Anchor 程序)

合约Program ID状态说明
MCC ProgrammCCUkDxoDfnVjTQjQHWkVi1PWBU2jxfQGJUhhDbeq5x✅ 主网运行中 (2026-01-31 重新部署)MCC 铸造/分发业务逻辑
MCD ProgramMcDVieuEFv5ucnM3C7p8wsT6LY8BAipKDrTG9HjAu3R✅ 主网运行中MCD 积分业务逻辑
LendingLENCJ9MYbnTrMJgh8vBLpHnMkzrj6JP6m6XWvgA7jqz✅ 主网运行中MCC 质押借贷
Territory NFTTeRxGfJEyixj1NM7bwprGoPtQ7j5PdZncQnsTZCyH17✅ 主网运行中领地 NFT
AuctionAucBs7tZhsSYqYSJrE4LEF4uMNHxq7p5mWtzU4UghQkd✅ 主网运行中领地拍卖
Level VerifierVPt7uKujw7YrCbFasXZdS3nK3o3TbbuXJ1RYktTCsG7✅ 主网运行中用户等级验证
FragmentFRGBrfuzTE9vjZVKBFA4eHgqyLdg5gPsJc8gLx3bSnPv✅ 主网运行中NFT 碎片化
ReincarnationREn8oKyydvjRsistZ2cVi6tksPubvR3bEuLdVTyGknb✅ 主网运行中MCC/MCD 轮回

Token 层 (由 Solana 官方 SPL Token 程序管理)

TokenToken Mint 地址Genesis ATA供应量
MCCMCCpDtigJLYnfGe1fW5xrSA8AXo6AeAj8ECE7wVqP5eD77aFnhcRr5PFgmb5TdFngcYyzM6ig2HXzUSYCJSHz7i10 亿
MCDMCDXTiLK6idQSycdb8QkwKYVP8HEbfe4JbJZjC7FktyDfLGbEV6FDSsG5BaFeCDLMrr9LKMupDQvENvp9943QiC100 亿

Token Program: TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA (Solana SPL Token)

2026-02-02: MCC/MCD 切换到 SPL Token + Metaplex Metadata,Solscan/钱包完美支持

1.2 关键地址 (主网)

名称地址用途
Genesis Authority (Mainnet)MCWe3gEYqTjRCShEkhqbMXhcR4xP2dz29gurSpLbk4A主网部署/升级/签名
MCC Mint (Mainnet)MCCpDtigJLYnfGe1fW5xrSA8AXo6AeAj8ECE7wVqP5eMCC 代币铸造地址 (10 亿枚,SPL Token + Metaplex)
MCC Genesis ATAD77aFnhcRr5PFgmb5TdFngcYyzM6ig2HXzUSYCJSHz7iMCC 创世池 ATA
MCD Mint (Mainnet)MCDXTiLK6idQSycdb8QkwKYVP8HEbfe4JbJZjC7FktyMCD 积分铸造地址 (100 亿枚,SPL Token + Metaplex)
MCD Genesis ATADfLGbEV6FDSsG5BaFeCDLMrr9LKMupDQvENvp9943QiCMCD 创世池 ATA
Reincarnation USDC VaultET3NjENp8TiL8KyL1zFpq1Qiyfy8vxDAcHciyXLbmrkQx402 支付接收地址(轮回池 USDC 金库,合约控制)

1.3 钱包管理

主网 Authority 地址:

MCWe3gEYqTjRCShEkhqbMXhcR4xP2dz29gurSpLbk4A

查询主网余额:

bash
curl -s https://api.mainnet-beta.solana.com -X POST -H "Content-Type: application/json" -d '{
  "jsonrpc": "2.0", "id": 1,
  "method": "getBalance",
  "params": ["MCWe3gEYqTjRCShEkhqbMXhcR4xP2dz29gurSpLbk4A"]
}' | python -c "import sys,json; d=json.load(sys.stdin); print(f'{d[\"result\"][\"value\"]/1e9:.4f} SOL')"

获取密钥:

bash
# 主网 Authority
gcloud secrets versions access latest --secret=solana-mainnet-authority --project=double-helix-9f030

二、MCC Token 合约

2.1 基本信息 (主网 - SPL Token + Metaplex)

⚠️ 区分:MCC Program (业务合约) ≠ Token Program (Solana 官方 SPL Token)

业务合约 (我们开发的)

项目
MCC ProgrammCCUkDxoDfnVjTQjQHWkVi1PWBU2jxfQGJUhhDbeq5x
MCC Mining Config PDA7RB17e42pe5xY5vwe7wvwbaQDHmnahAGHThYcQt1uf1M (bump: 255)

Token 层 (由 SPL Token 管理)

项目
Token ProgramTokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA (SPL Token)
MCC Mint (主网)MCCpDtigJLYnfGe1fW5xrSA8AXo6AeAj8ECE7wVqP5e
MCC Genesis ATAD77aFnhcRr5PFgmb5TdFngcYyzM6ig2HXzUSYCJSHz7i
总供应量10 亿 MCC(永不增发)✅ 2026-02-02 SPL Token 重新部署
Mint Authority已放弃 (None) ✅ 2026-02-10 确认
小数位9
MetadataMetaplex Token Metadata V3

2026-02-02: MCC Token 切换到 SPL Token + Metaplex Metadata,全部 10 亿枚铸造到 Genesis ATA,Mint Authority 已放弃 (None)。Logo 可在 Solscan 和钱包中正常显示。

2.2 指令列表

2026-01-20 更新: 移除 initialize_user_vaultwithdraw,User PDA 托管设计已废弃

指令用途
initialize_tokenMCC 代币初始化
initialize_mining_config铸造配置(减半规则)
initialize_vaults团队/政务官金库
process_mining_paymentUSDC 铸造(50-10-10-30 分配)
admin_mining_reward管理员铸造奖励(基于交易盈亏)
update_mcc_price更新 MCC 价格(预言机)
set_halt_status设置系统停机状态
get_mining_stats查询铸造统计信息
cycleMCC 轮回(x402 卖出)
dao_create / dao_contributeDAO 募资

2.3 分配规则


三、MCD Token 合约

3.1 基本信息 (主网 - SPL Token + Metaplex)

⚠️ 区分:MCD Program (业务合约) ≠ Token Program (Solana 官方 SPL Token)

业务合约 (我们开发的)

项目
MCD ProgramMcDVieuEFv5ucnM3C7p8wsT6LY8BAipKDrTG9HjAu3R
MCD Config PDA9ru4MVNzxHM7ADgSTSYZaRNJ7JVS2mT3QXg9tZri7mYp (2026-01-31 初始化)

Token 层 (由 SPL Token 管理)

项目
Token ProgramTokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA (SPL Token)
MCD Mint (主网)MCDXTiLK6idQSycdb8QkwKYVP8HEbfe4JbJZjC7Fkty
MCD Genesis ATADfLGbEV6FDSsG5BaFeCDLMrr9LKMupDQvENvp9943QiC
总供应量100 亿 MCD ✅ 2026-02-02 SPL Token 重新部署
Mint Authority保留 ✅ MCD 内部积分,保留铸造权
小数位9
汇率1 MCD = 1 USDC(固定)
MetadataMetaplex Token Metadata V3

2026-02-02: MCD Token 切换到 SPL Token + Metaplex Metadata,解决 Solscan/钱包 Logo 显示问题。MCD Config PDA 已初始化完成。

3.2 关键 PDA (主网)

PDA地址Seeds状态
MCD Config9ru4MVNzxHM7ADgSTSYZaRNJ7JVS2mT3QXg9tZri7mYpb"mcd_config"✅ 已初始化 (2026-01-31)
Genesis PoolH6TjQWbch58vvj9vT4fShJH5y4YQ4SrUsDLYA3SWRnywb"mcd_genesis_pool"PDA (无 Token 账户)
Recycle PoolFwkEqJNZvDsbJJHnkCuwPeBvF93qQXZKr5JW52J5AJGTb"mcd_recycle_pool"PDA (无 Token 账户)
MCD Genesis ATADfLGbEV6FDSsG5BaFeCDLMrr9LKMupDQvENvp9943QiCATA✅ 100 亿 MCD

Station MCD Vault (待重新初始化)

Territory ID 规范: Station 使用 stations.id 生成 Territory ID(如 S-00001),不使用 units.id

⚠️ 2026-02-02: MCD 切换到 SPL Token 后,Station Vault ATA 需要重新初始化

Station IDTerritory IDVault PDAVault ATA (SPL Token)状态
1S-00001GayhXUqw5Esy7VGF269Vz3K75wLcLDEtu9za91YDHauGG6vcWY4BW81HMnPeiDL1BSEUkaDDFBgZ48SKfMEWtbwe✅ 已初始化 (2026-02-02)

PDA 计算公式:

python
# Station Vault PDA
seeds = [b"station_vault", station_id.to_le_bytes()]  # station_id 是 u64
vault_pda, bump = Pubkey.find_program_address(seeds, MCD_PROGRAM_ID)

# Station Vault ATA (SPL Token)
vault_ata = get_associated_token_address(MCD_MINT, vault_pda, TOKEN_PROGRAM_ID)

3.3 PDA Seeds(重要!)

python
# Python 和 Rust 代码必须使用相同的 seeds
MCD_CONFIG_SEED = b"mcd_config"
MCD_GENESIS_POOL_SEED = b"mcd_genesis_pool"
MCD_RECYCLE_POOL_SEED = b"mcd_recycle_pool"
STATION_VAULT_SEED = b"station_vault"      # 没有 mcd_ 前缀!
USER_MCD_SEED = b"user_mcd"                 # 不是 user_mcd_account!
MCD_WHITELIST_SEED = b"mcd_whitelist"       # 白名单 PDA (2026-01-21 新增)

3.4 指令列表

2026-01-23 更新: 新增 close_user_mcd_account 账户关闭指令,支持僵尸账户租金回收

2026-01-21 更新: 新增白名单管理指令(add_to_whitelist, remove_from_whitelist, update_whitelist_status)

指令用途权限
initialize_mcd / initialize_mcd_config初始化 MCD Token 和配置管理员
initialize_station_vaultStation 金库 PDA管理员
initialize_user_mcd_account用户 MCD PDA 账户管理员
mint_mining_mcd铸造 MCD 到金库(30%)管理员
mint_genesis_supply铸造创世供应到 Genesis Pool管理员
distribute_daily_mcd每日 1% 分配给 Miner管理员
consume_mcdMCD 消费(自动验证白名单)管理员
mcd_mining_paymentMCD 铸造支付(70% 回收,30% 铸造)管理员
close_user_mcd_account关闭用户 MCD 账户(租金回收)管理员
add_to_whitelist添加项目到白名单管理员
remove_from_whitelist从白名单移除项目管理员
update_whitelist_status更新白名单状态(暂停/激活)管理员
migrate_config / fix_config_bump合约迁移和修复管理员

3.5 MCD 白名单机制(2026-01-21 新增)

设计目的: 确保 MCD 保持为系统控制的积分,而非自由流通的代币。

白名单 PDA 结构:

rust
pub struct McdWhitelist {
    pub project_id: u64,           // 项目 ID
    pub wallet_address: Pubkey,    // 项目方 MCD 钱包地址
    pub project_name: [u8; 64],    // 项目名称(最多 64 字节)
    pub registered_at: i64,        // 注册时间戳
    pub status: u8,                // 0=active, 1=suspended
    pub updated_at: i64,           // 最后更新时间戳
    pub bump: u8,                  // PDA bump
}

白名单验证流程:

  1. 用户调用 consume_mcd 消费 MCD
  2. 合约自动验证目标项目是否在白名单中(通过 PDA seeds 查找)
  3. 验证项目方钱包地址是否匹配白名单记录
  4. 验证项目状态是否为 active(未被暂停)
  5. 验证通过后执行 MCD 转账(用户 PDA → 项目方钱包)

白名单管理:

  • 管理员通过 add_to_whitelist 添加项目,提供 project_id、wallet_address、project_name
  • 管理员通过 update_whitelist_status 暂停(suspend)或激活(active)项目
  • 管理员通过 remove_from_whitelist 完全移除项目(关闭 PDA 账户)

状态常量:

rust
pub const STATUS_ACTIVE: u8 = 0;      // 激活状态,可接收 MCD
pub const STATUS_SUSPENDED: u8 = 1;   // 暂停状态,拒绝 MCD 转账

3.6 账户关闭与租金回收(2026-01-23 新增)

设计目的: 关闭僵尸 MCD 账户,回收链上 SOL 租金到 Genesis Authority。

3.6.1 close_user_mcd_account 指令

rust
pub fn close_user_mcd_account(ctx: Context<CloseUserMcdAccount>) -> Result<()> {
    // 1. 验证 Token Account 余额为 0
    // 2. 关闭 User Token Account (ATA),租金返回 rent_receiver
    // 3. 关闭 UserMcdAccount PDA,租金返回 rent_receiver
}

#[derive(Accounts)]
pub struct CloseUserMcdAccount<'info> {
    #[account(mut)]
    pub authority: Signer<'info>,  // MCD 管理员

    #[account(
        mut,
        seeds = [USER_MCD_SEED, &user_mcd_account.uid.to_le_bytes()],
        bump,
        close = rent_receiver
    )]
    pub user_mcd_account: Account<'info, UserMcdAccount>,

    #[account(
        mut,
        associated_token::mint = mcd_mint,
        associated_token::authority = user_mcd_account,
        constraint = user_token_account.amount == 0 @ McdError::AccountNotEmpty
    )]
    pub user_token_account: Account<'info, TokenAccount>,

    /// CHECK: rent_receiver 接收回收的租金 (Genesis Authority)
    #[account(mut)]
    pub rent_receiver: AccountInfo<'info>,

    pub mcd_mint: Account<'info, Mint>,
    pub token_program: Program<'info, Token>,
    pub system_program: Program<'info, System>,
}

3.6.2 账户租金明细

账户类型大小租金 (SOL)
User Token Account (ATA)165 bytes~0.00203928
UserMcdAccount PDA~72 bytes~0.00089
合计~0.00293

3.6.3 僵尸账户判定条件

管理员可关闭同时满足以下条件的账户:

  1. MCD 余额 = 0
  2. 未加入任何 Station (station_id IS NULL)
  3. 超过 180 天未登录

3.6.4 租金回收地址

Genesis Authority: Gq8ubUZwFrBgscZjerWHZCTYXXFMN2b8W6kRyaKMQYJo

3.6.5 安全约束

  • 只有 MCD 管理员 (authority) 可以执行关闭
  • 只能关闭余额为 0 的账户(合约强制校验)
  • 所有关闭操作记录到数据库(mcd_account_closures 表)

3.6.6 链上租金验证机制(2026-01-24 新增)

设计目的: 确保数据库记录的租金与链上实际回收金额一致,避免预估值与实际值不符。

验证流程:

  1. 查询 Authority SOL 余额 (balance_before)
  2. 执行 close_user_mcd_account 交易
  3. 查询 Authority SOL 余额 (balance_after)
  4. 计算实际回收租金 = balance_after - balance_before
  5. 将实际值写入数据库(非预估值)

Python 实现:

python
# mcd_solana_client.py

async def close_user_mcd_account(self, uid: int) -> dict:
    # 🔍 链上验证 Step 1: 记录关闭前 Authority 余额
    balance_before = await self.solana_client.get_balance(self.authority.pubkey())

    # 构建并发送关闭交易...
    signature = await self.solana_client.send_transaction(tx, self.authority)
    await self.solana_client.confirm_transaction(signature)

    # 🔍 链上验证 Step 2: 记录关闭后 Authority 余额
    balance_after = await self.solana_client.get_balance(self.authority.pubkey())

    # 🔍 链上验证 Step 3: 计算实际回收租金
    rent_recovered_lamports = balance_after - balance_before
    rent_recovered_sol = rent_recovered_lamports / 1e9

    return {
        'signature': str(signature),
        'rent_recovered_lamports': rent_recovered_lamports,
        'rent_recovered_sol': rent_recovered_sol
    }

降级策略:

场景处理方式
链上验证成功使用实际回收值 rent_recovered_sol
链上验证失败(RPC 错误等)使用预估值 0.00361 SOL 作为降级
余额差值为负或异常记录警告日志,使用预估值

为什么预估值是 0.00361 而不是 0.00293:

  • 理论计算值: Token Account (~0.00204) + PDA (~0.00089) = ~0.00293 SOL
  • 实际测试值: 0.00361 SOL(包含链上交易的额外租金返还)
  • 链上验证确保使用实际值,预估值仅作为降级兜底

3.6.7 后端 API

端点方法功能
/api/mcd/admin/zombie-accountsGET获取僵尸账户列表
/api/mcd/admin/close-account/{uid}POST关闭单个账户
/api/mcd/admin/batch-close-accountsPOST批量关闭账户
/api/mcd/admin/rent-statisticsGET获取租金统计
/api/mcd/admin/closure-historyGET获取关闭历史

四、Lending 合约

4.1 基本信息

项目
Program ID5JRnecaAZNfF1bBjdW93JB8VFJVpWWDkR3NKg2jHnMPQ
ProgramDataFksPZc5UTYfMCf8PiHgi4E5D7R8FAoN644vfsSGxMhw8
合约大小451 KB
部署费用3.21 SOL

4.2 已初始化账户(2026-01-15)

账户地址类型
Lending Pool9qyYsbHebyxLMQmgLmfPdP74vESvUSv7xxhDajoH4HE4PDA
LP Mint144sJixjMTdJrKFVrdZBQSSqeorxEvkr2dZGUxV3NnsmPDA
Vault8NGHVECRLyhWYFmyT332uPfFFEy2P5Sd3TvPQojXP5sNATA
NFT OracleFqu5YMqRmq5ckWn1x4kjtHxGq5DMWsGTai3VkaxHnKKkPDA

4.3 PDA Seeds

typescript
const LENDING_POOL_SEED = "mcc_lending_pool";
const LP_MINT_SEED = "mcc_lp_mint";
const NFT_PRICE_ORACLE_SEED = "nft_price_oracle";
// Vault 是 ATA,不使用 seeds

4.4 Vault 地址计算(重要!)

typescript
import { getAssociatedTokenAddressSync } from "@solana/spl-token";

// Vault 是 ATA,不是自定义 PDA!
// allowOwnerOffCurve = true,因为 owner 是 PDA
const vault = getAssociatedTokenAddressSync(MCC_MINT, lendingPool, true);

4.5 初始化参数

typescript
{
  pool_name: "mcc-lending-pool",
  base_rate: 1000,           // 10% APR
  optimal_utilization: 8000, // 80%
  slope1: 1000,              // 10%
  slope2: 8000,              // 80%
}

4.6 贷款规则

规则
支持资产只支持 MCC(不支持 USDC)
LTV100%
最高 APR100%
清算条件连续 3 次未还款

4.7 指令 Discriminator(已验证)

typescript
const DISCRIMINATORS = {
  initializeLendingPool: [236, 76, 136, 68, 196, 14, 9, 177],
  initializeLpMint: [205, 250, 9, 201, 188, 220, 164, 60],     // IDL 自动生成值错误!
  initializeVault: [48, 191, 163, 44, 71, 129, 63, 164],
  initializeNftOracle: [6, 80, 1, 161, 115, 198, 249, 112],
};

4.8 后端集成状态(2026-01-16)

组件文件状态
Solana Clientblockchain-service/app/utils/lending_client.py✅ 已实现
Service Layerblockchain-service/app/services/lending_service.py✅ 已实现
API Routesblockchain-service/app/routes/lending.py✅ 已实现
Proxy Routesorganization-service/app/routes/organizations/lending.py✅ 已实现
前端 APIportal-service/lib/api/services.ts✅ 已实现
Open APIopen-api-service/fastapi_app/routers/lending.py✅ 已实现

API 端点:

端点方法说明
/api/lending/poolGET获取借贷池配置
/api/lending/statsGET获取借贷池统计
/api/lending/position/<wallet>GET获取用户仓位
/api/lending/loans/<wallet>GET获取用户贷款列表
/api/lending/loan/<wallet>/<id>GET获取贷款详情
/api/lending/lp-balance/<wallet>GET获取 LP 余额
/api/lending/calculate-interestPOST计算利息
/api/lending/estimate-borrow-costPOST估算借款成本
/api/lending/deposit/preparePOST准备存款交易
/api/lending/withdraw/preparePOST准备取款交易
/api/lending/borrow/preparePOST准备借款交易
/api/lending/repay/preparePOST准备还款交易
/api/lending/liquidate/preparePOST准备清算交易

Open API 端点 (/v1/lending):

端点方法说明
/v1/lending/poolGET获取借贷池配置
/v1/lending/statsGET获取借贷池统计
/v1/lending/position/{wallet}GET获取用户仓位
/v1/lending/loans/{wallet}GET获取用户贷款列表
/v1/lending/loan/{wallet}/{loan_id}GET获取贷款详情
/v1/lending/lp-balance/{wallet}GET获取 LP 余额
/v1/lending/calculate-interestPOST计算利息
/v1/lending/estimate-borrow-costPOST估算借款成本

五、构建与部署规范

5.1 版本要求

组件版本备注
Solana CLI3.0.10Anza 发行版
Anchor CLI0.30.1cargo 安装
Rust1.86+系统 Rust

5.2 Cargo.toml 必须配置

toml
[dependencies]
anchor-lang = { version = "0.30.1", features = ["init-if-needed"] }
anchor-spl = { version = "0.30.1", features = ["token", "associated_token", "metadata"] }

# 关键!固定 blake3 版本避免 edition2024 问题
blake3 = "=1.7.0"

5.3 Cloud Build 命令

必须使用 --region=asia-northeast1,禁止使用 global 区域!

bash
# 构建
gcloud builds submit --config=cloudbuild.yaml --project=double-helix-9f030 --region=asia-northeast1

# 部署
gcloud builds submit --config=cloudbuild-deploy.yaml --project=double-helix-9f030 --region=asia-northeast1

5.4 密钥管理

所有密钥存储在 GCP Secret Manager:

Secret用途
solana-genesis-keypairAuthority(部署/升级)
solana-lending-keypairLending Program ID
solana-territory-nft-keypairTerritory NFT Program ID
solana-auction-keypairAuction Program ID
solana-level-verifier-keypairLevel Verifier Program ID
bash
# 获取密钥
gcloud secrets versions access latest --secret=solana-genesis-keypair --project=double-helix-9f030

六、已知问题与解决方案

6.1 Anchor 0.30.1 TypeScript 客户端 Bug

问题: 使用 program.methods.xxx().accounts().rpc() 初始化 PDA 时出现 "writable privilege escalated" 错误。

解决方案: 绕过 Anchor 客户端,使用原生 TransactionInstruction

typescript
const ix = new TransactionInstruction({
  keys: [
    { pubkey: authority.publicKey, isSigner: true, isWritable: true },
    { pubkey: lendingPool, isSigner: false, isWritable: true },
    { pubkey: MCC_MINT, isSigner: false, isWritable: false },
    { pubkey: SystemProgram.programId, isSigner: false, isWritable: false },
  ],
  programId: PROGRAM_ID,
  data: Buffer.concat([discriminator, ...args]),
});

6.2 IDL Discriminator 不正确

问题: anchor build 生成的 IDL 中 discriminator 可能错误。

解决方案: 手动计算验证:

javascript
const crypto = require('crypto');
const hash = crypto.createHash('sha256');
hash.update('global:initialize_lp_mint');  // snake_case
const discriminator = [...hash.digest().slice(0, 8)];
// [205, 250, 9, 201, 188, 220, 164, 60]

6.3 edition2024 兼容性

问题: blake3 >= 1.8 需要 edition2024,但 Solana platform-tools 的 Cargo 是 1.84。

解决方案: 在 Cargo.toml 中固定 blake3 = "=1.7.0"


七、Territory NFT 合约

7.1 基本信息

项目
Program IDipYLo2aitVyNXGzCgpiaKKA2JLvtbBvMHiV7qKZTPVZ
ProgramDataGsnqy6dxni66faY52J7Q6tGGijn6wrA1fY4F78g2Hfex
合约大小~490 KB
部署费用~3.5 SOL

7.2 已初始化账户(2026-01-16)

账户地址类型
Collection ConfigFy3mbmJCgDXvhHzQhm7gMAGgNpvPXLXNs7nBnaaAgkVQPDA
Collection MintBvV8jWSkLfw7GQthdrsqF6DZm91aVDbcEbpDWYNP88STKeypair
Collection Token Account7NH3fokZ3v9RRqFeeh9juq4YCjEfWatFC8MUdc7VxRfhKeypair
Collection MetadataFGAJFhEmYCicDdk2teMbcxYdKJ2MsjaSc9DEwSic3PB9Metaplex PDA
Collection Master EditionHn8HJYERA6foCRuw2vxpVCNaYFWdxXbXZtpAswMHxvfWMetaplex PDA

7.3 PDA Seeds

typescript
const COLLECTION_SEED = "territory_collection";
const TERRITORY_NFT_SEED = "territory_nft";

7.4 指令列表

指令用途Discriminator
initialize_configStep 1: 创建 Collection Config PDA[208, 127, 21, 1, 194, 190, 196, 70]
initialize_collection_nftStep 2: 创建 mint/metadata/edition[232, 111, 94, 240, 74, 97, 50, 238]
mint_station_nft铸造 Station NFT-
mint_matrix_nft铸造 Matrix NFT-
mint_sector_nft铸造 Sector NFT-
mint_system_nft铸造 System NFT-
transfer_nft转移 NFT 所有权-
burn_nft销毁 NFT-

7.5 领地 NFT 类型

类型代码容量说明
Station01000 用户最基础的领地单元
Matrix110 Station由 10 个 Station 组成
Sector210 Matrix由 10 个 Matrix 组成
System310 Sector由 10 个 Sector 组成

7.6 栈溢出问题与解决方案

问题: 在 Devnet/Mainnet 上执行 InitializeCollection 时出现 Access violation in stack frame 错误。

原因: Solana 程序栈限制 4KB,多个 init 约束 + CPI 调用导致栈溢出。特性 EenyoWx9UMXYKpR8mW5Jmfmy2fRjzUtM7NduYMY8bx33 在 devnet/mainnet 未启用。

解决方案:

  1. 将初始化拆分为两步(initialize_config + initialize_collection_nft
  2. 使用 Box<Account<>> 将账户移到堆上
  3. 使用 #[inline(never)] 将 CPI 调用拆分到独立函数

7.7 后端集成状态(2026-01-16)

组件文件状态
Solana 客户端blockchain-service/app/utils/territory_nft_client.py✅ 完成
业务服务层blockchain-service/app/services/territory_service.py✅ 完成
API 路由blockchain-service/app/routes/territory.py✅ 完成
代理路由organization-service/app/routes/organizations/territory.py✅ 完成
前端 APIportal-service/lib/api/services.ts✅ 完成
Open APIopen-api-service/fastapi_app/routers/territory.py✅ 完成

API 端点:

  • GET /api/territory/config - 获取 Collection 配置
  • GET /api/territory/holdings/<wallet> - 获取 NFT 持有量
  • GET /api/territory/nft/<mint> - 获取 NFT 详情
  • GET /api/territory/list/<wallet> - 获取用户 NFT 列表
  • POST /api/territory/mint - 铸造 NFT [管理员]
  • POST /api/territory/transfer/prepare - 准备 NFT 转移
  • POST /api/territory/burn/prepare - 准备 NFT 销毁

Open API 端点 (/v1/territory):

端点方法说明
/v1/territory/collectionGET获取 Collection 配置
/v1/territory/nft/{mint}GET获取 NFT 元数据
/v1/territory/nfts/{wallet}GET获取用户 NFT 列表
/v1/territory/unit/{unit_id}/nftGET获取领地关联 NFT

八、Auction 合约

8.1 基本信息

项目
Program ID6JRmShodszZca3ez7GfDkmsRSzTi5ELwscWCDgjsteJx
ProgramData3ji7ahcBepzeyntEFwnSMaHC7uFKg1C285i2uLWzgTF1
合约大小~347 KB
部署费用~2.47 SOL

8.2 已初始化账户(2026-01-16)

账户地址类型
Auction Config32h5ZUhd4cqAw42JQqy8geWz44MGpgbX9pdykRP8LyhJPDA

8.3 PDA Seeds

typescript
const AUCTION_CONFIG_SEED = "auction_config";
const AUCTION_SEED = "auction";
const BID_SEED = "bid";
const MCC_ESCROW_SEED = "mcc_escrow";

8.4 初始化参数

typescript
{
  min_bid_increment_percent: 5,  // 5%
  auction_duration: 604800,       // 7 天
  extension_duration: 600,        // 10 分钟
  extension_threshold: 300,       // 5 分钟
}

8.5 指令列表

指令用途Discriminator
initialize_auction_config初始化拍卖配置[94, 1, 96, 31, 46, 102, 88, 102]
create_auction创建拍卖-
place_bid出价(托管 MCC)-
cancel_bid取消出价(退还 MCC)-
complete_auction结算拍卖-
cancel_auction取消拍卖-

8.6 收益分配规则

拍卖类型收益归属
首拍(First)100% 团队
二拍(Secondary)100% 原政务官

8.7 后端集成状态(2026-01-16)

组件文件状态
Solana Clientblockchain-service/app/utils/auction_client.py✅ 已实现
Service Layerblockchain-service/app/services/auction_solana_service.py✅ 已实现
API Routesblockchain-service/app/routes/auction_solana.py✅ 已实现
Proxy Routesorganization-service/app/routes/organizations/auction_solana.py✅ 已实现
前端 APIportal-service/lib/api/services.ts✅ 已实现
Open APIopen-api-service/fastapi_app/routers/auction_solana.py✅ 已实现

API 端点:

端点方法说明
/api/auction-solana/configGET获取拍卖配置
/api/auction-solana/activeGET获取活跃拍卖列表
/api/auction-solana/<id>GET获取拍卖详情
/api/auction-solana/<id>/bidsGET获取出价列表
/api/auction-solana/createPOST创建拍卖 [管理员]
/api/auction-solana/bid/preparePOST准备出价交易
/api/auction-solana/<id>/completePOST结算拍卖 [管理员]
/api/auction-solana/<id>/cancelPOST取消拍卖 [管理员]

Open API 端点 (/v1/auction-solana):

端点方法说明
/v1/auction-solana/configGET获取拍卖配置
/v1/auction-solana/activeGET获取活跃拍卖列表
/v1/auction-solana/auction/{auction_id}GET获取拍卖详情
/v1/auction-solana/auction/{auction_id}/bidsGET获取竞价历史
/v1/auction-solana/bids/{wallet}GET获取用户竞价记录
/v1/auction-solana/auctions/{wallet}GET获取用户创建的拍卖

九、Level Verifier 合约

9.1 基本信息

项目
Program ID8TSuNuR1Carh8GpjqrZiVo3oz1nC2K9FSy6BhqbWb3ek
ProgramData9H8tZdrfbuJ5LBYoZiiNNdCptjGnh3Qv1QJuq26knmXu
合约大小~302 KB
部署费用~2.15 SOL

9.2 已初始化账户(2026-01-16)

账户地址类型
Verifier ConfigEF3sYSzXeWEHPjquTX3GaqiRpFn8VGWfNvEwzfZZGBEGPDA

9.3 PDA Seeds

typescript
const VERIFIER_CONFIG_SEED = "verifier_config";
const USER_PROFILE_SEED = "user_profile";
const MINING_RECORD_SEED = "mining_record";

9.4 初始化参数

typescript
{
  territory_nft_program: "ipYLo2aitVyNXGzCgpiaKKA2JLvtbBvMHiV7qKZTPVZ",  // Territory NFT 合约
  mcc_token_program: "FDRy2jpKqXD5pp8Xj2arEbEm78nCEcRnKCmGxBTiFWxr",     // MCC Token 合约
}

9.5 指令列表

指令用途说明
initialize_config初始化验证器配置管理员执行一次
update_config更新验证器配置管理员可更新程序地址
initialize_user_profile创建用户档案用户注册时调用
bind_wallet绑定钱包Recruit → Prospect
record_mining_day记录铸造日CronJob 调用
verify_miner_upgrade验证 Miner 升级≥21 天铸造
verify_commander_upgrade验证 Commander 升级≥1 Station NFT
verify_pioneer_upgrade验证 Pioneer 升级≥10 Station NFT
verify_warden_upgrade验证 Warden 升级≥10 Matrix NFT
verify_admiral_upgrade验证 Admiral 升级≥10 Sector NFT
check_level_demotion检查降级NFT 转让后

9.6 用户级别体系

级别英文升级条件验证方式
1Recruit注册账户链下
2Prospect绑定钱包 + 开始铸造链上
3Miner30天内铸造 ≥21天链上
4Commander≥1 Station NFT链上
5Pioneer≥10 Station NFT链上
6Warden≥10 Matrix NFT链上
7Admiral≥10 Sector NFT链上

9.7 后端集成 (2026-01-16 完成)

服务版本:

服务版本说明
blockchain-servicev1.2.3Level API + async 修复
organization-servicev2.1.20Level 代理层

API 端点 (organization-service):

端点方法功能
/level/configGET获取验证器配置
/level/profile/<wallet>GET获取用户链上档案
/level/status/{uid}GET获取用户等级状态
/level/initPOST初始化链上档案
/level/upgradePOST请求等级升级
/level/syncPOST同步链上等级

CronJob: k8s/level-sync-cronjob.yaml

  • 执行时间: UTC 00:20 (每日)
  • 功能: 记录铸造日、检查降级、同步等级

十、Fragment 合约

10.1 基本信息

项目
Program IDJ7wyftDtfzqn2pbpLr8QPqKQkAxecgVze75SUz9D4Fq3
合约大小~497 KB
部署费用~3.5 SOL

10.2 已初始化账户(2026-01-16)

账户地址类型
Fragment Config4bihhgqevyvTpBN5A73JyD2jxMQbbw3JGejtCpNzkzKVPDA

10.3 PDA Seeds

typescript
const FRAGMENT_CONFIG_SEED = "fragment_config";
const FRAGMENT_VAULT_SEED = "fragment_vault";
const FRAGMENT_MINT_SEED = "fragment_mint";
const BUYOUT_SEED = "buyout";
const BUYOUT_VAULT_SEED = "buyout_vault";

10.4 初始化参数(默认值)

typescript
{
  min_fragments: 100,            // 最小碎片数量
  max_fragments: 10000,          // 最大碎片数量
  buyout_duration: 604800,       // 买断期限: 7天
}

10.5 指令列表

指令用途说明
initialize_config初始化协议配置管理员执行一次
fragmentize_nft碎片化 NFT将 NFT 拆分成碎片代币
redeem_nft赎回 NFT需持有所有碎片
transfer_fragments转让碎片碎片自由流通
initiate_buyout发起买断设置每碎片价格
accept_buyout接受买断出售碎片给买家
complete_buyout完成买断买家收集所有碎片后
cancel_buyout取消买断仅发起者可执行
update_config更新配置管理员操作

10.6 碎片化流程

1. NFT 拥有者调用 fragmentize_nft ↓ 2. 创建 Fragment Vault(托管 NFT) ↓ 3. 创建 Fragment Mint(碎片代币) ↓ 4. 铸造碎片代币到拥有者账户 ↓ 5. 碎片可自由交易 ↓ 6. 收集所有碎片后调用 redeem_nft 赎回原 NFT

10.7 买断机制

阶段说明
发起持有者设置每碎片价格,创建 Buyout 账户
接受其他持有者可选择出售碎片获取 USDC
完成买家收集所有碎片后获得 NFT
取消发起者可取消,退还已支付款项

10.8 后端集成状态(2026-01-16)

组件文件状态
Solana Clientblockchain-service/app/utils/fragment_client.py✅ 已实现
Service Layerblockchain-service/app/services/fragment_service.py✅ 已实现
API Routesblockchain-service/app/routes/fragment.py✅ 已实现
Proxy Routesorganization-service/app/routes/organizations/fragment.py✅ 已实现
前端 APIportal-service/lib/api/services.ts✅ 已实现
Open APIopen-api-service/fastapi_app/routers/fragment.py✅ 已实现

API 端点:

端点方法说明
/api/fragment/configGET获取碎片化协议配置
/api/fragment/vault/<nft_mint>GET获取碎片化金库
/api/fragment/balance/<wallet>/<nft_mint>GET获取碎片余额
/api/fragment/buyout/<nft_mint>/<initiator>GET获取买断请求
/api/fragment/fragmentize/preparePOST准备碎片化交易
/api/fragment/redeem/preparePOST准备赎回交易
/api/fragment/buyout/initiate/preparePOST准备发起买断
/api/fragment/buyout/accept/preparePOST准备接受买断
/api/fragment/buyout/complete/preparePOST准备完成买断
/api/fragment/buyout/cancel/preparePOST准备取消买断

Open API 端点 (/v1/fragment):

端点方法说明
/v1/fragment/configGET获取 Fragment 配置
/v1/fragment/vaultsGET获取所有 Vault
/v1/fragment/vault/{vault_id}GET获取 Vault 详情
/v1/fragment/vault/{vault_id}/holdersGET获取 Vault 持仓分布
/v1/fragment/holdings/{wallet}GET获取用户 Fragment 持仓

十一、Reincarnation 合约(轮回/回购)

2026-02-02 迁移: MCC/MCD 切换到 SPL Token,Vault 已重新初始化,使用 InterfaceAccount 和 TokenInterface 支持双标准

2026-01-30 升级: 添加 USDT 铸造支持,所有稳定币视为等价 (1 USDC = 1 USDT = 1 USD)

2026-01-29 主网部署: 合约已部署到主网,Pool 和 Vaults 已初始化完成

2026-01-20 升级: 新增 execute_miningexecute_monthly_cycle 指令,实现铸造分发和月度轮回功能

11.1 基本信息

项目
Program IDREn8oKyydvjRsistZ2cVi6tksPubvR3bEuLdVTyGknb
状态主网运行中
代码路径solana-contracts/reincarnation/
初始部署2026-01-19 (Devnet)
主网部署2026-01-29

11.1.1 已初始化账户 (主网)

2026-01-30 更新: 添加 USDT Vault 支持

2026-01-29 主网部署完成: Pool 和所有 Vaults 已初始化。

账户地址类型
Program IDREn8oKyydvjRsistZ2cVi6tksPubvR3bEuLdVTyGknbUpgradeable
Reincarnation PoolH3azAs4vdPKa1zVJ74dkGyUtNzpobE8fDKAn4BmZ26itPDA (bump: 255)
USDC VaultET3NjENp8TiL8KyL1zFpq1Qiyfy8vxDAcHciyXLbmrkQATA
USDT VaultAVCMbMqcsUZQXiTbvSbX2nrrDfpcyT2Kb1xrxAPkxfAATA (2026-01-30 初始化完成)
MCC VaultDhS2L2ga55iaMHbk3VAPYr43HaQv4Q8ft2eXYkdkofWjATA (SPL Token, 2026-02-02 迁移)
MCD Vault2hG2FsxRSEdiZdq86p9NMA9XxWvsEBx1DL3NT6d9eEHoATA (SPL Token, 2026-02-02 迁移)
AuthorityMCWe3gEYqTjRCShEkhqbMXhcR4xP2dz29gurSpLbk4AMainnet Authority

11.1.2 支持的稳定币 (2026-01-30 新增)

稳定币Mint 地址Vault 地址状态
USDCEPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1vET3NjENp8TiL8KyL1zFpq1Qiyfy8vxDAcHciyXLbmrkQ✅ 可用
USDTEs9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYBAVCMbMqcsUZQXiTbvSbX2nrrDfpcyT2Kb1xrxAPkxfA✅ 可用

设计原则: 所有稳定币视为等价 (1 USDC = 1 USDT = 1 USD),base_price 代表 MCC 的美元价格

11.1.3 初始化参数 (主网)

参数说明
pool_nameMCC Reincarnation Pool池名称
base_price1,000,0001 USDC (6 decimals)
premium_bps5005% 溢价
daily_limit100,000,000,000100,000 USDC 每日限额

11.1.4 硬编码创世地址 (constants.rs - 主网)

2026-02-02 更新: MCC/MCD 切换到 SPL Token + Metaplex,Genesis ATA 地址已更新

常量地址说明
MCC_GENESIS_AUTHORITYMCWe3gEYqTjRCShEkhqbMXhcR4xP2dz29gurSpLbk4A主网 Authority,铸造分发 + 月度轮回接收
MCC_MINTMCCpDtigJLYnfGe1fW5xrSA8AXo6AeAj8ECE7wVqP5eMCC Token Mint (SPL Token)
MCC_GENESIS_ATAD77aFnhcRr5PFgmb5TdFngcYyzM6ig2HXzUSYCJSHz7iMCC 创世池 ATA (主网)
MCD_GENESIS_POOLDfLGbEV6FDSsG5BaFeCDLMrr9LKMupDQvENvp9943QiCMCD 创世池 ATA (主网)

安全设计: 创世地址硬编码在合约常量中,编译后不可修改,防止资金被转移到错误地址

11.2 功能概述

轮回合约(Reincarnation)是 MCC 回购协议的链上实现:

  • 核心功能: 用户使用 MCC 换取 USDC(回购)
  • 回购价格: base_price × 1.05(+5% 溢价)
  • 价格来源: 预言机服务(Oracle)
  • MCC 处理: 回购的 MCC 进入 burn vault,后续可销毁

11.2.1 价格架构

价格数据流向:

  1. 价格来源层: 市场价格 (Pyth/Raydium) [优先级1] / 管理员价格 (Open API) [优先级2]
  2. 预言机服务 (每4小时): 计算 30天 x 4小时收盘价均值 (180数据点),调用 contract.update_price(base_price)
  3. Reincarnation 合约 (价格唯一真实来源): 存储 base_price, premium_bps=500 (5%),计算 buyback_price = base_price x 1.05
  4. 下游消费者:
    • 数据库缓存 (每小时同步): 用途为前端展示,非交易用途
    • 用户回购 (x402实时): 直接从合约读取价格,钱包签名执行交易

核心原则:

  1. 合约是价格的唯一真实来源 (Single Source of Truth)
  2. 轮回合约不关心价格来源,只认预言机
  3. 用户交易从合约读取价格,不从数据库

预言机价格来源优先级:

优先级来源说明
1市场价格 (Pyth/Raydium)MCC 上线 DEX 后可用
2管理员价格 (Open API)当前阶段主要来源
3默认价格 (10 USDC)兜底价格

更新频率:

组件更新频率触发方式
预言机服务每 4 小时定时任务
合约价格预言机更新后 立即预言机调用 update_price
数据库缓存每小时CronJob 从合约同步
用户交易实时直接从合约读取

11.3 PDA Seeds

typescript
const REINCARNATION_POOL_SEED = "reincarnation_pool";
const USDC_VAULT_SEED = "usdc_vault";
const MCC_BURN_VAULT_SEED = "mcc_burn_vault";
const BUYBACK_RECORD_SEED = "buyback_record";

11.4 指令列表

指令用途说明
initialize_poolStep 1: 初始化轮回池配置创建 PDA,设置价格/溢价/限额
initialize_vaultsStep 2: 初始化金库创建 USDC/MCC vault ATA
execute_buyback执行回购用户 MCC → USDC
execute_mining执行铸造分发50-10-10-30 分发 (2026-01-20 新增)
execute_monthly_cycle月度轮回每月1日转回创世地址 (2026-01-20 新增)
update_price更新基础价格管理员/Oracle 调用
withdraw_usdc提取 USDC管理员提取流动性
pause_pool暂停池暂停回购功能
unpause_pool恢复池恢复回购功能
close_old_vault_ata关闭旧 Vault ATA回收废弃 Token-2022 ATA 租金 (2026-02-02 新增)

11.4.1 execute_mining 指令详情

用途: 执行铸造 MCC/MCD 分发

分配比例 (50-10-10-30):

  • 50% MCC → 用户外部钱包 ATA
  • 10% MCC → Team Vault
  • 10% MCC → 4级政务官代管钱包 (4%+3%+2%+1%)
  • 30% MCD → Station Vault

MCC 分发目标地址 (Mainnet - 2026-02-02 SPL Token 更新):

名称钱包地址MCC ATA (SPL Token)比例
Team Vault4HenU6EH44Kdxq6jnjU3w5mTTtwC8VHzdZkGiKKMEPWhAkcGSBr23ZuYvca89cgAmADJFgZ9cRQJVZSfX69oMago10%
team_station5uo1HYjQXokE9UAd8UYiwAKomL5WACqpQMbV2Ftk7pXx8wJD1bpkh1MiqHskkA1Bp7FTDiFKARd1dibNDiU9sPST4%
team_matrix7GptS1XqVjmkBhVrUXUDQV7293NZKbNf8SQ5Lk5JLCJD8AnVXYf7WvgF6VDgDcwpYCh8JN8QfDNaYQ2NERGpXwwf3%
team_sector5Lq2sx4FLsMANijGkn19twNKmyLrnmzeoxYbyBB3r82xGiLe4n2Eo89tzQYkuQHaTMRunbR4wxBxy1MAM3vMi1xR2%
team_system3HwYuVB4F5KVjQeCXoruSUiuu6G8qCdmkE4NsyMMQfFo4v6WbmsKCQLQDh19g7qjtneUh3XQjtTrz6xaT4tRLtD41%

注意: 4级政务官使用独立代管钱包,便于未来政务官拍卖后资金追溯和转移。

首次拍卖收款钱包 (2026-01-24 新增):

用途钱包名称钱包地址
首次领地拍卖收款team_auctionGgga8grwEneqn2gFHmDFkHqkFydyzabHzHNoSJpWKZ6b

账户参数:

rust
pub struct ExecuteMining<'info> {
    pub authority: Signer<'info>,           // Genesis Authority 签名
    pub reincarnation_pool: Account<'info>, // Pool PDA
    pub user_mcc_account: Account<'info>,   // 用户外部钱包 ATA
    pub team_vault: Account<'info>,         // Team Vault
    pub magistrate_pool: Account<'info>,    // Magistrate Pool
    pub station_vault: Account<'info>,      // Station MCD Vault
    pub mcc_genesis_ata: Account<'info>,    // MCC 创世 ATA
    pub mcd_genesis_pool: Account<'info>,   // MCD 创世池
    pub token_program: Program<'info>,
}

11.4.2 execute_monthly_cycle 指令详情

用途: 月度轮回 - 将 MCC/MCD Vault 中的余额转回创世地址

执行条件:

  • 只有 authority 可以调用
  • 合约内校验:只允许每月 1 日执行
  • 防重放:检查距上次执行是否超过 25 天

CronJob: k8s/monthly-cycle-cronjob.yaml

  • Schedule: "30 0 1 * *" (每月 1 日 UTC 00:30)

安全保障:

攻击方式防护措施
黑客调用指令authority 签名验证,没有私钥无法调用
篡改目标地址MCC/MCD 创世地址硬编码在常量
非 1 日调用合约内 day_of_month == 1 校验
同月重复调用last_cycle_timestamp 检查

11.5 回购流程

1. 用户调用 execute_buyback(mcc_amount) ↓ 2. 合约计算 usdc_amount = mcc_amount × buyback_price / 10^3 ↓ 3. 用户 MCC 转入 mcc_burn_vault ↓ 4. usdc_vault 中的 USDC 转给用户 ↓ 5. 更新统计(total_mcc_bought, total_usdc_paid)

11.6 参数配置(默认值)

注意: 以下是合约默认值,主网实际初始化值请参见 11.1.2 初始化参数 (主网)

参数默认值说明
base_price10,000,00010 USDC (6 decimals) - 默认值
premium_bps5005% 溢价
daily_limit1,000,000,000,0001M USDC 每日限额 - 默认值
min_buyback_amount10,000,000,000最小 10 MCC
max_buyback_amount100,000,000,000,000最大 100,000 MCC

11.6.1 ReincarnationPool 结构体解析(重要!)

⚠️ 2026-01-29 修复: Anchor String 使用 4字节长度 + 实际内容,不是固定 32 字节!

ReincarnationPool 结构体布局:

Offset Field Size 说明 ------ ----- ---- ---- 0 discriminator 8 Anchor 账户标识 8 name (String) 4 + N 4字节长度 + N字节实际内容(动态!) 8+4+N authority 32 管理员 Pubkey ... mcc_mint 32 ... usdc_mint 32 ... mcd_mint 32 ... usdc_vault 32 ... mcc_vault 32 ... mcd_vault 32 (共 7 个 Pubkey = 224 字节) ... base_price 8 u64 ... premium_bps 8 u64 ... price_updated_at 8 i64 (之前常被遗漏!) ... paused 1 bool (之前常被遗漏!) ... daily_limit 8 u64 ... daily_used 8 u64 ... last_reset_day 8 i64 ... (buyback stats) 24 3 × u64 ... (mining stats) 32 4 × u64 ... (cycle stats) 32 1 × i64 + 3 × u64 ... created_at 8 i64 ... bump 1 u8 ... _reserved 32 保留字段

正确的 Python 解析示例:

python
offset = 8  # 跳过 discriminator

# name: Anchor String = 4字节长度 + 实际内容
name_len = struct.unpack_from('<I', raw, offset)[0]
offset += 4
pool_name = raw[offset:offset + name_len].decode('utf-8')
offset += name_len  # ✅ 只跳过实际长度,不是固定 32 字节!

# 7 个 Pubkeys
offset += 224

# base_price, premium_bps
base_price = struct.unpack_from('<Q', raw, offset)[0]
offset += 8
premium_bps = struct.unpack_from('<Q', raw, offset)[0]
offset += 8

# price_updated_at - 不要漏掉!
price_updated_at = struct.unpack_from('<q', raw, offset)[0]
offset += 8

# paused - 不要漏掉!
paused = raw[offset] != 0
offset += 1

# daily_limit
daily_limit = struct.unpack_from('<Q', raw, offset)[0]

常见错误:

错误原因后果
offset += 32 代替 offset += name_len假设名称固定 32 字节后续所有字段偏移错误
漏掉 price_updated_at 字段未仔细阅读结构体定义daily_limit 等字段读取垃圾值
漏掉 paused 字段1 字节 bool 容易遗忘偏移量错位 1 字节

11.7 Token 地址 (2026-02-02 SPL Token + Metaplex 升级)

重要: MCC/MCD 已切换到 SPL Token + Metaplex Metadata,Solscan/钱包完美支持

Token地址 (主网)地址 (Devnet)小数位Token Program
MCC MintMCCpDtigJLYnfGe1fW5xrSA8AXo6AeAj8ECE7wVqP5e-9SPL Token
MCD MintMCDXTiLK6idQSycdb8QkwKYVP8HEbfe4JbJZjC7Fkty-9SPL Token
MCC Genesis ATAD77aFnhcRr5PFgmb5TdFngcYyzM6ig2HXzUSYCJSHz7i---
MCD Genesis ATADfLGbEV6FDSsG5BaFeCDLMrr9LKMupDQvENvp9943QiC---
USDC Mint (Devnet Test)-6aW6K4BW6UtzRJTj6YHqT5XDex3bYBv8pkm4X9Lj1osf6SPL Token

SPL Token + Metaplex 特性:

  • MCC: 供应量 10 亿,名称 "Microcosm Coin",符号 "MCC"
  • MCD: 供应量 100 亿,名称 "Microcosm Dollar",符号 "MCD"
  • MCC Mint Authority: 已放弃 (None),MCD Mint Authority: 保留 (MCWe3gEYqTjRCShEkhqbMXhcR4xP2dz29gurSpLbk4A)
  • Metadata: 通过 Metaplex Token Metadata V3 管理 (name/symbol/uri)

11.8 部署步骤

bash
cd solana-contracts/reincarnation

# 1. 安装依赖
yarn install

# 2. 构建合约
anchor build

# 3. 获取 Program ID
solana address -k target/deploy/reincarnation-keypair.json

# 4. 更新 Anchor.toml 和 lib.rs 中的 Program ID

# 5. 重新构建
anchor build

# 6. 部署到 Devnet
anchor deploy --provider.cluster devnet

# 7. 运行初始化脚本
yarn init

11.9 集成状态(2026-01-20 更新)

前端集成: ✅ 已完成(使用 Solana Wallet Adapter 直接调用链上合约)

组件文件状态
TypeScript 客户端portal-service/lib/solana/reincarnation-client.ts✅ 完成
页面组件portal-service/components/reincarnation/ReincarnationPage.tsx✅ 完成
Wallet Providerportal-service/components/providers/SolanaWalletProvider.tsx✅ 完成

后端集成: ✅ 已完成 (2026-01-20)

组件文件状态
Solana Clientblockchain-service/app/utils/reincarnation_client.py✅ 完成
x402 路由blockchain-service/app/routes/x402.py✅ 完成
Monthly CronJobk8s/monthly-cycle-cronjob.yaml✅ 完成

后端关键功能:

  • execute_mining() - 执行链上 MCC/MCD 分发
  • execute_monthly_cycle() - 执行月度轮回
  • get_pool_info() - 获取轮回池状态

x402 非托管铸造流程:

  1. 用户 USDC 支付是独立交易(用户签名)
  2. 后端验证链上交易
  3. 后端调用 execute_mining(只需 authority 签名)
  4. 链上分发 MCC/MCD (50-10-10-30)

x402 非托管回购流程:

  • 回购操作使用 x402 非托管支付协议
  • 用户钱包直接与链上合约交互,平台不托管用户资金
  • 前端使用 Solana Wallet Adapter(支持 Phantom、Solflare 等)
  • execute_buyback 指令将用户 MCC 转入 MCC Vault,从 USDC Vault 支付 USDC 给用户

十二、合约部署状态汇总

🎉 2026-01-29 主网部署完成: 所有 8 个合约已部署到主网!

合约Program ID状态最新更新
MCC TokenFDRy2jpKqXD5pp8Xj2arEbEm78nCEcRnKCmGxBTiFWxr主网运行中2026-01-29
MCD TokenJ9UwVmFEr7ujLcp19T8nqpDnpBLcDzpL4cpwh5TMSd36主网运行中2026-01-29
Lending5JRnecaAZNfF1bBjdW93JB8VFJVpWWDkR3NKg2jHnMPQ主网运行中2026-01-29
Territory NFTipYLo2aitVyNXGzCgpiaKKA2JLvtbBvMHiV7qKZTPVZ主网运行中2026-01-29
Auction6JRmShodszZca3ez7GfDkmsRSzTi5ELwscWCDgjsteJx主网运行中2026-01-29
Level Verifier8TSuNuR1Carh8GpjqrZiVo3oz1nC2K9FSy6BhqbWb3ek主网运行中2026-01-29
FragmentJ7wyftDtfzqn2pbpLr8QPqKQkAxecgVze75SUz9D4Fq3主网运行中2026-01-29
ReincarnationREn8oKyydvjRsistZ2cVi6tksPubvR3bEuLdVTyGknb主网运行中2026-01-29

Token Mint 汇总 (主网) - 2026-02-02 SPL Token + Metaplex 升级

TokenMint 地址总供应量Mint AuthorityToken Program
MCCMCCpDtigJLYnfGe1fW5xrSA8AXo6AeAj8ECE7wVqP5e10 亿枚✅ 保留 (MCWe3...)SPL Token
MCDMCDXTiLK6idQSycdb8QkwKYVP8HEbfe4JbJZjC7Fkty100 亿枚✅ 保留 (MCWe3...)SPL Token

版本历史

版本日期更新内容
v1.02026-01-15初始版本,包含 MCC/MCD/Lending 合约定义
v1.12026-01-16添加 Territory NFT 合约(含栈溢出解决方案)
v1.22026-01-16添加 Auction 合约
v1.32026-01-16添加 Level Verifier 合约
v1.42026-01-16Level Verifier 添加 update_config 指令,修正 territory_nft_program 地址
v1.52026-01-16添加 Fragment 合约(NFT 碎片化协议)
v1.62026-01-16Level Verifier 后端集成完成(blockchain-service v1.2.3)
v1.72026-01-16Territory NFT 后端集成完成
v1.82026-01-16Auction 后端集成完成
v1.92026-01-16Fragment 后端集成完成
v2.02026-01-16Lending 后端集成完成
v2.12026-01-16前端 API + Open API v1.1.0 完成(Territory/Auction/Fragment/Lending)
v2.22026-01-16前端页面集成完成,8 个合约/服务全部 100% 集成
v2.32026-01-17Territory NFT 浏览器完成,文档同步更新
v2.42026-01-18MCC Token Mint 重新部署,供应量从 100 亿修复为正确的 10 亿
v2.52026-01-19添加 Reincarnation 合约(轮回/回购协议),代码完成待部署
v2.62026-01-19Reincarnation 前端集成完成(Solana Wallet Adapter),修复 USDC Mint 地址
v2.72026-01-19重构 Reincarnation 价格机制:预言机服务作为价格聚合层,合约为唯一真实来源
v2.82026-01-20Reincarnation 合约升级: 新增 execute_mining + execute_monthly_cycle 指令
v2.92026-01-20添加 MCD Vault (9t5Kv8Qn14mgwe97gfBwSsxA2CFj8ZwnsSAsUNK3Tpca),重命名 mcc_burn_vault → mcc_vault
v3.02026-01-20后端集成完成 (reincarnation_client.py),添加 monthly-cycle-cronjob.yaml
v4.02026-01-29🎉 主网部署完成: 8 个合约全部部署到主网,MCC (20亿) + MCD (100亿) Token Mint 已创建
v4.12026-01-31Mint Authority 状态更新: MCC Mint Authority 已放弃 (None),MCD Mint Authority 保留
v5.02026-02-02🔄 SPL Token + Metaplex 迁移完成: MCC/MCD 从 Token-2022 切换到 SPL Token + Metaplex Metadata,解决 Solscan/钱包 Logo 显示问题
v5.12026-02-02Reincarnation v1.4.0: 添加 close_old_vault_ata 指令,回收废弃 Token-2022 ATA 租金
v5.22026-02-02后端 ATA 计算修复: reincarnation_client.py 和 mcd_solana_client.py 切换到 SPL Token Program ID

Token-2022 → SPL Token 迁移记录 (2026-02-02)

重要: Token-2022 版本已废弃,以下旧地址仅作记录,不再使用!

废弃原因:

  • Token-2022 的 Metaplex Metadata 支持不完善
  • Solscan/钱包显示 Logo/Name 需要 Metaplex,而 Metaplex 不支持 Token-2022
  • 切换到 SPL Token + Metaplex Metadata 标准

旧 Token-2022 地址(已废弃):

名称旧地址状态
MCC Token Mint (Token-2022)5WRLP7HB3VtQtA9QmUzA6Bs8ViMKPs3Fkr4b1f1nuhKH❌ 已废弃
MCC Genesis ATA (Token-2022)BDZBCDDAdpk9PxEEoUTBxUZKBjtmkpwzmtmGijggtqGS❌ 已废弃,已 burn + close
MCD Token Mint (Token-2022)8EuRvXfjDsGGhNmAGfoeVXQWFbWY4A4rJGY9H1NfLEGr❌ 已废弃
MCD Genesis ATA (Token-2022)ELjvTLShfWvQAe94Mc1vMxnaVVsKY8yD2DazGZ1nGGTS❌ 已废弃,已 burn + close
Reincarnation MCC Vault (Token-2022)D2g1WAs3b9tH78pzgxtpqpYv64f11J7hLq9R294rrhtx❌ 已关闭,租金已回收
Reincarnation MCD Vault (Token-2022)FJ2PFRYMArzHRTESoGSd7x1Xo7hmeeqhuhqhUPqyCfk5❌ 已关闭,租金已回收
Station 1 MCD Vault ATA (Token-2022)BpWvEJ8N8zWPwk1jZ3RL2gbHfRyxUojie3oNztRJwjZ9❌ 已关闭,租金已回收

新 SPL Token 地址(当前使用):

名称新地址说明
MCC Token MintMCCpDtigJLYnfGe1fW5xrSA8AXo6AeAj8ECE7wVqP5eSPL Token + Metaplex
MCC Genesis ATAD77aFnhcRr5PFgmb5TdFngcYyzM6ig2HXzUSYCJSHz7i10 亿枚
MCD Token MintMCDXTiLK6idQSycdb8QkwKYVP8HEbfe4JbJZjC7FktySPL Token + Metaplex
MCD Genesis ATADfLGbEV6FDSsG5BaFeCDLMrr9LKMupDQvENvp9943QiC100 亿枚
Reincarnation MCC VaultDhS2L2ga55iaMHbk3VAPYr43HaQv4Q8ft2eXYkdkofWjSPL Token
Reincarnation MCD Vault2hG2FsxRSEdiZdq86p9NMA9XxWvsEBx1DL3NT6d9eEHoSPL Token
Station 1 MCD Vault ATAG6vcWY4BW81HMnPeiDL1BSEUkaDDFBgZ48SKfMEWtbweSPL Token

SOL 回收:

  • 详见 docs/SOL回收指南.md
  • 总计回收约 3.36 SOL(Program Buffer + 旧 ATA 租金)

⚠️⚠️⚠️ ATA 地址计算问题 (2026-02-02 重要修复) ⚠️⚠️⚠️

核心问题: 不同的 Token Program ID 会导致相同的 owner + mint 计算出完全不同的 ATA 地址

ATA 地址计算公式:

python
# ATA = PDA([owner, token_program, mint], ATA_PROGRAM_ID)
# 关键:token_program 参与 seeds 计算!

# SPL Token ATA (正确)
ata_spl = get_associated_token_address(mint, owner, TOKEN_PROGRAM_ID)
# TOKEN_PROGRAM_ID = TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA

# Token-2022 ATA (错误 - 会计算出不同地址)
ata_2022 = get_associated_token_address(mint, owner, TOKEN_2022_PROGRAM_ID)
# TOKEN_2022_PROGRAM_ID = TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb

实际案例 - Station 1 MCD Vault:

Token ProgramVault PDA (相同)计算出的 ATA (不同!)状态
SPL TokenGayhXUqw5Esy7VGF269Vz3K75wLcLDEtu9za91YDHauGG6vcWY4BW81HMnPeiDL1BSEUkaDDFBgZ48SKfMEWtbwe✅ 正确
Token-2022GayhXUqw5Esy7VGF269Vz3K75wLcLDEtu9za91YDHauG33wxwR1XpcWFxN4Q31kHmGMGMxzVyeAYP9S19XhhArR6❌ 错误

后端修复 (2026-02-02):

文件修复内容
reincarnation_client.pyget_associated_token_address() 默认使用 SPL Token Program ID
mcd_solana_client.pyget_associated_token_address() 默认使用 SPL Token Program ID

修复代码示例:

python
def get_associated_token_address(mint: Pubkey, owner: Pubkey, token_program: Pubkey = None) -> Pubkey:
    # ⚠️ 关键:默认使用 SPL Token (2026-02-02 切换到 SPL Token + Metaplex)
    if token_program is None:
        token_program = TOKEN_PROGRAM_ID  # 不是 TOKEN_2022_PROGRAM_ID!

    seeds = [bytes(owner), bytes(token_program), bytes(mint)]
    return Pubkey.find_program_address(seeds, ASSOCIATED_TOKEN_PROGRAM_ID)[0]

开发注意事项:

  1. MCC/MCD 使用 SPL Token,所有 ATA 计算必须使用 TOKEN_PROGRAM_ID
  2. 不要假设 ATA 地址在不同 Token Program 间相同 - 它们完全不同
  3. 链上交易中的 token_program AccountMeta 必须与 ATA 计算时使用的一致
  4. 后端代码中搜索 TOKEN_2022_PROGRAM_ID,确保所有涉及 MCC/MCD 的地方都已切换到 TOKEN_PROGRAM_ID

十二、前端页面集成状态

12.1 集成概览

合约/服务页面组件集成度修改日期
MCC TokenWalletPage, MiningPage100%-
MCD TokenMCDPage100%-
AuctionAuctionsPage100%-
LendingLendingPage100%2026-01-16
Territory NFTStationDetailPage100%2026-01-16
Level VerifierProfilePage100%2026-01-16
FragmentFragmentPage100%2026-01-16
x402 APIapi.ts, services.ts100%2026-01-16

12.2 页面修复详情

页面修改内容文件路径
LendingPage从模拟数据改为真实 API 调用components/lending/LendingPage.tsx
StationDetailPage添加 Territory NFT 显示和铸造功能components/stations/StationDetailPage.tsx
ProfilePage添加用户等级状态卡片、铸造进度、升级进度components/profile/ProfilePage.tsx
FragmentPage新建完整的 NFT 碎片化交易页面components/fragment/FragmentPage.tsx (新建)
Fragment 路由添加 /mcc/fragment 路由页面app/(dashboard)/mcc/fragment/page.tsx (新建)
菜单配置添加 "NFT 碎片化" 菜单项config/menu-config.ts

12.3 新增前端文件

文件类型说明
app/(dashboard)/mcc/fragment/page.tsx路由页面Fragment 页面入口
components/fragment/FragmentPage.tsx组件碎片化交易完整 UI

12.4 x402 API 类型定义

新增类型 (lib/types/api.ts):

  • MiningRequest - 铸造请求
  • MiningRequestResponse - 铸造请求响应
  • PaymentConfirmRequest - 支付确认请求
  • PaymentConfirmResponse - 支付确认响应
  • MiningRatioInfo - 铸造产值比例信息

新增 API 函数 (lib/api/services.ts):

  • createMiningRequest() - 创建铸造请求
  • confirmMiningPayment() - 确认铸造支付
  • getMiningRatio() - 获取产值比例
  • getMiningRequestStatus() - 获取请求状态

十三、Redis 缓存架构 (2026-01-20 新增)

重要: 链上数据不直接从 Solana RPC 获取,而是通过 Redis 缓存层优化性能。

13.1 架构概述

blockchain-service 实现了工业标准的 Cache-Aside Pattern(旁路缓存模式)。

数据流: Frontend (Portal) --> blockchain-service --> Redis Cache (命中时直接返回) --> 若 cache miss 则查询 Solana RPC (Helius)

13.2 缓存 API 端点

端点方法功能TTL
/balance/wallet/{address}GET获取钱包全量余额(SOL/MCC/USDC/MCD)60s
/balance/wallet/{address}/mccGET获取 MCC 余额60s
/balance/wallet/{address}/mcdGET获取 MCD 积分余额60s
/balance/wallet/{address}/refreshPOST强制刷新钱包余额-
/balance/invalidate/{address}POST失效钱包缓存-
/balance/pool/reincarnationGET获取轮回池状态300s

13.3 缓存 Key 格式

python
# 钱包全量余额
f"blockchain:balance:all:{wallet_address}"

# MCC 单独余额
f"blockchain:balance:mcc:{wallet_address}"

# MCD 单独余额
f"blockchain:balance:mcd:{wallet_address}"

# 轮回池状态
"blockchain:pool:reincarnation"

13.4 缓存策略

策略说明
Cache-Aside读取时先查 Redis,未命中则查链上,然后写入 Redis
TTL 过期余额缓存 60 秒,池状态 300 秒,自动过期
事件驱动失效交易完成后主动调用 /balance/invalidate/{address}
强制刷新用户点击刷新时调用 ?force=true 忽略缓存
降级策略Redis 不可用时直接查询链上,不阻塞请求

13.5 前端集成

typescript
// 获取钱包余额(自动缓存)
const balance = await fetch(`/api/blockchain/balance/wallet/${address}`)

// 强制刷新余额
const fresh = await fetch(`/api/blockchain/balance/wallet/${address}?force=true`)

// 交易后失效缓存
await fetch(`/api/blockchain/balance/invalidate/${address}`, { method: 'POST' })

13.6 代码位置

组件文件路径
缓存模块services/blockchain-service/app/cache/
余额缓存services/blockchain-service/app/cache/balance_cache.py
缓存 APIservices/blockchain-service/app/routes/balance.py
前端 APIservices/portal-service/lib/api/blockchain.ts
代理路由services/portal-service/app/api/blockchain/balance/

13.7 Token 精度

Token小数位数转换公式
SOL9raw_amount / 1e9
MCC9raw_amount / 1e9
USDC6raw_amount / 1e6

此文档是 Solana 合约的权威定义,其他文档应引用而非重复定义。

询问 AI
询问 AI