
Poseidon:使用 TypeScript 构建 Solana 程序
Poseidon 是一个全新的转译器框架,让 Web 开发者只需使用全球数百万开发者熟悉的 TypeScript,就能创建 Solana 链上程序(即智能合约)。该框架显著降低了链上开发的入门门槛,让更多开发者能够接触 Solana。Poseidon 可将 TypeScript 代码直接转换为 Anchor,也就是 Solana 使用最广泛的程序框架。
本文将深入介绍 Poseidon 的起源、架构设计、核心功能,以及它可能为 Solana 开发生态带来的积极影响。此外,我们还会通过一个使用 Poseidon 编写的简单代币金库程序实例,展示该框架的部分能力。
背景
2023 年底,Turbin3 团队收到 Solana Foundation 提出的一项大胆挑战:“你们能否构建一个框架,让开发者使用 TypeScript 创建 Solana 程序?”我们的第一反应自然是:“为什么?”
TypeScript 是 JavaScript 的静态类型超集,可以帮助开发者更早发现错误,并编写更易维护的代码。作为现代 Web 开发事实上的标准,TypeScript 和 JavaScript 已培育出全球规模最大的开发者社区之一。引入基于 TypeScript 的程序开发方式,为扩大 Solana 新开发者群体、降低区块链开发门槛提供了重要机遇。
与许多其他区块链相比,掌握 Solana 程序开发更具挑战性。新开发者必须同时跨越两道门槛:理解 Solana 的账户模型并学习 Rust,学习曲线十分陡峭。Turbin3 对此再清楚不过;所有 Solana 新开发者中有 15% 参加过我们的项目。
通过引入 TypeScript 框架,开发者可以将这两项挑战拆分开来,利用已经掌握的语言,更快地将首个程序部署到测试网。基于 TypeScript 的链上程序开发框架让开发者首次能够使用同一种语言,无缝构建全栈 Solana 应用。
解决方案:Poseidon
该项目最初只是一个基础类型库和转译器概念,但经过初步原型设计,并充分采纳 Solana 和 TypeScript 专家的反馈后,很快发展为一个更加强大的框架。历经数月的构建、测试、问题排查,以及行业专家提供的宝贵建议,Poseidon 于今年早些时候在 Breakpoint 2024 上迎来关键里程碑。我们在那里向充满好奇的开发者观众首次展示了成果。
在现场演示中,Poseidon 的首席开发者 Shrinath 展示了如何使用 TypeScript 编写 Solana 程序。只需一条构建命令,Poseidon 就能在观众眼前将 TypeScript 代码转译为完整的 Anchor 语法。现场气氛热烈,人们纷纷低声议论:“这真的可行吗?”
自那以后,Poseidon 的开源代码库迅速发展,这离不开 X 和 Discord 上不断壮大的 Poseidon Army 所做出的贡献。社区成员解决问题、提交拉取请求,并协作构建新软件包,推动 Poseidon 日益成熟。改进内容包括增强 CLI、加入对代币程序函数的支持,以及优化错误消息。尽管 Poseidon 仍处于早期阶段,但它的潜力毋庸置疑。
从技术角度看,我们将 Poseidon 的开发历程分为四个阶段。在最初的沟通、头脑风暴和架构设计之后,我们面临了一些关键决策。其中最值得注意的是:
- 对所需库作出假设
- 通过链式调用方法,在指令体中派生账户
- 过程宏(对许多开发者而言是一个新概念)
随后,我们埋头进入构建和迭代阶段,为 Breakpoint 上的首次亮相做准备。 那次备受瞩目的发布开启了当前阶段的大门——我们已将框架交到早期采用者手中,让他们探索、发现并不断改进它。
随着 2024 年接近尾声,我们继续推动该框架成长,重点改进核心功能、通过社区参与扩展支持范围,并确定所需的 SPL 函数和 Anchor 库支持。这些目标将使核心开发者能够专注于关键改进。
展望 2025 年,我们将于第一季度末启动首届 Turbin3 Poseidon Cohort(即将公布),进一步加快开发速度。该计划将推动框架发展,并重点创建公共软件包、教程及其他教育资源。目标很明确:让 Poseidon 成为使用 TypeScript 快速开展 Solana 程序开发的权威工具。
核心功能
Poseidon 提供了多项突出功能:
- 简化开发: 基于 TypeScript 的界面可缩短 Web 开发者的学习曲线,让他们专注于应用逻辑,而不必费力掌握 Rust
- 提高生产力: Poseidon 让开发者可以使用熟悉的工具和工作流,更高效地工作并加快开发进程
- 增强安全性和性能: 该框架确保转译后的 Rust 代码符合 Solana 严格的安全和性能标准,维护链上程序的完整性
- 无缝集成: Poseidon 与 Solana 生态系统无缝集成,让开发者可以利用现有工具和库
系统架构
Poseidon 的架构由几个核心组件构成:
- 基于 TypeScript 的编程接口: 该层为开发者提供熟悉的语法和工具,用于编写 Solana 程序
- 转译引擎: 该引擎利用 TypeScript 类型系统和语言特性的优势,将 TypeScript 代码转换为等效的 Rust 代码
- Anchor 代码生成: 转译后的 Rust 代码会经过进一步处理,生成有效的 Anchor 程序,随后可以编译并部署到 Solana 网络
- 账户管理: Poseidon 简化了账户及其关联数据的管理方式,让开发者更轻松地与 Solana 区块链交互
使用场景
Poseidon 旨在帮助开发者更快理解 Solana 账户模型,大幅缩短新开发者将首个程序部署到测试网所需的时间。由于区块链应用对安全性要求极高,目前 Poseidon 不适合构建生产级主网应用。有志成为 Solana 协议工程师的开发者最终仍需学习 Anchor 和 Rust,以便更深入地理解 Solana 的底层架构。
该框架可用于探索和试验各种去中心化应用,包括:
- 去中心化金融(DeFi): 开发借贷协议、去中心化交易所和流动性挖矿平台等创新金融应用
- 非同质化代币(NFT): 在 Solana 区块链上创建和管理数字资产
- 游戏: 开发基于区块链的游戏和虚拟世界
- 供应链管理: 追踪并验证产品和材料的来源
我们首先专注于几乎所有区块链应用都依赖的基础程序:Counter、Vault 和 Escrow。这些核心构件是无数协议的基础,因此最适合作为起点。
Poseidon 示例程序
下面深入代码,详细分析一个使用 Poseidon 以 TypeScript 构建的金库程序示例,并将该程序拆解为各个组成部分。这个程序及其他程序的完整代码均可在 Poseidon GitHub 代码库中找到。
导入和程序声明
该程序被定义为一个 TypeScript 类,并通过静态 PROGRAM_ID 指定程序 ID。@solanaturbine/poseidon 软件包提供定义指令所需的类型,包括 Rust 类型(u8、u64、i8、i128、boolean、string)、SPL 类型(Pubkey、AssociatedTokenAccount、Mint、TokenAccount、TokenProgram)以及 Anchor 账户类型(Signer、UncheckedAccount、SystemAccount)。
import { Account, Pubkey, Result, Signer, SystemAccount, SystemProgram, UncheckedAccount, u64, u8 } from "@solanaturbine/poseidon";
export default class VaultProgram {
static PROGRAM_ID = new Pubkey("11111111111111111111111111111111");指令
使用 Poseidon 时,我们通常在程序类中定义方法来创建指令。每条指令的上下文隐含在方法参数中。要使用 @solanaturbine/poseidon 将账户定义为程序派生地址(PDA),我们会使用 derive 方法,将种子指定为数组中的第一个参数。
initialize(
owner: Signer,
state: Vault,
auth: UncheckedAccount,
vault: SystemAccount
): Result {
auth.derive(['auth', state.key])
state.derive(['state', owner.key]).init(owner)
vault.derive(['vault', auth.key])
// assign an argument of type Pubkey by calling the key property
state.owner = owner.key;
// to store bumps in the custom_Acc(state), we can simply call getBump
state.stateBump = state.getBump()
state.authBump = auth.getBump()
state.vaultBump = vault.getBump()
}
deposit(
owner: Signer,
state: Vault,
auth: UncheckedAccount,
vault: SystemAccount,
amount: u64
) {
state.deriveWithBump(['state', owner.key], state.stateBump)
auth.deriveWithBump(['auth', state.key], state.authBump)
vault.deriveWithBump(['vault', auth.key], state.vaultBump)
SystemProgram.transfer(
owner, // from
vault, // to
amount // amount to be sent
)
}
withdraw(
owner: Signer,
state: Vault,
auth: UncheckedAccount,
vault: SystemAccount,
amount: u64
) {
state.deriveWithBump(['state', owner.key], state.stateBump)
auth.deriveWithBump(['auth', state.key], state.authBump)
vault.deriveWithBump(['vault', auth.key], state.vaultBump)
SystemProgram.transfer(
vault,
owner,
amount,
['vault', state.key, state.authBump]
)
}
}账户状态
自定义状态账户被定义为扩展 Account 的接口。自定义状态账户的字段可以使用 @solanaturbine/Poseidon 软件包中的类型进行定义。
export interface Vault extends Account {
owner: Pubkey
stateBump: u8
authBump: u8
vaultBump: u8
}Poseidon 的影响
Poseidon 有望通过以下方式影响区块链开发格局:
- 壮大 Solana 开发者社区: 吸引更多开发者加入 Solana 生态系统
- 加快开发: 减少 Solana 项目所需的开发时间和工作量
- 改善开发者体验: 提供更直观、更高效的开发体验
未来方向
未来,Poseidon 计划通过以下方式进一步增强自身能力:
- 扩展语言支持: 支持 JavaScript 和 Python 等更多语言
- 提升性能: 优化转译流程和生成的 Rust 代码
- 增强安全性: 对框架和生成的代码进行严格测试,以发现潜在漏洞
总结
Poseidon 是让更多人能够参与 Solana 程序开发的一项重大进步。它弥合了 Web 开发与区块链编程之间的鸿沟,让开发者能够在 Solana 区块链上创建创新且具有影响力的应用。随着区块链领域不断发展,Poseidon 有望成为 Solana 新晋开发者不可或缺的工具。
其他资源
- Kite 简介:现代 Solana TypeScript 框架
- Turbin3 教育项目
- Poseidon GitHub 代码库
- Poseidon 示例程序
- @solanaturbine/poseidon NPM 软件包
相关文章
订阅 Helius
及时了解 Solana 开发的最新动态,并在我们发布新内容时收到更新


