VyperSVM 是 Vyper 编程语言的创新扩展,旨在将原本专为 Ethereum 虚拟机 (EVM) 设计的 Vyper 移植到 Solana 的虚拟机 (SVM)。这一扩展保持了 Vyper 标志性的 Python-like 语法特性,同时通过 LLVM 中间表示 (IR) 生成高效的 Solana 兼容 sBPF 字节码。VyperSVM 的核心目标是降低 Solana 程序开发的门槛,使熟悉 Vyper 的开发者能够轻松过渡到 Solana 生态,而无需深入学习 Rust 或 Anchor 的复杂性。项目地址:https://github.com/daog1/vysvm。
在此基础上,Vyper 进一步扩展语法,支持 Anchor 风格的账户管理机制。通过引入 account 和 accounts 关键字,开发者可以直接在合约中声明数据结构和指令参数,实现自动化的约束验证和程序派生地址 (PDA) 生成。这一设计大幅简化了 Solana 程序的编写,避免了手动处理账户映射的繁琐过程。存储管理依然由用户控制,PDA 生成则依赖 SVM 的原生系统调用,确保高效且安全。
这一实现深受 Anchor 框架的影响,借鉴了其 #[account] 和 #[derive(Accounts)] 宏的设计理念,同时整合了 Pinocchio(Solana 的 Rust SDK)的底层系统调用和账户信息访问能力。VyperSVM 旨在成为 Anchor 和 Pinocchio 之间的桥梁,提供高层次的便利性与底层的运行时效率,为 Solana 开发注入新的活力。
Vyper 是一种 Python-like 的编程语言,专为 Ethereum 智能合约设计,以其简洁、安全和静态类型检查著称。然而,随着区块链生态的扩展,开发者希望在其他平台如 Solana 上使用类似的语法。Solana 的 SVM(Solana Virtual Machine)使用 sBPF 字节码,与 EVM 不同,需要不同的编译目标。
VyperSVM 项目应运而生:它将 Vyper 扩展到 Solana,保持 Python-like 语法,同时生成 LLVM IR,最终编译为 sBPF 程序。这带来了显著优势:
此项目基于 Vyper 的前端(语法分析)和 VENOM IR 中间表示,后端生成 LLVM IR for Solana。当前支持基本运算、入口点生成、syscall 集成和控制流,未来将扩展存储操作。挑战包括处理 Solana 的账户模型和 syscall,而非 EVM 的 gas 机制。此外,项目需确保与 Anchor 的兼容性,避免引入新的复杂性,同时优化运行时性能以匹配 Solana 的高吞吐量需求。
VyperSVM 的架构分为前端、中间和后端:
安装和使用步骤:
# 克隆仓库
git clone https://github.com/daog1/vysvm
cd vysvm
# 安装依赖
pip install llvmlite # 用于 LLVM IR 处理
brew install llvm # LLVM 工具
cargo install sbpf-linker # sBPF 链接器
# 编译合约
PYTHONPATH=vysvm python -m vyper.cli.vyper_compile contract.vy --experimental-codegen -f llvm > contract.ll # 生成 LLVM IR
llvm-as contract.ll -o contract.bc # 组装为 bitcode
sbpf-linker contract.bc -o contract.so # 链接为 sBPF 程序
为了支持 Anchor 风格账户,扩展 Vyper 语法:
account 和 accounts 关键字,定义数据结构和参数。@init、@mut),生成运行时断言。sol_create_program_address 和 sol_try_find_program_address。编译器实现包括:
AccountDecl、AccountsDecl 节点。__vy_dispatch 函数,支持 InstructionContext 和账户绑定。扩展 venom_to_llvm.py 支持 syscall。集成步骤:在 feature/svm_accounts 分支开发,更新 AST、语义、IR/LLVM 后端,加入入口调度与账户约束逻辑。落地 InstructionContext,提供内置访问器。开发过程中,需进行单元测试和集成测试,确保语法解析正确、约束验证有效,并与现有 Vyper 功能兼容。
挑战:调度生成需兼容 Anchor discriminator 与账户序列化;账户布局与 PDA 校验的运行期开销优化;用户存储仍需手动维护。此外,需处理跨平台兼容性,如确保 LLVM IR 正确映射到 sBPF,并解决潜在的内存管理问题。
当前状态:
与 EVM Vyper 的差异:
示例合约(基础):
# test.vy
event LogMessage:
message: String[32]
@external
def entrypoint() -> uint256:
log LogMessage(message="Hello from Vyper on SVM!")
return 0
扩展示例(Anchor 风格):
# 定义账户结构
account MyAccount:
data: uint64
# 定义指令参数和约束
accounts Initialize:
@init(payer=user, space=8 + 8, seeds=[b"my_account", user.key()], bump=bump) # 初始化账户,指定 payer、空间、种子和 bump
my_account: MyAccount # 账户实例
@mut @signer # 可写且为签名者
user: address # 用户地址
bump: uint8 # PDA bump 值
# 入口点函数
@entrypoint
def entry(ctx: InstructionContext):
dispatch(ctx) # 自动调度指令
# 外部指令函数
@external
def initialize(ctx: Initialize, data: uint64):
ctx.my_account.data = data # 设置账户数据
# 另一个示例:更新数据
@external
def update(ctx: Initialize, new_data: uint64):
assert ctx.my_account.data != new_data, "Data unchanged"
ctx.my_account.data = new_data
约束处理细则:
@mut:确保账户可写,运行时断言 account.is_writable() == True,防止未授权修改。@signer:确保账户为签名者,断言 account.is_signer() == True,验证交易权限。@init:初始化新账户,首先检查数据长度为零以避免覆盖,然后通过 find_pda 计算 PDA 并校验公钥,最后调用 sol_init_account 系统调用分配空间。@close:函数结束时自动关闭账户,调用 sol_close_account 将租金返还到指定目标账户。@seeds/@bump:编译期生成种子数组,支持常量和表达式,用于 PDA 计算,提高安全性。remaining_accounts:在 accounts 声明末尾定义 remaining: DynArray[address, N],允许处理额外账户列表,灵活应对动态指令。类型扩展:
account:复用 StructT,新增 AccountLayout 元数据。accounts:同样 StructT,保存 AccountConstraint 列表。AccountBinding:{ info: AccountInfo, data: AccountDataView }。InstructionContext:提供 next_account()、remaining() 等方法。此实现简化 Solana 开发,结合 VyperSVM 的优势,提供高效、安全的链上编程。未来计划包括全面的单元测试、集成测试、性能基准测试、详细文档编写,以及在 Solana 测试网和主网上的部署验证。项目还将探索更多高级功能,如跨程序调用 (CPI) 支持和事件日志优化。更多信息见官方文档和 GitHub 仓库:https://github.com/daog1/vysvm。
VyperSVM 的核心代码位于 Vyper 项目的 SVM 扩展中,包括:
vyper/svm/:SVM 特定代码生成和 syscall 集成。vyper/venom/venom_to_llvm.py:LLVM IR 生成。vyper/semantics/types/instruction_context.py:InstructionContext 类型定义。vyper/codegen/function_definitions/external_function.py:账户约束验证。项目地址:https://github.com/daog1/vysvm
欢迎大家贡献代码、提出想法或报告问题!请访问项目仓库提交 PR 或 issue,我们期待您的参与。
VyperSVM 的账户抽象设计直接借鉴 Anchor 的理念:
account 关键字类似 Anchor 的 #[account],定义数据结构。accounts 关键字模仿 #[derive(Accounts)],支持约束如 @mut、@signer、@init。create_pda 和 find_pda 函数,对应 Anchor 的 PDA 工具。相比 Anchor(Rust 框架),VyperSVM 提供:
Seahorse 是一个用 Python 编写 Solana 智能合约的框架。它解析 Python 代码,生成 Anchor 兼容的 Rust 代码,然后通过 Anchor 编译为 sBPF 程序。Seahorse 提供了类 Anchor 的语法,如 @instruction、Account 等,但用户需手动解决 Rust 依赖和版本冲突问题。
solana-program 版本)。VyperSVM 直接生成 LLVM IR,更高效且依赖简化,无需 Rust 环境。总体,VyperSVM 提供更稳定、易用的 Python Solana 开发体验,避免 Seahorse 的依赖复杂性。