如何在 NodeJS 中构建自己的区块链
当我们尝试学习新知识时,常常会忍不住一头扎进文档、文章和概念解释中。虽然这些当然都很重要,但程序员们却拥有一个强大的工具,可以帮助他们理解那些他们常常习以为常的复杂主题。
用代码为不同的主题构建模型可以帮助我们理解一个想法的不同部分如何在实践中组合和运作。
在本教程中,我将向您展示如何使用一些相对简单的 Javascript 构建基本的区块链。
什么是区块链?
将区块链视为增强链表或每个元素指向前一个数组的数组会很有帮助。
区块链的每一个区块(相当于数组中的一个元素)内至少包含以下内容:
- 区块添加到链的时间戳
- 某种相关数据。就加密货币而言,这些数据会存储交易信息,但区块链的功能远不止存储加密货币的交易信息。
- 该区块之前的加密哈希值
- 基于块内包含的数据的加密哈希(包括前一个块的哈希)
区块链如此强大的关键在于,每个区块的哈希值都嵌入了前一个区块的数据(通过前一个区块的哈希值存储)。这意味着,如果你修改了一个区块的数据,它的哈希值也会被修改,从而使所有未来区块的哈希值失效。
创建块
虽然这可能可以通过原始 Javascript 来完成,但为了简单起见,我们将制作一个 Node.js 脚本并利用 Node.js 的内置 Crypto 包来计算我们的哈希值。
我们可以在代码中定义一个块,如下所示:
请注意,我们使用 SHA256 加密来对函数进行哈希处理。这是大多数区块链中使用的标准加密哈希函数,因为它极易计算,但极难逆转。
然后我们可以像这样创建这些块的实例:
let a = new Block({from: "Joe", to: "Jane"}, precedingHash = "0")
let b = new Block({from: "Jane", to: "Joe"}, precedingHash = a.hash)
尝试打印出这些区块的哈希值,并注意它们之间的区别。另请注意,如果更改第一个区块的数据,则两个区块的哈希值都会改变。
创建区块链
现在我们有了构建块(一语双关),让我们为我们的链创建一个类。我们可以像这样定义它:
首先,请注意,我们将链中的初始区块称为创世区块。由于该区块是链中的第一个区块,因此它不能存储任何先前的哈希值。
接下来,我们还创建了一个函数来检查区块链的有效性,以监控篡改行为。我们正在检查两种可能性。
- 有人篡改了数据,存储的哈希值不再是正确的哈希值
- 有人篡改了前一个区块的数据,因此存储的 prevHash 值不正确。
如果您运行该代码并打印出链的值,您应该能够看到链中的每个块如何存储其自己的哈希值以及前一个块的哈希值!
这个例子就到这里,但如果你想更深入地了解区块链,我强烈建议你尝试一下这段代码,看看是什么破坏了链的有效性!祝你在下一代云提供商Codesphere
的朋友们编程愉快。