Solar 中文社群

@SolarCN

https://soldev.cn/

注册于 2025-01-16
Solana 训练营: 构建预测市场

**视频 AI 总结**:该视频是一个关于在 Solana 区块链上构建预测市场(Betting Market)的技术工作坊。主讲人 Mike McKenna 从金融背景出发,讲解了预测市场的基本原理(事件、结果、投注池、手续费、结算)以及如何用 Solana 程序实现一个电影票房预测市场。他通过图解展示了从初始化配置、创建事件、用户下注、到事件结算和用户提取奖金的完整流程,并强调了 Solana 的账户模型、PDA、代币转账等核心技术概念。最后,他介绍了 QuickNode 的 RPC 服务和针对金融编程的 AI 技能资源。 **主要内容**: - 预测市场的核心组件:事件、多个结果、投注池、手续费机制。 - Solana 程序实现:通过指令处理器(如 initialize config、create event、place bet、settle event、claim winnings)管理投注逻辑。 - 账户模型与 PDA:使用 PDA 存储事件、结果、用户信息,并作为代币金库的授权。 - 业务概念映射:将事件、结果、投注等映射为 Solana 上的 PDAs 和关联代币账户。 - 结算与收益分配:胜利者获得本金加亏损池的份额,市场创建者按比例收取手续费。 - 进阶话题:预言机(Oracle)可提高结果可信度,可引入“曲柄”(crank)模式自动分发奖金。 - 相关资源:QuickNode 的 Solana RPC 服务、包含多种金融程序示例的 GitHub 仓库、以及配套的 AI 编程技能。

80 0 0 2026-07-23
OKX DEX Solana Self-host Binary 技术分享

Solana第二大 DEX 聚合器 OKX DEX 的资深开发和产品经理为我们分享 OKX DEX API 的最新产品进展、产品与技术思考,开发者可以使用的工具,对 Solana trader开发者生态的观察,以及众所期待的 okx self host binary,让你的bot免去rate限制,更快一步!

268 0 0 2026-06-23
Solana 生产环境部署

