---
# System prepended metadata

title: SYD - TD/TP Blockchain
tags: [TD, SYD]

---

# SYD - TD/TP Blockchain

[Github](https://github.com/dreimert/BuildYourBlockChain)

###### tags: `SYD` `TD`

## Etape 0

Modifications à apporter au code : 
```javascript=
socket.on('set', function (field, value, callback) {
    if (field in db) { // Si la clef est dans la base de donnée
        if(db[field].value != value){
            const error = new Error(`set error : Field ${field} exists.`)
            console.info(error)
            callback(error.message)
        }
        callback()
    } else {
        console.info(`set ${field} : ${value}`)
            db[field] = {
            value,
            date: Date.now() // on sauvegarde la date de création
        }
        callback()
    }
})
```

On rajoute une condition pour que la fonction ne renvoie pas une erreur quand on veut affecter à une clé la valeur qu'elle possède déjà.

## Etape 1

[Github](https://github.com/dreimert/BuildYourBlockChain/tree/etape-1)

### Confiance et défaillance

Commandes pour définir le port où lancer le serveur (ici le port 1234)
```bash
node serveur.js --port=1234
node serveur.js -p=1234
```

[Tip : Différence entre - et --](https://stackoverflow.com/questions/28279812/bash-difference-between-and-options)

### Jouer avec des inconnus

Ajout de la commande ```peers``` qui retourne la liste des ports utilisés : 
```javascript=
socket.on('peers', function (callback) {
    console.info('peers')
    callback(undefined, neighbors)
})
```

Résultat : 
```bash
qbordignon@2D-LINUX-060:~/Documents/4TC/SYD/Blockchain/BuildYourBlockChain$ node cli.js peers
Connection établie
peers =>
a,b,c
Disconnect
```

Ajout de la commande ```addPeers``` qui ajoute un voisin à la liste : 
```javascript=
socket.on('addPeer', function(portNumber, callback) {
    if(neighbors.includes(portNumber)){
      const error = new Error(`addPeer error : neighbor ${portNumber} exists`)
      console.info(error)
      callback(error.message)
    } else {
      console.info(`addPeer ${portNumber}`)
      neighbors.push(portNumber)
      callback()
    }
})
```

Résultat : 
```bash
qbordignon@2D-LINUX-098:~/Documents/4TC/SYD/Blockchain/BuildYourBlockChain$ node cli.js addPeer 3002
Connection établie
addPeer 3002 =>
OK
Disconnect
qbordignon@2D-LINUX-098:~/Documents/4TC/SYD/Blockchain/BuildYourBlockChain$ node cli.js peers
Connection établie
peers =>
3002
Disconnect
qbordignon@2D-LINUX-098:~/Documents/4TC/SYD/Blockchain/BuildYourBlockChain$ node cli.js addPeer 3002
Connection établie
addPeer 3002 =>
addPeer error : neighbor 3002 exists
Disconnect
qbordignon@2D-LINUX-098:~/Documents/4TC/SYD/Blockchain/BuildYourBlockChain$ node cli.js addPeer 3001
Connection établie
addPeer 3001 =>
OK
Disconnect
qbordignon@2D-LINUX-098:~/Documents/4TC/SYD/Blockchain/BuildYourBlockChain$ node cli.js peers
Connection établie
peers =>
3002,3001
Disconnect
```

Modification de la commande ```addPeer``` pour qu'elle crée une connexion avec le noeud voisin

```javascript=
socket.on('addPeer', function(portNumber, callback) {
    if(neighbors.includes(portNumber)){
      const error = new Error(`addPeer error : neighbor ${portNumber} exists`)
      console.info(error)
      callback(error.message)
    } else {
      console.info(`addPeer ${portNumber}`)
      neighbors.push(portNumber)
      const socket = ioClient(`http://localhost:${portNumber}`, {
        path: '/byc'
      });
      callback()
    }
})
```

Modification de la commande ```addPeer``` pour qu'elle envoie une commande ```auth``` avec son propre port en paramètre à l'autre serveur.

```javascript=
socket.on('addPeer', function(portNumber, callback) {
    if(neighbors.includes(portNumber)){
      const error = new Error(`addPeer error : neighbor ${portNumber} exists`)
      console.info(error)
      callback(error.message)
    } else {
      console.info(`addPeer ${portNumber}`)
      neighbors.push(portNumber)
      const socket = ioClient(`http://localhost:${portNumber}`, {
        path: '/byc'
      });
      socket.on('connect', () => {
        console.info('Connection établie')
        socket.emit('auth', argv.port, (error) => {
          if(error){
            console.error(error)
          } else {
            console.info('OK')
          }
        })
      })
      callback()
    }
})
```

Résultat : 
```bash
qbordignon@2D-LINUX-098:~/Documents/4TC/SYD/Blockchain/BuildYourBlockChain$ node cli.js addPeer 3002
Connection établie
addPeer 3002 =>
OK
Disconnect
qbordignon@2D-LINUX-098:~/Documents/4TC/SYD/Blockchain/BuildYourBlockChain$ node cli.js addPeer 3001
Connection établie
addPeer 3001 =>
OK
Disconnect
qbordignon@2D-LINUX-098:~/Documents/4TC/SYD/Blockchain/BuildYourBlockChain$ node cli.js peers
Connection établie
peers =>
3002,3001
Disconnect
qbordignon@2D-LINUX-098:~/Documents/4TC/SYD/Blockchain/BuildYourBlockChain$ node cli.js -p=3001 peers
Connection établie
peers =>
3000
Disconnect
qbordignon@2D-LINUX-098:~/Documents/4TC/SYD/Blockchain/BuildYourBlockChain$ node cli.js -p=3002 peers
Connection établie
peers =>
3000
Disconnect
qbordignon@2D-LINUX-098:~/Documents/4TC/SYD/Blockchain/BuildYourBlockChain$ node cli.js -p=3002 addPeer 3001
Connection établie
addPeer 3001 =>
OK
Disconnect
qbordignon@2D-LINUX-098:~/Documents/4TC/SYD/Blockchain/BuildYourBlockChain$ node cli.js -p=3002 peers
Connection établie
peers =>
3000,3001
Disconnect
qbordignon@2D-LINUX-098:~/Documents/4TC/SYD/Blockchain/BuildYourBlockChain$ node cli.js -p=3001 peers
Connection établie
peers =>
3000,3002
Disconnect
```