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 的差异
| 维度 | Sui | Aptos |
|---|---|---|
| 状态模型 | 对象中心(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 把"资源"作为一等公民——三种模型决定了各自的安全边界与扩展方式。
六、开发工具链对比
三套工具链
| 环节 | Solana | Aptos | Sui |
|---|---|---|---|
| CLI | solana、anchor | aptos | sui |
| 编译 | anchor build | aptos move compile | sui move build |
| 部署 | anchor deploy | aptos move publish | sui client publish |
| 测试 | anchor test(Rust+TS) | aptos move test | sui move test |
| 客户端 | @solana/web3.js | @aptos-labs/ts-sdk | @mysten/sui.js |
| 索引 | DAS API / RPC | Indexer API | Sui 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 之间自由切换,多链部署就不再是负担,而是一张覆盖全部公链用户的地图。
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。