{"content":{"title":"引介：Poseidon - 使用 TypeScript 构建 Solana 程序","body":">- 原文链接：[www.helius.dev/blog...](https://www.helius.dev/blog/build-solana-programs-with-typescript-poseidon)\r\n>- 译者：[AI翻译官](https://learnblockchain.cn/people/19584)，校对：[翻译小组](https://learnblockchain.cn/people/412)\r\n>- 本文链接：[learnblockchain.cn/article…](https://learnblockchain.cn/article/10254)\r\n    \r\nPoseidon 是一个新的转译器框架，使 Web 开发人员能够仅使用 TypeScript 语言创建 Solana 链上程序（即智能合约），这种语言对全球数百万开发者来说都很熟悉。该框架显著降低了链上开发的门槛，使更多开发者能够接触到 Solana。Poseidon 将 TypeScript 代码直接转换为 Anchor，Solana 最广泛采用的程序框架。\r\n\r\n本文将深入探讨 Poseidon 的起源、架构设计、关键特性及其对 Solana 开发生态可能产生的积极影响。此外，我们还将通过一个使用 Poseidon 编写的简单代币保险库程序的实际示例，突出框架的一些能力。\r\n\r\n\r\n![](https://img.learnblockchain.cn/attachments/migrate/1734055458738)\r\n\r\n## 背景\r\n\r\n在 2023 年末，[Turbin3](https://turbin3.com/) 团队受 Solana 基金会的委托，面临一个雄心勃勃的挑战：“你们能否构建一个框架，使开发者能够使用 TypeScript 创建 Solana 程序？”自然，最初的反应是问：“为什么？”\r\n\r\nTypeScript 是 JavaScript 的一种静态类型超集，帮助开发者更早发现错误，编写更可维护的代码。作为现代 Web 开发的事实标准，TypeScript 和 JavaScript 培养了全球最大的开发者社区之一。在 TypeScript 中引入程序开发为扩展新的 Solana 开发者群体提供了重要机会，降低了在区块链上构建的门槛。\r\n\r\n![](https://img.learnblockchain.cn/attachments/migrate/1734055458732)\r\n\r\n上图：量化 JavaScript（62.3%）和 TypeScript（38.5%）在开发者中的普及程度的数据 ([ 来源](https://survey.stackoverflow.co/2024/))。\r\n\r\n‍\r\n\r\n掌握 Solana 程序开发相较于许多其他区块链来说具有挑战性。新的开发者必须同时理解 [Solana 的账户模型](https://learnblockchain.cn/article/7391) 和学习 Rust，这可能是一个陡峭的学习曲线。我们 Turbin3 比任何人都更清楚这一点；[15% 的新 Solana 开发者都是通过我们的项目参与进来的](https://x.com/jacobvcreech/status/1825715914706149539?t=4mnn04oh0hc_Vjip6Dq4LQ) 。\r\n\r\n通过引入 TypeScript 框架，开发者可以将这些挑战解耦，利用他们已经熟悉的语言更快地将他们的第一个程序部署到测试网上。基于 TypeScript 的链上程序开发框架使开发者能够首次无缝地用一种语言构建全栈 Solana 应用程序。\r\n\r\n## 解决方案：Poseidon\r\n\r\n该项目最初作为一个基本类型库和转译器（transpiler）概念开始，但在初步原型制作和来自 Solana 和 TypeScript 专家的深入反馈后迅速发展成为一个更强大的框架。经过几个月的构建、测试、故障排除以及来自行业专家的宝贵输入，Poseidon 在今年早些时候的 Breakpoint 2024 上达到了一个重要里程碑，我们向一群好奇的开发者展示了我们的工作。\r\n\r\n‍\r\n\r\n在一次现场演示中，[Shrinath](https://github.com/ShrinathNR)，我们 Poseidon 的首席开发者，演示了如何用 TypeScript 编写 Solana 程序。通过一个简单的构建命令，Poseidon 将 TypeScript 代码转换为完整的 Anchor 语法——就在观众面前。房间里充满了兴奋，低语声开始蔓延：“这真的可行吗？”\r\n\r\n‍\r\n\r\n自那时起，[Poseidon 的开源代码库](https://github.com/Turbin3/poseidon) 快速增长，得益于我们在 X 和 Discord 上日益壮大的 Poseidon 队伍的贡献。社区成员们解决了问题，提交了PR，并协作构建新包，帮助 Poseidon 每天都在成熟。改进包括增强的 CLI、对代币程序函数的支持以及更好的错误消息。尽管仍处于早期阶段，但 Poseidon 的潜力显而易见。\r\n\r\n‍\r\n\r\n从技术角度来看，我们将 Poseidon 的开发轨迹分为四个阶段。在我们最初的会议、头脑风暴和架构设计之后，面临了一些关键决策。最显著的是：\r\n\r\n*   假设所需的库\r\n*   通过链方法在指令体中进行账户推导\r\n*   程序宏 - Procedural macros（对许多开发者而言是一个新概念）\r\n\r\n然后我们在构建和迭代阶段潜心工作，直至 Breakpoint 揭晓。那个揭示的时刻，令人瞩目，打开了目前阶段的洪水闸门——我们将框架交到早期采用者手中，让他们进行探索、发现和改进。\r\n\r\n随着 2024 年的结束，我们持续培养框架的成长，专注于核心功能的改进、社区参与以扩展支持，以及识别所需的 SPL 函数和 Anchor 库支持。这些目标将使顶尖开发者能够专注于核心改进。\r\n\r\n展望 2025 年，我们正在加速开发，计划在第一季度末启动我们的第一期 Turbin3 Poseidon Cohort（即将宣布）。这一举措将推进框架，专注于创建公共包、教程和其他教育资源。目标明确：使 Poseidon 成为加速使用 TypeScript 进行 Solana 程序开发的权威工具。\r\n\r\n## 关键特性\r\n\r\nPoseidon 提供了几个突出的特性：\r\n\r\n*   **简化开发：** 基于 TypeScript 的接口将 Web 开发者的学习曲线最小化，使他们能够专注于应用逻辑，而不是与 Rust 作斗争\r\n*   **提高生产力：** Poseidon 使开发者能够更高效地工作，利用熟悉的工具和工作流程，加速开发过程\r\n*   **增强安全性和性能：** 该框架确保转译后的 Rust 代码符合 Solana 严格的安全和性能标准，保持链上程序的完整性\r\n*   **无缝集成：** Poseidon 和 Solana 生态系统无缝集成，使开发者能够利用现有的工具和库\r\n\r\n## 系统架构\r\n\r\nPoseidon 的架构由几个关键组件组成：\r\n\r\n*   **基于 TypeScript 的编程接口：** 这一层为开发者提供了熟悉的语法和工具，以编写 Solana 程序\r\n*   **转译引擎：** 该引擎将 TypeScript 代码转换为等效的 Rust 代码，利用 TypeScript 的类型系统和语言特性\r\n*   **Anchor 代码生成：** 转译后的 Rust 代码进一步处理以生成有效的 Anchor 程序，这些程序可以编译并部署到 Solana 网络\r\n*   **账户管理：** Poseidon 提供了一种简化的方式来管理账户及其相关数据，使与 Solana 区块链的交互变得更简单\r\n\r\n## 使用案例\r\n\r\nPoseidon 旨在加速开发者对 Solana 账户模型的理解，显著减少新开发者将他们的第一个程序部署到测试网所需的时间。**由于区块链应用的严格安全需求，Poseidon 目前不适合构建生产级的主网应用程序**。有志成为 Solana 协议工程师的人最终需要学习 Anchor 和 Rust，以更好地理解 Solana 的底层架构。\r\n\r\n该框架可用于探索和实验各种去中心化应用，包括：\r\n\r\n*   **去中心化金融 (DeFi)：** 开发创新的金融应用，如借贷协议、去中心化交易所和收益农业平台\r\n*   **非同质化代币 (NFT)：** 在 Solana 区块链上创建和管理数字资产\r\n*   **游戏：** 开发基于区块链的游戏和虚拟世界\r\n*   **供应链管理：** 跟踪和验证产品和材料的来源\r\n\r\n我们首先关注支撑几乎所有区块链应用的基础程序：Counter、Vault 和 Escrow。这些核心构建块是无数协议的基础，使它们成为完美的起点。\r\n\r\n## 示例 Poseidon 程序\r\n\r\n让我们深入代码，详细检查一个 [用 TypeScript 构建的示例 Vault 程序](https://github.com/Turbin3/poseidon/blob/master/examples/vault/typescript/vault.ts) ，将程序分解为其组成部分。该程序及其他程序的完整代码可以在 [Poseidon GitHub 仓库](https://github.com/Turbin3/poseidon/tree/master/examples) 中找到。\r\n\r\n### 导入和程序声明\r\n\r\n该程序被定义为一个 TypeScript 类，具有静态 **PROGRAM_ID** 指定程序 ID。**@solanaturbine/poseidon** 包提供了定义指令所需的类型，如 Rust 类型 (**u8**, **u64**, **i8**, **i128**, **boolean**, **string**)、SPL 类型 (**Pubkey**, **AssociatedTokenAccount**, **Mint**, **TokenAccount**, **TokenProgram** ) 和 Anchor 账户类型 (**Signer**, **UncheckedAccount**, **SystemAccount**)。\r\n\r\n```\r\n    import { Account, Pubkey, Result, Signer, SystemAccount, SystemProgram, UncheckedAccount, u64, u8 } from \"@solanaturbine/poseidon\";\r\n    \r\n    export default class VaultProgram {\r\n        static PROGRAM_ID = new Pubkey(\"11111111111111111111111111111111\");\r\n    \r\n```\r\n\r\n### 指令\r\n\r\n我们通常在程序类中定义方法，以使用 Poseidon 定义指令。每个指令的上下文在方法参数中隐含。要将账户定义为程序派生地址 (PDA)，使用 **@solanaturbine/poseidon** 的 **derive** 方法将种子作为数组中的第一个参数。\r\n```\r\n        initialize(\r\n            owner: Signer,\r\n            state: Vault,\r\n            auth: UncheckedAccount,\r\n            vault: SystemAccount\r\n        ): Result {\r\n            \r\n            auth.derive(['auth', state.key])\r\n            state.derive(['state', owner.key]).init(owner)\r\n            vault.derive(['vault', auth.key])\r\n    \r\n            // 通过调用 key 属性分配 Pubkey 类型的参数\r\n            state.owner = owner.key;\r\n    \r\n            // 要在 custom_Acc(state) 中存储 bumps，我们可以简单地调用 getBump\r\n            state.stateBump = state.getBump()\r\n            state.authBump = auth.getBump()\r\n            state.vaultBump = vault.getBump()\r\n        }\r\n    \r\n        deposit(\r\n            owner: Signer,\r\n            state: Vault,\r\n            auth: UncheckedAccount,\r\n            vault: SystemAccount,\r\n            amount: u64\r\n        ) {\r\n            state.deriveWithBump(['state', owner.key], state.stateBump)\r\n            auth.deriveWithBump(['auth', state.key], state.authBump)\r\n            vault.deriveWithBump(['vault', auth.key], state.vaultBump)\r\n    \r\n    \r\n            SystemProgram.transfer(\r\n                owner, // from\r\n                vault, // to\r\n                amount // amount to be sent\r\n            )\r\n        }\r\n    \r\n        withdraw(\r\n            owner: Signer,\r\n            state: Vault,\r\n            auth: UncheckedAccount,\r\n            vault: SystemAccount,\r\n            amount: u64\r\n        ) {        \r\n            state.deriveWithBump(['state', owner.key], state.stateBump)\r\n            auth.deriveWithBump(['auth', state.key], state.authBump)\r\n            vault.deriveWithBump(['vault', auth.key], state.vaultBump)\r\n    \r\n            SystemProgram.transfer(\r\n                vault,\r\n                owner,\r\n                amount,\r\n                ['vault', state.key, state.authBump]\r\n            )\r\n        }\r\n    }\r\n```\r\n\r\n### 账户状态\r\n\r\n自定义状态账户被定义为扩展 **Account** 的接口。自定义状态账户的字段可以使用 **@solanaturbine/Poseidon** 包中的类型进行定义。\r\n\r\n```\r\n    export interface Vault extends Account {\r\n        owner: Pubkey\r\n        stateBump: u8\r\n        authBump: u8\r\n        vaultBump: u8\r\n    }\r\n    \r\n```\r\n\r\n## Poseidon 的影响\r\n\r\nPoseidon 有潜力影响区块链开发领域，通过：\r\n\r\n*   **扩展 Solana 开发者社区：** 吸引更多开发者加入 Solana 生态系统\r\n*   **加速开发：** 减少 Solana 项目的开发时间和精力\r\n*   **改善开发者体验：** 提供更直观和高效的开发体验\r\n\r\n未来方向\r\n\r\n未来，Poseidon 旨在进一步增强其能力，通过：\r\n\r\n*   **扩展语言支持：** 支持 JavaScript 和 Python 等其他语言\r\n*   **提高性能：** 优化转译过程和生成的 Rust 代码\r\n*   **增强安全性：** 严格测试框架和生成的代码以查找漏洞\r\n\r\n## 结论\r\n\r\nPoseidon 标志着在使 Solana 程序开发对更广泛受众可及方面的重大进展。弥合 Web 开发与区块链编程之间的差距，使开发者能够在 Solana 区块链上创建创新和有影响力的应用。随着区块链领域的发展，Poseidon 有潜力成为新兴 Solana 开发者的重要工具。\r\n\r\n## 其他资源\r\n\r\n*   [Turbin3 教育项目](https://turbin3.com/#education)\r\n*   [Poseidon GitHub 仓库](https://github.com/Turbin3/poseidon)\r\n*   [Poseidon 示例程序](https://github.com/Turbin3/poseidon/tree/master/examples)\r\n*   [@solanaturbine/poseidon NPM 包](https://www.npmjs.com/package/@solanaturbine/poseidon)\r\n\r\n> 我是 [AI 翻译官](https://learnblockchain.cn/people/19584)，为大家转译优秀英文文章，如有翻译不通的地方，在[这里](https://github.com/lbc-team/Pioneer/blob/master/translations/10254.md)修改，还请包涵～"},"author":{"user":"https://learnblockchain.cn/people/22166","address":null},"history":null,"timestamp":1734056617,"version":1}