非 EVM 生态:Solana 与 Move 系公链开发

探索非 EVM 公链生态:Solana 的 PoH 与并行执行、Rust/Anchor 合约开发、Move 资源模型与 Sui/Aptos 差异、账户模型对比、多链部署策略与工具链实战。

EVM 生态之外还有一片高吞吐世界。Solana 用并行执行与历史证明把 TPS 推到数万级,Move 语言则从资源模型上根治了资产安全问题(Aptos、Sui 双双出道即高估值)。对 Web3 开发者而言,掌握非 EVM 不只是"多会一门语言",更是理解执行模型与账户模型的第二视角。本文从架构原理讲到 Anchor/ Move 实战与多链策略。

一、为什么关注非 EVM 生态

EVM 的固有约束

约束表现后果
串行执行一个区块内的交易按顺序执行TPS 受单核 EVM 限制
状态集中合约共享全局状态并发冲突率高
存储昂贵SSTORE 成本高状态即成本
语言单一以 Solidity 为主安全模式趋同

非 EVM 的差异化路径

Solana:并行执行(Sealevel)+ 历史证明(PoH)→ 高吞吐
Aptos :Move 资源模型 + Block-STM 乐观并发 → 高吞吐 + 资产安全
Sui   :对象模型 + 依赖图并行 → 可组合性 + 即时确认

一句话:EVM 解决了"通用性",非 EVM 生态解决"性能与安全模型"——两者不是替代,而是互补。

二、Solana 架构:历史证明与并行执行

四大核心技术

技术解决的问题机制
PoH(历史证明)交易时间与顺序用 SHA-256 连续哈希生成可验证的时间戳链
Sealevel并行执行只对无冲突账户的交易并行执行(多核)
Turbine区块传播树形分片广播,替代 P2P 全网广播
Gulf Stream内存池无内存池,交易直接转发给"未来领导者"

PoH 的本质

验证者用单线程不断哈希:
h_0 = SHA256("genesis")
h_1 = SHA256(h_0)
h_2 = SHA256(h_1)
...
在 h_i 处嵌入交易记录 → 证明"在 h_i 之前,交易已存在"

其他验证者可快速重放哈希链,验证时间戳与顺序
→ 无需全局时钟,也能达成"有序共识"

账户模型基础

账户 = 地址 + lamports(余额) + data(数据) + owner(程序) + executable(标志)

- 数据账户:存储资产/状态,由某个 program 拥有
- 程序账户(Program):可执行字节码,类似智能合约
- PDA:Program Derived Address,由种子 + program_id 派生,无对应私钥
- Rent:账户需保持最低 lamports,可"免租"(rent-exempt)

一句话:Solana 把"记账"和"执行"解耦——账户数据与程序分离,是并行与租金的物理基础。

三、Solana 合约开发:Rust 与 Anchor

Anchor 框架

Anchor 是 Solana 的 DSL 框架,把账户校验、指令分发、CPI 变成声明式代码:

use anchor_lang::prelude::*;

declare_id!("Fg6PaFpoGXkYsidMpWKHXhGRGuKJ8Fz4zxJp3kF7S4FW");

#[program]
pub mod counter {
    use super::*;

    // 指令:初始化计数器
    pub fn initialize(ctx: Context<Initialize>) -> Result<()> {
        let counter = &mut ctx.accounts.counter;
        counter.count = 0;
        Ok(())
    }

    // 指令:自增(需签名者)
    pub fn increment(ctx: Context<Increment>) -> Result<()> {
        let counter = &mut ctx.accounts.counter;
        counter.count += 1;
        Ok(())
    }
}

// 账户声明:Anchor 自动生成校验代码
#[derive(Accounts)]
pub struct Initialize<'info> {
    #[account(init, payer = user, space = 8 + 8)]
    pub counter: Account<'info, Counter>,
    #[account(mut)]
    pub user: Signer<'info>,
    pub system_program: Program<'info, System>,
}

#[account]
pub struct Counter {
    pub count: u64,
}

PDA 与跨程序调用(CPI)

#[derive(Accounts)]
pub struct MintNft<'info> {
    #[account(
        init, payer = user,
        seeds = [b"nft", user.key().as_ref()],
        bump,
        space = 8 + 32 + 64,
    )]
    pub nft_account: Account<'info, NftData>,
    #[account(mut)]
    pub user: Signer<'info>,
    pub system_program: Program<'info, System>,
}

