From 1275f4b99f85155d822a1a87272dd4f9a63fe3db Mon Sep 17 00:00:00 2001 From: bruseeru Date: Tue, 28 Sep 2021 14:08:06 +0700 Subject: [PATCH 1/3] bold tag --- css/guide.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/css/guide.css b/css/guide.css index faf93c9..2126672 100644 --- a/css/guide.css +++ b/css/guide.css @@ -136,6 +136,10 @@ pre, code, .binary span { font-family: "DejaVu Sans Mono"; } +code{ + font-weight:bold; +} + pre { font-size: 12px; line-height: 1.3; From 06ae7f0c4d58abc35b82cef572168a561f255c47 Mon Sep 17 00:00:00 2001 From: bruseeru Date: Wed, 19 Jan 2022 03:01:13 +0700 Subject: [PATCH 2/3] add languages, add Russian language add languages, add Russian language tag style "italic" --- css/guide.css | 14 +- index.html | 8 +- index_ru.html | 1593 ++++++++++++++++++++++++++ lang/ru/img/format_public_key.png | Bin 0 -> 13373 bytes lang/ru/img/format_public_key.svg | 108 ++ lang/ru/img/format_udp_broadcast.png | Bin 0 -> 29543 bytes lang/ru/img/format_udp_broadcast.svg | 139 +++ lang/ru/img/identity_keypair.png | Bin 0 -> 13209 bytes lang/ru/img/identity_keypair.svg | 650 +++++++++++ 9 files changed, 2509 insertions(+), 3 deletions(-) create mode 100644 index_ru.html create mode 100644 lang/ru/img/format_public_key.png create mode 100644 lang/ru/img/format_public_key.svg create mode 100644 lang/ru/img/format_udp_broadcast.png create mode 100644 lang/ru/img/format_udp_broadcast.svg create mode 100644 lang/ru/img/identity_keypair.png create mode 100644 lang/ru/img/identity_keypair.svg diff --git a/css/guide.css b/css/guide.css index 2126672..be522a0 100644 --- a/css/guide.css +++ b/css/guide.css @@ -36,7 +36,7 @@ main { margin-bottom: 64px; } -header, footer { +header, footer, lang select{ color: rgba(255, 255, 255, 0.8); font-weight: 300; } @@ -72,6 +72,16 @@ nav { text-transform: uppercase; } +lang{ + background-color: #0f103d; + display: inline; + display: flex; + align-items: center; +} +lang select{ + background-color: #0f103d; +} + header a { display: flex; align-items: center; @@ -137,7 +147,7 @@ pre, code, .binary span { } code{ - font-weight:bold; + font-style: italic; } pre { diff --git a/index.html b/index.html index 924fec5..bc144d4 100644 --- a/index.html +++ b/index.html @@ -18,6 +18,12 @@ + + +

Scuttlebutt Protocol Guide

@@ -745,7 +751,7 @@

Async example

The responder does in fact have this blob so they respond with true. Because this is an async procedure and not a stream, there is only one response and no need to close the stream afterwards:

- +
Request number-2 diff --git a/index_ru.html b/index_ru.html new file mode 100644 index 0000000..6fb48cd --- /dev/null +++ b/index_ru.html @@ -0,0 +1,1593 @@ + + + + + Описание протокола Scuttlebutt + + + + + +
+ + + + + +
+
+

Описание протокола Scuttlebutt

+

Как пиры Scuttlebutt находят и общаются друг с другом

+
+ + +
+ +

Scuttlebutt - это протокол для создания децентрализованных приложений, которые хорошо работают в автономном режиме и которые никто не может контролировать. Поскольку центрального сервера нет, клиенты Scuttlebutt подключаются к своим партнерам для обмена информацией. В этом руководстве описаны протоколы, используемые для связи в сети Scuttlebutt.

+

Scuttlebutt - это гибкий протокол, способный поддерживать множество различных типов приложений. Одно из первых его приложений было как социальная сеть. В этом руководстве небольшое внимание уделяется тому, как использовать Scuttlebutt для социальных сетей, но многие объяснения все равно будут полезны, если вы хотите использовать его для чего-то совершенно другого или вам просто интересно, как это работает.

+ +

Криптография

+ +

Ключи и идентификаторы

+

Первое, что нужно пользователю для участия в Scuttlebutt, - это личность. Личность - это пара ключей Ed25519, которая обычно представляет человека, устройство, сервер или бота. Наличие нескольких личностей Scuttlebutt - это нормально.

+

При первом запуске клиенты Scuttlebutt автоматически сгенерируют пару ключей Ed25519 и сохранят ее в домашней папке пользователя в папке .ssb/secret.

+ +

Поскольку идентификаторы длинные и случайные, для создания нового идентификатора не требуется согласования или разрешения, что очень важно для конструкции сети.

+

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

+

Открытый ключ личности показывается пользователям и передается в некоторых частях сетевого протокола с использованием этого формата:

+ @FCX/tsDLpubCPKKfIrw4gc+SQkHcaD17s7GI6i/ziWY=.ed25519 где все, кроме префикса @ и суффикса .ed25519, является открытым ключом закодированным base64. + +

Знак начала @ означает, что он представляет собой открытый ключ, а не сообщение или большой двоичный объект, которые начинаются с % и &. С каждым идентификатором связан канал, который представляет собой список всех сообщений, отправленных этим идентификатором. Вот почему идентификатор также называется feed ID .

+ +

Криптографические примитивы

+ +

Протокол Scuttlebutt основан на примитивах криптобокса NaCl/libsodium. В этом руководстве используется следующее:

+ +
+
nacl_scalarmult(n, p)
+
Это Функция скалярного умножения libsodium , которая принимает два скаляра (обычно публичный и / или секретный ключи). Она обладает полезным свойством, которое, учитывая две пары ключей (pk1, sk1) и (pk2, sk2) , nacl_scalarmult (sk1, pk2) == nacl_scalarmult ( sk2, pk1) , которое позволяет общий секретный вывод между коллегами, которые знают открытые ключи друг друга. Более подробно рассмотрим позже.
+ +
nacl_auth(msg, key) и assert_nacl_auth_verify(authenticator, msg, key)
+
Эти функции являются функциями аутентификации сообщений Libsodium . Первая принимает сообщение и возвращает 32-байтовый аутентификатор, который действует как отдельная подпись сообщения. Последняя проверяет, что этот аутентификатор является действительным для данного сообщения и ключа; и возвращают ошибки, если они этого не делают.
+ +
nacl_secret_box(msg, nonce, key) и assert_nacl_secretbox_open(ciphertext, nonce, key)
+
Эти функции основаны на функциях crypto_secretbox_easy и crypto_secretbox_open_easy в Libsodium , которые используют симметричную криптографию для шифрования + аутентификации и проверки + расшифровки сообщения, используя одноразовый номер и опубликованный ключ.
+ +
nacl_sign_detached(msg, key) и assert_nacl_sign_verify_detached(sig, msg, key)
+
The former is computed from Libsodium's signature functions. Unlike the usual Libsodium/NaCl functions, they work with signatures in independent buffers, rather than concatenated with the msg.
+
Первичные вычисления из Функции сигнатур libsodium . В отличие от обычных функций Libsodium / NaCl, они работают с сигнатурами в независимых буферах, а не объединены с помощью MSG.
+ +
pk_to_curve25519(ed25519_pk) и sk_to_curve25519(ed25519_sk)
+
Эти функции преобразуют Ed25519 ключи (используемые для cryptobox) в Curve25519 (он же X25519) ключи, используемые для подписания. Они реализованы libsodium как crypto_sign_ed25519_pk_to_curve25519 и crypto_sign_ed25519_sk_to_curve25519 соответственно.
+
+ +

Развертывание

+
+

После того, как пользователь сгенерировал свою личность, ему нужно найти одноранговые узлы для подключения. Чтобы подключиться к одноранговому узлу, вам понадобится его открытый ключ и его адрес, используя любой из поддерживаемых им протоколов. Обычно для TCP/IP вам понадобятся его IP-адрес и порт, но протокол Scuttlebutt не ограничивается TCP/IP в качестве транспорта. В настоящее время протокол Scuttlebutt позволяет одноранговым узлам обнаруживать друг друга тремя способами.

+ +

Локальная сеть

+

Одноранговые узлы постоянно передают UDP-пакеты в свою локальную сеть, объявляя о своем присутствии. Тело каждого пакета - это строка, содержащая IP-адрес, порт и открытый ключ в кодировке base64 (без @ или .ed25519):

+
+ + +
+
+
+
+ Исходящий IP192.168.1.123 + Исходящий порт8008 + Целевой IP255.255.255.255 + Целевой порт8008 +
+ net:192.168.1.123:8008:~shs:FCX/tsDLpubCPKKfIrw4gc+SQkHcaD17s7GI6i/ziWY= +
+
+

Этим форматом сообщения может быть любой действительный многосерверный адрес. В локальных сетях это обычно net адрес с адресом IPv4 или IPv6.

+

Текущие реализации транслируют один из этих пакетов каждую секунду. Когда одноранговый узел видит широковещательный пакет другого однорангового узла, он может подключиться для обмена сообщениями. Некоторые клиенты показывают ближайших партнеров в пользовательском интерфейсе, чтобы пользователь мог видеть других людей в той же сети, что и они.

+
+ + +

Код приглашения

+

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

+

Они также содержат секретный ключ, который пользователь может активировать, чтобы паб подписался на него в ответ. Это позволяет новому пользователю видеть сообщения, отправленные другими участниками паба, и делиться своими собственными сообщениями. Пригласительные коды - это самый распространенный способ для новых пользователей начать работу со Scuttlebutt.

+

Операторы пабов могут распространять коды приглашения любым способом, который они считают нужным, например, размещая их в существующих социальных сетях. В некоторых пабах есть веб-страницы, которые любой может посетить, чтобы сгенерировать код приглашения.

+ +

Pub сообщение

+

Пользователи могут публиковать сообщения в своем канале рекламируя pub:

+ +
{
+  "author": "@FCX/tsDLpubCPKKfIrw4gc+SQkHcaD17s7GI6i/ziWY=.ed25519",
+  "content": {
+    "type": "pub",
+    "address": {
+      "host": "one.butt.nz",
+      "port": 8008,
+      "key": "@VJM7w1W19ZsKmG2KnfaoKIM66BRoreEkzaVm/J//wl8=.ed25519"
+    }
+  },
+  …
+}
+

Когда другие видят это сообщение, они могут отметить, что этот паб существует, и подключиться к нему в будущем.

+

Сообщения в пабе - полезный способ найти дополнительных пиров, если вы уже знаете некоторых из них. Очевидно, это не работает для новых пользователей, которые еще никого не знают и поэтому не могут видеть сообщения паблика.

+ +

Peer connections

+

Once a Scuttlebutt client has discovered the IP address, port number and public key of a peer they can connect via TCP to ask for updates and exchange messages.

+ +

Handshake

+
+

The connection begins with a 4-step handshake to authenticate each peer and set up an encrypted channel.

+ Message 1: Client hello (sent by the client). Message 2: Server hello. Message 3: Client authenticate. Message 4: Server accept +
+ +

The handshake uses the Secret Handshake key exchange which is designed to have these security properties:

+
    +
  • After a successful handshake the peers have verified each other’s public keys.
  • +
  • The handshake produces a shared secret that can be used with a bulk encryption cypher for exchanging further messages.
  • +
  • The client must know the server’s public key before connecting. The server learns the client’s public key during the handshake.
  • +
  • Once the client has proven their identity the server can decide they don’t want to talk to this client and disconnect without confirming their own identity.
  • +
  • A man-in-the-middle cannot learn the public key of either peer.
  • +
  • Both peers need to know a key that represents the particular Scuttlebutt network they wish to connect to, however a man-in-the-middle can’t learn this key from the handshake. If the handshake succeeds then both ends have confirmed that they wish to use the same network.
  • +
  • Past handshakes cannot be replayed. Attempting to replay a handshake will not allow an attacker to discover or confirm guesses about the participants’ public keys.
  • +
  • Handshakes provide forward secrecy. Recording a user’s network traffic and then later stealing their secret key will not allow an attacker to decrypt their past handshakes.
  • +
+ + +

Starting keys

+

Upon starting the handshake, the client and server know these keys:

+ Both the client and servers know: their own long term key pair, their own ephemeral key pair, and the network's (private) identifier. Additionally, the client knows the server's long term public key. + +

1. Client hello

+ The client sends their own ephemeral public key, hmac-authenticated using the network identifier + +
+
Client sends (64 bytes)
+
Server verifies
+
concat(
+  nacl_auth(
+    msg: client_ephemeral_pk,
+    key: network_identifier
+  ),
+  client_ephemeral_pk
+)
+
assert(length(msg1) == 64)
+
+client_hmac = first_32_bytes(msg1)
+client_ephemeral_pk = last_32_bytes(msg1)
+
+assert_nacl_auth_verify(
+  authenticator: client_hmac,
+  msg: client_ephemeral_pk,
+  key: network_identifier
+)
+
+ +
+

First the client sends their public generated ephemeral key. Also included is an hmac that indicates the client wishes to use their key with this specific instance of the Scuttlebutt network.

+

The  network identifier is a fixed key. On the main Scuttlebutt network it is the following 32-byte sequence:

+
+ d4a1cb88a66f02f8db635ce26441cc5d + ac1b08420ceaac230839b755845a9ffb +
+

Changing the key allows separate networks to be created, for example private networks or testnets. An eavesdropper cannot extract the network identifier directly from what is sent over the wire, although they could confirm a guess that it is the main Scuttlebutt network because that identifier is publicly known.

+

The server stores the client’s ephemeral public key and uses the hmac to verify that the client is using the same network identifier.

+
+ + +

2. Server hello

+ The server sends their own ephemeral public key, hmac-authenticated using the network identifier + +
+
Client verifies
+
Server sends (64 bytes)
+
assert(length(msg2) == 64)
+
+server_hmac = first_32_bytes(msg2)
+server_ephemeral_pk = last_32_bytes(msg2)
+
+assert_nacl_auth_verify(
+  authenticator: server_hmac,
+  msg: server_ephemeral_pk,
+  key: network_identifier
+)
+
concat(
+  nacl_auth(
+    msg: server_ephemeral_pk,
+    key: network_identifier
+  ),
+  server_ephemeral_pk
+)
+
+ +

The server responds with their own public ephemeral public key and hmac. The client stores the key and verifies that they are also using the same network identifier.

+ +

Shared secret derivation

+ Each derivation uses one public key (their peer's) and one secret key (their own). The resultting shared secrets are identical between server and client. + +
+
Client computes
+
Server computes
+
shared_secret_ab = nacl_scalarmult(
+  client_ephemeral_sk,
+  server_ephemeral_pk
+)
+
+shared_secret_aB = nacl_scalarmult(
+  client_ephemeral_sk,
+  pk_to_curve25519(server_longterm_pk)
+)
+
shared_secret_ab = nacl_scalarmult(
+  server_ephemeral_sk,
+  client_ephemeral_pk
+)
+
+shared_secret_aB = nacl_scalarmult(
+  sk_to_curve25519(server_longterm_sk),
+  client_ephemeral_pk
+)
+
+ +
+

Now that ephemeral keys have been exchanged, both ends use them to derive a shared secret  using scalar multiplication.

+

The client and server each combine their own ephemeral secret key with the other’s ephemeral public key to produce the same shared secret on both ends. An eavesdropper doesn’t know either secret key so they can’t generate the shared secret. A man-in-the-middle could swap out the ephemeral keys in Messages 1 and 2 for their own keys, so the shared secret  alone is not enough for the client and server to know that they are talking to each other and not a man-in-the-middle.

+

Because the client already knows the  server’s long term public key, both ends derive a second secret using the client's ephemeral key pair (either the public or the secret key) and the server's permanent key pair (respectively either the secret or private key) that will allow the client to send a message that only the real server can read and not a man-in-the-middle.

+
+ + +

3. Client authenticate

+ The client computes a detached signature of the network identifier, the server's long-term public key, and a hash of the shared secret; signed with its permanent secret key. They add their permanent public key, and encrypt both so that they can only be opened by someone knowing the network identifier and both shared secrets; then send the cyphertext to the server. + +
+
Client computes
+
Server verifies
+
detached_signature_A = nacl_sign_detached(
+  msg: concat(
+    network_identifier,
+    server_longterm_pk,
+    sha256(shared_secret_ab)
+  ),
+  key: client_longterm_sk
+)
+
msg3_plaintext = assert_nacl_secretbox_open(
+  ciphertext: msg3,
+  nonce: 24_bytes_of_zeros,
+  key: sha256(
+    concat(
+      network_identifier,
+      shared_secret_ab,
+      shared_secret_aB
+    )
+  )
+)
+
+assert(length(msg3_plaintext) == 96)
+
+detached_signature_A = first_64_bytes(msg3_plaintext)
+client_longterm_pk = last_32_bytes(msg3_plaintext)
+
+assert_nacl_sign_verify_detached(
+  sig: detached_signature_A,
+  msg: concat(
+    network_identifier,
+    server_longterm_pk,
+    sha256(shared_secret_ab)
+  ),
+  key: client_longterm_pk
+)
+
Client sends (112 bytes)
+
nacl_secret_box(
+  msg: concat(
+    detached_signature_A,
+    client_longterm_pk
+  ),
+  nonce: 24_bytes_of_zeros,
+  key: sha256(
+    concat(
+      network_identifier,
+      shared_secret_ab,
+      shared_secret_aB
+    )
+  )
+)
+
+ +
+

The client reveals their identity to the server by sending their  long term public key. The client also makes a signature using their  long term secret key. By signing the keys used earlier in the handshake the client proves their identity and confirms that they do indeed wish to be part of this handshake.

+

The client’s message is enclosed in a secret box to ensure that only the server can read it. Upon receiving it, the server opens the box, stores the client’s long term public key and verifies the signature.

+

An all-zero nonce is used for the secret box. The secret box construction requires that all secret boxes using a particular key must use different nonces. It’s important to get this detail right because reusing a nonce will allow an attacker to recover the key and encrypt or decrypt any secret boxes using that key. Using a zero nonce is allowed here because this is the only secret box that ever uses the key sha256(concat( )).

+
+ + +

Shared secret derivation

+ The client computes a new shared secret from their permanent secret key and the server's ephemeral public key. The server computes the same shared secret from the client's permanent public key and their own ephemeral secret key. + +
+
Client computes
+
Server computes
+
shared_secret_Ab = nacl_scalarmult(
+  sk_to_curve25519(client_longterm_sk),
+  server_ephemeral_pk
+)
+
shared_secret_Ab = nacl_scalarmult(
+  server_ephemeral_sk,
+  pk_to_curve25519(client_longterm_pk)
+)
+
+ +

Now that the server knows the  client’s long term public key, another shared secret  is derived by both ends. The server uses this shared secret to send a message that only the real client can read and not a man-in-the-middle.

+ +

4. Server accept

+ The server signs the network identifier, the previous detached signature, the client's permanent secret key, and the hash of the first shared secret, with their permanent secret key, as a new detached signature. They encrypt it so that they can only be opened by someone knowing the network identifier and all three shared secrets; then send the cyphertext to the client. + +
+
Client verifies
+
Server computes
+
detached_signature_B = assert_nacl_secretbox_open(
+  ciphertext: msg4,
+  nonce: 24_bytes_of_zeros,
+  key: sha256(
+    concat(
+      network_identifier,
+      shared_secret_ab,
+      shared_secret_aB,
+      shared_secret_Ab
+    )
+  )
+)
+
+assert_nacl_sign_verify_detached(
+  sig: detached_signature_B,
+  msg: concat(
+    network_identifier,
+    detached_signature_A,
+    client_longterm_pk,
+    sha256(shared_secret_ab)
+  ),
+  key: server_longterm_pk
+)
+
detached_signature_B = nacl_sign_detached(
+  msg: concat(
+    network_identifier,
+    detached_signature_A,
+    client_longterm_pk,
+    sha256(shared_secret_ab)
+  ),
+  key: server_longterm_sk
+)
+
Server sends (80 bytes)
+
nacl_secret_box(
+  msg: detached_signature_B,
+  nonce: 24_bytes_of_zeros,
+  key: sha256(
+    concat(
+      network_identifier,
+      shared_secret_ab,
+      shared_secret_aB,
+      shared_secret_Ab
+    )
+  )
+)
+
+

The server accepts the handshake by signing a message using their  long term secret key. It includes a copy of the client’s previous signature. The server’s signature is enclosed in a secret box using all of the shared secrets.

+

Upon receiving it, the client opens the box and verifies the server’s signature.

+

Similarly to the previous message, this secret box also uses an all-zero nonce because it is the only secret box that ever uses the key sha256(concat( )).

+ +

Handshake complete

+ +

At this point the handshake has succeeded. The client and server have proven their identities to each other.

+

The shared secrets established during the handshake are used to set up a pair of box streams for securely exchanging further messages.

+ +

Box stream

+
+

Box stream is the bulk encryption protocol used to exchange messages following the handshake until the connection ends. It is designed to protect messages from being read or modified by a man-in-the-middle.

+

Each message in a box stream has a header and body. The header is always 34 bytes long and says how long the body will be.

+ A stream is made of alternating headers (34 bytes) and bodies (1 to 4096 bytes); ending with a body followed by a 34-bytes 'goodbye' header + +

Sending

+

Sending a message involves encrypting the body of the message and preparing a header for it. Two secret boxes are used; one to protect the header and another to protect the body.

+
+ + + The plaintext message body is enclosed in a secret box using the key and nonce shown below. Secret boxes put a 16-byte tag onto the front of messages so that tampering can be detected when the box is opened. This tag is sliced off the body and put inside the header. A temporary header is made of the body length (a two-bytes big-endian integer) and th previous tag. This temporary header is then encrypted too, including its own (16-bytes) authentication tag, producing a 16+2+16 bytes header. + +

Receiving

+

Receiving a message involves reading the header to find out how long the body is then reassembling and opening the body secret box.

+ Read the first 34 bytes. This is the secret box containing the header. Open this box, extract the body length and body authentication tag. Read the number of bytes specified in the header. Join the body authentication tag and encrypted body back together, open it, and read the secret text. + +

Goodbye

+

The stream ends with a special “goodbye” header. Because the goodbye header is authenticated it allows a receiver to tell the difference between the connection genuinely being finished and a man-in-the-middle forcibly resetting the underlying TCP connection.

+ The 'goodbye' header is made of 18 bytes of zero, encrypted in a secret box (with a header authenticated tag like other headers). +

When a receiver opens a header and finds that it contains all zeros then they will know that the connection is finished.

+ +

Keys and nonces

+

Two box streams are used at the same time when Scuttlebutt peers communicate. One is for client-to-server messages and the other is for server-to-client messages. The two streams use different keys and starting nonces for their secret boxes.

+ The secret box key is made of a double-sha256 hash of the network identifier and three shared secrets, followed by either the server's permanent public key (for Client to Server) or the client's permanent public key (for Server to Client), both hashed again with sha256. The starting nonces are respectively the first 24 bytes of server's or the client's ephemeral public key, hmac-authenticated with the network identifier. +

The starting nonce is used for the first header in the stream (“secret box 1” in the above figures), then incremented for the first body (“secret box 2”), then incremented for the next header and so on.

+ +

RPC protocol

+ +
+

Scuttlebutt peers make requests to each other using an RPC protocol. Typical requests include asking for the latest messages in a particular feed or requesting a blob.

+

The RPC protocol can interleave multiple requests so that a slow request doesn’t block following ones. It also handles long-running asynchronous requests for notifying when an event occurs and streams that deliver multiple responses over time.

+

Similar to the box stream protocol, the RPC protocol consists of 9-bytes headers followed by variable-length bodies. There is also a 9-bytes goodbye message which is just a zeroed out header.

+ +
+ +

Both peers make requests to each other at the same time using the pair of box streams that have been established. The box streams protect the RPC protocol from eavesdropping and tampering.

+ + + +

Header structure

+

RPC headers contain a set of flags to say what type of message it is, a field specifying its length and a request number which allows matching requests with their responses when there are several active at the same time.

+ Headers are made of (in network order): 4 zero bits, a stream bit (1 = 'message is part of a stream'), a end/error bit (1 = 'message is the last in its stream or an error), and a 2-bits body type (00 = binary, 01 = UTF-8 string, 10 = JSON), the body length (4 bytes unsigned big-endian), and the request number (4 bytes signed big-endial). + +

Request format

+

To make an RPC request, send a JSON message containing the name of the procedure you wish to call, the type of procedure and any arguments.

+

The name is a list of strings. For a top-level procedure like createHistoryStream the list only has one element: ["createHistoryStream"]. Procedures relating to blobs are grouped in the blobs namespace, for example to use blobs.get send the list: ["blobs", "get"].

+
+

There are two types of procedure used when Scuttlebutt peers talk to each other:

+
    +
  • Source procedures return multiple responses over time and are used for streaming data or continually notifying when new events occur. When making one of these requests, the stream flag in the RPC header must be set.
  • +
  • Async procedures return a single response. Async responses can arrive quickly or arrive much later in response to a one-off event.
  • +
+

For each procedure in the RPC protocol you must already know whether it is source or async and correctly specify this in the request body.

+
+ + +

Source example

+

This RPC message shows an example of a createHistoryStream request:

+ + +
+
+
+ Request number1 + Body typeJSON + StreamYes + End/errNo +
+
{
+  "name": ["createHistoryStream"],
+  "type": "source",
+  "args": [{"id": "@FCX/tsDLpubCPKKfIrw4gc+SQkHcaD17s7GI6i/ziWY=.ed25519"}]
+}
+
+ +
+ +
+

createHistoryStream is how Scuttlebutt peers ask each other for a list of messages posted by a particular feed. It has one argument that is a JSON dictionary specifying more options about the request. id is the only required option and says which feed you are interested in.

+

Because this is the first RPC request, the request number is 1. The next request made by this peer will be numbered 2. The other peer will also use request number 1 for their first request, but the peers can tell these apart because they know whether they sent or received each request.

+
+

Now the responder begins streaming back responses:

+ +
+ +
+
+ Request number-1 + Body typeJSON + StreamYes + End/errNo +
+
{
+  "key": "%XphMUkWQtomKjXQvFGfsGYpt69sgEY7Y4Vou9cEuJho=.sha256",
+  "value": {
+    "previous": null,
+    "author": "@FCX/tsDLpubCPKKfIrw4gc+SQkHcaD17s7GI6i/ziWY=.ed25519",
+    "sequence": 1,
+    "timestamp": 1514517067954,
+    "hash": "sha256",
+    "content": {
+      "type": "post",
+      "text": "This is the first post!"
+    },
+    "signature": "QYOR/zU9dxE1aKBaxc3C0DJ4gRyZtlMfPLt+CGJcY73sv5abKK
+                  Kxr1SqhOvnm8TY784VHE8kZHCD8RdzFl1tBA==.sig.ed25519"
+  },
+  "timestamp": 1514517067956
+}
+
+ +
+
+ Request number-1 + Body typeJSON + StreamYes + End/errNo +
+
{
+  "key": "%R7lJEkz27lNijPhYNDzYoPjM0Fp+bFWzwX0SmNJB/ZE=.sha256",
+  "value": {
+    "previous": "%XphMUkWQtomKjXQvFGfsGYpt69sgEY7Y4Vou9cEuJho=.sha256",
+    "author": "@FCX/tsDLpubCPKKfIrw4gc+SQkHcaD17s7GI6i/ziWY=.ed25519",
+    "sequence": 2,
+    "timestamp": 1514517078157,
+    "hash": "sha256",
+    "content": {
+      "type": "post",
+      "text": "Second post!"
+    },
+    "signature": "z7W1ERg9UYZjNfE72ZwEuJF79khG+eOHWFp6iF+KLuSrw8Lqa6
+                  IousK4cCn9T5qFa8E14GVek4cAMmMbjqDnAg==.sig.ed25519"
+  },
+  "timestamp": 1514517078160
+}
+
+
+ + +

Each message posted by the feed is sent back in its own response. This feed only contains two messages.

+

To close the stream the responder sends an RPC message with both the stream and end/err flags set and a JSON body of true. When the requester sees that the stream is being closed they send a final message to close their own end of it (source type requests must always be closed by both ends).

+ +
+ +
+
+ Request number-1 + Body typeJSON + StreamYes + End/errYes +
+
true
+
+
+
+ Request number1 + Body typeJSON + StreamYes + End/errYes +
+
true
+
+ +
+ +

Alternatively, to abort a stream before it is finished the requester can send their closing message early, at which point the responder closes their own end.

+ +
+
+
+ Request number1 + Body typeJSON + StreamYes + End/errYes +
+
true
+
+ + +
+
+ Request number-1 + Body typeJSON + StreamYes + End/errYes +
+
true
+
+
+ +

Async example

+

One of the few public async procedures is blobs.has, which peers use to ask each other whether they have a particular blob.

+

In this example the requester is asking the responder if they have blob &WWw4tQJ6…:

+ +
+
+
+ Request number2 + Body typeJSON + StreamNo + End/errNo +
+
{
+  "name": ["blobs", "has"],
+  "type": "async",
+  "args": ["&WWw4tQJ6ZrM7o3gA8lOEAcO4zmyqXqb/3bmIKTLQepo=.sha256"]
+}
+
+ +
+ +

The responder does in fact have this blob so they respond with true. Because this is an async procedure and not a stream, there is only one response and no need to close the stream afterwards:

+ +
+ +
+
+ Request number-2 + Body typeJSON + StreamNo + End/errNo +
+
true
+
+
+ +

Error example

+ +

Let’s take the previous example and introduce a programming mistake to see how the RPC protocol handles errors:

+ +
+
+
+ Request number3 + Body typeJSON + StreamNo + End/errNo +
+
{
+  "name": ["blobs", "has"],
+  "type": "async",
+  "args": ["this was a mistake"]
+}
+
+ + +
+
+ Request number-3 + Body typeJSON + StreamNo + End/errYes +
+
{
+  "name": "Error",
+  "message": "invalid hash:this was a mistake",
+  "stack": "…"
+}
+
+
+ +

Most importantly, the response has the end/err flag set to indicate that an error occurred. The reference Scuttlebot implementation also includes an error message and a JavaScript stack trace.

+

For source type procedures an error will also end the stream because the end/err flag has the dual purpose of ending streams and indicating that an error occurred.

+ +

Feeds

+

A Scuttlebutt feed is a list of all the messages posted by a particular identity. When a user writes a message in a Scuttlebutt client and posts it, that message is put onto the end of their feed.

+ +

Structure

+

The messages in a feed form an append-only log, meaning that once a message is posted it cannot be modified. Each message (except the first one) references the ID of the previous message, allowing a chain to be constructed back to the first message in the feed.

+ + +

Message format

+

To create a message to post in a feed, start by filling out these fields:

+
{
+  "previous": "%XphMUkWQtomKjXQvFGfsGYpt69sgEY7Y4Vou9cEuJho=.sha256",
+  "author": "@FCX/tsDLpubCPKKfIrw4gc+SQkHcaD17s7GI6i/ziWY=.ed25519",
+  "sequence": 2,
+  "timestamp": 1514517078157,
+  "hash": "sha256",
+  "content": {
+    "type": "post",
+    "text": "Second post!"
+  }
+}
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
previousMessage ID of the latest message posted in the feed. If this is the very first message then use null. See below for how to compute a message’s ID.
authorPublic key of the feed that the message will be posted in.
sequence1 for the first message in a feed, 2 for the second and so on.
timestampTime the message was created. Number of milliseconds since 1 January 1970 00:00 UTC.
hashThe fixed string sha256, which is the hash function used to compute the message ID.
contentIf the message is not encrypted, This is a dictionary containing free-form data for applications to interpret, plus a mandatory type field. The type field allows applications to filter out message types they don’t understand and must be a UTF-16 string between 3 and 52 code units long (inclusive). If the message is encrypted, then this is a base64 encoded string, followed by a suffix of .box; we will describe private messages later in this document.
+ + +

Signature

+
+

All messages in a feed are signed by that feed’s long-term secret key. This enables recipients to verify that a message was really posted by a particular identity and not tampered with as it gets gossiped and replicated throughout the Scuttlebutt network.

+

Before signing a message it must be serialized according to a specific canonical JSON format. This means for any given message there is exactly one way to serialize it as a sequence of bytes, which is necessary for signature verification to work. The reference implementation verifies that all messages it receives are in the canonical format and rejects messages that aren’t.

+
+ +

The canonical format is defined by the ECMA-262 6th Edition section JSON.stringify. For an example, see how the above message is formatted.

+

In brief, the rules are:

+
    +
  • Two spaces for indentation.
  • +
  • Dictionary entries and list elements each on their own line.
  • +
  • Newlines use the line feed character \n.
  • +
  • No trailing newline.
  • +
  • One space after the colon : for dictionary keys.
  • +
  • Empty dictionaries appear as {} and empty lists appear as [].
  • +
  • Strings and numbers formatted according to the sections QuoteJSONString and ToString Applied to the Number Type. +
+

Then sign the message by computing:

+
signature = nacl_sign_detached(
+  msg: formatted_json_message,
+  key: authors_longterm_sk
+)
+

Base64 encode the signature and put .sig.ed25519 on the end. Finally, add the signature to the message itself. It must be the last entry in the dictionary:

+
{
+  "previous": "%XphMUkWQtomKjXQvFGfsGYpt69sgEY7Y4Vou9cEuJho=.sha256",
+  "author": "@FCX/tsDLpubCPKKfIrw4gc+SQkHcaD17s7GI6i/ziWY=.ed25519",
+  "sequence": 2,
+  "timestamp": 1514517078157,
+  "hash": "sha256",
+  "content": {
+    "type": "post",
+    "text": "Second post!"
+  },
+  "signature": "z7W1ERg9UYZjNfE72ZwEuJF79khG+eOHWFp6iF+KLuSrw8Lqa6
+                IousK4cCn9T5qFa8E14GVek4cAMmMbjqDnAg==.sig.ed25519"
+}
+ +

To verify the signature, first remove the signature field from the message. Make sure the remaining message is formatted as JSON using the same formatting rules. Here the order of dictionary entries within content matters; they must be in the same order that you received them.

+

Then remove the .sig.ed25519 suffix from the signature, base64 decode it and verify with:

+
nacl_sign_verify_detached(
+  sig: signature,
+  msg: formatted_json_message,
+  key: authors_longterm_pk
+)
+ +

Message ID

+

A message ID is a hash of the message including signature. Messages can refer to other messages by their ID.

+

To compute a message’s ID, first format it as JSON using the formatting rules. Like with signatures, dictionary keys must appear in the same order that you received them. The signature key must appear last as shown above (but without wrapping the line).

+

The ID of the above message is:

+ %R7lJEkz27lNijPhYNDzYoPjM0Fp+bFWzwX0SmNJB/ZE=.sha256 where everything between % and .sha256 is the base64-encoding of the sha256 hash of the formatted message including signature +

Currently all IDs are computed using sha256. However the protocol includes the name of the hash function in message IDs and the messages themselves to allow migrating to a different one if needed in the future.

+ +

createHistoryStream

+

Scuttlebutt clients maintain a set of feeds that they are interested in. These could be feeds that the user has followed, bookmarked or subscribed to. When peers connect, one of the first things they do is ask each other whether the feeds they are interested in have any new messages.

+ +

The RPC procedure createHistoryStream is how peers ask each other for a list of messages in a particular feed.

+ +
+
+
+ Request number1 + Body typeJSON + StreamYes + End/errNo +
+
{
+  "name": ["createHistoryStream"],
+  "type": "source",
+  "args": [
+    {
+      "id": "@FCX/tsDLpubCPKKfIrw4gc+SQkHcaD17s7GI6i/ziWY=.ed25519",
+      "sequence": 2,
+      "limit": 1,
+      "live": false,
+      "old": true,
+      "keys": true
+    }
+  ]
+}
+
+ +
+ +

createHistoryStream takes one argument which is a dictionary of additional options that controls how the feed is returned. Valid options are:

+ + + + + + + + + + + + + + + + + + + + + + + + + +
idPublic key of the feed to return messages from. Required.
seqOnly return messages later than this sequence number. If not specified then start from the very beginning of the feed.
limitMaximum number of messages to return. If the limit is exceeded only the earliest messages are returned. Default: unlimited.
liveIf true, keep the stream alive and send new messages as they are posted. If false, end the stream after messages are sent and don’t wait for new ones. Default: false.
oldUsed together with live. If true, start by sending existing messages already posted by this feed. If false, don’t send existing messages posted by this feed, only send new messages as they arrive. Default: true.
keysIf true, also include message IDs and timestamps of when each message was received by this peer. If false, just send the messages themselves. Default: true.
+ +

Here is a comparison of createHistoryStream responses with keys set to true and false:

+ +
+
+
+ Request number1 + Body typeJSON + StreamYes + End/errNo +
+
{
+  "name": ["createHistoryStream"],
+  "type": "source",
+  "args": [
+    {
+      "id": "@FCX/tsDLpubCPKKfIrw4gc+SQkHcaD17s7GI6i/ziWY=.ed25519",
+      "keys": true
+    }
+  ]
+}
+
+ + +
+
+ Request number-1 + Body typeJSON + StreamYes + End/errNo +
+
{
+  "key": "%XphMUkWQtomKjXQvFGfsGYpt69sgEY7Y4Vou9cEuJho=.sha256",
+  "value": {
+    "previous": null,
+    "author": "@FCX/tsDLpubCPKKfIrw4gc+SQkHcaD17s7GI6i/ziWY=.ed25519",
+    "sequence": 1,
+    "timestamp": 1514517067954,
+    "hash": "sha256",
+    "content": {
+      "type": "post",
+      "text": "This is the first post!"
+    },
+    "signature": "QYOR/zU9dxE1aKBaxc3C0DJ4gRyZtlMfPLt+CGJcY73sv5abKK
+                  Kxr1SqhOvnm8TY784VHE8kZHCD8RdzFl1tBA==.sig.ed25519"
+  },
+  "timestamp": 1514517067956
+}
+
+
+
+
+ Request number2 + Body typeJSON + StreamYes + End/errNo +
+
{
+  "name": ["createHistoryStream"],
+  "type": "source",
+  "args": [
+    {
+      "id": "@FCX/tsDLpubCPKKfIrw4gc+SQkHcaD17s7GI6i/ziWY=.ed25519",
+      "keys": false
+    }
+  ]
+}
+
+ + +
+
+ Request number-2 + Body typeJSON + StreamYes + End/errNo +
+
{
+  "previous": null,
+  "author": "@FCX/tsDLpubCPKKfIrw4gc+SQkHcaD17s7GI6i/ziWY=.ed25519",
+  "sequence": 1,
+  "timestamp": 1514517067954,
+  "hash": "sha256",
+  "content": {
+    "type": "post",
+    "text": "This is the first post!"
+  },
+  "signature": "QYOR/zU9dxE1aKBaxc3C0DJ4gRyZtlMfPLt+CGJcY73sv5abKK
+                Kxr1SqhOvnm8TY784VHE8kZHCD8RdzFl1tBA==.sig.ed25519"
+}
+
+
+ +

Blobs

+

A blob is binary data. Blobs are referred to from Scuttlebutt messages and stored by peers in the network. When a user attaches an image to their post, that image is stored as a blob and the message contains a link to it.

+

Being just a sequence of bytes, blobs can contain any data, unlike feeds and messages which have a specific structure. Blobs can handle much larger amounts of data than feeds or messages, which is why they are stored separately. However, clients may decide to not replicate blobs larger than a chosen size, which defaults to 5 megabytes in current implementations.

+

Blobs are referred to by their blob ID:

+ &uaGieSQDJcHfUp6hjIcIq55GoZh4Ug7tNmgaohoxrpw=.sha256 where everything between & and .sha256 is the base64-encoding of the sha256 hash of the blob +

Blobs are immutable because their ID contains a hash of their contents. This allows peers to fetch blobs from anyone in the network and know they haven’t been tampered with.

+

When a Scuttlebutt implementation receives a new message and sees that it references a blob, it might be a good time to fetch that blob so that the complete message will be available to show the user.

+ +

Fetching

+

There are two RPC methods for fetching blobs. To get an entire blob use blobs.get, or for only part of the blob use blobs.getSlice.

+ + +

blobs.get

+

blobs.get asks a peer to send you the contents of a blob. There is one argument which is the blob ID:

+
+
+
+ Request number1 + Body typeJSON + StreamYes + End/errNo +
+
{
+  "name": ["blobs", "get"],
+  "type": "source",
+  "args": ["&uaGieSQDJcHfUp6hjIcIq55GoZh4Ug7tNmgaohoxrpw=.sha256"]
+}
+
+ +
+ +

Now the responder begins streaming back the contents of the blob. Each response has a body type of binary and contains a piece of the blob, starting from the beginning.

+

This particular blob is 161,699 bytes long and the responder has decided to send it in pieces of 65,536 bytes each. That means two full pieces of 65,536 bytes will be sent and a final piece with the remaining 30,627 bytes.

+ +
+ +
+
+ Request number-1 + Body typeBinary + StreamYes + End/errNo +
+
+ ffd8ffe000104a46494600010200000100010000ffdb0043 + 00080606070605080707070909080a0c140d0c0b0b0c1912 + 130f141d1a1f1e1d1a1c1c20242e2720222c231c1c283729 + 2c30313434341f27393d38323c2e333432ffdb +
…65536 bytes total
+
+
+ +
+
+ Request number-1 + Body typeBinary + StreamYes + End/errNo +
+
+ bae49231ce6874d0d4999e66b9f317ef2b20dc07a8ef8ad3 + b5b9330f349057a723a9f6359329b89252d2614918551d3e + b4915bb2a12ce1467b77351ecac5f3dce8165b6907cf310d + e8d83519b58d1cc81f7311838c67f2ac291dc6 +
…65536 bytes total
+
+
+ +
+
+ Request number-1 + Body typeBinary + StreamYes + End/errNo +
+
+ caf507ad376364afca7df3c558e48e07cbe9d68047f778f6 + a057220a36e08c1a79881438ede94ec83d074a70519c8345 + 839885a25e31cd39536aae573dc7a54b9c1e339a724ac8b2 + 051c483072074cfe94587cc3148eadd73e9438 +
…30627 bytes total
+
+
+
+ +

Finally, the stream is closed with a JSON message of true with the end/err flag set. The requester sees that the stream is being closed and closes their end of the stream too:

+ +
+ +
+
+ Request number-1 + Body typeJSON + StreamYes + End/errYes +
+
true
+
+
+
+ Request number1 + Body typeJSON + StreamYes + End/errYes +
+
true
+
+ +
+ +

Upon receiving the blob the requester should check that what they received matches the sha256 checksum they asked for.

+ +

blobs.get has an alternate form where the first argument is a JSON dictionary of options:

+
+
+
+ Request number2 + Body typeJSON + StreamYes + End/errNo +
+
{
+  "name": ["blobs", "get"],
+  "type": "source",
+  "args": [
+    {
+      "hash": "&uaGieSQDJcHfUp6hjIcIq55GoZh4Ug7tNmgaohoxrpw=.sha256",
+      "size": 161699,
+      "max": 200000
+    }
+  ]
+}
+
+ +
+ +

Valid options are:

+ + + + + + + + + + + + + +
hashID of the blob. Required.
sizeExpected size of the blob in bytes. If the blob is not exactly this size then reject the request. Optional.
maxMaximum size of the blob in bytes. If the blob is larger then reject the request. Only makes sense to specify max if you don’t already know size. Optional.
+

This form allows the responder to reject the request if the blob is not the expected size or too large. When a request is rejected the responder sends back a single message with the end/err flag set containing a JSON error message.

+ +

blobs.getSlice

+

blobs.getSlice works like blobs.get but rather than receiving the entire blob, the requester specifies a start and end point and the responder only sends back bytes within that range.

+

Reasons for using blobs.getSlice could be to download a blob in pieces from many peers at once, to resume a partially-completed download or to fetch the first part of a video to show a preview. Though beware that if you only fetch part of a blob you cannot be sure that it hasn’t been tampered with. You need the whole blob to verify its integrity.

+ +
+
+
+ Request number1 + Body typeJSON + StreamYes + End/errNo +
+
{
+  "name": ["blobs", "getSlice"],
+  "type": "source",
+  "args": [
+    {
+      "hash": "&uaGieSQDJcHfUp6hjIcIq55GoZh4Ug7tNmgaohoxrpw=.sha256",
+      "start": 65536,
+      "end": 65584
+    }
+  ]
+}
+
+ + +
+
+ Request number-1 + Body typeBinary + StreamYes + End/errNo +
+
+ bae49231ce6874d0d4999e66b9f317ef2b20dc07a8ef8ad3 + b5b9330f349057a723a9f6359329b89252d2614918551d3e +
+
+ +
+
+ Request number-1 + Body typeJSON + StreamYes + End/errYes +
+
true
+
+
+
+ Request number1 + Body typeJSON + StreamYes + End/errYes +
+
true
+
+ +
+ +

Start and end are byte offsets from the start of the blob and form a half-open interval, meaning the end byte is not included.

+ For example, start=4 and end=10 returns six bytes: bytes 4, 5, 6, 7, 8, and 9; but not byte 10. (Bytes are numbered so that the first byte is byte 0) +

Specifying start = 0 means start from the beginning of the blob. Specifying end = size of the blob means keep going all the way to the end of the blob.

+

blobs.getSlice also accepts the size and max options, which work the same as in blobs.get. These two options refer to the size of the entire blob, not the range requested.

+ +

Want and have

+

Peers signal to each other which blobs they want and have. This lets peers know who they can fetch a particular blob from. It also allows requests for blobs to propagate through the network until a peer that has the blob is found.

+ +

Upon connecting, peers typically invoke the RPC method blobs.createWants on each other. blobs.createWants asks a peer to tell you which blobs they want, and also allows the peer to tell you which blobs they have.

+ +
+
+
+ Request number1 + Body typeJSON + StreamYes + End/errNo +
+
{
+  "name": ["blobs", "createWants"],
+  "type": "source",
+  "args": []
+}
+
+ + +
+
+ Request number-1 + Body typeJSON + StreamYes + End/errNo +
+
{}
+
+
+ +

Responding with an empty dictionary {} means they don’t currently want any blobs. Later, when they want a particular blob the responder will send another response back:

+ +
+ +
+
+ Request number-1 + Body typeJSON + StreamYes + End/errNo +
+
{"&uaGieSQDJcHfUp6hjIcIq55GoZh4Ug7tNmgaohoxrpw=.sha256": -1}
+
+
+ + +

The -1 means the responder wants this blob themselves. -2 means they know someone who wants the blob. -3 means they know someone who knows someone who wants the blob, and so on.

+

If a peer tells you that they want a blob and you don’t have it yourself then you can forward the want to other peers you are connected to. When forwarding a request, remember to subtract one from the number so that the request does not keep propagating through the network in an infinite loop.

+

Implementations can pick a limit and ignore blob requests that come from further out than their threshold. The reference implementation forwards requests with -1 or -2, but does not forward requests with -3 or further out.

+

If the responder does in fact have the blob, they can respond with its size in bytes:

+ +
+ +
+
+ Request number-1 + Body typeJSON + StreamYes + End/errNo +
+
{"&uaGieSQDJcHfUp6hjIcIq55GoZh4Ug7tNmgaohoxrpw=.sha256": 161699}
+
+
+ + +

Now the requester knows they can retrieve the blob from this peer with blobs.get or blobs.getSlice. +

+ Peer A tells Peer B: 'Want: &uaGie: -1'. Peer B tells Peer C: 'Want: &uaGie: -2'. Peer C has it, so it answers: 'Have: &uaGie: 161699'. Peer B then requests 'Get: &uaGie' and Peer C returns the content of the blob. Peer B then tells Peer A: 'Have: &uaGie'. Peer A hen requests 'Get: &uaGie' from B, and B answers with the blob. + +

Following

+

Feeds can follow other feeds. Following is a way of saying “I am interested in the messages posted by this feed”.

+ +

Following is an optional part of Scuttlebutt, however current clients do implement it because it enables interesting social dynamics, such as introducing people that otherwise wouldn’t have found each other and allowing trust to be built within human networks. Following is what enables Scuttlebutt to be a social network rather than a group messenger.

+ +

When a user wants to follow another feed their client will post a message to their own feed that looks like:

+ +
{
+  "author": "@FCX/tsDLpubCPKKfIrw4gc+SQkHcaD17s7GI6i/ziWY=.ed25519",
+  "content": {
+    "type": "contact",
+    "contact": "@sxlUkN7dW/qZ23Wid6J1IAnqWEJ3V13dT6TaFtn5LTc=.ed25519",
+    "following": true
+  },
+  …
+}
+

Later, if the user decides to unfollow this feed, their client can post another message with following set to false.

+

When two feeds follow each other current user interfaces will call them “friends”, however this is just a cosmetic touch and for everything else they are still treated as individual follows in each direction.

+ +

Follow graph

+

Because each feed publicly announces which feeds it is following, clients can arrange feeds into a graph of who follows who:

+ The follow graph seen by a user is a directed graph, 'rooted' in the user. It can be seen as concentric circles, with the user in the center, and feeds arranged by proximity to the user according to the number of hops. First, feeds directly followed by the user. Then feeds not directly followed by visible in the user interface (2 hops or more). Then feeds not visible, whose content is fetched by the client nontheless. Then feeds the client has need mentioned but chosen not to fetch. +

Clients may want to use the follow graph to decide which feeds to display to the user and which to replicate. If the user explicitly follows a feed that is a strong signal that the user wants to see messages posted by that feed.

+

One implementation, Patchwork, shows messages up to 2 hops out by default. Messages from feeds 3 hops out are replicated to help keep them available for others, but not directly shown in the user interface. A benefit of replicating at a greater range is that for discussion threads with lots of participants it’s more likely that the client will be able to fill in gaps where someone posted who was further than 2 hops out.

+

Clients could also let users configure how far the visibility and replication ranges are, or a client could use an entirely different method of deciding which feeds to show and replicate that is not based on follow range.

+ +

Pubs

+

A pub is a publicly-accessible Scuttlebutt peer. Pubs have a social and a technical purpose:

+
    +
  • Pubs serve as a gathering point for new users to find other people and for existing users to welcome people who have just joined.
  • +
  • Pubs have a stable IP address and allow incoming TCP connections, which enables users to connect even if their internet service provider lacks dedicated IP addresses or refuses incoming connections.
  • +
+

Pubs speak the same protocol as regular peers and behave like regular peers except that they are normally run on servers so that they are always online.

+

Joining a pub means following it and having it follow you back. After a new user joins a pub they will be able to see posts by the pub’s other members, and crucially the other members will be able to see the new member. This works because everyone is now within 2 hops of each other:

+ From a new user perspective, the pub will be 1 hop from them, and existing users will be 2 hops from them. From the pub's perspective, all users who are members of the pub are 1 hop from it. From existing users' perspective, the pub is 1 hop from them, and both the new user and other existing users are 2 hops away. +

After joining a pub, a user may decide to follow some of its members directly, in which case the pub is no longer needed for feed visibility but is still useful for accepting TCP connections and replicating messages.

+ +

Invites

+

Any user can follow a pub by posting a follow message, but to get the pub to follow you back you need an invite.

+
+

How the pub hands out invites is for its operator to decide. Some pubs have a web page that anybody can visit to generate an invite code. Some pubs have a pre-generated list of invite codes that the operator distributes. Invite codes can be single-use-only, have a maximum number of uses before they expire, or keep working indefinitely. A single user can use several invites if they wish to join several different pubs.

+

Invite codes use this format:

+
+ + one.butt.nz:8008:@VJM7w1W19ZsKmG2KnfaoKIM66BRoreEkzaVm/J//wl8=.ed25519~r4hIBk7KC7a9Gknj6Qiuuo4+Et/TS2rjgl6gYgw3OIM=. the parts are: a domain name or IP address of the pub, a colon, the port, a colon, the pub's public key (prefixed with an @ and suffixed with .ed25519 as usual), a tilde, then the base64-encoded invite secret key. +

To make a new invite code, a pub generates a new Ed25519 key pair. The seed for the key pair (derived from the secret key) goes into the invite code, which is given to either a new user or the pub operator to distribute. The public key is remembered by the pub along with any extra conditions such as the number of remaining uses or expiry date.

+ +

Redeeming invites

+

To redeem an invite, a user enters the invite code into their Scuttlebutt client. The client opens a new TCP connection to the domain and port contained in the invite and proceeds to set up a peer connection, starting with the handshake.

+ +

However, unlike a regular handshake, the client uses the secret key in the invite as their long term secret key. Because the invite only contains the secret key but not the public key, the client will need to calculate the public key from the secret key. Some cryptographic libraries call this “seeding” an Ed25519 key pair.

+

Handshaking with the invite key allows the client to call a special RPC method invite.use:

+ + +
+
+
+ Request number1 + Body typeJSON + StreamNo + End/errNo +
+
{
+  "name": ["invite", "use"],
+  "type": "async",
+  "args": [{"feed": "@FCX/tsDLpubCPKKfIrw4gc+SQkHcaD17s7GI6i/ziWY=.ed25519"}]
+}
+
+ +
+

The pub checks the key used in the handshake against its list of unredeemed invites. If the invite code is valid and has not expired, the pub follows the feed ID specified by the requester and responds with its new follow message:

+
+ +
+
+ Request number-1 + Body typeJSON + StreamNo + End/errNo +
+
{
+  "key": "%+7u6Fa0s1cE6tS9BtKUijDV3QBYQEINH7gLSIkDqRMM=.sha256",
+  "value": {
+    "previous": "%S1v8a0gQkaNNzNOrWuQUomZvFrDO+XARfd6z35OmCb4=.sha256",
+    "author": "@VJM7w1W19ZsKmG2KnfaoKIM66BRoreEkzaVm/J//wl8=.ed25519",
+    "sequence": 14,
+    "timestamp": 1516094092985,
+    "hash": "sha256",
+    "content": {
+      "type": "contact",
+      "contact": "@FCX/tsDLpubCPKKfIrw4gc+SQkHcaD17s7GI6i/ziWY=.ed25519",
+      "following": true,
+      "pub": true
+    },
+    "signature":"zckFCb4XAJxNVy4tcm38o2GoFIWj25ZKa6EOaBYQA7DH/zNeWp
+                 hHuJBCCEWK6XRl4VENZWXHxPNHEBCBXDq6CA==.sig.ed25519"
+  }
+}
+
+
+ + +

Because this a pub, it is probably connected to a few other peers already. The pub will notify its peers of its new follow message using the normal createHistoryStream mechanism, at which point other users of the pub may decide that they are now interested in this new user’s feed and fetch it.

+

Now that the pub has followed the new user, the new user should reciprocate by following the pub back. Clients automatically handle this on behalf of the user when they enter an invite code. The client posts a message to the user’s feed that follows the pub back:

+
{
+  "author": "@FCX/tsDLpubCPKKfIrw4gc+SQkHcaD17s7GI6i/ziWY=.ed25519",
+  "content": {
+    "type": "contact",
+    "contact": "@VJM7w1W19ZsKmG2KnfaoKIM66BRoreEkzaVm/J//wl8=.ed25519",
+    "following": true
+  },
+  …
+}
+ +

The client also posts a message of type pub to the user’s feed:

+
{
+  "author": "@FCX/tsDLpubCPKKfIrw4gc+SQkHcaD17s7GI6i/ziWY=.ed25519",
+  "content": {
+    "type": "pub",
+    "address": {
+      "host": "one.butt.nz",
+      "port": 8008,
+      "key": "@VJM7w1W19ZsKmG2KnfaoKIM66BRoreEkzaVm/J//wl8=.ed25519"
+    }
+  },
+  …
+}
+

These messages help peers discover new pubs where they might be able to fetch new messages from. Clients can maintain a list of pubs they have seen so that they know of alternative places to fetch messages from in case a pub goes offline.

+ +

Private messages

+
+

Private messages are encrypted so that only certain recipients can read them. They are posted to the sender’s Scuttlebutt feed like normal messages.

+

Anyone can see the fact that a feed posted a private message, who sent it (the feed that posted it), when it was sent and its size. However the list of recipients, number of recipients and message body is concealed.

+
+ +

Given the user wants to post these message contents:

+
{
+  "type": "post",
+  "text": "Don’t tell anybody about this one weird trick…",
+  "recps": [
+    "@FCX/tsDLpubCPKKfIrw4gc+SQkHcaD17s7GI6i/ziWY=.ed25519",
+    "@VJM7w1W19ZsKmG2KnfaoKIM66BRoreEkzaVm/J//wl8=.ed25519"
+  ]
+}
+ + +

This is how it would appear as a private message when posted to the user’s feed:

+
{
+  "previous": "%+7u6Fa0s1cE6tS9BtKUijDV3QBYQEINH7gLSIkDqRMM=.sha256",
+  "author": "@FCX/tsDLpubCPKKfIrw4gc+SQkHcaD17s7GI6i/ziWY=.ed25519",
+  "sequence": 15,
+  "timestamp": 1516222868742,
+  "hash": "sha256",
+
+  "content": "ilDLCLIPRruIQPuqOq1uKnkMh0VNmxD8q+DXKCbgThoAR4XvotMSbMYnodhEkgUQuEEbxjR/MHTa77
+              DQKY5QiGbFusUU564iDx1g/tP0qNqwir6eB0LGEna+K5QDj4CtNsHwnmDv7C0p/9n8lq/WtXlKptrO
+              /A6riL+8EfhIWck1KCQGIZNxZz84DtpDXdN1z88rvslDNoPPzQoeGIgkt/RrGsoysuMZoJyN8LZb3X
+              uczoSn+FhS0nWKIYnCy+CtmNiqw+9lATZgXM4+FOY8N3+L+j25hQQI191NNIdFVyMwoxkPL81byqLx
+              ABJDLpMDSOXnWjvyzCJ68UOUwciS16/QdXE647xJ4NSC7u6uMreFIdtHTkQcP556PlZyBFwArJXbwx
+              TUq84f5rTUt3uoG3fOllxFjRs/PPLkIcD1ihxJoSmoTTbFePclRYAV5FptRTJVHg==.box",
+
+  "signature": "6EQTBQbBhAxeE3w7kyg/7xWHUR8tXP7jUl7bWnEQVz8RxbCYgb
+                TRUnfX/2v68xfSG5xyLAqDJ1Dh3+d+pmRvAw==.sig.ed25519"
+}
+ +

When a client sees a message where the content is a string ending in .box it will know that it is a private message. Because clients can’t see who the message is addressed to, they will attempt to decrypt every private message they come across in case it is for them.

+ +

Encrypting

+

To encrypt a private message, the sender starts with these keys:

+ A generated Curve25519 key pair used to encrypt the message header, call the 'header key'; a generated 32-byte secret key used to encrypt the message body called the 'body key'; and the public long-term key of each recipient (max 7). +

Next, the sender uses scalar multiplication to derive a shared secret for each recipient:

+ by computing the product of the secret key they just generated and that recipient's public long-term key. +

The sender constructs the encrypted message by first enclosing the message content in a secret box, then enclosing the key needed to open it into a series of additional secret boxes, one to each recipient:

+ The plaintext message content is enclosed in a secret box using the public 'body key' and a random 24-byte nonce; this box is 16 bytes (the auth tag) plus the original length of the message. The sender prepares a temporary header, made of the number of recipients (1 byte) and the secret body key (32 bytes). This temporary header is then enclosed as many times as there are recipients, in as many secret boxes (the 'encrypted headers', 16 + 33 bytes each, as they each include their own auth tag). The final message is made of: the 24 bytes nonce (defined above), the public header key (32 bytes), all the encrypted headers (49 bytes each), and finally the encrypted message content (at least 16 + 1 bytes). + +

Decrypting

+

Decrypting a private message involves scanning through the series of header secret boxes to see if any of them open using your long-term secret key. Then, if one of them opens, taking out the body secret key and using it to open the secret box holding the message content:

+ base64-decode the message, extract the nonce and the public header key at the beginning. Then use the secret long-term key and the header public key to compute the shared secret. Read the first 49 bytes of the encrypted headers and try to open it as a secret box. If that fails, try the next 49 bytes. Keep trying up to 7 times. If the shared secret opens a secret box, then this message is intended for you. Read the number of recipients and body secret key. Now that you know how many recipients there are, skip forward 49 bytes for each remaining header. Finally open the secret box using the body secret key and read the content. +
+ + + diff --git a/lang/ru/img/format_public_key.png b/lang/ru/img/format_public_key.png new file mode 100644 index 0000000000000000000000000000000000000000..d13278cc7ec67fee63032a0abdb263b49c5dbb07 GIT binary patch literal 13373 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 + + + + + + + + + + + image/svg+xml + + + + + + + + @FCX/tsDLpubCPKKfIrw4gc+SQkHcaD17s7GI6i/ziWY=.ed25519 + + base64(открытый ключ) + diff --git a/lang/ru/img/format_udp_broadcast.png b/lang/ru/img/format_udp_broadcast.png new file mode 100644 index 0000000000000000000000000000000000000000..33b6fd2512778692d779c71cf8fac307b749c3d5 GIT binary patch literal 29543 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 H#ryvU!jhSJ literal 0 HcmV?d00001 diff --git a/lang/ru/img/format_udp_broadcast.svg b/lang/ru/img/format_udp_broadcast.svg new file mode 100644 index 0000000..8fcec37 --- /dev/null +++ b/lang/ru/img/format_udp_broadcast.svg @@ -0,0 +1,139 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + net:192.168.1.123:8008~shs:FCX/tsDLpubCPKKfIrw4gc+SQkHcaD17s7GI6i/ziWY= + + base64(публичный ключ) + + + порт + IP адрес + diff --git a/lang/ru/img/identity_keypair.png b/lang/ru/img/identity_keypair.png new file mode 100644 index 0000000000000000000000000000000000000000..f2ae421fa18c5991e930f0b0e71a62adb4d45e44 GIT binary patch literal 13209 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 rX + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + Scuttlebutt личность + + + + + + A + + + + + A + + Секретный ключ + Открытый ключ + + Долгосрочная Ed25519пара ключей + + + From bf95a8382cba7e0f1c27ed380caecc3b75280435 Mon Sep 17 00:00:00 2001 From: bruseeru Date: Fri, 21 Jan 2022 00:45:06 +0700 Subject: [PATCH 3/3] update of the Russian translation update of the Russian translation --- index_ru.html | 60 +-- lang/ru/img/client_hello.png | Bin 0 -> 11137 bytes lang/ru/img/client_hello.svg | 648 ++++++++++++++++++++++++++ lang/ru/img/message_flow.png | Bin 0 -> 35984 bytes lang/ru/img/message_flow.svg | 417 +++++++++++++++++ lang/ru/img/starting_keys.png | Bin 0 -> 84526 bytes lang/ru/img/starting_keys.svg | 836 ++++++++++++++++++++++++++++++++++ 7 files changed, 1931 insertions(+), 30 deletions(-) create mode 100644 lang/ru/img/client_hello.png create mode 100644 lang/ru/img/client_hello.svg create mode 100644 lang/ru/img/message_flow.png create mode 100644 lang/ru/img/message_flow.svg create mode 100644 lang/ru/img/starting_keys.png create mode 100644 lang/ru/img/starting_keys.svg diff --git a/index_ru.html b/index_ru.html index 6fb48cd..7ff0954 100644 --- a/index_ru.html +++ b/index_ru.html @@ -197,17 +197,17 @@

Pub сообщение

Когда другие видят это сообщение, они могут отметить, что этот паб существует, и подключиться к нему в будущем.

Сообщения в пабе - полезный способ найти дополнительных пиров, если вы уже знаете некоторых из них. Очевидно, это не работает для новых пользователей, которые еще никого не знают и поэтому не могут видеть сообщения паблика.

-

Peer connections

-

Once a Scuttlebutt client has discovered the IP address, port number and public key of a peer they can connect via TCP to ask for updates and exchange messages.

+

Одноранговые соединения

+

Как только клиент Scuttlebutt обнаружит IP-адрес, номер порта и открытый ключ партнера, он может подключиться через TCP, чтобы запросить обновления и обменяться сообщениями.

-

Handshake

+

Рукопожатие

-

The connection begins with a 4-step handshake to authenticate each peer and set up an encrypted channel.

- Message 1: Client hello (sent by the client). Message 2: Server hello. Message 3: Client authenticate. Message 4: Server accept +

Подключение начинается с четырехэтапного рукопожатия для аутентификации каждого узла и настройки зашифрованного канала.

+ Message 1: Client hello (sent by the client). Message 2: Server hello. Message 3: Client authenticate. Message 4: Server accept
-

The handshake uses the Secret Handshake key exchange which is designed to have these security properties:

+

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

    -
  • After a successful handshake the peers have verified each other’s public keys.
  • -
  • The handshake produces a shared secret that can be used with a bulk encryption cypher for exchanging further messages.
  • -
  • The client must know the server’s public key before connecting. The server learns the client’s public key during the handshake.
  • -
  • Once the client has proven their identity the server can decide they don’t want to talk to this client and disconnect without confirming their own identity.
  • -
  • A man-in-the-middle cannot learn the public key of either peer.
  • -
  • Both peers need to know a key that represents the particular Scuttlebutt network they wish to connect to, however a man-in-the-middle can’t learn this key from the handshake. If the handshake succeeds then both ends have confirmed that they wish to use the same network.
  • -
  • Past handshakes cannot be replayed. Attempting to replay a handshake will not allow an attacker to discover or confirm guesses about the participants’ public keys.
  • -
  • Handshakes provide forward secrecy. Recording a user’s network traffic and then later stealing their secret key will not allow an attacker to decrypt their past handshakes.
  • +
  • После успешного рукопожатия узлы подтвердили открытые ключи друг друга.
  • +
  • При рукопожатии создается общий секретный ключ, который можно использовать в шифровании для массового обмена сообщениями.
  • +
  • Перед подключением клиент должен знать открытый ключ сервера. Сервер узнает открытый ключ клиента во время рукопожатия.
  • +
  • После того, как клиент подтвердит свою личность, сервер может решить, что он не хочет разговаривать с этим клиентом, и отключиться, не подтверждая свою личность.
  • +
  • Посредник не может узнать открытый ключ любого партнера.
  • +
  • Оба узла должны знать ключ, представляющий конкретную сеть Scuttlebutt, к которой они хотят подключиться, однако посредник не может узнать этот ключ из рукопожатия. Если рукопожатие прошло успешно, обе стороны подтвердили, что хотят использовать одну и ту же сеть.
  • +
  • Прошлые рукопожатия нельзя воспроизвести. Попытка воспроизвести рукопожатие не позволит злоумышленнику обнаружить или подтвердить предположения об открытых ключах участников.
  • +
  • Рукопожатия обеспечивают конфиденциальность при пересылке. Запись сетевого трафика пользователя, а затем кража его секретного ключа не позволит злоумышленнику расшифровать его прошлые рукопожатия.
-

Starting keys

-

Upon starting the handshake, the client and server know these keys:

- Both the client and servers know: their own long term key pair, their own ephemeral key pair, and the network's (private) identifier. Additionally, the client knows the server's long term public key. +

Стартовые ключи

+

При запуске рукопожатия клиент и сервер знают эти ключи:

+ Both the client and servers know: their own long term key pair, their own ephemeral key pair, and the network's (private) identifier. Additionally, the client knows the server's long term public key. -

1. Client hello

- The client sends their own ephemeral public key, hmac-authenticated using the network identifier +

1. Клиент hello

+ The client sends their own ephemeral public key, hmac-authenticated using the network identifier
-
Client sends (64 bytes)
-
Server verifies
+
Клиент отправляет (64 bytes)
+
Сервер проверяет
concat(
   nacl_auth(
     msg: client_ephemeral_pk,
@@ -268,19 +268,19 @@ 
Server verifies
-

First the client sends their public generated ephemeral key. Also included is an hmac that indicates the client wishes to use their key with this specific instance of the Scuttlebutt network.

-

The  network identifier is a fixed key. On the main Scuttlebutt network it is the following 32-byte sequence:

+

Сначала клиент отправляет свой public сгенерированный эфемерный ключ. Также включен hmac, который указывает, что клиент желает использовать свой ключ с этим конкретным экземпляром сети Scuttlebutt.

+

Идентификатор сети – это фиксированный ключ. В основной сети Scuttlebutt это следующая 32-байтовая последовательность:

d4a1cb88a66f02f8db635ce26441cc5d ac1b08420ceaac230839b755845a9ffb
-

Changing the key allows separate networks to be created, for example private networks or testnets. An eavesdropper cannot extract the network identifier directly from what is sent over the wire, although they could confirm a guess that it is the main Scuttlebutt network because that identifier is publicly known.

-

The server stores the client’s ephemeral public key and uses the hmac to verify that the client is using the same network identifier.

+

Изменение ключа позволяет создавать отдельные сети, например частные сети или тестовые сети. Злоумышленник не может извлечь идентификатор сети непосредственно из того, что передается по сети, хотя он может подтвердить предположение, что это основная сеть Scuttlebutt, поскольку этот идентификатор общеизвестен.

+

Сервер сохраняет недолговечный открытый ключ клиента и использует hmac для проверки того, что клиент использует тот же сетевой идентификатор.

2. Server hello

diff --git a/lang/ru/img/client_hello.png b/lang/ru/img/client_hello.png new file mode 100644 index 0000000000000000000000000000000000000000..dfaf6b14661a4410dd7ba0ef83744474b57ebc58 GIT binary patch literal 11137 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 Y+%iuSt^`+raariThAy(?AKT~u2cTYyk^lez literal 0 HcmV?d00001 diff --git a/lang/ru/img/client_hello.svg b/lang/ru/img/client_hello.svg new file mode 100644 index 0000000..49bf19f --- /dev/null +++ b/lang/ru/img/client_hello.svg @@ -0,0 +1,648 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + Клиент + Сервер + + + + + + + + + + + + a + + + + + + + N + + + + + a + + hmac + используетсяпроверяемый + + diff --git a/lang/ru/img/message_flow.png b/lang/ru/img/message_flow.png new file mode 100644 index 0000000000000000000000000000000000000000..73385da988bce4737c350a295e77c82584d5291e GIT binary patch literal 35984 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 V&+a;6l}X^o)M)?Cd_$M0{{nwH-nIY$ literal 0 HcmV?d00001 diff --git a/lang/ru/img/message_flow.svg b/lang/ru/img/message_flow.svg new file mode 100644 index 0000000..7cf3df8 --- /dev/null +++ b/lang/ru/img/message_flow.svg @@ -0,0 +1,417 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + Клиент + Сервер + + + Клиент открывает TCP-соединение + + Сообщение 1. Клиент hello + + + + Сообщение 2. Сервер hello + + + + Сообщение 3. Аутентификация клиента + + + + Сообщение 4. Сервер принимает + + Рукопожатие завершено. После обмена сообщениями по протоколу RPC. + + + + + + + + + + diff --git a/lang/ru/img/starting_keys.png b/lang/ru/img/starting_keys.png new file mode 100644 index 0000000000000000000000000000000000000000..eaa3ddc566610037decc4644e47737cf90df90a9 GIT binary patch literal 84526 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 aroNJ%__af9k}e4RIdj6)sKDUr-Twi4E`&G$ literal 0 HcmV?d00001 diff --git a/lang/ru/img/starting_keys.svg b/lang/ru/img/starting_keys.svg new file mode 100644 index 0000000..e37b978 --- /dev/null +++ b/lang/ru/img/starting_keys.svg @@ -0,0 +1,836 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + B + + + + + a + + + + + B + + Клиент знает + Сервер знает + + + + A + + + + + N + + + + + A + + + + + b + + + + + a + + + + + b + + + + + B + + секретный + публичный + секретный + публичный + секретный + публичный + секретный + публичный + + + + N + + + + Долгосрочные Ed25519 Scuttlebuttидентификаторы хранящиеся в .ssb/secret. + Недолговечная Curve25519 пара ключейгенерируется для этого рукопожатия. + Клиент уже знает серверный долгосрочныйоткрытый ключ для подключения. + Сетевой идентификатор, большинство клиентов используют общеизвестный ключ, чтобыприсоединиться к основной сети Scuttlebutt. + секретные ключи отображаются сплошным цветом. + открытые ключи показаны контурами. + Примечание. В этом руководстве + + + + K + + + + + K + + +