title: Introduction à secure-scuttlebutt (SSB)
url: https://git.scuttlebot.io/%253qtmFApy1Es5BVA7JIhrlfahcWqBp%2F7I391i%2BxQ1HP8%3D.sha256
hash_url: 0bd3550090004d7dafd05daee05cc94f

# Introduction à secure-scuttlebutt (SSB)

Vous trouverez mes autres repos git-ssb dans [ssb:millette][].

Le document actuel se trouve à [ssb, une intro][].

## Préambule
Sautez à la section **C'est quoi SSB?** pour passer le préambule.

### Décentralisé
J'ai toujours été attiré par les aspects décentralisés du web
et de l'internet en général. J'hébergeais déjà un serveur web
chez moi à partir des années 1990, sur ma petite ligne ADSL
à 1Mbps et mon Pentium 90MHz et ses 24MiB de RAM. J'ai même été
*slashdotté* comme on le disait à l'époque.

### Silos
Avec le temps, le web s'est refermé sur lui-même, on a vu des silo
de plus en plus gros marquer leurs territoires sur le web. On n'a
qu'à penser à Google ou Facebook. J'ai toujours un compte Google,
mais ça fait des années que j'ai détruit mon compte Facebook.

### Expériences
Il y a quelques mois, j'ai un peu expérimenté avec [ZeroNet][]
et plus récemment avec le [datproject][]. Il y a quelques jours,
je redécouvrais [secure-scuttlebutt][] suite au tapage
entourant la sortie de [mastodon][].

### Mastodon et fédération
Mastodon et ses cousins GNU Social et StatusNet reposent
tous sur le protocole OStatus, qui lui-même est composé
de protocoles et standards plus anciens comme PubSubHubbub,
Salmon, Webfinger et ActivityStreams. Je suis assez bien placé
pour en parlé puisque j'étais un des développeur de StatusNet
il y a une dizaine d'années.

OStatus permet la fédération, au même titre que le email qu'on
utilise couramment (on peut envoyer un mail du service de Google
et il sera reçu par un utilisateur de Yahoo) ou encore les *pods*
de Diaspora ou Jabber/XMPP pour *chatter*. Dans le cas de fédération,
la relation P2P repose entre les serveurs et non les utilisateurs
eux-mêmes, bien que ces derniers soient tout à fait libres
d'héberger leurs propres serveurs.

### P2P
[ZeroNet][], [datproject][] et [secure-scuttlebutt][] quand à eux
proposent de véritables réseaux P2P, au même titre que BitTorrent
et Bitcoin par exemple. **Dans les réseaux P2P, il n'y a plus de
distinction entre les clients et les serveurs**. Les utilisateurs
prennent donc part entière aux échanges.

## C'est quoi SSB?
SSB, scuttlebutt, secure-scuttlebutt, scuttlebot... c'est un peu mêlant.
Sans trop aller dans les détails, disons pour commencer que les termes
SSB, scuttlebutt et secure-scuttlebutt sont à peu près interchangeables.

### Scuttlebutt
En gros, il s'agit d'une base de données *append-only* qui facilite la
réplication et la consistence éventuelle. *Append-only* signifie
que l'information n'est jamais modifiée ou effacée, mais seulement
ajoutée.

Cette base de donnée va contenir les données que vous y mettez
ainsi que les données que vous allez répliquer à partir d'autres
instances scuttlebutt.

Quels genres de données? Des messages, des identifiants, des *blobs*,
bref, un peu de tout.

### Scuttlebot
Pour simplifier la réplication, le service scuttlebot est disponible.
C'est le logiciel P2P responsable de partager vos données et de
récupérer les données qui vous intéressent.

En suivant des utilisateurs, scuttlebot s'occupera de recevoir
les données de ces utilisateurs, et vice-versa.

Le réseau P2P utilise *gossip*. Concrètement, les ordinateurs doivent
être connectés entre-eux à un certain moment (mais pas tout le temps)
pour échanger des données. Disons qu'on a les utilisateurs
Pierre, Jean et Jacques.

* Pierre suit Jean et Jacques
* Jean suit Jacques
* Jean se connecte à Jacques et obtient ses données
* Pierre se connecte à Jean et obtient les données de Jean et Jacques,
  transitivement

Dans ce scénario, Pierre ne s'est pas connecté directement à Jacques,
mais il a quand même pu obtenir les données de Jacques, via Jean.
C'est ce qu'on veut dire par *gossip*, ou commérages, potins, rumeurs.

Mieux que des rumeurs, SSB est sécure et garanti que les données de
Jacques obtenues via Jean seront intègres.

### Patchwork
Si la réplication est basée sur un réseau social (ceux que vous
suivez et qui vous suivent), une application évidente de SSB est
un réseau social en bonne et due forme. Le logiciel patchwork est
la réalisation de cette application.

Jusqu'ici, scuttlebutt et scuttlebot sont des logiciels «système».
Ils offrent une interface à la ligne de commande générique de
bas niveau.