大家好, 今天我们要聊一个在 Solana 生态中远未获得足够关注的话题: 支付应用的生产就绪性. 从一个能在 devnet 上跑通的概念验证, 到真正能处理真实资金, 真实用户, 真实后果的生产系统, 这中间存在着巨大的鸿沟. 说实话, 这道鸿沟已经坑了很多团队. 让我先讲一个你可能听起来很熟悉的故事. 你构建了一个出色的支付应用, 也许是结账系统, 也许是市场平台, 也许是某种订阅服务. 你在本地测试过, 部署到了 devnet, 一切都运行得很完美. 你准备好切换到主网, 开始处理真实交易了. 然后, 现实像一辆卡车一样撞上了你. 突然间, 你面对的都是从未想过的问题: 如果 RPC 节点在用户付款过程中宕机了怎么办? 如果交易卡在内存池里过期了怎么办? 网络拥堵时该如何处理优先费? 如果有人用一个看起来跟 USDC 一模一样的假代币来支付怎么办? 当签名密钥需要被后端服务访问时, 如何保证它的安全? 这些都不是假设性问题. 如果你处理不好, 它们会彻底毁掉你的发布. 最棘手的地方在于, 这些问题大多在测试阶段不会出现, 只有当你上线, 当真实资金在流转, 当用户期待一切正常运行时, 它们才会浮出水面. 所以, 让我们来拆解一下, 对于 Solana 支付而言, "生产就绪"究竟意味着什么. 它不是单一的一件事, 而是一套协同运作的考量体系, 共同构建出可靠, 安全, 可维护的支付基础设施. 首先, 我们来谈 SOL. 这看似基础, 但至关重要. 你的主网钱包需要有真实的 SOL 来支付交易费用和租金. 不一定需要很多, 但你需要从运营角度来考虑这个问题. 需要多少 SOL? 这取决于你的交易量, 但你应该以覆盖数千笔交易的费用为基准, 同时还要考虑你所创建账户的租金. 有一件事没人告诉你: 你需要一套系统来监控这个余额, 并在余额耗尽前及时告警. 在运营途中耗尽 SOL 既尴尬又完全可以避免. 然后是 RPC 配置. 很多团队都在这里栽了跟头. 在开发阶段, 你可能用的是公共 Solana RPC 节点. 那些节点用于测试没问题, 但绝对不适合生产环境, 它们有速率限制, 可能很慢, 也无法保证正常运行时间和性能. 在生产环境中, 你需要配置自己的 RPC 节点, 这可能意味着运行自己的验证节点, 或者更常见地, 使用 Helius, Triton, QuickNode 等专用 RPC 服务商. 但关键在于: 无论你选择哪种 RPC 方案, 都不应该是互联网上任何人都能访问的公共节点. 你的生产 RPC 应当是私有的, 有身份验证的, 并且只向你的服务开放. 为什么? 因为速率限制, 因为安全, 因为你需要精确控制应用与 Solana 网络的交互方式. 说到 RPC 节点, 你绝对需要备用方案. 你的主 RPC 节点迟早会宕机, 这是必然的. 也许是你忘记的维护窗口, 也许是 DDoS 攻击, 也许是海底电缆被切断. 无论原因如何, 你都需要一个备用 RPC, 让你的应用能够自动故障转移. 这意味着你的代码从第一天起就要以多 RPC 节点为前提来设计. 我们来聊聊优先费. 这是一个看似可选, 却会在某个关键时刻变得不可或缺的功能. Solana 默认按先来先处理的顺序处理交易, 但当网络繁忙时, 优先费可以让你插队. 对于支付应用而言, 这可能是交易即时到账还是在内存池中无限期等待的区别. 聪明的做法是动态定价. 不要硬编码一个固定的优先费值. 实现一套逻辑, 观察当前网络状况并相应调整优先费: 网络空闲时付最低费用, 网络拥堵时付足够让交易通过的费用. 你的用户期待支付能够正常运行, 为此多花几分之一美分的优先费是完全值得的. 接下来是重试逻辑, 这里会变得有趣. Solana 交易可能因各种原因失败: 也许 blockhash 在交易处理前就过期了, 也许是短暂的网络抖动, 也许是 RPC 节点瞬间故障. 无论原因如何, 你的应用都需要优雅地处理这些失败. 但棘手的地方在于: 你不能对每一笔失败的交易都盲目重试. 有些失败是永久性的, 如果有人试图用一个他们无权控制的账户向你付款, 重试无济于事; 如果余额不足, 重试同样无济于事. 你的重试逻辑必须足够智能, 能够区分值得重试的临时性失败和需要告知用户的永久性失败. 还有另一个维度: blockhash 过期. 每笔 Solana 交易都包含一个最近的 blockhash, 该 blockhash 只有约 150 个 slot 的有效期, 大约是 60 到 90 秒. 如果交易在此窗口内未能上链, 就会过期. 你的重试逻辑需要能检测到这种情况, 并用新的 blockhash 创建一笔新交易, 而不是重试旧的那笔. 确认级别. 这是一个让人困惑的概念, 因为它与大多数区块链的工作方式不同. 在 Solana 上, 交易可以在不同级别得到确认: processed(已处理), confirmed(已确认)和 finalized(已最终化). Processed 表示交易已被打包进某个区块; confirmed 表示该区块已获得超过三分之二权益的投票; finalized 表示该区块已被确立为根区块, 不可回滚. 对于大多数支付应用, confirmed 是合适的等待级别. 它很快, 通常只需一两秒, 回滚的概率极低. Finalized 更安全, 但需要更长时间, 大约 32 个 slot, 约 13 秒. 你需要根据使用场景做出选择, 高价值支付或许值得等待 finalized, 普通支付则可能不需要. 错误处理. 这个话题值得深入探讨, 因为 Solana 的错误信息可能晦涩难懂, 而你的用户不应该去解读这些信息. 当出错时, 你需要捕获错误, 理解其含义, 并向用户呈现有用的信息. "Transaction simulation failed"(交易模拟失败)毫无帮助; "Insufficient funds to complete this payment"(余额不足, 无法完成支付)才是有用的. 思考所有常见的错误场景: SOL 不足以支付费用, 代币余额不足, 收款地址无效, 兑换超出滑点容差, 账户未满足租金豁免条件. 每一种情况都应该有专项处理和清晰的错误提示. 如果你在处理无 Gas 交易, 即由你来代用户支付费用, 那就增加了另一层复杂性. 你需要一套健壮的系统, 在代表用户签名和提交交易的同时, 保证安全性并防止滥用. 这通常涉及某种带速率限制和欺诈检测的交易中继服务. 代币验证. 这一点至关重要, 却常被忽视. 如果你的应用接受 USDC 支付, 你必须验证收到的代币确实是 USDC, 而不是某个刻意伪装成 USDC 的骗局代币. 请对照官方代币列表核验 mint 地址. 不要轻信代币自称的名字, 要验证链上实际的 mint 地址. 安全是重中之重. 你的私钥就是你金库的钥匙, 字面意义上的. 它们绝对, 永远不应该存储在前端代码或任何用户可以访问的地方. 仅限后端, 静态加密, 并遵循正规的密钥管理规范. 考虑使用硬件安全模块或密钥管理服务, 并落实最小权限原则: 密钥只能做它需要做的事情, 仅此而已. 让我们进一步展开. 不同操作应使用不同的密钥. 不要用同一把密钥既签名交易又控制资金库. 建立合理的密钥层级结构: 用热钱包处理日常操作, 用冷存储保管大部分资金. 还有, 请务必安全地备份你的密钥, 多份备份, 存放于多个位置, 并做好加密. 交易监控与告警. 你需要实时掌握支付动态. 建立对交易成功率, 平均确认时间, 失败交易模式的监控. 一旦出现问题, 你要第一时间知道, 而不是等到用户开始投诉时才发现. 构建仪表盘, 设置告警, 与你的事故管理系统集成. 最后, 压力测试. 这一步绝对不可跳过. 你需要在预期负载下测试你的系统, 然后在超出预期许多的负载下再次测试. 当每小时处理量从十笔增长到一千笔时会发生什么? 一万笔呢? 瓶颈在哪里? 是 RPC 连接? 数据库? 签名服务? 你需要在用户发现之前先找到这些极限. 生产就绪不是在清单上打勾. 它是关于在真实世界条件下构建可靠, 安全, 可维护的系统; 是关于思考故障模式和边界情况; 是关于尊重这样一个事实, 你在处理真实的资金和真实的用户期望. 好消息是, 这一切都是可以做到的. Solana 上成功发布生产级支付应用的案例屡见不鲜. 但他们都是从一开始就认真对待这些考量, 而不是事后才亡羊补牢. 所以, 在你构建下一个支付应用时, 请牢记这些原则. 你未来的自己, 以及你的用户, 都会感谢你的.

