Skip to content

Implémentation Java de la Blockchain et du protocole Bitcoin , fonctionnement en mode nœud complet (Full Node mode)

License

Notifications You must be signed in to change notification settings

daloji/blockchain

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Build Status Coverage Status Codacy Badge

Implémentation du protocole Bitcoin en Java

L'objectif de ce projet est la vulgarisation de la blockchain. C'est purement a titre éducatif, cependant l'application peut se connecter au reseau bitcoin en tant que pair (peer). Le noeud crée se connecte en mode noeud complet (Full Node) .......

prérequis

  • Java 8+ maven 3.6.2

Lancement

# mvn clean install
# java -jar target/blockchain.jar

Recommandation

Lors du premier lancement,le processus Initial Block Download ou processus de synchronisation permet de recuperer la blockchain (260 Go) actuellement. Cette phase de telechargement est tres long une semaine environ c'est une opération assez lourde qui peut se heurter à quatre limitations de votre machine :

  • Votre connexion Internet
  • puissance processeur
  • Memoire vive 4 Go
  • Disque Dur (300 Go de libre minimum )

Cependant fonctionne avec une Raspeberry Pi 2 model B

Blockchain

 | Taille(octet) |     Nom      |   Type    |     Description                           |
 | ------------ :| ------------:| --------: | ---------------------------:              | 
 | 4             | VERSION      |int32_t    |  version du block                         |
 | 32            | PREV HASH    |char[32]   | SHA256(SHA256()) hash du bloc precedent   |
 | 32            | MERKLE ROOT  |char[32]   | SHA256(SHA256())  merkle root transaction |
 | 4             | TIME         |int32_t    | unix epoch generation du bloc             |
 | 4             | DIFFICULTE   |int32_t    | diffuclté lors de la generation du block  |
 | 4             | NONCE        |int32_t    | nombre aleatoire                          |

Transaction

Protocole peer to peer

Le réseau bitcoin a une architecture de réseau pair-à-pair (peer to peer). Les noeuds du réseau s'interconnectent en réseau maillé, les noeuds fournissent et consomment des services a la fois. Au demarrage le noeud doit s'annoncer au réseau. Pour cela il doit trouver la liste des noeuds bitcoins

  • Le DNS lookUp se fait via l'adresse seed.bitcoin.sipa.be qui est une sorte de DNS des noeuds bitcoins gérée par bitcoin.org

protocole d'echange entre pair

Comme une trame IP , les messages envoyés ont un format bien defini par le protocole (cf https://en.bitcoin.it). Tous les messages bitcoins doivent avoir un entête de ce type

 #### Trame Header

 | Taille(octet) |     Nom  |   Type    |                             Description                    |
 | ------------ :| --------:| --------: | ---------------------------------------------------:       | 
 | 4             |  MAGIC   |char[4]    |         Valeur Magic                                       |
 | 12            | COMMANDE |char[12]   |chaine ASCII  représentant le type de paquet                |
 | 4             | SIZE     |uint32_t   |taille en octet de la charge utile (payload)                |
 | 4             | CHECKSUM |uchar[4]   |les 4 premiers octet de la double sha256 sha256(sha256(payload))|

Notons qu'il a trois types de réseaux Bitcoins qui sont MAINNET , TESTNET , REGTEST. le protocole est le même ,seulement la donnée (Magic) de l'entête change pour chaque reseau. le bloc genesis de la blockchaine de chaque réseau n'est pas le même. TESTNET et REGTEST sont utilisés pour le developpement , les bitcoins de ses reseaux ne valent rien du tout.

 #### type de Valeur  MAGIC possible
 | reseau   |  Port utilisé  | valeur hexa |         
 | ------ : | --------------:| --------: | 
 | Mainnet  |  	8333         | f9beb4d9   |   
 | Testnet  |   18333        | 0b110907   |
 | regtest  |  18444         | fabfb5da   |

Pour etablir une connexion, le noeud doit envoyer un message Version qui annonce la version du protocole bitcoin qu'il supporte ainsi que la longueur de sa blockchain en local, Dans le cas d'un premier demarrage la longueur est 0 (analogie avec tcp SYN / SYNACK) Dans la suite on ne va plus reproduire l'entête

  ####  Trame Version 
  
 | Taille(octet) |     Nom      |   Type    |     Description                    |
 | ------------ :| ------------:| --------: | ---------------------------:       | 
 | 4             | VERSION      |int32_t    |  version du protocole utilisée     |
 | 8             | SERVICE      |uint64_t   | numero du service                  |
 | 8             | TIMESTAMP    |int64_t    | epoch unix                         |
 | 26            | ADDR_RECEIVE |net_addr	  | adresse de l'envoyeur              |
 | 26            | ADDR_FROM    |net_addr	  | adresse de reception               |
 | 8             | NONCE        |uint64_t   | nombre aleatoire                   |
 | ?             | USER_AGENT   |variable   | user agent                         |
 | 4             | START_HEIGTH |int32_t    | longueur de la blockchaine connue  |
 | 1             | RELAY        |bool       | noeud en mode relais               |

About

Implémentation Java de la Blockchain et du protocole Bitcoin , fonctionnement en mode nœud complet (Full Node mode)

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages