纯干货 区块链用JavaScript这样写 你就能玩转币圈

自从区块链诞生以来,颠覆了互联网时代的疯狂,将科技进步推向了一个巅峰。区块链一时成为了比“大数据、云计算和人工智能”还要火爆的词,在这火爆之下像京东、腾讯、阿里等这样的大企业都蜂拥而至,入局开始研发区块链。

可能真正谈到区块链大多人想起的是比特币,因为相对来说炒币的人还是很多,对于比特币的开发技术没有多少人能够关注。且目前区块链并没有一个很清楚的定义,只是介绍了它是比特币的底层技术,究其底层技术是什么又成了一个疑问。所以单从理论角度来解说区块链的定义:

●区块链是一个在非安全环境中的分布式系统;

●采用密码学方式保证区块内已有数据的不可篡改性;

●采用了共识算法对新增数据达成共识。

综上具备这三个基本特性的就称之为区块链。

那么,区块链技术到底是什么样的,下面我们用JavaScript来创建一个简单的区块链,以便大家明白它的工作原理。

 步骤 

○实现一个基本的区块链

○POW机制的实现

○挖矿与交易奖励

1.1实现一个基本的区块链

研究实现前我们先得明白加密货币为什么要基于区块链实现?因为,区块链是由一个个任何人不可访问、不可篡改的区块构成,如果期间要添加一个区块,就必须得让剩余区块失效,否则它是不会再被改变的。也就是说做完交易后你肯定不希望有人再去变更交易。

1.1.1创造一个区块

既然说区块链是由一个个区块连接而成,那么这种区块的数据完整性就需要我们去考证,确保数据不被操纵、变更、因此就需要每个区块包含一个机遇其内容而计算出来的hash,同时也包含前一区块的hash。

如果用JavaScript来写大致就是:

纯干货 区块链用JavaScript这样写 你就能玩转币圈

需要解释的是("crypto-js/sha256"),因为JavaScript中不支持hash256,所以将crypto-js库引入。再定义一个构造函数,目的是初始化区块的属性。纯干货 区块链用JavaScript这样写 你就能玩转币圈表示每个区块都被赋予index属性,让它告诉我们当前区块在整个链上的位置。同时野生成了时间戳以及需要在区块里存储的一些数据。最后一个hash是指前一个区块的hash。

1.1.2创造一个链

要想将每个区块连接起来,就需要在Blockchain类中创建,JavaScript是这样实现的:

纯干货 区块链用JavaScript这样写 你就能玩转币圈

在构造函数里,我们需要创建一个包含创世区块的数组来初始化整个链。此时,第一个区块比较特殊,因为它不能指向前一个区块,所以可以调用以下方法:

●getLatestBlock()表示返回区块链上最新区块;

●add Block()表示添加新的区块到这条链上。

借此我们可以将上一个区块的hash添加到当前最新的区块中,这样也就可以保证整个链的完整性。因为我们如果变更了新区块中的内容,那么就需要重新计算他当前的hash值,计算完成后,再将这个区块放到链里(也就是一个数组);最后就要创建一个纯干货 区块链用JavaScript这样写 你就能玩转币圈来确保无人篡改过区块链,此时它会遍历所有区块检查自己的hash是否正确。

然后通过比较纯干货 区块链用JavaScript这样写 你就能玩转币圈来检查该区块是否正确指向上一个区块,如果正确它会返回true,指向错误会返回false,以此类推,将所有区块检查完毕。

1.1.3使用区块链

编写玩类就可以真正使用了。

纯干货 区块链用JavaScript这样写 你就能玩转币圈

创建一个区块链实例,且命名为SavjeeCoin,之后就要添加一些区块到链上。区块里可以放任何你想要的数据,以上只添加了一个带有amount属性的对象。

下面试一试不可变更的区块

纯干货 区块链用JavaScript这样写 你就能玩转币圈

一开始通过运行纯干货 区块链用JavaScript这样写 你就能玩转币圈来验证整个链的完整性。我们操作过任何区块,所以它会返回true。之后我将链上的第一个(索引为1)区块的数据进行了变更。之后我再次检查整个链的完整性,发现它返回了false。我们的整个链不再有效了。

二、POW机制的实现

经过上面的JavaScript做简单的区块链工作原理演示,发现仍然不完整,还是能够篡改系统数据,因此,我们就需要另一种机制来抵御这种攻击。下面一起走进这个防御区一探究竟。

快速创造了区块后将其添加到区块链中,却发现导致了下面三个问题:

●人们可以快速创建区块,然后在我们的链里塞满垃圾。大量的区块会导致我们区块链过载并让它无法使用。

●因为创建一个有效的区块太容易了,人们可以篡改链中的某一个区块,然后重新计算所有区块的 hash。即使它们已经篡改了区块,他们仍然可以以有效的区块来作为结束。

●你可以通过结合上述两个破绽来有效控制区块链。区块链由 P2P 网络驱动,其中节点会将区块添加到可用的最长链中。