256 0 0 2026-05-08
构建 Solana Mobile 应用

一个参考应用,展示如何在 React Native 中使用和调用 Anchor 程序,使用 Mobile Wallet Adapter 作为签名器。 **此应用仅在 Android 上完全功能正常。** ## 技术栈 - [Mobile Wallet Adapter](https://github.com/solana-mobile/mobile-wallet-adapter/tree/main/js/packages/mobile-wallet-adapter-protocol) - 用于连接钱包和签名交易/消息 - [web3.js](https://solana-labs.github.io/solana-web3.js/) - 用于构建交易和 RPC `connection` 客户端 | [![截图 1](https://github.com/Solana-ZH/solana-bootcamp-2026-cn/raw/main/15-solana-mobile-counter/images/screenshot1.png)](https://github.com/Solana-ZH/solana-bootcamp-2026-cn/blob/main/15-solana-mobile-counter/images/screenshot1.png) | [![截图 2](https://github.com/Solana-ZH/solana-bootcamp-2026-cn/raw/main/15-solana-mobile-counter/images/screenshot2.png)](https://github.com/Solana-ZH/solana-bootcamp-2026-cn/blob/main/15-solana-mobile-counter/images/screenshot2.png) | [![截图 3](https://github.com/Solana-ZH/solana-bootcamp-2026-cn/raw/main/15-solana-mobile-counter/images/screenshot3.png)](https://github.com/Solana-ZH/solana-bootcamp-2026-cn/blob/main/15-solana-mobile-counter/images/screenshot3.png) | | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | | | | | ## 先决条件 - 一个 [Expo](https://expo.dev/) 账户 - React Native 和 Android 环境 设置 - Android 设备/模拟器 - 在设备/模拟器上安装兼容 MWA 的钱包应用 ## 使用方法 ### 构建并运行应用 按照 Expo 设置指南中的 **["运行应用"](https://docs.solanamobile.com/react-native/expo#running-the-app)** 部分,将模板作为自定义开发构建启动。 ### 初始化 使用以下命令初始化示例应用: ``` npx expo start --dev-client ``` 选择项目名称,然后进入目录。 ## 故障排除 - `Metro 遇到错误:尝试解析模块 @solana-mobile/mobile-wallet-adapter-protocol...` - 这是使用 `npm install` 安装 Expo 模板时的持续性问题 - 解决方法:清理项目依赖并使用 `yarn install` 重新安装 - `包 'solana-mobile-wallet-adapter-protocol' 似乎未链接。请确保:...` - 确保您**没有**使用 Expo Go 运行应用 - 您需要使用 [Expo 自定义开发构建](https://docs.solanamobile.com/react-native/expo#custom-development-build),而不是 Expo Go - `无法连接到...` - 这是 Expo 错误,可能在特定 Wi-Fi 网络上尝试连接到开发服务器时发生 - 修复方法:尝试使用 `--tunnel` 命令启动开发服务器 (`npx expo start --dev-client --tunnel`) - `错误:不支持 crypto.getRandomValues()` - 这是在 React Native/Expo 环境中尝试使用 `@solana/web3.js` 中的某些函数时的 polyfill 问题 - 修复方法:确保您的应用正确导入和使用 polyfill,如本[指南](http://docs.solanamobile.com/react-native/expo#step-3-update-appjs-with-polyfills)所示 - ``` 错误:无法加载项目配置 ``` - 同上,但针对 `yarn`。通过 yarn [卸载并重新安装](https://github.com/react-native-community/cli#updating-the-cli) CLI - ``` 看起来您的 iOS 环境未正确设置 ``` : - 您可以在模板初始化期间忽略此提示,并正常构建 Android 应用。此模板仅兼容 Android - ``` 使用错误:看起来您正在尝试使用 https:... URL 添加包;我们现在要求明确指定包名 ``` - 此错误发生在某些版本的 `yarn` 上,如果您尝试通过 GitHub 仓库 URL 而不是 npm 包初始化模板,则会发生此错误。为避免此问题,请使用指定的 `@solana-mobile/solana-mobile-dapp-scaffold` 包,或将 `yarn` 版本降级到经典版本 (1.22.x) - ``` 错误:在 "@solana-mobile/solana-mobile-dapp-scaffold" 模板中找不到 ".../@solana-mobile/solana-mobile-dapp-scaffold/template.config.js" 文件 ``` - 这是某些版本 `yarn` (>= 3.5.0) 的[已知错误](https://github.com/react-native-community/cli/issues/1924)。通过使用 `--npm` 标志运行 cli 命令或降级 `yarn` 版本来修复 ## 版本声明 本节课程代码复制自 [solana-mobile/tutorial-apps](https://github.com/solana-mobile/tutorial-apps/tree/4b694128776e89f59827bd8dd413c2c96c9ed671/AnchorCounterDapp)