Patchwork est une application desktop, un GUI qui donne forme au
réseau social et permet de suivre et lire les messages, photos, *likes*
des autres utilisateurs qui vous intéressent.

C'est la façon recommandée de faire ses premiers pas dans le
*scuttleverse*, bien qu'il existe d'autres clients plus légers
comme on le verra plus loin dans ce document.

Notez cependant qu'il s'agit d'un éxécutable de 50-70 MiB basé sur
electron, qui lui-même est basé sur chromium et sur node, ces deux
derniers reposant sur V8 pour l'engin JavaScript. Cette application
inclut aussi scuttlebutt et scuttlebot. Autrement dit, ça prend
pas mal de ressources en RAM et en CPU. Chez moi, ça fait monter
la température de façon critique.

## Installation
Nous allons installer quelques logiciels. Vous aurez besoin d'une
version récente (6.x) de NodeJS.

Si vous n'avez pas déjà node 6.x ou mieux, installez n pour gérer
les versions de node:
```
curl -L https://git.io/n-install | bash
```

Vous devez relancer le terminal pour utiliser n. Voir les détails:
<https://github.com/mklement0/n-install>

### patchwork
Téléchargez patchwork à partir de <https://github.com/ssbc/patchwork/releases>

Au démarrage, une fenêtre devrait s'ouvrir sur votre *desktop* offrant
le GUI.

