Перейти к содержимому

Сообщения Snapchain

Всё, что аккаунт делает в Farcaster, — это подписанное сообщение: каст, лайк, подписка, изменение профиля, изменение ключей. Ноды проверяют каждое сообщение и хранят те, которые принимают. Протокол описан в разделе Messages документации Farcaster.

Поле Что
data содержимое: тип, fid, отметка времени, сеть и тело для этого типа
hash хеш BLAKE3 от data, 20 байт
signature подпись Ed25519 над хешем
signer публичный ключ, который подписал и который должен быть зарегистрирован на fid

casty никогда не собирает их вручную; он вызывает сборщики из @farcaster/core (makeCastAdd, makeReactionAdd, makeLinkAdd и другие) с вашим ключом приложения.

Отметки времени считают секунды с эпохи Farcaster, 2021-01-01 00:00:00 UTC. Ноды отвергают сообщение с отметкой больше чем на 15 минут в будущем, поэтому casty doctor и шаг 1 проверяют ваши часы.

Каст содержит до 320 байт текста UTF-8 или до 1024 байт как длинный каст; casty выбирает тип по длине. Текст считается в байтах, а не в символах, поэтому в каст на кириллице или с эмодзи помещается меньше символов.

Упоминания не входят в текст. Каст хранит упомянутые fid и байтовые смещения, где они стоят, а лента возвращает @name на место. Ответ указывает на родительский каст по fid и хешу; пост в канале вместо этого указывает на URL канала. Ссылки идут во вложения, --embed <url> в командной строке.

Удаление каста публикует CAST_REMOVE. Лайки и рекасты — это реакции, подписки — это ссылки (links), и у каждого из них тоже есть сообщение удаления.

Snapchain делит сеть на шарды. Касты, реакции, подписки и профиль аккаунта живут на одном шарде сообщений, который выбирается по первым 4 байтам SHA-256 от его fid. Изменения ключей и несколько других сообщений уровня всего аккаунта идут на шард 0. Поэтому status и casty doctor печатают по строке на шард: нода синхронизирована, только когда синхронизирован каждый шард.

  1. casty собирает и подписывает сообщение и отправляет его байты на POST /v1/submitMessage.
  2. Нода проверяет его и отвечает 200 или ошибкой с причиной.
  3. Read-нода ничего не хранит: она передаёт сообщение дальше через gossip и забывает его. 200 означает «принято для передачи», а не «сохранено».
  4. Как только валидатор включает сообщение в блок, оно есть у каждой ноды, включая вашу.

Поэтому casty читает сообщение обратно, например через castById после каста, пока оно не появится; тайминги — в Read-нодах и валидаторах. Одни и те же байты дают один и тот же хеш, так что сообщение, отправленное дважды, хранится один раз.

Каждое сообщение, которое хранит аккаунт, учитывается в его хранилище, включая удаления: CAST_REMOVE остаётся как запись о том, что каста больше нет. См. Аренда хранилища.