Blockchain at Heart

La Blockchain sans la Cryptomonnaie

@m4d_z
alwaysdata
On va parler blockchain

C’est une révolution

La plus grande révolution technologique depuis Internet (?)

DuckDuckGo Research

Ce n’est pas que la crypto monnaie
c’est à la fois bien plus simple
et bien plus puissant

  • Décentralisation
  • Smart Contracts
  • Mining
  • Consommation des ressources

Nope

Je vais vous raconter une petite histoire…

La première Blockchain de l’histoire
date de… 1995

La somme de contrôle est publiée
quotidiennement dans le NYT

Crypto folks are clever

La blockchain, c’est avant tout
une histoire de Crypto

Raconte-nous
la blockchain, tonton !

C’est quoi ?

Une blockchain,
c’est une suite (une chaine)
de structures de données (des blocs)

Still clever

Une base de données

Immuable
(Immutability)

Elle répond à deux besoins :
  • Traçabilité
  • Certification

Décentralisée

  • Transparence
    tous les nodes disposent de
    toutes les structures de données
  • Résilience
    il n’y a plus de Principal vs. Replicas

Autorité

Publique vs Privée

Le problème Byzantin

Obtenir un consensus valide

  • Preuve de travail
    (Proof of Work)
  • Preuve d’enjeu
    (Proof of Stake / Delegated Proof of Stake)
  • Byzantine Fault Tolerance
    (Delegated BFT / Practical BFT)

PoW (Nakamoto consensus)

  • Minage
  • Résolution d’une énigme math
  • Coûteux en énergie
  • Le général est le premier à résoudre son Sudoku

PoS

  • Membres riches / anciens
  • Confiance sur la durée d’appartenance
  • Théorie de jeux
  • Le général est toujours le plus vieux / décoré

pBFT : Practical Byzantine Fault Tolerance

  • Régulation : par validation
  • Réseau fermé, donc privé
  • Le général est le fils du patron
Pas trop perdu·e·s ?

Pourquoi l’utiliser sur réseau fermé ?

  • Transparence / Confiance
  • BFT
  • Décentralisation

Sur un cluster de BDD

  • Primaire / Secondaires
  • Primaire en écriture / Secondaires en lecture
  • Secondaires en réplication
  • ⇒ Cyclique

Sur une Blockchain

  • Tous les nodes en écriture
  • Validation par consensus
  • Copie complète du travail

Imaginez
Git vs SVN

Automatisation

« Smart Contracts »

  1. Code certifié auto-exécuté
  2. À chaque transaction,
    ⇒ Smart Contracts
Allez, je vous raconte une histoire…

Tech & Crypto

Repartons de zéro

Un bloc

{
  index: 1,
  hash: "7A7D12...E62EC2",
  parent: "3A1A1D...684E1E",
  data: [...],
  timestamp: 1548237157237
}

Hash

SHA256({
  index: 1,
  parent: "3A1A1D...684E1E",
  data: [...],
  timestamp: 1548237157237
}) === "7A7D12...E62EC2"

Data

{
  data: [
    {hash:"67c...640", data: ..., timestamp: 1548237157237},
    {hash:"82a...503", data: ..., timestamp: 1548237157252},
  ]
}

Une Blockchain

class Blockchain {
  constructor() {
    this.blocks = [{
      hash: "000000",
      index: 0,
      data: null,
      timestamp: Date.now()
    }]
  }
}

Ajouter un bloc

class Blockchain {...
  addBlock(data) {
    const block = {
      index: this.blocks.length,
      parent: this.blocks[this.blocks.length -1].hash
      data,
      timestamp: Date.now()
    }
    block.hash = CryptoJS.SHA256(`
      ${block.index};${block.parent};
      ${JSON.stringify(data)};${block.timestamp}
    `)
    return this.blocks.push(block)
  }
}

Ajouter une transaction

class Blockchain {...
  transaction(data) {
    const transaction = {
      data,
      timestamp: Date.now()
    }
    transaction.hash = CryptoJS.SHA256(`
      ${JSON.stringify(data)};${transaction.timestamp}
    `)
    return transaction
  }
}

En action

const blockchain = new Blockchain
blockchain.addBlock([
  blockchain.transaction({
    id: 2820628...37, name: 'Jane Doe', note: 'Registration'
  })
  blockchain.transaction({
    id: 2820628...37,
    prescription: [{
      name: 'Doliprane',
      dosage: '3-6/day'
    }]
  })
])

Intégrité

Moaaaar

blockchain.addBlock{[
  blockchain.transaction({
    id: 1940269...51,
    name: 'John Doe',
    note: 'Registration'
  })
]}
[{
  index: 0, hash: "000000", data: null, timestamp: 1548237157237
},{
  index: 1,
  hash: "7A7D12...E62EC2", parent: "000000",
  data: [{
    {hash:"67C...640", data: ..., timestamp: 1548237157237},
    {hash:"82A...503", data: ..., timestamp: 1548237157252}
  }], timestamp: 1548237157237
},{
  index: 2,
  hash: "6DE54C...87FEB7D", parent: "7A7D12...E62EC2",
  data: [{
    {hash:"AE4...953", data: ..., timestamp: 1548237157237}
  }], timestamp: 1548237157237
}]