![Capture d'écran Patchwork](patchwork-screenshot.jpg)

S'il y a d'autres utilisateurs de scuttlebot sur votre réseau local (LAN),
peut-être en classe, au travail ou dans un café, votre instance
commencera automatiquement à recevoir les données du réseau et vous
pourrez chercher du contenu et des utilisateurs et les suivre,
même s'il ne sont pas sur votre LAN. C'est l'effet *gossip*.

Autrement, si vous êtes seul sur votre LAN, vous devrez vous connecter
à un **Pub** public.

Vous obtiendrez une invitation sur un des [pubs publics sur le wiki][].

Dans patchwork, cliquez sur «+ Join Pub» et copiez-y le code d'invitation
que vous avez obtenu.

Ainsi, vous suivrez ce **Pub** et vice-vera. Si vous n'avez pas encore
synchronisé avec le réseau social, ça prendra quelques minutes pour
vous mettre à jour.

À partir d'ici, vous prenez par au scuttleverse. Vous pouvez me suivre:

* @dcWOOqyFtY1sEXv+rM0MzdINiYyIFFwom1NfmP4aMFo=.ed25519
* <http://viewer.scuttlebot.io/%25xLwTdQULCtpiRtRGKH3vETWDtaMPNrAc0ns4QjHrv3o%3D.sha256>

Personnellement, je n'utilise pas beaucoup le client Patchwork
puisqu'il prend trop de ressources pour mon ordinateur. Les prochaines
sections proposeront deux autres clients plus légers. Je mentionne
quand même Patchwork puisque c'est une porte d'entrée facile.

Le réseau supporte les messages publics et privés.

#### Messages publics
Tout ce que vous publierez sera disponible pour l'éternité sur le réseau,
ainsi que les utilisateurs que vous mentionnerez, alors pensez-y bien
avant d'écrire tout ce qui vous passe par la tête :-)

#### Messages privés
Vous pouvez aussi échanger des messages privés. Ces derniers ne pourront
être lus que par leurs destinataires et la liste des destinataires
demeure aussi privée (encryptée).

Le réseau verra cependant que vous avez envoyé un message privé, sans
connaitre son contenu ou destinataires, et pourra faire suivre ce
message comme les autres en P2P avec *gossip*.

### scuttlebot
Les prochains clients proposés reposent sur le logiciel scuttlebot,
ou sbot à la ligne de commande. Node est installé? Parfait,
on peut procéder à l'installer et démarrer le serveur:
```
npm install --global scuttlebot
sbot server
```

Si vous avez installé Patchwork à l'étape précédente, votre nouvelle
instance de scuttlebot devrait se connecter et synchroniser en
priorisant les utilisateurs suivis.

Un *log* devrait rapidement remplir le terminal où vous avez lancé
**sbot server**. Mais pas de GUI, c'est normal.

Vous avez tout de même une interface complète pour accéder et participer
au scuttleverse, à la ligne de commande. Pour obtenir la liste de
toutes les commandes:
```
sbot --help
```

Par exemple, pour confirmer que vous utilisez la bonne identité:
```
sbot whoami # afficher votre clé publique (identifiant)
```

Vous pouvez lire des messages, en envoyer, suivre des utilisateurs
et ainsi de suite, mais ça prend des commandes plutôt fastidieuses
à taper.

sbot offre aussi une interface RPC sur le port 8008 par défaut, qui
sera utilisée par les prochains clients.

#### Plugins scuttlebot
* ssb-notifier
* ssb-links
* ssb-query
* ssb-ws
* ssb-fulltext
* patchfoo
* dnssb

### patchbay

### patchfoo
Client simple qui s'utilise via votre fureteur préféré (incluant dillo).

## Plus qu'un réseau social
Si patchwork, patchbay et patchfoo offrent des représentations du
scuttleverse de type réseau social, d'autres types d'applications
sont possible, qui reposent sur la même architecture P2P.

### ssb-git
git est un gestionnaire de code, décentralisé par nature. Pour accéder
à un dépot, il faut en connaitre l'adresse, souvent par les protocoles
http/https ou ssh. On peut cloner ce dépot plus ou moins manuellement à
une autre adresse. Ainsi, on peut continuer de coder sur un vol de 5h
sans wifi. Avant git, cvs et svn étaient la norme, mais avec ces derniers
on ne pouvait faire de commit sans connection. C'était complètement
centralisé.

Par leur nature, les dépots ont chacun une forme de centralisation,
c'est à dire un auteur, *maintainer* ou un groupe qui est responsable
de ce qui sera commis dans la version dite officielle de dépot.

Si un dépot est sur notre laptop et qu'un autre utilisateur veut
en faire un clone, il doit y avoir accès d'une certaine façon. Peut-être
par ssh ou un autre protocole. Mais le plus souvent, on fera nous
même un clone de notre dépot qu'on tiendra à jour sur un service public
(ou non) et accessibles en ligne. GitHub, GitLab et BitBucket sont des
options fréquentes.

Avec ssb-git, on fera un clone de notre dépot et on le publiera dans le
scuttleverse.

Pour installer ssb-git:

```
npm install --global git-ssb
```
#### Usage
> Tiré de <https://github.com/clehner/git-ssb/blob/master/README.md#usage>

Vous pouvez utiliser un *remote* `ssb://` comme n'importe quel autre
*remote* git. Un dépot sur ssb est identifé par un message ID.
Pour créer un nouveau dépot git sur ssb, utilisez la commande
`git ssb create`. Vous ne pouvez *pusher* que sur les dépots ssb git
que vous avez créé et non sur les dépots des autres.

#### Exemples
Publier un dépot existant sur ssb:
```
cd repo
git ssb create ssb my-cool-repo
git push --tags --set-upstream ssb master
```

Pour cloner un dépot à partir de ssb:
```
git clone ssb://<msgId> repo
```

*Fork un dépot ssb git que vous avez cloné:
```
cd repo
git ssb fork mine
# edit and commit, then push changes:
git push mine
```

Démarrer un serveur web pour browser (à la github):
```
git ssb web
```

# Alternatives
* Matrix (riot)
* dat project (hypercore/hyperdrive)
* ZeroNet
* CouchDB (mécanisme de réplication éventuellement consistent)
* Et bien plus!

## Todo
* Liens ssb vs liens http

[gh:secure-scuttlebutt]: <https://github.com/ssbc/secure-scuttlebutt>
[secure-scuttlebutt]: <http://scuttlebot.io/>
[gh:patchwork]: <https://github.com/ssbc/patchwork>
[ssb handbook]: <https://www.scuttlebutt.nz/>
[Pub servers]: <https://github.com/ssbc/scuttlebot/wiki/Pub-Servers>
[git-ssb]: <https://git.scuttlebot.io/%25n92DiQh7ietE%2BR%2BX%2FI403LQoyf2DtR3WQfCkDKlheQU%3D.sha256>
[ce document]: <http://viewer.scuttlebot.io/%25oqqA9e73Xohkaj5lOXS4lYj7ciqwo3O7iaZx7541sQg%3D.sha256>
[gh:patchbay]: <https://github.com/ssbc/patchbay>
[patchfoo]: <https://git.scuttlebot.io/%25YAg1hicat%2B2GELjE2QJzDwlAWcx0ML%2B1sXEdsWwvdt8%3D.sha256>
[git ssb]: <http://git-ssb.celehner.com/>
[dnssb]: <https://git.scuttlebot.io/%25aVOBlkoiDbK99ROZPIaiiDk%2B4q2P4%2BG7MGul4UxkBBM%3D.sha256>
[Scuttlebot]: <https://ssbc.github.io/scuttlebot/>
[gh:ssb-notifier]: <https://github.com/ssbc/ssb-notifier>
[gh:scuttlebot]: <https://github.com/ssbc/scuttlebot>
[ssb:millette]: <https://git.scuttlebot.io/%40dcWOOqyFtY1sEXv%2BrM0MzdINiYyIFFwom1NfmP4aMFo%3D.ed25519>
[ssb, une intro]: <https://git.scuttlebot.io/%253qtmFApy1Es5BVA7JIhrlfahcWqBp%2F7I391i%2BxQ1HP8%3D.sha256>
[ZeroNet]: <https://zeronet.io/>
[gh:ZeroNet]: <https://github.com/HelloZeroNet/ZeroNet>
[datproject]: <https://datproject.org/>
[gh:datproject]: <https://github.com/datproject/dat-desktop>
[mastodon]: <https://mastodon.social/>
[gh:mastodon]: <https://github.com/tootsuite/mastodon>
[pubs publics sur le wiki]: <https://github.com/ssbc/scuttlebot/wiki/Pub-Servers>
