WIP: Resolve "Add block checking (checking all rules of the unit protocol)"
Closes #84
Merge request reports
Activity
changed milestone to %v0.3 Minimal mirror node
added D-medium label
- Resolved by Pascal Engélibert
- Resolved by Pascal Engélibert
113 } 114 if issuers.len() != block.issuers_count { 115 return Err(invalid_rule_error(InvalidRuleError::WrongIssuersCount)); 116 } 117 118 //BR_G05 - issuers frame 119 if block.issuers_frame 120 != previous_block.issuers_frame 121 + match previous_block.issuers_frame_var.cmp(&0) { 122 Ordering::Less => -1, 123 Ordering::Greater => 1, 124 Ordering::Equal => 0, 125 } 126 { 127 return Err(invalid_rule_error(InvalidRuleError::WrongIssuersFrame)); 128 } changed this line in version 2 of the diff
115 return Err(invalid_rule_error(InvalidRuleError::WrongIssuersCount)); 116 } 117 118 //BR_G05 - issuers frame 119 if block.issuers_frame 120 != previous_block.issuers_frame 121 + match previous_block.issuers_frame_var.cmp(&0) { 122 Ordering::Less => -1, 123 Ordering::Greater => 1, 124 Ordering::Equal => 0, 125 } 126 { 127 return Err(invalid_rule_error(InvalidRuleError::WrongIssuersFrame)); 128 } 129 } 130 // Only rules that do concern genesis block Pour
verify_genesis_block_validity
, est-ce qu'il est vraiment nécessaire de mettre les DBs en argument, puisque logiquement tous les indexes sont vides avant le bloc 0 ? (c'est là que BR_G100 me semble bizarre : l'issuer du bloc 0 ne peut pas déjà être membre)@tuxmain en effet il n'y a pas besoin des DBs pour vérifier le bloc genesis.
Concernant la BR_G100, l'issuer du bloc genesis doit faire parti des membres déclarés dans le bloc genesis ;)
changed this line in version 2 of the diff
added 14 commits
-
a93d6067...ee77b7a1 - 12 commits from branch
dev
- 47f4cb3a - [feat] blockchain: check rules BR_G99->04
- db87fcc5 - [tests] blockchain: test block verification
-
a93d6067...ee77b7a1 - 12 commits from branch
changed milestone to %v1.0 full member node
- Resolved by Pascal Engélibert
- Resolved by Pascal Engélibert
- Resolved by Pascal Engélibert
98 &bc.wot_databases.certs_db, 99 &bc.wot_index, 100 &bc.wot_databases.wot_db, 101 )?; 95 if block_doc.number.0 == 0 { 96 verify_genesis_block_validity(&block_doc)?; 97 } else { 98 verify_block_validity( 99 &block_doc, 100 &bc.blocks_databases.blockchain_db, 101 &bc.wot_databases.identities_db, 102 &bc.wot_databases.certs_db, 103 &bc.wot_index, 104 &bc.wot_databases.wot_db, 105 )?; 106 } La fonction prend du coup l'argument
wot_databases: &WotsV10DBs
, mais maintenant j'ai cette erreur :error[E0283]: type annotations required: cannot resolve `_: durs_wot::data::WebOfTrust` --> lib/modules/blockchain/blockchain/src/dubp/mod.rs:98:13 | 98 | verify_block_validity( | ^^^^^^^^^^^^^^^^^^^^^ | note: required by `dubp::check::verify_block_validity` --> lib/modules/blockchain/blockchain/src/dubp/check/mod.rs:77:1 | 77 | / pub fn verify_block_validity<W: WebOfTrust>( 78 | | block: &BlockDocument, 79 | | blockchain_db: &BinDB<LocalBlockchainV10Datas>, 80 | | wot_databases: &WotsV10DBs, ... | 142| | Ok(()) 143| | } | |_^
Si je comprends bien, c'est que la fonction
verify_block_validity
ne respecte pas le traitWebOfTrust
. Ce que je ne comprends pas c'est pourquoi l'erreur pointe l'appel de la fonction et pas sa déclaration, et pourquoi la fonction avait ce trait. D'ailleurs si j'enlève<W: WebOfTrust>
ça passe.@tuxmain c'est parce que le compilateur rust n'arrive pas a inférer le type de W.
Ce type générique sert pour l'argument wot_db qui est de type
&BinDB<W>
.Maintenant que tu passe la wot_db a l'intérieur de l'objet
WotsV10DBs
, cet objet n'est pas générique, il impose une implémentation spécifique du traitWebOfTrust
, laquelle a t'on avis ?Du coup c'est tout a fait normal que ça marche en supprimant la généricité sur ta fonction, ce que je veut c'est que tu comprenne le pourquoi du comment :)
@tuxmain dans l'ensemble c'est plutôt bien, je vois que tu a progréssé en rust ça fait très plaisir :)
Concernant les tests il faudrait en réalité 1 test par règle. Pour éviter d'avoir un fichier avec des dizaines de milliers de lignes voir plus, il faudrait 1 fichier par règle. Chaque règle sera évaluée dans une fonction inline afin de ne pas alourdir la stack a l'éxécution (sauf pour les quelques règles les plus complexes a évaluer).
Et en effet, comme tu me l'a dit en privé, je te confirme qu'il faut aussi tester le cas d'un bloc invalide (et ceux pour chaque règle).
Ce que je te dit la n'est pas valable pour le block genesis, c'est un bloc spécial, ça peut être pertinent de garder un seul fichier pour les vérifications de ce block la.
added 19 commits
-
a48dedcc...1314818b - 16 commits from branch
dev
- 837db22c - [feat] blockchain: check rules BR_G99->04
- 367e237a - [ref] separate checks for block 0
- 54ec686d - [tests] blockchain: test block verification
Toggle commit list-
a48dedcc...1314818b - 16 commits from branch
@tuxmain j'ai mis a jours ta branche sur dev, je me suis contenté de résoudre les conflits en modifiant le moins possible ton code :)
Ainsi les commentaires non résolues restent d'actualité ;) (Si je résout mes remarques a ta place tu n'apprendra pas).
Aussi j'ai commencé a coder un moteur de règle pour que l'application du protocole soit plus propre et plus faible, quand je l'aurais fini il faudra que tu réfactor ton code pour utiliser le moteur de règle.
EDIT: tien en rebasant j'ai oublié de changer tes BlockId par BlockNumber (le nom du type a changé sur dev). Bon c'est que dal je réglerai ça lundi ;)
Edited by Éloïsadded 5 commits
-
ab078bac...5104eb15 - 2 commits from branch
dev
- 72fdd840 - [feat] blockchain: check rules BR_G99->04
- 276ca582 - [ref] separate checks for block 0
- be948772 - [tests] blockchain: test block verification
Toggle commit list-
ab078bac...5104eb15 - 2 commits from branch
added 7 commits
-
be948772...3f5e883b - 4 commits from branch
dev
- 6435ebd3 - [feat] blockchain: check rules BR_G99->04
- 476d6f4c - [ref] separate checks for block 0
- b257319d - [tests] blockchain: test block verification
Toggle commit list-
be948772...3f5e883b - 4 commits from branch
@tuxmain voila j'ai fini le moteur de règle, il est sur dev, et je t'ai mis a jours ta branche comme ça tu n'aura pas de conflits a gérer :)
J'aimerais que tu réfactor entièrement ta contribution en utilisant le rules engine, aussi sépare la vérification en 2 parties : local et globale.
je t'ai donné un exemple de ce que j'attends sur la branche
elois/use-rule-engine-example
:)Edited by Éloïsadded 6 commits
-
63a372d9...c2702403 - 2 commits from branch
dev
- bb3ecf87 - [feat] blockchain: check rules BR_G99->04
- 0d80c5b9 - [ref] separate checks for block 0
- 56ad07ae - [tests] blockchain: test block verification
- 648194e4 - [ref] blockchain: remove expects
Toggle commit list-
63a372d9...c2702403 - 2 commits from branch