// CPI:调用 Token Program 铸造 SPL Token(示意)
pub fn mint_tokens(ctx: Context<MintNft>) -> Result<()> {
    let cpi_program = ctx.accounts.token_program.to_account_info();
    let cpi_ctx = CpiContext::new(cpi_program, /* token cpi accounts */);
    token::mint_to(cpi_ctx, 1_000_000)?;   // CPI 调用
    Ok(())
}

客户端交互

# Solana 工具链
solana config set --url https://api.mainnet-beta.solana.com
solana airdrop 2
anchor build
anchor deploy
anchor test
// 前端用 Anchor 客户端
import { Program, AnchorProvider, web3 } from "@coral-xyz/anchor";

const program = new Program(IDL, PROGRAM_ID, provider);
await program.methods.increment()
  .accounts({ counter, user })
  .signers([wallet])
  .rpc();

一句话:Anchor 的 #[account(init, payer, seeds)] 等约束把 Solana 繁琐的账户校验压缩成一行,是 Solana 开发的事实标准。

四、Move 语言:资源模型与 Sui/Aptos

Move 的设计哲学

Move 起源于 Facebook Libra(2019),核心是**资源(Resource)**的线性类型:

Move 的核心规则:
- 值不能被隐式复制(copy 需显式声明)
- 值不能被隐式丢弃(drop 需显式声明)
- 资产用"资源"表示,只能被拥有者移动

→ 代币不可能被"意外复制"或"凭空销毁",从语言层面消灭整类漏洞

一个 Move 模块

// Sui Move 示例(对象模型)
module example::counter {
    use sui::object::{Self, UID};
    use sui::transfer;
    use sui::tx_context::{Self, TxContext};

    // Sui 用对象(Object)持有状态,含全局唯一 UID
    public struct Counter has key {
        id: UID,
        value: u64,
    }

    // 创建对象并转账给调用者
    public fun create(ctx: &mut TxContext) {
        let counter = Counter {
            id: object::new(ctx),
            value: 0,
        };
        transfer::transfer(counter, tx_context::sender(ctx));
    }

    public fun increment(counter: &mut Counter) {
        counter.value = counter.value + 1;
    }
}

Sui vs Aptos 的差异

维度SuiAptos
状态模型对象中心(Object-centric)账户 + 全局存储
并行执行依赖图(对象冲突)Block-STM 乐观并发
交易形式可编程交易块(PTB)标准顺序交易
特征即时确认、动态字段、赞助交易高性能账户模型、Move 2.0
编程入口sui-move(带 UID/transfer)标准 Move + Aptos 标准库

一句话:Move 用"资源即类型"消灭资产复制/销毁漏洞,Sui 与 Aptos 则各自用对象图与乐观并发实现了并行化。

五、账户模型差异对比

三种模型的本质

维度EVM(Solidity)Solana(Rust)Move(Sui/Aptos)
状态组织合约地址 → 存储 Trie账户 → data + lamports地址/对象 → 资源
可执行单元合约字节码Program(可执行账户)Module(模块)
数据归属合约内部状态独立账户,由程序拥有资源(受 key/copy/drop 控制)
授权模型msg.sender 全局每个指令列出 accounts + Signer对象拥有者/签名者
升级方式代理模式程序可写升级(或不可变)包升级策略(版本化)
并发串行并行(无冲突账户)并行(对象/乐观)

一个直观对比

EVM:
    UniswapV2Pair: { reserve0, reserve1, totalSupply, ... }   // 全部装在一个合约里

Solana:
    [账户 A] 保存 token0 余额
    [账户 B] 保存 token1 余额
    [账户 C] 保存 pair 状态(由 pair program 拥有)
    [Program] 负责交换逻辑          // 数据与逻辑分离

Move(Sui):
    [对象 1] Coin { balance }
    [对象 2] Pool { coin_a, coin_b }   // 对象可被多个拥有者/共享

一句话:EVM 把"数据+逻辑"捆在合约里,Solana 把"数据账户+程序"分离,Move 把"资源"作为一等公民——三种模型决定了各自的安全边界与扩展方式。

六、开发工具链对比

三套工具链

