前文曾聊过 farcaster hub 的内部技术实现,今天就聊聊 farcaster 的开发。为何我个人认为 farcaster 的开发值得关注,原因其实并不复杂:
那么,让我们进入今天的主题。
当前开发者可以开发的 farcaster 应用可以分成三类:frame、action 和 bot。
Frame 是内嵌在 farcaster 信息流中的可交互式应用,一个典型的例子:
可能有同学会脱口而出:这不是就微信小程序吗?我个人的看法是:类似,但不尽相同。
虽然从大的范畴来讲,它算是小程序性质的东西,因为它得运行在 farcaster 的 client 中。但是,它依旧服务于用户浏览信息流的大场景,并没打算喧兵夺主,像微信小程序那般可以实现高度交互性的 ui。
举个例子,我发现我关注的某个用户推荐了不错的商品,我想要进一步了解再决定购买。在没有 frame 的情况下,我只能点击商品链接去网站详细阅读。之后,不论我是否打算购买,如果我还打算继续阅读信息(而且这个可能性还很大,毕竟我是在阅读信息的时候看到的这件商品),我还得重新回到应用中。
注意到了吗?整个过程涉及到了两个应用间的切换,影响了用户的阅读体验。
借助 frame,商家可以为每件商品实现一个 frame,用于帮助用户了解和购买商品,整个过程无需离开阅读应用。从而并未干扰我一开始的目的:阅读信息。
从技术细节上,frame 依托于 open graph 规范,整个 ui 实质是 open graph 中的 image,交互组件则是 farcaster 对于规范的扩展,详细的技术细节可以在其协议网站看到。
如果以上提高了你对于 frame 的很高期望,那么接下来我得要打击你一下。假若你想实现高度交互的 ui,如微信小程序那般,目前的 frame 并不支持。它很像早年的 jsp 应用,ui 由后端生成,前端交互有限,整体交互受限于运行环境,即 farcaster client。
对于那些技术执念太深者,可能会大失所望,甚至进一步 diss。这大可不必,我个人反而觉得它的这种做法值得学习:
Action 相当于 farcaster client 的插件,可以由用户自行安装,安装之后,就可以针对每个 cast 使用,如下图:
上图中的 “Bot or Not” 和 “Playbot” 都是已安装的 action,点击之后会有对应的行为发生。同样,其技术细节可以在其协议网站找到。
Bot 更简单,其实质跟其他的各类 bot 区别不大,都是监听消息,然后有针对性的做出行动。技术实现上就是一个 webhook + api 调用:
工欲善其事必先利其器,进入一个新的开发领域,不系统性了解该领域中的工具属于不智。
目前主流的框架:
我们目前使用的是 frog,主要看重它的轻量级,同时基于 hono 的缘故。用它可同时 frame、action 和 bot 开发。
同以太坊开发类似,与 farcaster hub 交互需要用到 api,目前主要的 api 服务提供者:
我们目前使用的是 neynar,主要因为其 api 设计、我们没有额外的需求,并且其支付很方便。
关于 frame ui 的设计,frog 有一个对应的 ui 库:frog-ui,并且提供了对应的设计规范:fig。
其他值得注意的辅助工具:
对于调试,可以使用以下两个工具之一,方便实现对于本地 frame 的访问:
本文没打算成为一个手把手的教程,这里只列出开发需要注意的地方。
由于 frame 是后端 render,有些在以往开发中习以为常的过程可能会不那么一目了然,比如完成交易。这篇文档详细说明了 frame 中发起交易的全过程。
简单说就是:后端准备数据,前端签名并发送交易,之后再转到后端指定的地址。有了这样的背景之后,就很容易理解 frog 文档中关于 tx 部分了。
熟悉以太坊开发的人应该对于 indexing 这一概念不陌生,在 farcaster 早期 github repo 中提供了单独的 replicator 来帮助完成这一任务,同时还提供对应的数据库 schema。
阔是,这个工具不尽如人意,就我们自身使用而言体验也不佳,主要问题是慢(hub 早早同步完了,数据库却迟迟跟不上)且资源消耗大。最近,这个 repo 已被移除,开发团队准备用shuttle来替代。但目前看来应该还在早期。
另外,若是打算做 indexing,建议不要用 public node,而是自建 node,将数据源指向 local node。这是因为 public node 通常都有 rate limit 设置。
目前 farcaster 支持的 chain 是:mainnet、base、optimism 和 base sepolia。这是在它的客户端 warpcast 中的结果,至于其他的 client,没有调研过。
如果你的 contract 不是完全 permissionless,想实现类似确保所有 contract 调用都是由 frame app 发起的,那么可以考虑引入签名机制:frame server 签名并将签名发送到客户端,在发起 tx 时附上。唯一需要注意的是签名的不可重用性,以避免 replay。
外面的世界太凶险,frame app 与一般的 app 不一样,没有所谓的登录过程,那么为了确保我们收到的请求来自于可信源,自然还得靠签名验证,几个场景:
farcaster 是协议,warpcast 则是协议对应的客户端之一。若你不爽,完全可以开发自己的客户端与 farcaster hub 对接。
了解这层关系之后,也就清楚了为何在 warpcast 有 warp 但在 farcaster github repo 中看不到它的踪迹的原因了。
至此,关于 farcaster 开发的 big picture 已经讲完,最后简单说说实现场景。针对这类 embedded 应用的应用场景,个人看法是:它必须能增强用户在宿主应用的体验,所服务的场景也需遵循这样的原则,否则完全没有必要。
就 frame 的场景而言,开发 frame 游戏,显然不是一个好主意。且不说这样的体验极糟糕,它还背离了用户打开 farcaster client 是为了阅读信息的主要目的。打个比方,你会边逛街边打游戏吗?
但换个场景,若有个 frame 可以快速生成一个关于某商品的 slides,这便是一个有意义的尝试。这类似于,边逛街边浏览橱窗商品。而且,这种工具的好处在于:简化了交互。比如,以往要想稍微详细地介绍一个商品:
前者制作成本高,后者则表现力有限。如今,借助 frame,实现这个功能完成可以轻易做到。而且宣传图的成本一般也都低于宣传片,如果借助相关工具,可能可以进一步降低,这也是我做这个 frame template 的初衷。
该说的已经说完,接下来就是各位看官如何发挥想象力了,;)
觉得有帮助的话,不妨考虑购买付费文章来支持我们 🙂 :
付费文章