http://www.7klian.com

实现Merkle-Tree和Patricia-Trie教程详解

    }
verifyHash = sha256(neighbour + verifyHash);

}
要测试成果,请在根目次中建设一个js文件,将其定名为test.js并在个中添加以下代码。
.createHash(“sha256”)
    add(transaction) {

console.log(patriciaTrie.get(“random-string”));
transactionList.list[2].to = “kashish”;
默克尔树merkel tree的重要性在于其高效验证数据的本领。在给定列表中的任何数据,我们可以在O(h)时间巨大度中验证此数据是否有效。并且我们不需要整个列表举办验证。
//TODO: Add comments
module.exports = hash;
if (position % 2 == 0) {
假如节点数为偶数,则取两个持续的节点并形成父层。可是假如节点数为奇数,我们将利用两个持续的节点,直到剩下一个以形成父层为止,然后通过将哈希值复制到父层来反复剩余的节点。

// Hashes data and returns a hex string
  else {
tree.createTree(transactionList.list);
  }
}
let transactionList = new TransactionList();
}
const TransactionList = require(“./TransactionList”);
4. 反复步调3,直到找到根
}
}
    }
neighbour = this.root[index][position – 1];
您可以通过实现以下内容来进一步扩展该项目:
1. 利用Merkel Tree和Patricia Tries实施区块链。
建设一个文件Transaction.js并在个中添加以下代码。
3. 在Node.js中实现
默克尔树merkel tree的一种更简朴形式表示是哈希链或只是一个区块链,个中每个节点都具有前一个节点值的哈希值。假如我们改动中间的任何节点,则可以在O(n)时间内确定该节点是否被改动。哈希链中的验证可以通过计较所有节点的哈希值(从所接头的节点开始直至竣事)来执行。在需要验证多个节点的环境下,我们从所有可疑节点中的第一个节点开始,然后计较最后一个节点的哈希。此刻我们有了最后一个节点的哈希,可以较量并查抄此哈希是否匹配。哈希链看起来很简朴,但对付大型数据工具而言并不是一个有效的选择。由于我们需要物理上存在的整个链来验证数据,因此这也会使哈希链空间效率低下。
3. amount
if (position) {
  this.root.unshift(transactionList);
this.root.unshift(temp);
您可以打消注释节制台日志以打印整个根目次和被改动的事务。
            if (temporaryRoot) temporaryRoot = temporaryRoot[hash[index]];
建设
        }
const util = require(“util”);

代码实施
for (let index = 0; index < this.root[0].length; index += 2) {

Element found at: 2
        verifyHash = sha256(verifyHash + neighbour);
    }
            }
        position = Math.floor((position – 1) / 2)
在实现我们的代码之前,我们需要建设一个用于散列数据的函数。因此建设一个名为helper.js的文件及个中的以下代码。
本节以数学形式描写了用于在默克尔树merkel tree中建设和验证的算法。
1. 关于Merkle和Patricia实验
  amount: 0.7140173399739937,
默克尔树merkel tree的验证环境并非如此。为了说明验证进程,请思量下面的示例。
module.exports = TransactionList;
                temporaryRoot[character] = {};
  }

譬喻:给定一个字母表列表,从中建设一个默克尔树merkel tree。默克尔树merkel tree的最底层将包括所有字母作为叶节点。

  console.log(position);
它应该输出以下输出:
}
雷同地,利用第三层的值形成第四层。

        if (temporaryRoot[“DATA”]) return temporaryRoot[“DATA”];
5. 较量当前根和先前的根(假如它们匹配,则C’)
    let verifyHash = transaction.getHash();

为了验证哈希链中的数据,我们需要O(n)时间,因为在最坏的环境下我们将计较n个哈希,就像在默克尔树的环境下一样,由于我们仅计较logn哈希,因此可以在O(logn)时间内验证沟通的数据。
假如是哈希链,我们将需要整个数据列表来验证C’是正确的。在默克尔树merkel tree中,我们只需要哈希即可。下图说明白如安在没有其他可用数据工具的环境下验证C’。

this.root = [];
}
            else return null;
else {
    for (let index = this.root.length – 2; index > 0; index–) {
// Lets tamper the data
  if (position) {
        else return null;
            else return false;

TODO: Transaction Class
let patriciaTrie = new PatriciaTrie();
    }
this.root = [];

const sha256 = require(“./helper”);
code .
// Import Node.js crypto module
class MerkelTree {
// TODO: Add comments
  let position = this.root.slice(-1)[0].findIndex(t => t.hash == transaction.hash);
算 法
            if (temporaryRoot) temporaryRoot = temporaryRoot[hash[index]];
        let str = transaction.hash;

每个生意业务哈希将具有数字或字符字符(取决于算法)。对付sha256,我们将利用32个字符长的哈希。假如我们假设哈希仅由0–9和A_Z构成,则patricia trie中的每个节点将具有35个子节点。从根开始,我们向下遍历,同时将每个字符与节点值匹配,直到最后得到生意业务数据工具。
        for (let index = 0; index < hash.length; index++) {
const PatriciaTrie = require(‘./PatriciaTrie’)
Patricia Trie就像一个哈希表,但有一些细微的差别。
在会见时,我们返回键“ DATA”的最后一个映射的值,在删除时,我们只删除给定哈希的叶节点。
for (let index = 0; index < 5; index++) {
数据验证
2. 利用Patricia Trie实施状态。
 */
4. id
            return true;
function hash(data) {
2. from
}
if (index < this.root[0].length – 1 && index % 2 == 0)
  from: 0.774577364867872,
}
    this.root.unshift(temp);
const TransactionList = require(“./TransactionList”);
运行此文件,您应该获得与以下输出雷同的输出:
? crypto
/**

console.log(util.inspect(tree, false, null, true /* enable colors */));
通过利用此界说,我们可以编写以下算法在trie中存储数据:

        temporaryRoot[“DATA”] = transaction;

数据验证
}
console.log(verifyHash == this.root[0][0] ? “Valid” : “Not Valid”);

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

相关文章阅读