# 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
```