1. 介绍
Farcaster 是一个基于以太坊的去中心化社交网络。与 Nostr 属于同一类协议(不了解 Nostr?看这里)。
Farcaster 协议分为三层,第一层是链层(以太坊),用户需要在链层进行注册自己的账号,链层也只承担账号注册和查询的功能。
第二层是数据层(Delta Graph),由很多节点(Hub)构成,用户发布的信息都会被存储到 Hub 中,然后 Hub 之间同步这些数据。
第三层是应用层,用户可以自己开发各种应用,移动端或者桌面应用,需要注意的是,这里不仅仅终端应用,也可以是另外一个服务端应用,这个应用可以缓存 hub 中所有的数据,然后实现搜索、索引等更高级的功能。这样可以让终端应用的使用体验与当前的社交应用更相似。
2. 身份体系
在 Farcaster 中,身份由三部分构成:
- 一个唯一的数字 id,比如 8098
- 一个 ECDSA 公私钥对(也代表了一个地址),用来对发布的消息签名
- 一个可读的用户名(username),比如 ray,这个是可选的
数字 id 和用户名都需要在链上进行注册,由链上的两个合约来管理。如果要进入到 Farcaster 网络,数字 id 是必须的。
如果你觉得数字 id 不足以表达自己,可以再去注册一个用户名。每个公私钥可以拥有一个数字 id 和多个用户名,其中数字 id 是免费的,在注册的时候只需要付一些 gas fee,但是用户名是收费的,需要按年计费,每年需要续费一次,如果不续费,就会失去这个用户名。
对于数字 id 和用户名,都可以设置一个备份地址,如果当前的地址不再可用,或者私钥丢失,都可以通过这个备份地址将数字 id 和用户名转发到另一个地址。
3. 数据层
在 Farcaster 网络中,需要解决用户身份、认证、网络可用性、内容一致性等等问题。用户的身份体系已经在上面的说到了,每个用户都需要到链上去进行注册。
在用户完成注册之后,会向网络中发送消息,在这样一个不可信的网络中,需要通过用户的公私钥对来进行证明消息是自己发布的,别人无法伪造。用户可以通过签名来构造多个公私钥对,每一个公私钥对都可以用来发布消息,而且对于已经签发的公私钥对,也可以进行回收,而且回收之后,发布的相关消息也会被作废。
在 Farcaster 中,用户的每一个消息都被称之为 Delta,然后将所有的 Delta 组织起来构成一个 Delta Graph,这个是 Farcaster 中数据组织起来的方式,然后节点之间通过 Gossip 协议来同步这些数据。
Delta 有如下的类型:
- Casts:用户发布的消息,就像是一条推文或者一条微博
- Reactions:用户对消息的回应,比如点赞
- Amps:用户的背书
- Verifications:对所有权的证明,比如一条以太坊的签名
- Signers:就是上面提到的用户通过签名来生成的发布消息的公私钥对
- User Data:用户信息,比如简介,头像等等
所有的 Delta 构成了 Delta Graph,就像下面这样:
每一条 Delta 都是由上面的两个点和连接两个点的一条边构成。上面的 Delta Graph 可以分解成下面的结构:
在 Delta 中,还需要解决 Delta 的顺序问题,由于 Gossip 协议同步的消息是乱序的。所以对于 Delta 有一些额外的定义来解决这些问题:
- 每条消息都会有一个 hash 作为唯一标识(i)
- 对于同一个行为,比如上面的点赞/取消点赞,会生成一个额外的标识(c)
- 用户会提交一个本地的时间戳(t)
在接收到消息时,首先会比对 i 是否相同,如果 i 已经存在,直接丢弃消息。对于同一个 Delta 的修改,比如先对一条消息点赞了,后续又点了取消点赞,在这样情况下,会先比较 c,然后比较 t,t 更大的那条 Delta 会被保留,通过这样的机制,避免了数据的冲突。
所有的 Delta 都会被组织成 MPT(一种数据结构,以太坊的底层也在用这个),节点会通过 MPT 来追踪 Delta,通过同步其他节点的信息来比对自己的数据是否完整。
节点是完全公开的,可能会遭受到恶意节点的攻击,Farcaster 也有一些策略来组织作恶的行为:
- 首先,节点在接收到消息时,会先检查这条消息的签名人是不是已经在链上注册了,如果没有就直接丢弃
- 对每个签名人的 id 进行限流,如果请求量过大,就会直接拒绝这个 id 发出来的消息
- 同时也会给同步消息的节点打分,对于低分节点的请求也会直接拒绝
由于所有的数据都在节点上存储,如果数据持续增长,那么可能就有很多节点承担不起这个成本,从而导致网络的去中心化程度降低。在当前的版本中,会对客户端发布的内容有一些限制:
- 目前 Delta 中允许出现文字,如果是视频、图片等比较大的文件,需要用链接的形式,这些文件可以托管到 IPFS 这些分布式存储
- 所有的 Delta 消息需要在一个 TCP 的包中能够完成传输
- Delta Graph 的大小最多不超过 64 TB
在这些存储压力下,Farcaster 也需要找出一种激励的方式,让节点有动力参与进来。
4. 应用层
Farcaster 只是底层的协议,任何人都可以基于协议来开发自己的应用。在当前的模式下,一个应用的数据和接口都是被某个公司掌握,第三方的开发只能在开发的这些接口下来开发,甚至有可能随时被封禁的情况。
在 Farcaster 和其他 web3 的协议下,这个情况会有些不同,应用层会成为真正意义上的入口,所有的底层数据流动是自由的,应用之间只能比体验,而没法滥用自己的权利,这样对于用户来说,会享受到更多有创意的产品,而不是必须捏着鼻子去用一个自己不喜欢的产品。
5. 与 Nostr 的不同
Nostr 与 Farcaster 虽然做的是同样事情,但是路径却完全不同。在 Nostr 中,是一个完全自由的世界。他们主要的差别有:
底层实现不同,Nostr 是一个完全分布式的实现,底层不依赖区块链,每个网络节点都是独立的。Farcaster 是基于以太坊来实现的,所有的账号信息都是在链上注册的。这样也会带来一些问题,当链上注册开销越来越大的时候,会不会是组织新用户进入的一个障碍。
准入机制不同,在 Nostr 中,只要生成一个公私钥就是一个账号,每个人可以无限生成,Farcaster 中,除了生成公私钥还需要去链上注册,注册完成之后才是一个完整的账号,上链需要一定的费用,这样生成垃圾账号的成本就会高不少。
数据处理不同,目前在完全去中心化的环境中存储数据是比较昂贵的,而社交网络往往会产生大量的数据。Nostr 中,每个节点只会存储部分的数据,数据的索引会通过记录其他节点的位置来实现,这样会导致数据很容易丢失,同时也降低了每个节点需要存储的数据量。而 Farcaster 中会追求数据的完全一致,用户产生的所有数据在所有的节点中会进行同步,这样数据就不会丢失,用户的体验也会更好,但同时给节点带来了很大的存储压力。
参考链接