Skip to content

Commit a0328e9

Browse files
committed
update: merkle root python
1 parent b29d933 commit a0328e9

File tree

5 files changed

+133
-13
lines changed

5 files changed

+133
-13
lines changed

README.md

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ corrisponda a quello salvato in blockchain.
2424

2525
## Guida
2626

27-
- Clona questo software oppure scaricalo da questo <a href="https://github.com/jambtc/merkle-root-php/releases/tag/v1.2">link</a> in una cartella sul tuo pc.
27+
- Clona questo software oppure scarica l'ultima versione da questo <a href="https://github.com/jambtc/merkle-root-php/releases/">link</a> in una cartella sul tuo pc.
2828
- Copia i file json sia del Qldb che della Blockchain sotto questa stessa cartella.
2929
- Apri una finestra shell o prompt e digita i seguenti comandi:
3030

@@ -33,13 +33,15 @@ cd <nomecartella>
3333
php index.php
3434
```
3535

36-
Il software ti permette di selezionare 3 scelte:
36+
Il software ti permette di selezionare 4 scelte:
3737

38-
1. Verifica Merkle Root
39-
2. Estrai i Merkle Root dal file QLDB
40-
3. Estrai i Merkle Root dal file Blockchain
38+
1. Compara i Merkle Root
39+
2. Estrai il Merkle Root dal file QLDB
40+
3. Estrai il Merkle Root dal file Blockchain
41+
4. Mostra gli hash dei file
4142

42-
Dovresti ottenere una risposta di questo tipo:
43+
44+
Selezionando la prima opzione, dovresti ottenere una risposta di questo tipo:
4345

4446
```bash
4547
Merkle Root Calculator
@@ -49,3 +51,16 @@ Merkle root da Blockchain: 36d12cb8e28699290b0cef1ea5a1fadfd2c6bc4afad02633330e8
4951
Merkle root da QLDB: 36d12cb8e28699290b0cef1ea5a1fadfd2c6bc4afad02633330e86b197b61884
5052
Verifica Merkle root: SUCCESSO
5153
```
54+
55+
## Verifica online in php
56+
57+
Se non si ha a disposizione un ambiente php installato, è possibile effettuare un controllo online
58+
del merkle root.
59+
Si può utilizzare il sito <https://onlinephp.io/> e copiare al suo interno il contenuto del file `online.php`
60+
61+
E' necessario però modificare manualmente il contenuto dell'array `$data`, con i valori di hash che si vuole controllare dal file qldb.
62+
63+
## Verifica online in python
64+
65+
E' possibile anche usare uno script in python che funziona allo stesso modo.
66+
Legge l'array elements e ne produce il merkle root. Il file da usare, in questo caso, è `online.py`

func/functions.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ function verificaMerkleRoot($qldb_json, $blockchain_json)
8484
if ($matchDate >= $dateFromPeriod->startDate && $matchDate <= $dateFromPeriod->finishDate) {
8585
// se appartiene al periodo la salvo in array
8686
$qldb_hashes[$matchDate->format('Y-m')][] = $qldb->document_hash;
87+
// $timestamp_qldb_hashes[$qldb->activity_timestamp][] = $qldb->document_hash;
8788

8889
// salvo anche le informazioni del merkle root della blockchain relative
8990
$blockchain_data[$matchDate->format('Y-m')] = $merkleRootByPeriod;
@@ -93,6 +94,12 @@ function verificaMerkleRoot($qldb_json, $blockchain_json)
9394
}
9495
}
9596

97+
// echo '<pre>' . print_r($timestamp_qldb_hashes, true) . '</pre>';
98+
// asort($timestamp_qldb_hashes);
99+
// echo '<pre>' . print_r($timestamp_qldb_hashes, true) . '</pre>';
100+
101+
// exit;
102+
96103
return [
97104
'qldb_hashes' => $qldb_hashes,
98105
'blockchain_data' => $blockchain_data,

index.php

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,13 @@
77
echo "Merkle Root Calculator\n\n";
88

99
echo "Fai la tua scelta:\n\n";
10-
echo " 1. Verifica Merkle Root\n";
11-
echo " 2. Estrai i Merkle Root dal file QLDB\n";
12-
echo " 3. Estrai i Merkle Root dal file Blockchain\n";
10+
echo " 1. Compara i Merkle Root\n";
11+
echo " 2. Estrai il Merkle Root dal file QLDB\n";
12+
echo " 3. Estrai il Merkle Root dal file Blockchain\n";
13+
echo " 4. Mostra gli hash dei file\n";
1314
$scelta = readline();
1415

15-
if ($scelta != '1' && $scelta != '2' && $scelta != '3'){
16+
if ($scelta != '1' && $scelta != '2' && $scelta != '3' && $scelta != '4'){
1617
echo "\nScelta non consentita!\n\n";
1718
die();
1819
}
@@ -23,6 +24,13 @@
2324

2425
// Estraggo le informazioni dai file
2526
$result = verificaMerkleRoot($qldb_json, $blockchain_json);
27+
if ($scelta == '4'){
28+
unset($result['qldb_hashes']);
29+
echo '<pre>' . print_r($result, true) . '</pre>';
30+
exit;
31+
32+
}
33+
2634

2735
if ($scelta == '1'){
2836
foreach ($result['blockchain_data'] as $period => $merkleRoot) {
@@ -31,7 +39,7 @@
3139
$qldb_root = $merkle->root($result['qldb_hashes'][$period]);
3240

3341
// stampo il risultato per singolo periodo
34-
echo "Periodo: $period\n";
42+
echo "\nPeriodo: $period\n";
3543
echo "Merkle root da Blockchain: $merkleRoot\n";
3644
echo "Merkle root da QLDB: $qldb_root\n";
3745
echo "Verifica Merkle root: " . ($merkle->verify($result['qldb_hashes'][$period], $merkleRoot) ? 'SUCCESSO' : 'FALLITO') . "\n";
@@ -47,7 +55,7 @@
4755
$qldb_root = $merkle->root($hashes);
4856

4957
// stampo il risultato per singolo periodo
50-
echo "Periodo: $period\n";
58+
echo "\nPeriodo: $period\n";
5159
echo "Merkle root da QLDB: $qldb_root\n";
5260
}
5361

@@ -58,7 +66,7 @@
5866
foreach ($result['blockchain_data'] as $period => $merkleRoot) {
5967

6068
// stampo il risultato per singolo periodo
61-
echo "Periodo: $period\n";
69+
echo "\nPeriodo: $period\n";
6270
echo "Merkle root da Blockchain: $merkleRoot\n";
6371
}
6472

online.php

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
<?php
2+
class MerkleRoot
3+
{
4+
/**
5+
* Calcola il Merkle Root
6+
*
7+
* La funzione calcola il Merkle Root a partire dai dati passati come argomento, utilizzando
8+
* la funzione hash SHA256 per calcolare gli hash dei singoli elementi e degli hash intermedi.
9+
* Viene restituito il Merkle Root, ovvero l'hash della radice del Merkle Tree.
10+
*
11+
* @param array $data Array di hash
12+
* @return string Merkle root
13+
*/
14+
public function root(array $data): string
15+
{
16+
// Se il numero di elementi è dispari, duplica l'ultimo elemento
17+
if (count($data) % 2 != 0) {
18+
$data[] = end($data);
19+
}
20+
21+
// Calcola gli hash dei singoli elementi
22+
foreach ($data as $element) {
23+
$merkle_tree[] = hash('sha256', $element);
24+
}
25+
26+
// Calcola gli hash intermedi
27+
while (count($merkle_tree) > 1) {
28+
$level = [];
29+
for ($i = 0; $i < count($merkle_tree); $i += 2) {
30+
$left = $merkle_tree[$i];
31+
$right = isset($merkle_tree[$i + 1]) ? $merkle_tree[$i + 1] : $left;
32+
$level[] = hash('sha256', $left . $right);
33+
}
34+
$merkle_tree = $level;
35+
}
36+
37+
return $merkle_tree[0];
38+
}
39+
40+
}
41+
42+
// array di dati
43+
$data = [
44+
'2b44e6ec8a82f17f87f17c62b7c10b98afb0e84d8247417c7e276a438ae81d1b',
45+
'2b44e6ec8a82f17f87f17c62b7c10b98afb0e84d8247417c7e276a438ae81d1b',
46+
'2b44e6ec8a82f17f87f17c62b7c10b98afb0e84d8247417c7e276a438ae81d1b',
47+
'2b44e6ec8a82f17f87f17c62b7c10b98afb0e84d8247417c7e276a438ae81d1b',
48+
'5f2fb9087b45d6a030b1827a21dcd1816d24fec6833afff8183bafbee95e72a0'
49+
];
50+
51+
// inizializzo la classe
52+
$merkle = new MerkleRoot();
53+
54+
// genero il Merkle root
55+
$root = $merkle->root($data);
56+
57+
58+
echo "Merkle root: $root\n";

online.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import hashlib
2+
3+
def merkle_root(data):
4+
# Se il numero di elementi è dispari, duplica l'ultimo elemento
5+
if len(data) % 2 != 0:
6+
data.append(data[-1])
7+
8+
# Calcola gli hash dei singoli elementi
9+
merkle_tree = [hashlib.sha256(element.encode()).hexdigest() for element in data]
10+
11+
# Calcola gli hash intermedi
12+
while len(merkle_tree) > 1:
13+
level = []
14+
for i in range(0, len(merkle_tree), 2):
15+
left = merkle_tree[i]
16+
right = merkle_tree[i + 1] if i + 1 < len(merkle_tree) else left
17+
combined = left + right
18+
level.append(hashlib.sha256(combined.encode()).hexdigest())
19+
merkle_tree = level
20+
21+
return merkle_tree[0]
22+
23+
elements = [
24+
'2b44e6ec8a82f17f87f17c62b7c10b98afb0e84d8247417c7e276a438ae81d1b',
25+
'2b44e6ec8a82f17f87f17c62b7c10b98afb0e84d8247417c7e276a438ae81d1b',
26+
'2b44e6ec8a82f17f87f17c62b7c10b98afb0e84d8247417c7e276a438ae81d1b',
27+
'2b44e6ec8a82f17f87f17c62b7c10b98afb0e84d8247417c7e276a438ae81d1b',
28+
'5f2fb9087b45d6a030b1827a21dcd1816d24fec6833afff8183bafbee95e72a0'
29+
];
30+
31+
result = merkle_root(elements)
32+
print("Merkle root: " + result)

0 commit comments

Comments
 (0)