د آنکو/د مركل

v1.0.0 2022-08-06 03:51 UTC

This package is auto-updated.

Last update: 2024-09-07 08:50:13 UTC


README

License Version PHP PHPUnit PHPStan

توضيحات

با استفاده از: composer require danc0/dmerkle

اجرايي پي‌آرپي از شجرة هش مركل. هشهاي کامل به صورت پاكت‌هايي بازگردانده مي‌شوند و مدرک اضافه شدن مي‌تواند براي پاكتها اجرا شود تا بررسی شود که تراکنش‌ها در آن پاكت قرار دارند.

استفاده

شما باید انجام دهيد که تراکنش‌هاي خود را در دايتابسي با فیلدهاى block_id و root_hash ذخيره کنيد. تراکنش‌ها را از طریق یک صف اول در اول به اول پردازش کنيد. شما همچنین نیاز به یک جدول دارید که داده‌های بلوک را ذخیره کند تا امکان تأیید تراکنش‌ها فراهم شود.

شما باید این تراکنش‌ها را بر اساس اندازه بلوک تنظیم شده خود ( پیش‌فرض 100 تراکنش در هر بلوک است) به عنوان گروه‌ها به تابع هش کردن ارسال کنید. به عنوان مثال، اگر اندازه بلوک شما 2 بود، چیزی مشابه این را ارسال می‌کنید

$transactions_to_hash = [
    ['foo'],
    ['bar']
];

داده‌هاي ارسالی به تابع هش کردن باید یک آرایه از آرایه‌ها باشد که بزرگتر از اندازه بلوک حداکثر نباشد، اگر این اندازه را برتريابيم، یک DMerkle_Exception پرتاب می‌شود.

استفاده از فایل DMerkle.php

پس از ساخت صف و ذخیره تراکنش‌ها می‌توانید شروع به ساخت داده‌هايي برای ارسال به روش هش کردن کنید.

use DMerkle\DMerkle;

$previous_block_hash = '123456bcdef';
$DMerkle = new DMerkle($previous_block_hash);
// Data from your queue in groups equal to your max block size
$transactions = [ ... ];

// Change the default block size
$DMerkle->max_block_size = 50;
// Pass a block of no more than 50 transactions
$DMerkle->setBlockData($transactions);
// Run the hashes
$DMerkle->runBlockCalculation();
// Get block data
$block_data = $DMerkle->createBlockData();

مетод createBlockData داده‌های ساختاریافته بلوک را بازمی‌گرداند، از جمله شجرة هش کامل. شما باید این اطلاعات بلوک را برای تأیید بلوک ذخیره کنید! همچنین، این بلوک هش را برای استفاده در بلوک بعدی بازمی‌گرداند. این کار اجازه می‌دهد که بلوک‌ها را تأیید کنید و باید با داده‌های بلوک شما ذخیره شوند! ارسال هش بلوک قبلي به بلوک فعلي به این معنی است که اگر چیزی در هر بلوک قبل از فعلي تغییر کند، بلوک فعلي هش مشابهي نخواهد داشت. این کار اجازه می‌دهد تا بلوک‌ها را تأیید کنیم.

داده‌های بلوک مثال

