构建 Story CLI:从 30 分钟的 IP 注册到不到 5 分钟

发布: (2025年12月16日 GMT+8 05:43)
8 min read
原文: Dev.to

Source: Dev.to

引发此项目的问题

有一点让我对 Web3 开发者工具感到不满:它们往往是 有经验的区块链开发者 有经验的区块链开发者构建的。

以区块链上的 IP 注册为例,如果你是只想把自己的艺术作品、音乐或代码登记为链上知识产权的独立创作者,你需要花 15–30 分钟在文档中摸索、手动格式化 JSON 元数据,并祈祷交易在你已经花费了 gas 之后不会失败。

我创建 Story CLI 来解决这个问题。

我构建了什么

Story CLI 是一个用于在 Story Protocol 上注册 IP 资产的命令行工具包——一个专为可编程知识产权设计的区块链。你无需编写代码或手动调用 API,只需使用交互式向导:

story register ./my-artwork.jpg

CLI 会引导你完成许可证选择、处理 IPFS 上传、执行区块链交易,并为你提供一个可分享的作品集可视化,展示所有已注册的 IP。

目标: 将 15–30 分钟的流程压缩到 5 分钟以内。

Story CLI 演示

1. 许可证向导状态机

最棘手的部分之一是把法律许可证配置转换为人类在 30 秒内能回答的问题。Story Protocol 使用 PIL(Programmable IP License),包含多个参数——商业使用权限、衍生权、版税比例。

我将其映射为三问决策树:

商业使用? → 是/否
允许衍生? → 是/否
收益分成? → 0‑100%(仅在商业 + 衍生时)

这三个问题决定以下四种许可证配置之一:

商业使用允许衍生结果
仅限非商业
非商业衍生作品
商业但无衍生
商业混音(+ 版税 %)

状态机方式让我能够实时验证答案,并在它们进入区块链之前阻止无效组合。

许可证向导示意图

2. 快速失败(Fail‑fast)原则

区块链交易会消耗 gas,失败的交易仍然会消耗 gas。这就产生了设计需求:在触链之前验证所有内容

  • 钱包地址格式?在任何网络请求前检查。
  • IPFS 哈希格式?在输入时验证。
  • 余额是否充足?在提交交易前查询。
  • 版税比例?在提示时限制在 0‑100 %。

理念是:如果要失败,就在前 2 秒内失败,而不是在 30 秒的交易尝试后才失败。

3. 三段式错误信息

Story CLI 的每个错误都遵循结构:发生了什么为什么重要如何修复

✖ Pinata API key not found
  IPFS uploads require Pinata authentication for metadata storage.
  Run: story config set pinataApiKey YOUR_KEY

大多数 CLI 工具只会抛出 “Error: invalid credentials” 之类的提示,让你自行摸索。我花了大量时间确保每种失败状态都有可操作的指引。

4. 自包含的作品集 HTML

注册完成后,用户需要 看到 他们的 IP。我选择 Mermaid.js 进行图形可视化,因为它可以生成 单个 HTML 文件,所有 CSS、JavaScript 与关系图都内嵌其中。

无需服务器。下载文件、发送邮件给他人、打开即可。它就能工作。

story portfolio
# → 生成 story-portfolio.html,内含交互式图表

权衡是:相比 D3.js,视觉定制性更低,但对 MVP 来说,交付 > 完美。

挑战与收获

挑战 1:SDK 文档缺口

Story Protocol 较新。SDK 文档存在空白——尤其是错误响应和边缘情况。我最终直接阅读 SDK 源码,并构建了一个模拟实现 (STORY_CLI_MOCK=true) 以便离线开发,避免消耗测试网 ETH。

经验教训: 集成新 SDK 时,需要预留时间进行探索。Mock 模式不仅用于测试——它是提升迭代速度的关键。

挑战 2:终端 UX 比想象中更难

让 CLI “手感好”需要关注在 Web UI 中理所当然的细节:

  • 异步操作时的加载动画(Ora)
  • 颜色编码的输出以形成视觉层级(Chalk)
  • 成功信息的盒装展示以庆祝(Boxen)
  • 带内联反馈的清晰提示验证(Inquirer)

每个库解决特定的 UX 需求。将它们组合成统一体验的迭代次数远超预期。

经验教训: CLI UX 是一门真正的学科。用户会注意到做得好与否——只是不自觉而已。

挑战 3:配置文件安全

~/.storyrc 中存储 API 密钥和钱包信息需要考虑权限。配置文件使用 chmod 600(仅所有者读写)创建,敏感值也可以通过环境变量在 CI/CD 流水线中覆盖。

export STORY_WALLET_PRIVATE_KEY=0x...  # 覆盖配置文件
story register ./asset.png

经验教训: 安全不是一个功能,而是约束,它塑造了整个设计。

技术栈

技术栈示意图

架构一览

flowchart TD
    A[User terminal] --> B[Command router (Commander.js)]
    B --> C[Register command]
    C --> D[License wizard (Inquirer.js)]
    C --> E[Metadata prompts]
    C --> F[IPFS upload (Pinata SDK)]
    C --> G[Blockchain transaction (Story SDK)]
    B --> H[Portfolio command]
    H --> I[Asset fetching (Story API)]
    H --> J[Graph building (Mermaid.js)]
    H --> K[HTML rendering]
    B --> L[Config command]
    L --> M[~/.storyrc management]
    B --> N[Status command]
    N --> O[Wallet & network info]

关键模式

  • Command 模式 – 每个 CLI 命令都是独立的处理器。
  • Facade 模式StoryClient 封装了复杂的 SDK。
  • Singleton 模式ConfigManager 防止重复读取文件。
  • Fail‑fast 验证 – 错误即时显现,而不是在区块链调用后才出现。

为什么这很重要(超越代码本身)

区块链上的 IP 注册是那种“显而易见却被技术壁垒卡住”的点子。最需要它的人——独立艺术家、开源开发者、内容创作者——往往最缺乏使用 Web3 工具的能力。

Story CLI 是我搭建的一座桥梁。它不是简化版,而是一个精简、安全、友好的方式,让创作者以最小摩擦在链上声明作品所有权。

Back to Blog

相关文章

阅读更多 »