244 0 0 2026-05-08
Solana Mobile 环境搭建

## 为什么是 Solana Mobile? 过去几年,Web3 的用户体验一直停留在桌面端和网页端。但现实是——全球超过 55 亿人使用智能手机,移动互联网才是大多数人接触数字世界的第一入口。 而华语区,正是全球移动互联网的中心。 华语用户早在十年前就完成了移动支付的普及,我们的工程师深度参与了微信、支付宝、抖音这些改变世界的移动产品的构建。华语区有全球最顶尖的移动互联网工程师,这是我们独特的优势。 **Solana Mobile,正在把这个优势变成 Web3 的机会。** ## 什么是 Solana Mobile Stack? Solana Mobile Stack(SMS)是一套专为 Android 移动端 dApp 开发设计的技术集合,核心由三个部分组成: ### ① Mobile Wallet Adapter(MWA) MWA 是移动端 dApp 与钱包 App 之间的通信协议。类比 Web 端的 Wallet Adapter——你的 dApp 只需集成一次,就能兼容所有实现了 MWA 协议的钱包,包括 Phantom、Solflare、Ultimate 等。支持 React Native、Kotlin、Flutter 等主流框架。 ### ② Seed Vault 系统级安全密钥托管服务,把私钥保存在设备上安全性最高的执行环境中——比如安全处理器或安全辅助芯片。对钱包应用来说,这是移动端密钥安全的底层保障。 ### ③ Solana dApp Store 专为 Solana 生态设计的独立应用分发平台。绕开传统应用商店的限制——不抽分成、没有额外审核壁垒,让你的应用直接触达用户。目前已有超过 100 个应用上线。 ``` Solana Mobile Stack ├── Mobile Wallet Adapter → dApp ↔ 钱包通信协议 ├── Seed Vault → 系统级安全密钥管理 └── dApp Store → 独立应用分发平台 ``` ## 对开发者的支持 ### Builder Grants Solana Mobile 设有专属的 Builder Grants 计划,每个团队最高可获得 **$10,000** 的资金支持,同时附带官方市场宣发和上线协助。只要你的应用专注于移动端开发,都可以申请。 ### 黑客松奖励 在各大 Colosseum 黑客松中,移动端项目是重点评审方向之一。Solana Mobile 官方黑客松奖金池高达 **$100,000**,获奖项目还能在 dApp Store 获得首发推荐位。这不只是奖金,更是直接触达真实用户的机会。 ## 华语区的机会 我们非常相信一件事:下一批最出色的 Solana Mobile 应用,很可能诞生在华语区。 我们懂移动端,从产品设计到工程实现,华语区积累了全球最丰富的移动互联网经验。把这些能力迁移到 Web3,我们天然有优势。而现在正是早期——早进来的 builder,能拿到最多支持,也能抢占最好的位置。 ## 相关资源 ### 搭建开发环境 - [Solana Mobile 开发环境配置](https://docs.solanamobile.com/get-started/development-setup#expo-%2F-react-native) ### Solana 移动端模板 如果你想在已有的 Web2 移动应用基础上快速接入 Solana,官方开发者模板里有专门的移动端模板,已预集成 MWA、钱包连接、交易发送等常用功能: - [Solana 官方开发者模板](https://solana.com/developers/templates) ### 参考项目 想看看真实的 Solana Mobile 应用是怎么构建的?官方提供了一批示例应用,覆盖 DeFi、NFT、游戏等多个场景: - [示例应用概览](https://docs.solanamobile.com/sample-apps/sample_app_overview) - [完整示例代码](https://github.com/solana-mobile/react-native-samples/tree/main)

