区块链入门:使用JavaScript实现的简易BlockChain

前言

众所周知,在我们 IT 界有一句话口口相传,“Talk is cheap, show me your code.”

鉴于本人水平有限,可能讲的不是很好,有时候一些概念直接使用代码来进行论证可能会更加清晰易懂,这个demo的代码也不多,就几百行,因此感兴趣的同学可以去到我的 Gitee 上拉取源代码进行学习。

基于JavaScript的简易单机版区块链源码地址,仅供参考;

前情回顾

什么是区块链

区块链(Blockchain)是一种按照时间顺序将数据区块以顺序相连的方式组合成的一种链式数据结构,并以密码学方式保证的不可篡改和不可伪造的分布式账本(Distributed Ledger),且对任何人都完全开放。

它有种有趣的性质,就是一旦数据被记录到区块链中,日后就很难被改变。

如何做到的?

对于区块链中的每一个块,都包含三个部分:数据当前块的哈希值先前块哈希值

在这里插入图片描述

存储在块中的数据取决于块的类型,在比特币系统中,其记录了交易的细节,如发送人、接受者和钱币数量:

在这里插入图片描述

块本身有一个哈希值,我们可以将其看作“指纹”,它用来鉴定这个块和其内容,并且这哈希值是独一无二的。

当数据块被制作出来时,它的哈希值也就被计算出来。若想要改变数据块的内容,就会同时改变这个哈希值:

在这里插入图片描述

也就是说,当我们想检测数据块是否有变化时,哈希值会非常有用。

如果一个数据块的指纹发生了改动,它就不再是原来的自己了。

每个块中的第三个元素,是前一个块的哈希值,这种性质有效的建立了块与块之间的链接性:

在这里插入图片描述

并且也就是这种技术使得区块链如此安全,为什么呢?

假设我们现在有条包含三个块的区块链:

在这里插入图片描述

由上图可知,块3指向块2,块2指向块1:

在这里插入图片描述

而块1没有指向,因为它就是第一块,我们称之为创世区块

此时如果有人想篡改第二块,那么就会导致第二块的哈希值变化,接着依次导致块3以及后面所有块都将失效:

在这里插入图片描述

因为它们不再存储前一块的有效哈希值。

但是仅仅靠使用哈希值并不足以防范篡改数据,现在电脑的计算速度非常快,假设我们篡改了某一块然后重新计算一遍所有其他块的哈希值并不是难事,这一样可以使我们的区块链重新生效。

为了应对这种情况,引入了工作量证明机制的技术。

这是一项能减慢创建新块的机制。

在比特币应用中,计算所需的工作量证明并将新块加入链中需要十分钟左右。

这种机制使得篡改变得相当不容易,因为如果我们想篡改一个块,我们则需要为所有后面的块重新计算工作量证明:

在这里插入图片描述

因此区块链的安全性来自于其对开创性的对哈希值的使用和工作量证明机制。

除此之外,区块链还使用了分布式的架构来实现,其采用的是一种对等网络(P2P NetWork)并且所有人都可以加入。

当有人加入这个网络时,他就会得到整个区块链的复制,这个人就可以以此来验证是否所有的区块还是合法未篡改的。

当某人创建了一个新的区块时,每个人再验证这个区块,以确保这个区块没有被篡改过,如果所有的东西都被检验正确之后,那么每个人就都会把这块新的区块加到自己的区块链上。

网络上的所有人就达成了“共识”:他们共同认可网络上的哪些区块是合法的哪些是不合法的。

不合法的区块会被网络上的其他用户拒绝。

总结一下:

要成功篡改一个区块,需要篡改区块链上的所有区块,重新完成每个区块的工作量证明,并且控制区块链网络中超过 50% 的用户。只有这样篡改的区块才会被所有人承认,而这基本是不可能做到的!

区块链的核心特性总结如下:

1、去中心化:区块链没有中心化的管理机构或硬件,所有节点都是平等的,每个节点都保存着整个区块链的数据副本,并共同参与区块链的维护和更新。