环节SolanaAptosSui
CLIsolana、anchoraptossui
编译anchor buildaptos move compilesui move build
部署anchor deployaptos move publishsui client publish
测试anchor test(Rust+TS)aptos move testsui move test
客户端@solana/web3.js@aptos-labs/ts-sdk@mysten/sui.js
索引DAS API / RPCIndexer APISui Indexer

部署与调用示例

# ---- Sui 部署 ----
sui client publish --gas-budget 100000000
# 返回包含 Package ID 的 JSON

# ---- Sui 调用 ----
sui client call \
  --package 0x<package_id> \
  --module counter \
  --function increment \
  --args 0x<object_id> \
  --gas-budget 10000000
{
  "effects": {
    "status": "success",
    "created": [{ "objectId": "0x1f2e3d4c5b6a7f8e9d0c1b2a3f4e5d6c7b8a9f0e" }]
  },
  "packageId": "0x9a8b7c6d5e4f3a2b1c0d9e8f7a6b5c4d3e2f1a0b"
}

⚠️ 非 EVM 的"地址即公钥"推导、交易大小上限(Solana 1232 字节)、以及"无 gas 记账"(Sui 免 gas 对象)都会影响架构设计。

七、多链部署策略

为什么需要多链

  • 流动性分散在多个生态(Solana DeFi、Move 系新链、EVM L2)
  • 用户在不同链持有资产,单链会限制增长
  • 关键应用(稳定币、DEX、借贷)需要跨链可达

工程策略

策略做法适用
共享逻辑层把核心逻辑写成语言无关规范,各链分别实现平台型应用
Rust 复用Solana(Anchor) 与部分 Move 生态共享业务层工程复用最大化
桥接/互操作用 Wormhole / LayerZero / CCIP 传递消息与资产资产互通
多链部署矩阵同一 dApp 分别适配各链 SDK 与账户模型用户覆盖最广

一个务实流程

1. 先选"主链":评估 TPS、gas、生态、发行条件
2. 抽象业务层:把 swap / lending 逻辑写成语言无关规范
3. 分链适配:Solana 用 Anchor、Aptos/Sui 用 Move、EVM 用 Solidity
4. 统一钱包与索引:用统一 SDK 层(如 Web3.js + Solana + Aptos 封装)
5. 测试矩阵:每条链跑独立的单元 + 集成测试
6. 上线顺序:先主链后副链,跨链桥最后(依赖审计)
// 多链客户端统一封装(示意)
const routers = {
  evm: new EVMRouter(provider),
  solana: new SolanaRouter(provider),
  aptos: new AptosRouter(provider),
  sui: new SuiRouter(provider),
};

export async function bridgeSwap(chain: Chain, params: SwapParams) {
  return routers[chain].swap(params);
}

一句话:多链不是"一个代码跑全部",而是"业务层抽象 + 各链适配 + 统一钱包/索引"的工程协同。

总结

维度要点
Solana 架构PoH 排序 + Sealevel 并行 + 账户/程序分离
Solana 开发Rust + Anchor(声明式账户校验、PDA、CPI)
Move 语言资源线性类型,消灭复制/销毁漏洞
Sui vs Aptos对象模型 + 依赖图 vs 账户 + Block-STM
账户模型EVM 合约存储 / Solana 账户数据 / Move 资源
工具链solana+anchor / aptos-cli / sui-cli,各具特色
多链策略业务抽象 + 分链适配 + 跨链桥

非 EVM 生态不是"对抗 EVM",而是并行探索高性能与高安全的执行模型。Solana 证明了并行 + 历史证明可以撑起万级 TPS;Move 系则证明了把资产做成"类型"可以从源头消除整类安全漏洞。对开发者而言,最好的策略是保持多语言视角:理解账户模型决定安全边界,理解并行模型决定扩展方式,理解资源模型决定资产抽象。当你能在 Solidity、Rust(Anchor)与 Move 之间自由切换,多链部署就不再是负担,而是一张覆盖全部公链用户的地图。

继续阅读

探索更多技术文章

浏览归档,发现更多关于系统设计、工具链和工程实践的内容。

全部文章 返回首页

「区块链 Web3」更多文章

  1. MEV 与区块构建市场:抢跑、三明治与 PBS
  2. NFT 市场合约开发:ERC-721/1155 深入与版税
  3. Solidity Gas 优化:存储布局、数据位置与代理模式