257 0 0 2026-05-08
构建 RWA 应用

一个基于 Solana 的神秘盲盒 NFT 抽签系统,收录 11 款限量版 Labubu 角色,采用 Token-2022 标准。 ## 功能特性 - **11 种独特 Labubu 类型**:10 种普通类型(每种 120 份)+ 1 种稀有类型(6 份)= 共 1,206 个 NFT - **神秘盲盒机制**:根据剩余供应量进行加权随机铸造 - **Token-2022 NFT**:使用 Solana 的 token-2022 标准铸造代币 - **Anchor 程序**:链上藏品状态管理与铸造逻辑 - **Next.js 前端**:集成钱包的交互式盲盒 UI ## 前置条件 - Node.js 18+ 及 pnpm - Rust 和 Anchor CLI(0.31.1+) - 配置为 devnet 的 Solana CLI - Devnet SOL([水龙头](https://faucet.solana.com/)) ## 快速开始 ``` # 1. 安装依赖 cd anchor && pnpm install cd ../app && pnpm install # 2. 构建并部署程序 cd anchor anchor build solana config set --url https://api.devnet.solana.com anchor deploy --provider.cluster devnet # 3. 生成 TypeScript 客户端 pnpm codegen # 4. 初始化藏品 anchor run initialize # 5. 启动前端 cd ../app && pnpm dev ``` 访问 [http://localhost:3000](http://localhost:3000/) ## 程序架构 三条主要指令: 1. `initialize_collection` - 创建带有供应计数器的藏品账户 2. `create_labubu_mint` - 为每种 Labubu 类型创建 Token-2022 铸币账户 3. `mint_random` - 向用户的关联代币账户随机铸造一个 NFT ## 相关资源 - [Solana 文档](https://solana.com/docs) - [Anchor 框架](https://www.anchor-lang.com/) - [Token-2022 指南](https://spl.solana.com/token-2022) - [@solana/react-hooks](https://github.com/solana-foundation/framework-kit/tree/main/packages/react-hooks) ## 许可证 MIT

269 0 0 2026-05-08
构建 X402 应用