所以你可以篡改区块,然后计算所有其他的区块,最后添加任意多你想要添加的区块。你最后会得到一个最长的链,所有的其他节点都会接受它,然后往上添加自己的区块。

此时,就需要一个合理的解决方案—pow。

 关于pow 

Pow首先是一项简单技术,是通过一定数量的计算来防止滥用;其次,在第一个区块链创造之前它就已经存在。

工作量是防止垃圾填充和篡改的关键。如果它需要大量算力,那么垃圾的填充也就失去了意义。

以比特币的场景为例:

比特币要求hash以特定0的数目来实现pow,在其场景下,一个区块含各种交易信息,那么我们肯定是不希望为了获取正确的hash而混淆那些数据。此时区块链就添加了一个Nonce值来解决这个问题(需要说明的是Nonce是用来查找有效hash次数的)。

挖矿就是在无法预测hash函数输出时,为满足hash之前的条件,寻求有效hash而创建的一个新区块。

在修改区块类并在构造函数中添加Nonce变量,将初始化值设为0。

纯干货 区块链用JavaScript这样写 你就能玩转币圈

获取新方法添加Nonce,并获取有效hash。

纯干货 区块链用JavaScript这样写 你就能玩转币圈

变更纯干货 区块链用JavaScript这样写 你就能玩转币圈函数

纯干货 区块链用JavaScript这样写 你就能玩转币圈

它们结合后得到新的区块类:

纯干货 区块链用JavaScript这样写 你就能玩转币圈

在区块链中增加一个新的属性,用于追踪整条链的难度,将它设为2.

纯干货 区块链用JavaScript这样写 你就能玩转币圈

改变 addBlock() 方法,以便在将其添加到链中之前确保实际挖到该区块:

纯干货 区块链用JavaScript这样写 你就能玩转币圈

现在pow可以作为防御遁甲抵挡攻击了!

三、挖矿与交易奖励

区块链创建好了,pow防护盾也有了,接下来我们需要给我们的矿工奖励。

 重构区块类 

目前我们的区块中已经拥有了previousHash,timestamp,data,hash和nonce属性。现在我们还需要将data改名为transactions,如下:

纯干货 区块链用JavaScript这样写 你就能玩转币圈

更改了区块类我们就需要同时更改它对应的calculateHash()函数

纯干货 区块链用JavaScript这样写 你就能玩转币圈

定义交易类,便于我们交易时锁定它的属性:

纯干货 区块链用JavaScript这样写 你就能玩转币圈

由于pow在区块链中可以稳定创建区块,在比特币的场景下,难度被设置为每10分钟创在一个新区块。那么就要创建一个新的属性,用于定义矿工劳动所获的奖励:

纯干货 区块链用JavaScript这样写 你就能玩转币圈

调用addBlock()方法,并重写,杜绝直接在链上添加区块。使交易添加到下一曲快中,因此将addBlock()更名为createTransaction():

纯干货 区块链用JavaScript这样写 你就能玩转币圈

 挖矿 

将新的交易添加处理到交易列表后,还需要将其清理并移入实际区块中。因此就要创建一个minePendingTransactions()方法,用它来挖掘所有新交易的区块,并向采矿者发送奖励。

纯干货 区块链用JavaScript这样写 你就能玩转币圈

值得注意的是,该方法采用了参数miningRewardAddress。如果你开始挖矿,你可以将你的钱包地址传递给此方法。一旦成功挖到矿,系统将创建一个新的交易来给你挖矿奖励。

 地址余额检索 

纯干货 区块链用JavaScript这样写 你就能玩转币圈

 测试 

完成以上工作后,我们需要检测代码运行情况:

纯干货 区块链用JavaScript这样写 你就能玩转币圈

目前交易处于待定状态,所以我们必须挖矿并获取挖矿所得的新地址:

纯干货 区块链用JavaScript这样写 你就能玩转币圈

检查账户余额:

纯干货 区块链用JavaScript这样写 你就能玩转币圈

结果输出0,很意外啊,仔细检查会发现系统会创建一个交易,然后会把挖矿奖励添加为新的待处理交易。这笔交易会包含在下一区块中,如果继续挖矿,会得到100的奖励。

纯干货 区块链用JavaScript这样写 你就能玩转币圈

现在我们可以在这个区块链上的区块中存储交易信息,并为矿工带来汇报。

这只是一个原理性的区块链实现,因为它还欠缺很多功能和奖励机制,今天我们只为论证区块链技术的概念来做工作原理的解释,具体的实现还需完整的编码实现。

本文来源: 币晓区块链 文章作者: 千淘万漉 我要纠错
声明:本文由入驻金色财经的作者撰写,观点仅代表作者本人,绝不代表金色财经赞同其观点或证实其描述。
比特币实时价格 ¥52361.72(数据来源:火币Pro)
    下一篇

小白的最新炒币经验,总有你需要的!