Сообщения 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 печатают по строке
на шард: нода синхронизирована, только когда синхронизирован каждый шард.
Отправка через вашу ноду
Заголовок раздела «Отправка через вашу ноду»- casty собирает и подписывает сообщение и отправляет его байты на
POST /v1/submitMessage. - Нода проверяет его и отвечает
200или ошибкой с причиной. - Read-нода ничего не хранит: она передаёт сообщение дальше через gossip и забывает его.
200означает «принято для передачи», а не «сохранено». - Как только валидатор включает сообщение в блок, оно есть у каждой ноды, включая вашу.
Поэтому casty читает сообщение обратно, например через castById после каста, пока оно не
появится; тайминги — в Read-нодах и валидаторах. Одни и те же
байты дают один и тот же хеш, так что сообщение, отправленное дважды, хранится один раз.
Хранилище
Заголовок раздела «Хранилище»Каждое сообщение, которое хранит аккаунт, учитывается в его хранилище, включая удаления: CAST_REMOVE
остаётся как запись о том, что каста больше нет. См. Аренда хранилища.