一个 AI 驱动的算命应用,演示如何使用 X402 协议在 Solana 上进行加密货币支付。用户支付加密货币后即可解锁 AI 生成的命运解读和付费内容。 ## 应用功能 - **AI 算命** - 由 OpenAI 驱动的个性化命运解读($0.05) - **分级内容** - 多个价格档次对应不同内容 - **直接加密支付** - 通过 Coinbase Pay 或加密钱包以 Solana 支付 - **无需注册** - 支付后立即访问内容 ## 快速开始 ``` pnpm install cp .env.example .env.local # 编辑 .env.local:填入你的 OpenAI API 密钥和 CDP 客户端密钥 pnpm dev ``` ------ # X402 Next.js Solana 模板 **一个集成了 X402 支付协议的简洁 Next.js 入门模板,专为 Solana 设计。** 本模板演示了如何使用 `x402-next` 包实现 X402 支付协议,轻松为你的 Next.js 应用添加加密货币支付门控。 > **在主网使用?** 本模板默认配置为测试网(devnet)。若要在主网接收真实支付,需要设置 CDP API 密钥并配置手续费支付方。完整设置说明请参阅 [CDP X402 主网文档](https://docs.cdp.coinbase.com/x402/quickstart-for-sellers#running-on-mainnet)。 ## 目录 - [什么是 X402?](https://github.com/Solana-ZH/solana-bootcamp-2026-cn/tree/main/12-solana-x402-demo#什么是-x402) - [功能特性](https://github.com/Solana-ZH/solana-bootcamp-2026-cn/tree/main/12-solana-x402-demo#功能特性) - [快速开始](https://github.com/Solana-ZH/solana-bootcamp-2026-cn/tree/main/12-solana-x402-demo#快速开始-1) - [工作原理](https://github.com/Solana-ZH/solana-bootcamp-2026-cn/tree/main/12-solana-x402-demo#工作原理) - [项目结构](https://github.com/Solana-ZH/solana-bootcamp-2026-cn/tree/main/12-solana-x402-demo#项目结构) - [配置说明](https://github.com/Solana-ZH/solana-bootcamp-2026-cn/tree/main/12-solana-x402-demo#配置说明) - [使用方法](https://github.com/Solana-ZH/solana-bootcamp-2026-cn/tree/main/12-solana-x402-demo#使用方法) ------ ## 什么是 X402? **X402** 是一个开放支付协议,利用 HTTP 状态码 **402 "Payment Required"** 为网页内容和 API 实现无缝加密货币支付。 ### 核心优势 - **直接支付** - 无需第三方支付处理商,直接接收加密货币 - **无需账户** - 无需用户注册或身份验证 - **区块链验证** - 支付直接在 Solana 区块链上验证 - **简单集成** - 通过中间件为任意 Next.js 路由添加支付门控 - **灵活定价** - 为不同内容设置不同价格 ### 工作流程 ``` 1. 用户请求受保护内容 2. 服务器返回 402 Payment Required 3. 用户通过 Coinbase Pay 或加密钱包完成支付 4. 用户提供交易签名作为支付凭证 5. 服务器在区块链上验证并授权访问 ``` ------ ## 功能特性 - **X402 支付中间件** - 由 `x402-next` 包驱动 - **Solana 集成** - 使用 Solana 区块链进行支付验证 - **多价格档次** - 为不同路由配置不同价格 - **会话管理** - 支付后自动处理会话 - **类型安全** - 完整的 TypeScript 支持(Viem 类型) - **Next.js 16** - 基于最新的 Next.js App Router 构建 ------ ## 快速开始 ### 前置条件 - Node.js 18+ 或 Bun - pnpm、npm 或 yarn - 一个用于接收支付的 Solana 钱包地址 ### 安装步骤 ``` # 从模板创建项目 npx create-solana-dapp my-app --template x402-template # 进入项目目录 cd my-app # 安装依赖 pnpm install # 启动开发服务器 pnpm dev ``` 访问 `http://localhost:3000` 查看运行中的应用。 ### 测试支付流程 1. 访问 `http://localhost:3000` 2. 点击"访问廉价内容"或"访问昂贵内容" 3. 弹出 Coinbase Pay 支付对话框 4. 完成支付 5. 授权成功,即可查看受保护内容 ------ ## 工作原理 本模板使用 `x402-next` 包提供的中间件来处理完整的支付流程。 ### 中间件配置 支付集成的核心在 `middleware.ts` 中: ``` import { Address } from 'viem' import { paymentMiddleware, Resource, Network } from 'x402-next' import { NextRequest } from 'next/server' // 接收支付的 Solana 钱包地址 const address = 'CmGgLQL36Y9ubtTsy2zmE46TAxwCBm66onZmPPhUWNqv' as Address const network = 'solana-devnet' as Network const facilitatorUrl = 'https://x402.org/facilitator' as Resource const cdpClientKey = '3uyu43EHCwgVIQx6a8cIfSkxp6cXgU30' const x402PaymentMiddleware = paymentMiddleware( address, { '/content/cheap': { price: '$0.01', config: { description: '访问廉价内容', }, network, }, '/content/expensive': { price: '$0.25', config: { description: '访问昂贵内容', }, network, }, }, { url: facilitatorUrl, }, { cdpClientKey, appLogo: '/logos/x402-examples.png', appName: 'x402 Demo', sessionTokenEndpoint: '/api/x402/session-token', }, ) export const middleware = (req: NextRequest) => { const delegate = x402PaymentMiddleware as unknown as ( request: NextRequest, ) => ReturnType<typeof x402PaymentMiddleware> return delegate(req) } export const config = { matcher: ['/((?!_next/static|_next/image|favicon.ico).*)', '/'], } ``` ### 底层实现逻辑 1. **请求拦截** - 中间件检查请求路由是否需要支付 2. **支付检查** - 若路由受保护,检查是否存在有效支付会话 3. **402 响应** - 若无有效支付,返回 402 及支付要求 4. **Coinbase Pay 弹窗** - 用户看到由 Coinbase 驱动的支付弹窗 5. **支付验证** - 支付完成后,通过协调者在 Solana 区块链上验证交易 6. **创建会话** - 有效支付后创建会话令牌 7. **授权访问** - 用户可访问受保护内容 ------ ## 项目结构 ``` x402-template/ ├── middleware.ts # X402 支付中间件配置 ├── app/ │ ├── page.tsx # 包含受保护内容链接的首页 │ ├── layout.tsx #根布局 │ ├── globals.css #全局样式 │ └── content/ │ └── [type]/ │ └── page.tsx # 受保护内容页面 ├── components/ │ └── cats-component.tsx # 示例内容组件 ├── lib/ # 工具函数(按需) ├── public/ #静态资源 └── package.json # 依赖配置 ``` ------ ## 配置说明 ### 环境变量 模板提供了合理的默认值,你也可以创建 `.env.local` 文件进行自定义: ``` # 你的 Solana 钱包地址(接收支付) NEXT_PUBLIC_WALLET_ADDRESS=your_solana_address_here # 网络(solana-devnet 或 solana-mainnet-beta) NEXT_PUBLIC_NETWORK=solana-devnet # Coinbase Pay 客户端密钥(从 Coinbase 开发者门户获取) NEXT_PUBLIC_CDP_CLIENT_KEY=your_client_key_here # 协调者 URL(验证支付的服务) NEXT_PUBLIC_FACILITATOR_URL=https://x402.org/facilitator ``` ### 自定义路由和价格 编辑 `middleware.ts` 以添加或修改受保护路由: ``` const x402PaymentMiddleware = paymentMiddleware( address, { '/premium': { price: '$1.00', config: { description: '付费内容访问', }, network: 'solana-mainnet-beta', }, '/api/data': { price: '$0.05', config: { description: 'API 数据访问', }, network: 'solana-mainnet-beta', }, }, // ... 其余配置 ) ``` ### 网络选择 可使用以下网络: - `solana-devnet` - 用于测试(使用测试代币) - `solana-mainnet-beta` - 用于生产环境(真实资金!) - `solana-testnet` - 备用测试网络 ------ ## 使用方法 ### 创建受保护内容 只需在中间件定义的受保护路由下创建页面即可: ``` // app/content/premium/page.tsx export default async function PremiumPage() { return ( <div> <h1>付费内容</h1> <p>此内容需要支付后才能访问。</p> {/* 在此处添加你的受保护内容 */} </div> ) } ``` ### 添加新的价格档次 1. 在 `middleware.ts` 中添加路由配置 2. 创建对应的页面组件 3. 用户访问该路由时将自动收到支付提示 ### 在开发网测试 使用 `solana-devnet` 时: - 支付使用测试代币(无真实资金) - 适合开发和测试 - 从 [Solana 水龙头](https://faucet.solana.com/) 获取测试代币 ### 上线生产环境 接受真实支付前: 1. 在 `middleware.ts` 中将网络改为 `solana-mainnet-beta` 2. 将钱包地址更新为你的生产钱包 3. 部署前请充分测试! 4. 考虑实施额外的安全措施 ------ ## 依赖项 本模板使用最少的依赖: ``` { "dependencies": { "next": "16.0.0", "react": "19.2.0", "react-dom": "19.2.0", "viem": "^2.38.5", "x402-next": "^0.7.1" } } ``` - **next** - Next.js 框架 - **react** / **react-dom** - React 库 - **viem** - 类型安全的 Ethereum/Solana 类型 - **x402-next** - X402 支付中间件(处理所有支付逻辑) ------ ## 了解更多 ### X402 协议 - [X402 规范](https://github.com/coinbase/x402) - 官方协议文档 - [X402 Next 包](https://www.npmjs.com/package/x402-next) - 本模板使用的中间件 ### Solana - [Solana 文档](https://docs.solana.com/) - Solana 官方文档 - [Solana 浏览器](https://explorer.solana.com/) - 链上交易查询 ### Coinbase 开发者 - [CDP 文档](https://docs.cdp.coinbase.com/) - Coinbase 开发者文档 ------ ## 常见问题 ### 支付无法正常工作 1. 检查 `middleware.ts` 中的钱包地址是否正确 2. 确认使用的网络正确(devnet vs mainnet) 3. 查看浏览器控制台报错 4. 确保 Coinbase Pay 客户端密钥有效 ### 402 错误未显示 1. 检查 `middleware.ts` 中的 matcher 配置 2. 确认路由路径与页面结构匹配 3. 清除 Next.js 缓存:`rm -rf .next && pnpm dev` ### 会话未保持 1. 确认浏览器已启用 Cookie 2. 验证会话令牌端点已配置 3. 检查使用自定义域名时是否存在 CORS 问题 ------ ## 支持 模板相关问题请在仓库中提交 Issue。 X402 协议相关问题请参阅[官方文档](https://github.com/coinbase/x402)。 ------ ## 许可证 MIT 许可证 - 欢迎在你的项目中使用本模板。 ------ ## 贡献 欢迎贡献!请随时提交 Pull Request。 ------ **由 [Kronos](https://www.kronos.build/) 打造**

273 0 0 2026-05-08
构建预测市场

这是一个基于 [Anchor](https://www.anchor-lang.com/) 构建在 Solana 上的双代币流动性池,专门针对稳定币交易对进行了优化。它实现了 [Curve StableSwap invariant](https://curve.fi/files/stableswap-paper.pdf),因此在交换价格接近的资产(例如 USDC/USDT)时,相比恒定乘积 AMM,可以显著降低滑点。 更多内容请前往:https://learnblockchain.cn/course/94

246 0 0 2026-05-08
构建稳定币swap应用

这是一个基于 [Anchor](https://www.anchor-lang.com/) 构建在 Solana 上的双代币流动性池,专门针对稳定币交易对进行了优化。它实现了 [Curve StableSwap invariant](https://curve.fi/files/stableswap-paper.pdf),因此在交换价格接近的资产(例如 USDC/USDT)时,相比恒定乘积 AMM,可以显著降低滑点。 ## 工作原理 标准 AMM(如 Uniswap 风格的 `x·y = k`)即使面对中等规模的交易,也会产生明显价格冲击。对于那些应当接近 `1:1` 交易的资产,StableSwap invariant: ```text 4·A·(x + y) + D = 4·A·D + D³ / (4·x·y) ``` 会把流动性集中在锚定价格附近,因此在储备平衡时可以实现接近零滑点的交换,同时当价格偏离锚定时,曲线仍能自动回到更稳健的状态。 **放大系数 A(amplification parameter)** 控制这种权衡: - **高 A(100–2000)**:曲线在 peg 附近几乎是平的,滑点极低,适合 USDC/USDT - **低 A(1–10)**:更接近恒定乘积,对脱锚场景的适应性更强 ### 示例 在 `A = 100` 时,交换相当于池子规模 `10%` 的资产: - **StableSwap**:输出效率约为 `99.9%` - **恒定乘积**:输出效率约为 `90.9%` ## Program ID ```text CorabfeniSyoc4aLcJe7t9b3RaFX5tzVWXdewU1xuA6B ``` ## 前置要求 - [Rust](https://rustup.rs/) - [Solana CLI](https://solana.com/developers/guides/getstarted/setup-local-development) - [Anchor CLI](https://www.anchor-lang.com/docs/installation) v1.0.0-rc.2 - [Node.js](https://nodejs.org/) + [Yarn](https://yarnpkg.com/) ## 构建 ``` anchor build ``` ## 测试 ``` yarn install anchor test ``` 测试会在本地 validator 上覆盖完整的池子生命周期,包括: - 池子初始化 - 初始与后续流动性添加 - A→B 和 B→A 交换 - 交换和提取流动性时的滑点保护 - 移除流动性 - StableSwap 与恒定乘积 AMM 的效率对比 ## 指令 ### `initialize_pool` 为 token A / token B 交易对创建一个新的池子。 | 参数 | 类型 | 说明 | | --------------- | ----- | ------------------------------------------------------- | | `amplification` | `u64` | A 参数(1–1,000,000)。对稳定币通常使用 100–2000。 | | `fee_bps` | `u16` | 交换手续费,单位为 basis points(例如 `4` = `0.04%`)。 | 该指令会自动创建: - pool PDA - LP mint - 两个 vault ATA ### `add_liquidity` 向池子中存入 token A 和/或 token B,以获得代表池子份额的 LP token。 | 参数 | 类型 | 说明 | | ------------ | ----- | ---------------------------------------- | | `amount_a` | `u64` | 要存入的 token A 数量。 | | `amount_b` | `u64` | 要存入的 token B 数量。 | | `min_lp_out` | `u64` | 至少应收到的 LP token 数量(滑点保护)。 | 首次存款会建立初始价格。后续存款可以是不平衡的,但 LP token 的铸造数量将按池子 invariant `D` 的变化比例计算。 ### `swap` 使用 StableSwap invariant 将一种代币交换为另一种。 | 参数 | 类型 | 说明 | | ---------------- | ------ | -------------------------------------- | | `amount_in` | `u64` | 输入代币数量。 | | `min_amount_out` | `u64` | 至少应收到的输出代币数量(滑点保护)。 | | `a_to_b` | `bool` | `true` 表示 A→B,`false` 表示 B→A。 | ### `remove_liquidity` 销毁 LP token,并按比例提取两种底层资产。 | 参数 | 类型 | 说明 | | ----------- | ----- | --------------------------------------- | | `lp_amount` | `u64` | 要销毁的 LP token 数量。 | | `min_a` | `u64` | 至少应收到的 token A 数量(滑点保护)。 | | `min_b` | `u64` | 至少应收到的 token B 数量(滑点保护)。 | ## 账户结构 ```text Pool PDA seeds: ["pool", mint_a, mint_b] ├── token_mint_a — token A 的 mint 地址 ├── token_mint_b — token B 的 mint 地址 ├── vault_a — 池子持有 token A 的 ATA(owner 为 pool PDA) ├── vault_b — 池子持有 token B 的 ATA(owner 为 pool PDA) ├── lp_mint — LP token mint(authority = pool PDA) ├── amplification — A 参数 └── fee_bps — 交换手续费 ``` ## 安全性 - **防 LP inflation attack**:首次存款会锁定 `MINIMUM_LIQUIDITY = 1000` 作为虚拟死股份,避免攻击者通过捐赠极小数量资产来操纵 LP 价格 - **滑点保护**:所有指令都支持用户指定最小输出值,不满足则回滚 - **溢出保护**:所有数学运算都使用 `checked_*`;Newton–Raphson 迭代最多执行 255 次

260 0 0 2026-05-08