跳转到内容

Snapchain 消息

一个账户在 Farcaster 上做的一切都是一条签名消息:一条 cast、一次点赞、一次关注、一次资料修改、一次密钥变更。 节点检查每条消息,并保存它们接受的那些。该协议在 Farcaster 文档的 Messages 中有介绍。

字段 内容
data 内容:类型、fid、时间戳、网络,以及对应类型的消息体
hash data 的 BLAKE3 哈希,20 字节
signature 对该哈希的 Ed25519 签名
signer 签名所用的公钥,它必须注册到该 fid

casty 从不手工组装这些字段;它用你的应用密钥调用 @farcaster/core 的构建函数 (makeCastAdd、makeReactionAdd、makeLinkAdd 等)。

时间戳以自 Farcaster 纪元 2021-01-01 00:00:00 UTC 以来的秒数计。节点会拒绝时间戳在未来 15 分钟以上的消息, 这就是 casty doctor 和第 1 步检查你的时钟的原因。

一条 cast 最多包含 320 字节的 UTF-8 文本,作为长 cast 时最多 1024 字节;casty 根据长度选择类型。 文本按字节而不是字符计数,所以用西里尔字母书写或带有表情符号的 cast 能容纳的字符更少。

提及不是文本的一部分。一条 cast 保存被提及的 fid 以及它们所在位置的字节偏移量,时间线再把 @name 放回原处。回复通过 fid 和哈希指向它的父 cast;频道帖子则改为指向频道的 URL。链接放在嵌入中, 即命令行上的 --embed <url>。

删除一条 cast 会发布一条 CAST_REMOVE。点赞和 recast 属于反应,关注属于链接,每一种也都有对应的移除消息。

Snapchain 把网络分成多个分片。一个账户的 cast、反应、关注和个人资料位于同一个消息分片上, 该分片由其 fid 的 SHA-256 的前 4 个字节选出。密钥变更和其他少数作用于整个账户的消息进入分片 0。 这就是 status 和 casty doctor 每个分片打印一行的原因:只有每个分片都同步了,节点才算已同步。

  1. casty 构建并签署消息,然后把它的字节提交到 POST /v1/submitMessage。
  2. 节点检查它,返回 200,或者一个带原因的错误。
  3. 只读节点什么也不保存:它通过 gossip 把消息传出去,然后就忘了它。200 表示已接受并转发,而不是已保存。
  4. 一旦某个验证者把消息纳入区块,每个节点(包括你的)都会拥有它。

因此 casty 会读回该消息,例如在发布 cast 之后用 castById,直到它出现; 只读节点与验证者给出了具体时间。相同的字节有相同的哈希, 所以发送两次的消息只保存一次。

一个账户保存的每条消息都计入它的存储,移除消息也不例外:CAST_REMOVE 会作为该 cast 已删除的记录保留下来。 见存储租用。