Skip to content
Snippets Groups Projects

WIP: Resolve "dubp: impl 5 first rules"

Closed Hugo Trentesaux requested to merge hugo/145-dubp-impl-5-first-rules into dev
4 files
+ 308
0
Compare changes
  • Side-by-side
  • Inline

Files

# Le DUBP expliqué plus simplement
Le Duniter Blockchain Protocol (DUBP) est l'ensemble de règles qui régissent la blockchain duniter. Leur détail est expliqué dans la [RFC](https://git.duniter.org/nodes/common/doc/blob/master/rfc/0009_Duniter_Blockchain_Protocol_V11.md), je tente ici d'en écrire une version plus facile à lire et en français. Pour cela, je vais séparer les règles en plusieurs catégories :
- les règles "bloc zéro" : les règles qui s'appliquent au bloc zéro
- les règles "de bloc" : les règles relatives au bloc lui-même
- les règles "temporelles" : les règles reliées à la temporalité de la blockchain
- les règles "de protocole" : les règles qui décrivent le fonctionnement du protocole (DU, réévaluations...)
- les règles "d'entrés" : les règles qui portent sur les entrées contenues dans un bloc
- les règles "des index" : les règles qui permettent de retrouver les index à partir des blocs
## Définition
On appelle `HEAD` le bloc qui nous sert de référentiel. Son numéro `HEAD.number` est un entier positif. On considère séparément le cas `HEAD.number == 0` ("bloc zéro") car les règles qui s'appliquent à lui sont très différentes. On note `HEAD~n` le bloc situé `n` positions avant le bloc `HEAD` sur la chaîne. Par exemple, le dernier bloc avant `HEAD` est `HEAD~1`.
Sont considérées ici comme définitions les règles :
BR_G02, BR_G100, BR_G04, BR_G98, BR_G51, BR_G52, BR_G53,
BR_G54, BR_G55, BR_G56, BR_G57, BR_G58, BR_G59, BR_G60,
BR_G61,
Pour ajouter un bloc à la chaîne (hors bloc zéro), celui-ci doit respecter un ensemble de 108 règles.
Les règles suivantes sont numérotées de 1 à 108.
## Règles (hors définitions)
Non comprises :
BR_G05, BR_G06, BR_G07, BR_G08, BR_G09, BR_G10, BR_G11, BR_G16
Concernant les index (idendity, member, source, certification):
IINDEX : BR_G19, BR_G20, BR_G21, BR_G33, BR_G35, BR_G36, BR_G22,
IINDEX : BR_G23, BR_G24, BR_G25, BR_G26, BR_G27, BR_G28, BR_G29, BR_G30, BR_G31, BR_G32, BR_G34, BR_G017,
MINDEX : BR_G37, BR_G38, BR_G39, BR_G40, BR_G41, BR_G42, BR_G43, BR_G44, BR_G44.2, BR_G45, BR_G104
SINDEX : BR_G102, BR_G46, BR_G47, BR_G48
SINDEX : BR_G91, BR_G106,
CINDEX : BR_G92, BR_G93, BR_G105
-INDEX : BR_G94, BR_G95, BR_G96, BR_G97
Étranges :
BR_G12, BR_G15, BR_G49, BR_G50, BR_G99
ENTRY (à faire plus tard) :
BR_G63, BR_G64, BR_G108, BR_G64, BR_G65, BR_G66, BR_G67, BR_G68, BR_G69, BR_G70, BR_G71
BR_G72, BR_G73, BR_G74, BR_G75, BR_G76, BR_G77, BR_G78, BR_G79, BR_G80, BR_G81, BR_G82, BR_G83
BR_G84, BR_G85, BR_G86
transaction ENTRY (plus tard) :
BR_G103, BR_G87, BR_G88, BR_G89, BR_G90
##### Règles du bloc zéro
```
HEAD.dividend = 0 #
HEAD.previousHash = null # BR_G02
HEAD.previousIssuer = null # BR_G03
HEAD.issuersCount = 0 # BR_G04
HEAD.issuersFrame = 1 # BR_G05
HEAD.issuersFrameVar = 0 # BR_G06
HEAD.udTime = udTime0 # BR_G11
HEAD.udReevalTime = udReevalTime0 # ''
HEAD.unitBase = 0 # BR_G12
HEAD.dividend = ud0 # BR_G13
HEAD.new_dividend = null # ''
HEAD.mass = 0 # BR_G15
HEAD.massReeval = 0 # BR_G15
```
##### Règles de bloc
###### BR_G02 - HEAD.previousHash
le bloc contient une référence au bloc précédent :
```
HEAD.previousHash == HEAD~1.hash
```
###### BR_G99 - HEAD.currency
le bloc opère sur la même monnaie que le précédent :
```
HEAD.currency == HEAD~1.currency
```
###### BR_G03 - HEAD.previousIssuer
le bloc contient la référence de l'auteur du précédent
```
HEAD.previousIssuer == HEAD~1.issuer
```
###### BR_G13 - HEAD.dividend and HEAD.new_dividend
règle de réévaluation du DU et de création du DU
*réévaluation*
```
If HEAD.udReevalTime != HEAD~1.udReevalTime:
HEAD.dividend == CEIL(HEAD_1.dividend + c² * CEIL(HEAD~1.massReeval / POW(10, HEAD~1.unitbase)) / HEAD.membersCount)
Else:
HEAD.dividend == HEAD~1.dividend
EndIf
```
*création*
```
If HEAD.udTime != HEAD~1.udTime:
HEAD.new_dividend == HEAD.dividend
Else:
HEAD.new_dividend == null
EndIf
```
###### BR_G14 - HEAD.dividend and HEAD.unitbase and HEAD.new_dividend
cette règle permet de changer d'unité pour éviter de compter des nombres trop grands
```
If HEAD.dividend >= 1000000:
HEAD.dividend = CEIL(HEAD.dividend / 10)
HEAD.unitBase = HEAD.unitBase + 1
HEAD.new_dividend = HEAD.dividend
EndIf
```
###### BR_G15 - HEAD.mass and HEAD.massReeval
cette règle permet de suivre la masse monétaire actuelle et de réévaluer par rapport à la masse monétaire précédente
*mise à jour de la masse monétaire lors de la création du DU*
```
If HEAD.udTime != HEAD~1.udTime:
HEAD.mass = HEAD~1.mass + HEAD.dividend * POWER(10, HEAD.unitBase) * HEAD.membersCount
Else:
HEAD.mass = HEAD~1.mass
EndIf
```
*stockage de l'ancienne masse monétaire lors d'une réévaluation du DU*
```
If HEAD.udReevalTime != HEAD~1.udReevalTime:
HEAD.massReeval = HEAD~1.mass
Else:
HEAD.massReeval = HEAD~1.massReeval
EndIf
```
###### BR_G49 - Version
la version du bloc ne peut qu'augmenter
```
HEAD.version == HEAD~1.version OR HEAD.version == HEAD~1.version + 1)
```
###### BR_G50 - Block size
la taille du bloc ne dépasse pas un certain seuil
```
HEAD.size < MAX(500 ; CEIL(1.10 * HEAD.avgBlockSize))
```
###### BR_G101 - Issuer
l'auteur d'un bloc est membre
```
HEAD.issuerIsMember == true
```
###### BR_G62 - Proof-of-work
the proof of work has been done (adjustable complexity)
```
HEAD.hash starts with at least HEAD.powZeros zeros
HEAD.hash's HEAD.powZeros + 1th character is:
between [0-F] if HEAD.powRemainder = 0
between [0-E] if HEAD.powRemainder = 1
between [0-D] if HEAD.powRemainder = 2
between [0-C] if HEAD.powRemainder = 3
...
```
BR_G101 - Issuer
###### BR_G00_title
```
code
```
BR_G101 - Issuer
###### BR_G00_title
```
code
```
BR_G101 - Issuer
Loading