-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
5 changed files
with
133 additions
and
13 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,58 @@ | ||
<?php | ||
class MerkleRoot | ||
{ | ||
/** | ||
* Calcola il Merkle Root | ||
* | ||
* La funzione calcola il Merkle Root a partire dai dati passati come argomento, utilizzando | ||
* la funzione hash SHA256 per calcolare gli hash dei singoli elementi e degli hash intermedi. | ||
* Viene restituito il Merkle Root, ovvero l'hash della radice del Merkle Tree. | ||
* | ||
* @param array $data Array di hash | ||
* @return string Merkle root | ||
*/ | ||
public function root(array $data): string | ||
{ | ||
// Se il numero di elementi è dispari, duplica l'ultimo elemento | ||
if (count($data) % 2 != 0) { | ||
$data[] = end($data); | ||
} | ||
|
||
// Calcola gli hash dei singoli elementi | ||
foreach ($data as $element) { | ||
$merkle_tree[] = hash('sha256', $element); | ||
} | ||
|
||
// Calcola gli hash intermedi | ||
while (count($merkle_tree) > 1) { | ||
$level = []; | ||
for ($i = 0; $i < count($merkle_tree); $i += 2) { | ||
$left = $merkle_tree[$i]; | ||
$right = isset($merkle_tree[$i + 1]) ? $merkle_tree[$i + 1] : $left; | ||
$level[] = hash('sha256', $left . $right); | ||
} | ||
$merkle_tree = $level; | ||
} | ||
|
||
return $merkle_tree[0]; | ||
} | ||
|
||
} | ||
|
||
// array di dati | ||
$data = [ | ||
'2b44e6ec8a82f17f87f17c62b7c10b98afb0e84d8247417c7e276a438ae81d1b', | ||
'2b44e6ec8a82f17f87f17c62b7c10b98afb0e84d8247417c7e276a438ae81d1b', | ||
'2b44e6ec8a82f17f87f17c62b7c10b98afb0e84d8247417c7e276a438ae81d1b', | ||
'2b44e6ec8a82f17f87f17c62b7c10b98afb0e84d8247417c7e276a438ae81d1b', | ||
'5f2fb9087b45d6a030b1827a21dcd1816d24fec6833afff8183bafbee95e72a0' | ||
]; | ||
|
||
// inizializzo la classe | ||
$merkle = new MerkleRoot(); | ||
|
||
// genero il Merkle root | ||
$root = $merkle->root($data); | ||
|
||
|
||
echo "Merkle root: $root\n"; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
import hashlib | ||
|
||
def merkle_root(data): | ||
# Se il numero di elementi è dispari, duplica l'ultimo elemento | ||
if len(data) % 2 != 0: | ||
data.append(data[-1]) | ||
|
||
# Calcola gli hash dei singoli elementi | ||
merkle_tree = [hashlib.sha256(element.encode()).hexdigest() for element in data] | ||
|
||
# Calcola gli hash intermedi | ||
while len(merkle_tree) > 1: | ||
level = [] | ||
for i in range(0, len(merkle_tree), 2): | ||
left = merkle_tree[i] | ||
right = merkle_tree[i + 1] if i + 1 < len(merkle_tree) else left | ||
combined = left + right | ||
level.append(hashlib.sha256(combined.encode()).hexdigest()) | ||
merkle_tree = level | ||
|
||
return merkle_tree[0] | ||
|
||
elements = [ | ||
'2b44e6ec8a82f17f87f17c62b7c10b98afb0e84d8247417c7e276a438ae81d1b', | ||
'2b44e6ec8a82f17f87f17c62b7c10b98afb0e84d8247417c7e276a438ae81d1b', | ||
'2b44e6ec8a82f17f87f17c62b7c10b98afb0e84d8247417c7e276a438ae81d1b', | ||
'2b44e6ec8a82f17f87f17c62b7c10b98afb0e84d8247417c7e276a438ae81d1b', | ||
'5f2fb9087b45d6a030b1827a21dcd1816d24fec6833afff8183bafbee95e72a0' | ||
]; | ||
|
||
result = merkle_root(elements) | ||
print("Merkle root: " + result) |