Hashes

  1. Intégrité de la suite
  2. Modifier un seul bit
    ⇒ Recompiler toute la chaîne
  3. Immutabilité

Signer

Ajouter un client

class Blockchain {
  constructor() {...
    this.users = []
  }

  register(user) {
    const keys = GenKeyPair()
    user.pubKey = keys.pubKey
    this.users.push(user)
    return key.privKey
  }
}

Signer la transaction

class Blockchain {...
  transaction(data, privKey) {...
    transaction.sign = Sign(transaction.hash, privKey)
  }
}
blockchain.transaction({
  id: 1940269...51,
  name: 'John Doe',
  note: 'Registration'
}, Storage.privKey)

Vérifier la transaction

class Blockchain {...
  findUserForTransaction(transaction) {
    return this.users.find(user => Verify(transaction.sign, user.pubKey))
  }
  checkTransaction(transaction) {
    return !!findUserForTransaction(transaction)
  }
}

Certifier

class Blockchain {...
  register(user, privKey) {
    const keys = GenKeyPair()
    user.pubKey = keys.pubKey
    user.pubKey.sign = Sign(keys.pubKey, privKey)
    this.users.push(user)
    return key.privKey
  }
  checkUserKey(pubKey) {
    return !!this.users.find(user => Verify(pubKey.sign, user.pubKey))
  }
  checkTransaction(transaction) {
    const user = findUserForTransaction(transaction)
    return user ? checkUserKey(user.pubKey) : false
  }
}

Contrôler les blocs

class Blockchain {...
  addBlock(data) {
    if (!data.every(this.checkTransaction)) {
      throw
    }
    ...
  }
}

Chiffrer

const pharmacy = blockchain.getUser(pharmacyID)

transaction({
  id: 2820628...37,
  prescription: Encrypt(JSON.stringify([{
    name: 'Doliprane',
    dosage: '3-6/day'
  }]), pharmacy.pubKey)
})

Synchroniser

  • Broadcast UDP (dgram)
    • transactions
    • blocs
    • metadonnées
  • Persistence disque
  • Cache local LRU (Least Recently Used)

Consensus

Consensus de Nakamoto

class Blockchain {...
  const inc = 5, prefix = Array(inc).fill(0).join('')
  addBlock(data) {...
    while (true) {
      block.nonce = Math.random()
      block.hash = CryptoJS.SHA256(`
        ${block.nonce};${block.index};${block.parent};
        ${JSON.stringify(data)};${block.timestamp}
      `)
      if (block.hash.substr(0, inc) === prefix) {
        this.blocks.push(block); break
      }
    }
  }
}

Code Is Law

Smart Contracts

class SmartContract {
  validate (transaction) {
    return true
  }

  exec (transaction) {
    return true
  }
}

Exécution

class Blockchain {...
  addContract (contract) {
    this.contracts.push(contract)
  }
  addBlock (data, ...) {...
    this.blocks.push(block)
    block.data.forEach(transaction => {
      this.contracts
      .filter(contract => contract.validate(transaction))
      .each(contract => contract.exec(transaction))
    })
  }
}

Cool ! J’ai tout compris,
je mets en prod demain !

Nope, nope, nope, nope…

Crypto !

Une blockchain n’est :

  • qu’une base de données
  • potentiellement asynchrone
  • décentralisée

Si votre cas d’usage inclut :

  • Tracabilité
  • Historisation (immutabilité)
  • Haute dispo
  • Résilience
  • Possiblement une absence d’autorité centrale

La blockchain s’accomode mal du monde réel

  • Ressources consensus Nakamoto
  • Transfert de confiance réel → virtuel
  • Acquisition du public non-tech (e.g. les médecins)
  • Fiabilité sur une blockchain fermée
Evaluez, et ajustez

Choisissez d’utiliser une blockchain avec précaution :
la techno est brillante en terme de cryptographie,
mais comme tout ce qui brille, elle n’est pas magique.
Ce n’est qu’un outil.

m4dz's avatar
m4dz

Paranoïd Web Dino · Tech Evangelist

alwaysdata logo
https://www.alwaysdata.com

Questions?

Illustrations

m4dz, CC BY-SA 4.0

Interleaf images

Courtesy of Unsplash and Pexels contributors

Icons

  • Layout icons are from Entypo+
  • Content icons are from FontAwesome

Fonts

  • Cover Title: Sinzano
  • Titles: Argentoratum
  • Body: Mohave
  • Code: Fira Code

Tools

Powered by Reveal.js

Source code available at
https://git.madslab.net/talks