2、不可篡改性:一旦数据被写入区块链,它将很难被更改或删除。这是因为区块链采用密码学技术确保数据的完整性和真实性,同时每个区块都包含了前一个区块的哈希值,形成了一个不可篡改的链式结构。

3、透明性:区块链上的所有交易都是公开透明的,任何人都可以查看区块链上的数据和交易记录。这有助于建立信任并防止欺诈行为。

4、匿名性:虽然区块链上的交易记录是公开的,但交易参与者的身份是匿名的。这提供了一定程度的隐私保护,但也可能导致非法活动的发生。

5、智能合约:智能合约是自动执行、基于区块链技术的数字化协议。它们可以在满足特定条件时自动执行预定的操作,无需第三方干预。

什么是比特币

比特币(Bitcoin)是一种基于去中心化、点对点(P2P)网络的数字货币,它使用密码学原理来确保交易安全和控制交易单位的生成。比特币系统允许任何人在任何地方进行转账和接收款项,整个系统由用户(即比特币矿工)来共同维护,而不是依赖中央管理机构或银行

比特币的创始人是中本聪(Satoshi Nakamoto),他(或他们)在2008年发布了一篇名为《比特币:一种点对点的电子现金系统》的论文,详细描述了比特币的原理和实现方式。2009年,比特币系统正式上线并产生了第一个创世区块,这标志着比特币的诞生。

比特币的核心特性包括:

1、去中心化:比特币不由任何中央机构或政府控制,而是由网络中的节点共同维护。这使得比特币系统具有高度的抗审查性和去信任性。

2、有限性:比特币的总量是有限的,根据比特币系统的设定,最终将只有2100万个比特币产生。这种有限性使得比特币具有类似黄金的稀缺性,从而具有潜在的价值储存功能。

3、安全性:比特币使用公钥和私钥进行加密和签名,确保交易的安全和不可篡改性。同时,比特币系统采用了工作量证明(Proof of Work)机制来防止双重支付和确保网络的安全。

4、匿名性:虽然比特币交易记录是公开的,但交易双方的身份是匿名的,这为用户提供了一定的隐私保护。

5、全球通用:比特币是一种全球性的数字货币,可以在任何地方进行转账和接收款项,无需经过银行或其他金融机构。

区块链与比特币的关系

区块链和比特币之间存在密切的关系,但两者并不是同一回事。以下是它们之间的关系解释:

1、起源关系:区块链技术起源于比特币。比特币是第一个成功应用区块链技术的加密货币系统。在比特币系统中,区块链被用作一种去中心化的、不可篡改的账本,用于记录所有比特币交易的历史。

2、技术基础:区块链是比特币的技术基础。比特币系统的运行依赖于区块链技术。区块链通过分布式账本、共识机制、密码学等技术手段,确保比特币交易的安全、透明和去中心化。

3、应用范围:虽然区块链最初是为比特币而设计的,但它现在已经被广泛应用于许多其他领域,如金融、供应链管理、智能合约等。而比特币则是一种基于区块链技术的加密货币,主要用于价值传输和支付。

4、安全性:区块链技术的安全性为比特币提供了保障。由于区块链的去中心化、不可篡改和透明性等特点,比特币交易具有较高的安全性和可信度。此外,比特币系统还采用了工作量证明(Proof of Work)等机制来确保网络的安全和稳定。

5、发展趋势:随着区块链技术的不断发展和完善,其应用领域也在不断扩大。未来,区块链技术有望在更多领域发挥重要作用,而比特币作为区块链技术的代表之一,也将继续发挥其独特的价值。

总之,区块链和比特币之间存在密切的关系,但两者并不等同。区块链是一种技术,而比特币是基于这种技术的一种应用

工作量证明机制 ProofOfWork

工作量证明机制(Proof-of-Work,简称PoW)在区块链中的应用主要体现为一种共识算法,它的核心作用在于确保区块链网络的安全性和稳定性。以下是关于工作量证明机制在区块链中应用的详细解释:

1、确保区块链数据的完整性和一致性:在区块链网络中,每个节点都会维护一份完整的区块链数据副本。当有新的交易发生时,需要通过工作量证明机制来验证该交易的有效性,并将其打包成一个新的区块,然后添加到区块链的末尾。这个过程中,矿工需要执行大量的计算工作来找到一个满足特定条件的哈希值,这个哈希值将作为新区块的标识。由于哈希函数的特性,找到满足条件的哈希值需要耗费大量的计算资源,因此这个过程可以确保只有真正完成了工作量的矿工才能成功添加新区块,从而保证了区块链数据的完整性和一致性。

2、防止双重支付和篡改:在区块链网络中,由于每个区块都包含了前一个区块的哈希值,因此形成了一个不可篡改的链式结构。如果攻击者想要篡改某个区块的数据,就需要重新计算该区块及其之后所有区块的哈希值,这需要耗费巨大的计算资源。同时,由于工作量证明机制的存在,攻击者需要投入大量的计算资源来参与挖矿竞争,以期望获得添加新区块的权利。这使得攻击者想要篡改区块链数据的成本变得非常高昂,从而有效防止了双重支付和篡改等攻击行为。

3、奖励机制:在区块链网络中,矿工通过执行工作量证明机制来参与挖矿竞争。如果他们成功找到了满足条件的哈希值并成功添加了新区块,那么他们将获得一定的奖励(如比特币)。这种奖励机制激励了矿工们积极参与挖矿活动,并保证了区块链网络的稳定运行。

4、安全性和去中心化:工作量证明机制通过确保每个新区块都需要通过大量的计算工作来生成,从而保证了区块链网络的安全性。同时,由于每个节点都可以参与挖矿活动并有机会获得奖励,因此区块链网络具有去中心化的特性。这使得区块链网络不依赖于任何中心化的管理机构或硬件,从而避免了单点故障和权力集中的问题。

在正式开始写我们自己的区块链之前,先来简单验证感受一下所谓的 工作量证明机制

首先我们需要使用 npm 安装一下node.js 的第三方包:js-sha256,这是我们会用到的哈希函数,安装命令如下:

npm install js-sha256

在这里插入图片描述

安装完毕咧。

然后我们来简单使用一下 sha256 哈希函数:

在这里插入图片描述

运行结果如下:

在这里插入图片描述

不难发现对于不同的输入,哪怕只是一个很微小的改动,输出的结果都会是不一样的。

那么如果是输入相同的情况呢:

在这里插入图片描述

运行结果如下:

在这里插入图片描述

可以发现输入的数据如果一样,那么加密输出的结果会是完全一样的。

那么比特币(区块链技术的落地应用之一)究竟是怎样通过这样一个哈希函数的特点来实现 pow 机制的呢?

过程类似于:

“比特币系统现在需要得到一个开头值为 n 个 0 的哈希值,请告诉我该块的工作量是多少?”

我们写一个程序来完成这个事情:

在这里插入图片描述

上面这个程序用来检测要查找以两个 0 开头的哈希值的工作量,运行结果如下:

在这里插入图片描述

瞬间出结果,运算了一次就拿到结果了(当然有可能是巧合)。

我们将其设置为查找以前 4 个 0 开头的哈希值的工作量呢:

在这里插入图片描述

运行结果如下:

在这里插入图片描述

可以看到工作量一下就上去了,如果更大呢?求前 6 个0:

在这里插入图片描述

想要瞬间出结果就已经不可能了,而计算量也已经到达了 10095138 次。

在明白了基础概念之后,我们正式开始完成我们自己的区块链。

正文开始

简单区块链搭建

区块链,主要就是 区块 和 链 嘛。

因此我们来新建一个区块的数据结构,按照前文的说法,其包含三个内容:

在这里插入图片描述

运行结果如下:

在这里插入图片描述

接下来创建 链 的数据结构:

在这里插入图片描述

运行结果如下:

在这里插入图片描述

可以看见此时我们新建一个区块链的时候,创世区块就自动作为区块链的第一个数据块而存在了。

接下来是添加区块到链上:

在这里插入图片描述

测试一下:

在这里插入图片描述

运行结果如下:

在这里插入图片描述

可以看见我们的区块链已经形成啦。

但我们还没有对于每个添加进来的数据块进行判断,也就是要验证当前区块链是否合法,当前的数据有没有被篡改:

在这里插入图片描述

测试有没有被篡改:

在这里插入图片描述

运行结果如下:

在这里插入图片描述

可以看到返回结果为 true,说明链是有效的,没有遭到篡改。

那么我们再测试一下如果被篡改的情况:

在这里插入图片描述

运行结果如下:

在这里插入图片描述

加入工作量证明机制

我们现在的代码添加区块链是过于简单的,因为缺少了POW机制,因此我们要在添加区块的函数中加入我们的工作量证明机制,因此我们来实现一下这个东西。

要加肯定得加在我们添加区块到区块链上的 addBlockChain 这个函数里啦,因为工作量证明方法就是用来减缓增加新新块的一个速度的:

在这里插入图片描述

可以看见多加了一个 Block 类中的 mine 函数以及 Chain 类的一个新的参数 difficulty,我们加一下这个参数:

在这里插入图片描述

通过修改这个参数我们就可以实现动态的控制求前 difficulty 个 0 开头的哈希值这一项任务了。

接下来是实现一下这个 mine 函数,这个函数其实主要就实现了我们之前在 工作量证明机制 这一小节中所实现的那个简易版本的求前 x 个 0 开头的代码:

在这里插入图片描述

可以看见在 mine 函数中还调用了一个 getAnswer 方法,该方法根据区块链设置的 difficulty 的值来返回我们所要求的 0 的个数。

而这个 nonce 参数可以看见也是新增的,其实它不过就是我们之前那个例子里的 x 罢了,这里取名为 nonce 是有一定的历史渊源的:

在这里插入图片描述

作为计算机科学技术名词:
Nonce指一种在鉴别协议中仅被使用一次的数字。这种数字通常为随机数或者伪随机数,用于抵御重放攻击。在区块链中,Nonce是一串仅用一次的数字,它以特定的格式附加到区块中,并用于验证区块的完整性和有效性。

从代码中不难发现所做的事情和我们之前讲 POW 机制时一模一样,就是循环求出工作量 x 即可。

数字货币的产生

数字货币比特币的产生背景与全球经济环境密切相关。在2008年全球金融危机的冲击下,传统金融体系暴露出了许多弊端,如中心化、不透明和易受操控等问题。在这样的背景下,一位神秘的技术天才——中本聪(Satoshi Nakamoto)提出了比特币的概念,旨在通过一种全新的电子现金系统来解决这些问题。

中本聪在2008年11月1日在密码学邮件组上发布了《比特币:一种点对点的电子现金系统》白皮书,详细阐述了比特币的产生过程、基本原理以及运行机制。这份白皮书被誉为比特币的“圣经”,为比特币的诞生奠定了理论基础。

比特币的产生基于区块链技术。区块链是一个由多个区块组成的分布式数据库,每个区块都包含了前一个区块的哈希值和一定数量的交易记录。这种链式结构确保了数据的不可篡改性和公开透明性。

在比特币的产生过程中,矿工需要通过解决一个复杂的数学问题(即工作量证明)来争夺记账权。这个数学问题通常涉及到一个哈希函数和一个随机数(即nonce)。矿工需要不断调整nonce的值,直到找到一个满足特定条件的哈希值,这个哈希值就是新区块的标识符。

当矿工成功找到一个满足条件的哈希值时,他们将获得一定数量的比特币奖励。这个奖励是比特币系统为了激励矿工参与挖矿而设置的。随着比特币的供应量不断增加,挖矿奖励也会逐渐减少。

当矿工成功挖到一个新区块后,他们需要将该区块内的交易记录添加到区块链中。这些交易记录需要经过网络中的其他节点验证后才能被确认并永久记录在区块链上。

那么交易记录是啥?

