你自己的 Farcaster。
三条命令。

在你租的服务器上跑一个 Snapchain read node(只读节点),再用一个只跟它通信的客户端发帖。不需要 API key,也不需要任何人批准。

  1. 0
    租一台服务器node scripts/provision.mjs
  2. 1
    启动只读节点ssh … "curl …/node.sh | sudo bash"
  3. 2
    用你自己的客户端发帖node fc.mjs init --node <your-server>

2026 年 10 月在主网上完整跑通:从零同步一个节点,再通过它发出第一条 cast。

实测

在主网上真跑过,不只是写出来。

在租来的服务器上从零同步一个节点,然后客户端的每条命令都通过它发到了真实网络。

  • 添加了免 gas 的 app key,然后发出第一条 cast
  • 发帖、回复、点赞、转发,逐一撤销,删除
  • 关注和取消关注,按 app 过滤信息流
  • 每一步结果都用节点自己的 API 核对过

完整记录  ·  59 秒视频,音乐:Kevin MacLeod(CC BY 4.0)

开始使用

大约十分钟就能跑起来。

另外还要等节点自己同步几个小时。你需要 Node.js 20 或更高版本,一个 Azure、AWS 或 Hetzner 账号,以及一个已购买存储空间、并且手上有 recovery phrase(助记词)的 Farcaster 账号。

第 0 步

租一台服务器。

git clone https://github.com/Sats100M/farcaster-in-3
cd farcaster-in-3
az login                                   # 或者 aws login,或者在 .env 里设置 HCLOUD_TOKEN
node scripts/provision.mjs --provider azure

它会先显示价格,经你确认后才创建任何资源:一台 4 vCPU、16 GB 内存、2 TB 硬盘的服务器,并开放 Snapchain 用到的端口。完成后会把第 1 步的命令打印给你。

第 1 步

启动一个 Snapchain 只读节点。

ssh -i ~/.ssh/farcaster_node azureuser@<server-ip> \
  "curl -fsSL https://raw.githubusercontent.com/Sats100M/farcaster-in-3/main/scripts/node.sh \
   | sudo bash -s -- --fid <your-fid>"

安装 Docker 和官方的 Snapchain 节点,然后开始同步。首次同步要下载一个 470 GB 的 snapshot(快照),需要好几个小时。在服务器上运行 fc-node-status 可以查看进度。

第 2 步

用你自己的客户端发帖。

cd client && npm install
node fc.mjs init --node <server-ip>

它只会问一次你的助记词,用它给这个客户端生成一个专属的 app key(应用密钥),然后立刻把助记词丢掉。之后就可以这样用:

node fc.mjs feed
node fc.mjs cast "posting from my own node"
node fc.mjs follow dwr
node fc.mjs like 3/0x…
node fc.mjs feed --hide-app <app>

对待助记词,要像对待 rm -rf 一样小心。谁拿到它,谁就能控制你的账号。只把它粘贴到你读过代码或者信得过的软件里。这个客户端只在内存里用它签一条消息,既不保存,也不会把它发送到任何地方。你可以自己检查:代码就一个文件。

第一次尝试?请用测试账号。如果某个应用支持委托签名(delegated signing),也就是在已经登录你账号的应用里批准它的密钥,优先用这种方式:助记词不用离开你的手机。这个客户端之所以要助记词,只是因为一台全新的服务器上没有可以发起批准的应用。

用完了?node scripts/destroy.mjs 会删除所有资源,计费随之停止。

工作原理

你的账号不归任何一个 app 所有。

Farcaster 把一个社交网络拆成三层,分别由不同的人来运行。就算某个 app 封了你,或者干脆关门了,你的账号、关注者和 cast(帖子)都还在。

在 Optimism 上

身份

你的账号编号、拥有这个账号的钱包,以及你已付费的存储空间。

在 Snapchain 上

数据

每一条 cast、每个点赞和关注,都是一条小小的签名消息,由每个节点保存。

谁都能写

应用

你刷的信息流、你点的按钮。也包括这个仓库里的客户端。

账号

FID、托管地址和存储空间。

FID

你的账号编号,由 Optimism 上的 ID Registry 合约分配。像 @dwr 这样的用户名是另一个独立的标签,指向这个编号。

Custody address(托管地址)

拥有你 FID 的以太坊钱包,由你的助记词按 m/44'/60'/0'/0/0 路径派生出来。它能转移账号、添加或移除 app key,所以你只用它来授权,从不用它发帖。客户端会去问你自己的节点“这个托管地址拥有哪个账号”,以此找到你的 FID,所以不需要以太坊 RPC,也不需要 API key。

存储租金

