From b29d9336f67997b1e83489120a6f6d2d35ca04fa Mon Sep 17 00:00:00 2001 From: jambtc Date: Sun, 18 Jun 2023 19:25:35 +0200 Subject: [PATCH] lettura nuovo file blockchain.json e aggiornamento funzioni --- .gitignore | 3 +- README.md | 20 ++++++++- blockchain.example | 5 +++ blockchain.json | 10 ++--- func/functions.php | 101 +++++++++++++++++++++++++++++++++++++++++++++ index.php | 91 +++++++++++++++++++++++----------------- qldb.example | 32 ++++++++++++++ qldb.json | 42 ++++++++++++------- 8 files changed, 241 insertions(+), 63 deletions(-) create mode 100644 blockchain.example create mode 100644 func/functions.php create mode 100644 qldb.example diff --git a/.gitignore b/.gitignore index 8b13789..b314eeb 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ - +blockchain.json +qldb.json diff --git a/README.md b/README.md index 331d9a1..852299e 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,15 @@ In particolare permette di confrontare il contenuto presente su QLDB con quello Seguendo questa guida è possibile eseguire in autonomia il predetto controllo. +## Dettagli + +Nel file blockchain.json è contenuto il merkle root di ciascun mese degli hash +generati e salvati nel qldb. +A regime avremo tanti merkle root, uno per ogni mese di attitivà. + +L'operazione di verifica, pertanto, verrà eseguita estraendo per ciascun mese +gli hash dal qldb, eseguendone il merkle root e verificando che quest'ultimo +corrisponda a quello salvato in blockchain. ## Prerequisiti @@ -15,8 +24,8 @@ Seguendo questa guida è possibile eseguire in autonomia il predetto controllo. ## Guida -- Clona questo software oppure scaricalo da questo link in una cartella sul tuo pc. -- Copia i file json sia del Qldb che della Blockchain sotto questa stessa cartella. Nel file `blockchain.json` lascia soltanto il merkle root che vuoi verificare. Nel file `qldb.json` lascia soltanto gli hash relativi al periodo che vuoi verificare. Ricordati di eliminare l'ultima virgola per evitare errori di formattazione del formato json. +- Clona questo software oppure scaricalo da questo link in una cartella sul tuo pc. +- Copia i file json sia del Qldb che della Blockchain sotto questa stessa cartella. - Apri una finestra shell o prompt e digita i seguenti comandi: ```bash @@ -24,11 +33,18 @@ cd php index.php ``` +Il software ti permette di selezionare 3 scelte: + +1. Verifica Merkle Root +2. Estrai i Merkle Root dal file QLDB +3. Estrai i Merkle Root dal file Blockchain + Dovresti ottenere una risposta di questo tipo: ```bash Merkle Root Calculator +Periodo: 2023-05 Merkle root da Blockchain: 36d12cb8e28699290b0cef1ea5a1fadfd2c6bc4afad02633330e86b197b61884 Merkle root da QLDB: 36d12cb8e28699290b0cef1ea5a1fadfd2c6bc4afad02633330e86b197b61884 Verifica Merkle root: SUCCESSO diff --git a/blockchain.example b/blockchain.example new file mode 100644 index 0000000..fe2e677 --- /dev/null +++ b/blockchain.example @@ -0,0 +1,5 @@ +{ + "json_results": { + "01-5-2023__31-5-2023": "a66d8b9b2a6959daf5516f0f777a5eeed3e32eabb810eb4e8494764310f1f8e7" + } +} \ No newline at end of file diff --git a/blockchain.json b/blockchain.json index 8b0cfde..fe2e677 100644 --- a/blockchain.json +++ b/blockchain.json @@ -1,7 +1,5 @@ -[ - { - "merkleRoot": "36d12cb8e28699290b0cef1ea5a1fadfd2c6bc4afad02633330e86b197b61884", - "txHash": "0x4de4beaf81e16c53537f1369180ab77a803b4251d8a29a6ee937b5f72af8a0c9", - "timestamp": 1683380719 +{ + "json_results": { + "01-5-2023__31-5-2023": "a66d8b9b2a6959daf5516f0f777a5eeed3e32eabb810eb4e8494764310f1f8e7" } -] \ No newline at end of file +} \ No newline at end of file diff --git a/func/functions.php b/func/functions.php new file mode 100644 index 0000000..de38ccb --- /dev/null +++ b/func/functions.php @@ -0,0 +1,101 @@ +' . print_r($dates, true) . ''; + // exit; + + $startDate = \DateTime::createFromFormat('d-m-Y H:i:s', $dates[0] . ' 00:00:00'); + $finishDate = \DateTime::createFromFormat('d-m-Y H:i:s', $dates[1] . ' 23:59:59'); + // echo '
' . print_r($startDate, true) . '
'; + // echo '
' . print_r($finishDate, true) . '
'; + // exit; + + $result = new \stdClass; + $result->startDate = $startDate; + $result->finishDate = $finishDate; + + return $result; +} + +/** + * Questa funzione verifica entrambi i merkle root e restituisce gli array da stampare a video + * + * @param string $qldb_json, $blockchain_json + * @return array + */ +function verificaMerkleRoot($qldb_json, $blockchain_json) +{ + $blockchainResults = (array) $blockchain_json->json_results; + // echo '
' . print_r($blockchainResults, true) . '
'; + // exit; + + // genero l'array con i merkle root dalla blockchain suddivisi per anno/mese + foreach ($blockchainResults as $period => $merkleRootByPeriod) { + // funzione che estrae date dal period salvato su blockchain + $dateFromPeriod = dateFromPeriod($period); + + // estraggo dal file qldb solo gli hash del mese/anno elaborato + foreach ($qldb_json as $qldb) { + // data ricavata dal timestamp + $stringDate = date('Y-m-d H:i:s', $qldb->activity_timestamp); + // data convertita in formato datetime + $matchDate = new \DateTime($stringDate); + + // confronto la data del qldb con il periodo + if ($matchDate >= $dateFromPeriod->startDate && $matchDate <= $dateFromPeriod->finishDate) { + // se appartiene al periodo la salvo in array + $qldb_hashes[$matchDate->format('Y-m')][] = $qldb->document_hash; + + // salvo anche le informazioni del merkle root della blockchain relative + $blockchain_data[$matchDate->format('Y-m')] = $merkleRootByPeriod; + } + $all_qldb_hashes[$matchDate->format('Y-m')][] = $qldb->document_hash; + + } + } + + return [ + 'qldb_hashes' => $qldb_hashes, + 'blockchain_data' => $blockchain_data, + 'all_qldb_hashes' => $all_qldb_hashes + ]; +} \ No newline at end of file diff --git a/index.php b/index.php index 5ba48de..6bece6b 100644 --- a/index.php +++ b/index.php @@ -1,51 +1,66 @@ document_hash; +if ($scelta == '1'){ + foreach ($result['blockchain_data'] as $period => $merkleRoot) { + // Inizializzo la classe e calcolo il Merkle root con gli hash ricavati dal qldb + $merkle = new MerkleRootCalculator(); + $qldb_root = $merkle->root($result['qldb_hashes'][$period]); -// prendo solo l'elemento 0 del json della blockchain -$blockchain_data = $blockchain_data[0]; + // stampo il risultato per singolo periodo + echo "Periodo: $period\n"; + echo "Merkle root da Blockchain: $merkleRoot\n"; + echo "Merkle root da QLDB: $qldb_root\n"; + echo "Verifica Merkle root: " . ($merkle->verify($result['qldb_hashes'][$period], $merkleRoot) ? 'SUCCESSO' : 'FALLITO') . "\n"; + } + + die(); +} + +if ($scelta == '2'){ + foreach ($result['all_qldb_hashes'] as $period => $hashes) { + // Inizializzo la classe e calcolo il Merkle root con gli hash ricavati dal qldb + $merkle = new MerkleRootCalculator(); + $qldb_root = $merkle->root($hashes); -// inizializzo la classe e calcolo il Merkle root con gli hash ricavati dal qldb -$merkle = new MerkleRootCalculator(); -$qldb_root = $merkle->root($qldb_hashes); + // stampo il risultato per singolo periodo + echo "Periodo: $period\n"; + echo "Merkle root da QLDB: $qldb_root\n"; + } + + die(); +} -// stampo il risultato -echo "Merkle root da Blockchain: $blockchain_data->merkleRoot\n"; -echo "Merkle root da QLDB: $qldb_root\n"; -echo "Verifica Merkle root: " . ($merkle->verify($qldb_hashes, $blockchain_data->merkleRoot) ? 'SUCCESSO' : 'FALLITO') . "\n"; +if ($scelta == '3') { + foreach ($result['blockchain_data'] as $period => $merkleRoot) { + + // stampo il risultato per singolo periodo + echo "Periodo: $period\n"; + echo "Merkle root da Blockchain: $merkleRoot\n"; + } + die(); +} \ No newline at end of file diff --git a/qldb.example b/qldb.example new file mode 100644 index 0000000..b8ae286 --- /dev/null +++ b/qldb.example @@ -0,0 +1,32 @@ +[ + { + "id": 5, + "document_hash": "5f2fb9087b45d6a030b1827a21dcd1816d24fec6833afff8183bafbee95e72a0", + "activity_timestamp": 1683380719 + }, + { + "id": 2, + "document_hash": "5f2fb9087b45d6a030b1827a21dcd1816d24fec6833afff8183bafbee95e72a0", + "activity_timestamp": 1680779370 + }, + { + "id": 4, + "document_hash": "5f2fb9087b45d6a030b1827a21dcd1816d24fec6833afff8183bafbee95e72a0", + "activity_timestamp": 1683379607 + }, + { + "id": 3, + "document_hash": "5f2fb9087b45d6a030b1827a21dcd1816d24fec6833afff8183bafbee95e72a0", + "activity_timestamp": 1683357746 + }, + { + "id": 6, + "document_hash": "5f2fb9087b45d6a030b1827a21dcd1816d24fec6833afff8183bafbee95e72a0", + "activity_timestamp": 1683464522 + }, + { + "id": 1, + "document_hash": "5f2fb9087b45d6a030b1827a21dcd1816d24fec6833afff8183bafbee95e72a0", + "activity_timestamp": 1680779370 + } +] \ No newline at end of file diff --git a/qldb.json b/qldb.json index b8ae286..4618037 100644 --- a/qldb.json +++ b/qldb.json @@ -1,32 +1,42 @@ [ - { - "id": 5, - "document_hash": "5f2fb9087b45d6a030b1827a21dcd1816d24fec6833afff8183bafbee95e72a0", - "activity_timestamp": 1683380719 - }, { "id": 2, - "document_hash": "5f2fb9087b45d6a030b1827a21dcd1816d24fec6833afff8183bafbee95e72a0", - "activity_timestamp": 1680779370 + "document_hash": "2b44e6ec8a82f17f87f17c62b7c10b98afb0e84d8247417c7e276a438ae81d1b", + "activity_timestamp": 1684770201 }, { - "id": 4, - "document_hash": "5f2fb9087b45d6a030b1827a21dcd1816d24fec6833afff8183bafbee95e72a0", - "activity_timestamp": 1683379607 + "id": 9, + "document_hash": "2b44e6ec8a82f17f87f17c62b7c10b98afb0e84d8247417c7e276a438ae81d1b", + "activity_timestamp": 1686564728 }, { - "id": 3, - "document_hash": "5f2fb9087b45d6a030b1827a21dcd1816d24fec6833afff8183bafbee95e72a0", - "activity_timestamp": 1683357746 + "id": 10, + "document_hash": "2b44e6ec8a82f17f87f17c62b7c10b98afb0e84d8247417c7e276a438ae81d1b", + "activity_timestamp": 1686564965 }, { "id": 6, - "document_hash": "5f2fb9087b45d6a030b1827a21dcd1816d24fec6833afff8183bafbee95e72a0", - "activity_timestamp": 1683464522 + "document_hash": "2b44e6ec8a82f17f87f17c62b7c10b98afb0e84d8247417c7e276a438ae81d1b", + "activity_timestamp": 1684935291 + }, + { + "id": 5, + "document_hash": "2b44e6ec8a82f17f87f17c62b7c10b98afb0e84d8247417c7e276a438ae81d1b", + "activity_timestamp": 1684933749 + }, + { + "id": 3, + "document_hash": "2b44e6ec8a82f17f87f17c62b7c10b98afb0e84d8247417c7e276a438ae81d1b", + "activity_timestamp": 1684924135 }, { "id": 1, "document_hash": "5f2fb9087b45d6a030b1827a21dcd1816d24fec6833afff8183bafbee95e72a0", - "activity_timestamp": 1680779370 + "activity_timestamp": 1683563084 + }, + { + "id": 14, + "document_hash": "2b44e6ec8a82f17f87f17c62b7c10b98afb0e84d8247417c7e276a438ae81d1b", + "activity_timestamp": 1686763270 } ] \ No newline at end of file