新消息:Helius 收购 Light Protocol
使用 TypeScript 和 Poseidon 构建 Solana 程序
博客/开发

Poseidon:使用 TypeScript 构建 Solana 程序

Solana 人才引擎。X 上的 Team Turbin3LinkedIn 上的 Team Turbin3
阅读需 8 分钟

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 新晋开发者不可或缺的工具。

其他资源

‍

订阅 Helius

及时了解 Solana 开发的最新动态,并在我们发布新内容时收到更新

放大图片