每条消息都要占用每个节点的空间,所以账号需要付租金,在 Optimism 上按年为单位购买。一个单位大约能存 5,000 条 cast、2,500 个回应(reaction)和 2,500 个关注。超出之后,最早的会被清理掉。在 Farcaster app 里注册的账号通常自带存储空间;没有存储空间的账号,这个客户端没法替它发帖。

网络

验证者负责写入,只读节点负责跟随。

Snapchain 负责给每条消息排序并存储。一小组公开、固定的 validator(验证者)负责提议区块并投票。只读节点运行同一套软件,只是设置了 read_node = true,保存完整的状态,提供同样的 API。任何人都可以运行一个。

提交你的客户端用 app key 给 cast 签名,然后发给你的节点。
转发你的节点校验之后,通过 gossip 把它传播出去。节点本身不维护 mempool。
打包某个验证者收到它,把它放进一个区块。
同步区块到达你的节点,这条 cast 就出现在你的信息流里了。

所以节点返回成功,意思是已接受并转发,而不是已经打包进区块。负载很高时,转发出去的消息可能会丢,需要重新发送。

App key

你的客户端有自己的密钥。

app 从不用你的托管密钥发帖。每个 app 都会拿到一个 app key:一个 Ed25519 密钥,只能以你的 FID 的名义签名消息,除此之外什么都做不了。

从 2026 年年中开始,添加 app key 是免费的。不需要发起 Optimism 交易:客户端直接把一条带三个签名的 KEY_ADD 消息发给 Snapchain。

  1. 你的托管地址签名确认:添加哪个密钥、它能做什么、有效期多长,外加一个 nonce。
  2. 发起请求的 app 签署一份请求,写明它自己的 FID。这个客户端自己就是 app,所以这一步签名的还是你的托管地址。
  3. 新密钥给整个信封签名,证明它确实由添加它的人持有。

这个客户端的密钥可以发帖、删除 cast、点赞和关注,但不能添加密钥,也碰不了账号本身。连续 30 天不用就会过期,每用一次都会重新计时。

按客户端过滤

每个 app key 都记录着申请它的那个 app 的 FID。所以你的节点知道每条 cast 来自哪个 app,而且不需要信任这个 app。

node fc.mjs apps dwr                 # 看某人用哪些 app 发帖
node fc.mjs feed --only-app <app>    # 只看这个 app
node fc.mjs feed --hide-app <app>    # 除了它,其他都看
底层细节

服务器和节点。

Snapchain 需要 4 核 CPU、16 GB 内存、一个公网 IP,并开放 3381 到 3383 端口。还有硬盘:光是快照压缩后就有 470 GB,而且解压期间要一直保留。直接上 2 TB。

node.sh 额外做了什么

它封装了 farcasterxyz/snapchain 的官方安装脚本:挂载数据盘并把数据库放在上面;提前回答安装脚本的交互提问,这样通过 SSH 也能直接跑;另外加了一个 fc-node-status 命令,用来显示同步进度。还有一个每周运行的任务,让节点保持最新版本。

fc-node-status                          # 在服务器上运行
curl http://<ip>:3381/v1/info            # 在任何地方都能运行

各云厂商的注意事项

Azure。新订阅需要先注册 Compute,脚本会帮你做。免费试用每个区域允许 4 个 vCPU,刚好够用。机型经常售罄,所以脚本会自动尝试其他机型。

AWS。免费套餐的账号开不了这种规格的服务器。用新版 Projects 流程创建的账号,在开启高级功能之前,EC2 和 Lightsail 也是被禁用的。

Hetzner。最便宜,前提是你的账号已经用了一段时间。新账号暂时还创建不了 2 TB 的卷。

费用

按小时计费。

新账号通常会送一些额度,所以试用一天往往不花钱。

云厂商每月每天
Hetzner,CX43 加 2 TB$176$5.80
AWS Lightsail,16 GB 加 2 TB$289$9.50
Azure,D4s v4 加 2 TB$294$9.70

常见问题排查

客户端连不上我的节点。

API 要等快照恢复完成后才会启动。在服务器上运行 fc-node-status 看看,并确认 3383 端口已经开放。

有一个分片落后好几个月,几乎不动。

快照每天都会替换,而节点在开始同步之前,就会先读取所有 shard(分片)的下载列表。如果首次同步耗时太久,等轮到某个分片时,它对应的快照已经没了,节点就会跳过它,从头开始重放这个分片,这要花好几周。fc-node-status 会对这种情况发出警告,并打印修复方法:reload-shard.sh --shard N,它只为这一个分片下载当天的快照并替换进去。分片 0 大约花了一个小时。

报错 "Nonce is not greater than stored nonce."

同一时刻有另一个密钥被添加到了你的账号上。重新运行一次 init 就行。

我的 cast 在其他 app 里看不到。

等几秒钟。如果一直没出现,说明转发在高负载下被丢弃了。再发一次就好。

延伸阅读