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

Custody-адрес и ключи приложений

Здесь участвуют ключи двух видов. Custody-адрес владеет вашим fid. Ключ приложения подписывает ваши повседневные сообщения: касты, реакции, подписки. casty использует custody-адрес один раз, чтобы добавить ключ приложения, и хранит только ключ приложения. Custody подписывает либо в кошельке, со страницы (Кошельки и ключи), либо в терминале, по seed-фразе, которую спрашивает casty init.

Это аккаунт Ethereum, выведенный из вашей seed-фразы. Он может добавлять и удалять ключи приложений и переносить fid, поэтому casty никогда его не хранит: casty init читает фразу, подписывает один запрос и обнуляет фразу. casty key revoke спрашивает её снова, потому что удаление ключа custody-адресом требует новой подписи.

Ключ Ed25519, который casty генерирует на вашей машине. Он подписывает сообщения для вашего fid, и ноды принимают их, пока ключ зарегистрирован и не истёк.

Начиная с версии движка 16, Snapchain регистрирует такие ключи сообщением KEY_ADD вместо ончейн-транзакции: без газа, и ключ можно использовать, как только сообщение сольётся. casty собирает его с помощью функций makeKeyAddBody и makeKeyAdd из @farcaster/core. См. writing messages в документации Snapchain. Старые руководства, в том числе пример hello-world в hub-monorepo, до сих пор добавляют ключ транзакцией в контракт KeyGateway в OP Mainnet: это стоит газа и требует кошелька с ETH и RPC, и casty этот путь не использует.

KEY_ADD несёт три подписи:

  • подпись запрашивающего приложения над запросом ключа, сделанную custody-адресом fid приложения (--app-fid, по умолчанию ваш собственный fid);
  • подпись custody-адреса над ключом, его scopes, сроком жизни, nonce и дедлайном;
  • конверт сообщения, подписанный самим новым ключом, что доказывает, что у casty есть его приватная половина.

Nonce свой для каждого fid и должен расти с каждым изменением ключей: casty читает текущий с ноды и прибавляет 1. Если первым проходит другое изменение, нода отвергает сообщение, и casty init один раз повторяет попытку с новым nonce.

Ключ без газа перечисляет типы сообщений, которые он может подписывать. По умолчанию casty запрашивает эти:

Имя в --scopes Типы сообщений
cast CAST_ADD, CAST_REMOVE
reaction REACTION_ADD, REACTION_REMOVE
link LINK_ADD, LINK_REMOVE

user-data (USER_DATA_ADD, ваш профиль) добавляется, только если вы его запросите. KEY_ADD и KEY_REMOVE никогда не могут входить в scopes ключа, поэтому ключ приложения не может добавлять ключи или удалять другие ключи; он может удалить только себя.

--ttl задаёт, сколько ключ живёт без использования: по умолчанию 30 дней, не больше 90. Каждое сообщение, которое подписал ключ и которое слилось, начинает срок заново, так что ключ, которым вы пользуетесь, не истекает. casty init печатает дату, когда он истечёт, если им не пользоваться. У fid может быть не больше 1000 активных ключей без газа.

Каждый ключ записывает fid приложения, которое его запросило. Каст несёт публичный ключ, который его подписал, так что лента может сказать, из какого приложения он пришёл: casty ищет подписавший ключ в списке ключей автора, берёт запросивший fid и показывает имя пользователя этого fid после via. --only-app и --exclude-app фильтруют по нему, а casty clients --fid <fid> перечисляет ключи любого аккаунта с их приложениями. Ключи, добавленные ончейн, несут такой же запрос, и casty читает их так же.

Команда Кем подписано Что нужно
casty key revoke <key> custody-адресом seed-фраза
casty key revoke <key> --self самим ключом приложения ключ в хранилище casty

Обе отправляют KEY_REMOVE и ждут, пока нода не перестанет показывать ключ. Ключи, добавленные ончейн, удаляются ончейн, в контракте KeyRegistry; casty этого не делает.