比特币的交易记录是指在比特币网络上进行的所有交易的历史数据。这些交易记录包括每一笔交易的详细信息,如交易的时间、交易的金额、发送方和接收方的比特币地址等。这些记录是公开、透明和不可篡改的,任何人都可以查阅。

具体来说,当你发送或接收比特币时,这笔交易就会被记录在比特币的区块链上。区块链就像是一个公共的、分布式的账本,记录着比特币网络上的所有交易历史。每一个区块都包含了一定数量的交易记录,并且每个区块都被数字签名和时间戳标记,以确保其完整性和真实性。

由于比特币的交易记录是公开的,这意味着任何人都可以追踪和查看每一笔交易,从而增加了交易的透明度和可信度。这种机制使得比特币交易在很大程度上减少了欺诈和双重支付的风险。

接下来我们往我们的代码中加入数字货币这种东西以模拟比特币交易的行为:

第一步是新增一个数据结构也就是关于交易的类:

在这里插入图片描述

然后修改一下我们的 data 数据属性:

在这里插入图片描述

data原来我们设置的是string类型,但是现在应该让其成为一个交易对象的数组。

然后在 Block 上新增时间戳,这个时间戳也必须加入到哈希码的生成中(白皮书论文中是这么写的):

在这里插入图片描述

然后对区块链也需要进行一个改动:

在这里插入图片描述

最后还要增加一个挖矿的函数:

在这里插入图片描述

写测试用例:

在这里插入图片描述

运行结果如下:

在这里插入图片描述
在这里插入图片描述

从上图可以看到,挖到矿的矿工奖励为 50 个数字货币。

加入数字签名

数字签名(又称公钥数字签名)是一种利用密码技术生成的电子密码,用于标识签名者的身份以及签名者对电子文档的认可。这种签名只有信息的发送者才能产生,别人无法伪造,是对信息的发送者发送信息真实性的一个有效证明。

数字签名采用了规范的程序和科学的方法,用于鉴定签名人的身份,以及对一项电子数据内容的认可。它还能验证文件的原文在传输过程中有无变动,从而确保传输电子文件的完整性、真实性和不可抵赖性。

在数字签名中,每个人都有一对“钥匙”(数字身份),其中一个只有她/他本人知道(私钥),另一个公开的(公钥)。签名的时候用私钥,验证签名的时候用公钥。基于公钥密码体制和私钥密码体制都可以获得数字签名,目前主要是基于公钥密码体制的数字签名。

数字签名在网络安全、身份认证、数据完整性、不可否认性以及匿名性等方面有着重要的应用。它能够验证签字产生者的身份,以及产生签字的日期和时间,并且可用于证实被签消息的内容。此外,数字签名还可由第三方验证,从而能够解决通信双方的争议。

接下来我们在代码中简单验证一下这个事情:

首先需要安装第三方库:elliptic

安装命令如下:

npm i elliptic

在这里插入图片描述

npm中的elliptic是一个用于椭圆曲线加密的库。它提供了一个纯JavaScript实现的快速椭圆曲线密码学。椭圆曲线密码学是一种公钥密码学技术,其安全性基于椭圆曲线离散对数问题的困难性。elliptic库允许开发者使用椭圆曲线密码学进行加密、解密、签名和验证等操作。

我们使用这个库提供的公钥密码学技术来完成验证:

在这里插入图片描述

运行结果如下:

在这里插入图片描述

逻辑应该不难懂,不再赘述。

接下来我们就将这个数字签名的内容加入我们的区块链当中:

首先先改写一下我们的交易类:

在这里插入图片描述

测试用例如下:

在这里插入图片描述

运行结果如下:

在这里插入图片描述

可以看见签名是可以正常工作的。

写到这里的时候发现实在是需要改的细节太多了,涉及各个类的变化,因此建议可以参考上面数字签名的验证流程结合我的代码中的注释来弄懂,这里就不再赘述了。

最后截取了测试代码,演示一下效果即可:

在这里插入图片描述

运行结果如下:

在这里插入图片描述
在这里插入图片描述

  • 14
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

在地球迷路的怪兽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值