pleonasm/merkle-tree

PHP 中 Merkle 树的实现

2.0.0 2020-11-02 05:11 UTC

This package is auto-updated.

Last update: 2024-08-29 04:16:41 UTC


README

Build Status Coverage Status

这是 PHP 中哈希树或Merkle 树的实现。

安装

通过 Composer 安装(确保您的路径或项目中已安装 composer)。

将以下内容放入您的 package.json 文件中

{
    "require": {
        "pleonasm/merkle-tree": "*"
    }
}

然后运行 composer install

固定大小树的用法

使用哈希树需要用户提供一个哈希函数,每个节点将使用此函数进行哈希。此函数必须接受单个字符串参数,并始终返回字符串。它永远不会抛出异常。

如果需要,您还可以提供一个回调,当整个哈希树实际上完成时而不是每次自己检查时。

<?php
use Pleo\Merkle\FixedSizeTree;

require 'vendor/autoload.php';

// basically the same thing bitcoin merkle tree hashing does
$hasher = function ($data) {
    return hash('sha256', hash('sha256', $data, true), true);
};

$finished = function ($hash) {
    echo implode('', unpack('H*', $hash)) . "\n";
};

$tree = new FixedSizeTree(16, $hasher, $finished);

$tree->set(0, 'Science');
$tree->set(1, 'is');
$tree->set(2, 'made');
$tree->set(3, 'up');
$tree->set(4, 'of');
$tree->set(5, 'so');
$tree->set(6, 'many');
$tree->set(7, 'things');
$tree->set(8, 'that');
$tree->set(9, 'appear');
$tree->set(10, 'obvious');
$tree->set(11, 'after');
$tree->set(12, 'they');
$tree->set(13, 'are');
$tree->set(14, 'explained');
$tree->set(15, '.'); // this will echo the string 'c689102cdf2a5b30c2e21fdad85e4bb401085227aff672a7240ceb3410ff1fb6'

FixedSizeTree 以与比特币相同的方式实现 Merkle 树。还有其他方法来实际处理树宽度不是完全平方数的情况。

如果需要其他方法,我不会反对添加它。

从 1.0 升级

1.0 和 2.0 之间的区别应该非常小。如果您只使用 FixedSizeTree 的公共接口(减去一些错误处理更改),则应该没问题。

新的实现大大简化,并且对于大树来说要快得多。我的最新基准测试显示,1.0 需要花费 100 秒来填充一个包含 10,000 项的树,而 2.0 只需要 0.2 秒。

话虽如此,这实际上是一个向后不兼容的更改,因此需要进行主要版本的升级。

许可协议

您可以在LICENSE 文件中找到此代码的许可协议。