array(2) {
  ["block_data"]=>
  array(3) {
    ["header"]=>
    array(4) {
      ["block_id"]=>
      string(64) "5534f1313ea84c84faff9c99a766fb942864c86e53ce42be94f6a9bc7c322d43"
      ["root_hash"]=>
      string(64) "c12ab12acc2b1567e0c58809005d4e99b84f5a6c640dc3b6285fd70177242fc4"
      ["completed"]=>
      string(19) "2022-07-25 23:14:35"
      ["previous_block"]=>
      string(0) ""
    }
    ["base"]=>
    array(1) {
      [0]=>
      array(6) {
        [0]=>
        string(64) "31a76d7c1c7e8caffd45978dd1550716fded6121fe304172df75182b5888a49d"
        [1]=>
        string(64) "0b61a45894993b25785ea2dc0ff419db8c07eb626d05bf7c02268f536868f36c"
        [2]=>
        string(64) "ff87ae9ef3c9a0280c910142a2b7bde3413ffd0b21746f6e46359aa6ed67baea"
        [3]=>
        string(64) "a9b820c175525dd527b2076bb1be3c303ec2d05a7ab0f84c6af90d040ceb3230"
        [4]=>
        string(64) "80fe5885c37f06b5a8dc501323dc68299df99dda00ff3b04f2c9a9b7a37477bc"
        [5]=>
        string(64) "64755db4b6bdde855a6ddc641fb7b9e8d3238a7303da2cc25a6a4631304bd81b"
      }
    }
    ["full_tree"]=>
    array(4) {
      [0]=>
      array(6) {
        [0]=>
        string(64) "31a76d7c1c7e8caffd45978dd1550716fded6121fe304172df75182b5888a49d"
        [1]=>
        string(64) "0b61a45894993b25785ea2dc0ff419db8c07eb626d05bf7c02268f536868f36c"
        [2]=>
        string(64) "ff87ae9ef3c9a0280c910142a2b7bde3413ffd0b21746f6e46359aa6ed67baea"
        [3]=>
        string(64) "a9b820c175525dd527b2076bb1be3c303ec2d05a7ab0f84c6af90d040ceb3230"
        [4]=>
        string(64) "80fe5885c37f06b5a8dc501323dc68299df99dda00ff3b04f2c9a9b7a37477bc"
        [5]=>
        string(64) "64755db4b6bdde855a6ddc641fb7b9e8d3238a7303da2cc25a6a4631304bd81b"
      }
      [1]=>
      array(3) {
        [0]=>
        string(64) "56f1e19e51877ee8e398af8e83167390dec0552ef4449baf1de717bb7b22ab5d"
        [1]=>
        string(64) "33129c523c53ec276c6470284c94b417fc6af47d867fe3028bba05d7d4e2eb9c"
        [2]=>
        string(64) "1b54ea0fc30fd68b12e94fc8a8cf53a6fd15894feeea485c6f6a1c8496f5dbc9"
      }
      [2]=>
      array(2) {
        [0]=>
        string(64) "8afdae9451bde20d23ad26911acc7378d207c31fc430896c362e105b823c667e"
        [1]=>
        string(64) "c18204abc5b4e9bf5cc92c3c832ffc72a8d33afa5be72110969530ae142eacd6"
      }
      [3]=>
      array(1) {
        [0]=>
        string(64) "c12ab12acc2b1567e0c58809005d4e99b84f5a6c640dc3b6285fd70177242fc4"
      }
    }
  }
  ["block_hash"]=>
  string(64) "e1a822184c2f1909fcf50cc86706442c6705a57186a849cbb86559046c38b0be"
}

این داده‌ها باید ذخیره شوند و block_id و root_hash باید به هر تراکنشی که برای ساخت این بلوک استفاده شده است، ذخیره شوند.

تأیید یک تراکنش

برای تأیید یک تراکنش باید داده‌های تراکنشی استفاده شده هنگام ساخت بلوک و root_hash آن بلوک را ارسال کنید. همچنین باید داده‌های کامل بلوک بازگردانده شده از روش هش کردن را به DMerkle_Block::class بارگذاري کنید.

use DMerkle\DMerkle_Block;
$block_data_from_hashing = [ ... ]; // loaded from your db somewhere
$transaction_data = [ ... ]; // loaded from your db, data used when creating blocks
$root_hash = '...'; // loaded from your db


$DMerkle_Block = new DMerkle_Block($block_data_from_hashing);

$transaction_is_valid = $block->transactionIsPartOfBlock($transaction_data, $root_hash);

مетод transactionIsPartOfBlock true | false بازمی‌گرداند و تراکنش را از سطح پایین تا ریشه هش می‌کايد و تأیید می‌کند که آیا تراکنش در آن بلوک قرار دارد یا خیر. این به این معنی است که اگر هش در سطح پایین تغییر کند، هیچ راهي وجود ندارد که ریشه هش مشابه باقی بماند مگر اینکه کل بلوک مختل شده و دوباره هش شود.

تأیید یک بلوک

امکان دارد یک بلوک را بدون تغییر تأیید کنید با بازسازی یا هش کردن آن بلوک و استفاده از کلاس DMerkle_Block برای تأیید هش. برای انجام این کار، هش بلوک قبلي باید در هنگام هش کردن تراکنش‌ها به بلوک فعلي ارسال شود. این تکنیک به این معنی است که هرگونه تغییر در بلوک قبل از فعلي باعث ایجاد هش متفاوتي برای بلوک فعلي خواهد شد.

use DMerkle\DMerkle_Block;

$old_block = new DMerkle_Block($old_block_data);
$old_block_hash = $old_block->getBlockHash();

$current_block = new DMerkle_Block($current_block_data);

$old_block_hash_is_valid = $current_block->previousBlockHashIsValid($old_block_hash, $current_block_stored_hash)

چون هش بلوک قبلي به عنوان بخشی از بلوک جدید هش می‌شود، اگر این هش هرگز تغییر کند، هش بلوک فعلي متفاوت از آنچه که ذخیره شده است، خواهد بود.