纯干货!区块链用JavaScript这样写,你就能玩转币圈!
Posted 币晓区块链
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了纯干货!区块链用JavaScript这样写,你就能玩转币圈!相关的知识,希望对你有一定的参考价值。
自从区块链诞生以来,颠覆了互联网时代的疯狂,将科技进步推向了一个巅峰。区块链一时成为了比“大数据、云计算和人工智能”还要火爆的词,在这火爆之下像京东、腾讯、阿里等这样的大企业都蜂拥而至,入局开始研发区块链。
可能真正谈到区块链大多人想起的是比特币,因为相对来说炒币的人还是很多,对于比特币的开发技术没有多少人能够关注。且目前区块链并没有一个很清楚的定义,只是介绍了它是比特币的底层技术,究其底层技术是什么又成了一个疑问。所以单从理论角度来解说区块链的定义:
●区块链是一个在非安全环境中的分布式系统;
●采用密码学方式保证区块内已有数据的不可篡改性;
●采用了共识算法对新增数据达成共识。
综上具备这三个基本特性的就称之为区块链。
那么,区块链技术到底是什么样的,下面我们用javascript来创建一个简单的区块链,以便大家明白它的工作原理。
步骤
○实现一个基本的区块链
○POW机制的实现
○挖矿与交易奖励
1.1实现一个基本的区块链
研究实现前我们先得明白加密货币为什么要基于区块链实现?因为,区块链是由一个个任何人不可访问、不可篡改的区块构成,如果期间要添加一个区块,就必须得让剩余区块失效,否则它是不会再被改变的。也就是说做完交易后你肯定不希望有人再去变更交易。
1.1.1创造一个区块
既然说区块链是由一个个区块连接而成,那么这种区块的数据完整性就需要我们去考证,确保数据不被操纵、变更、因此就需要每个区块包含一个机遇其内容而计算出来的hash,同时也包含前一区块的hash。
如果用JavaScript来写大致就是:
需要解释的是("crypto-js/sha256"),因为JavaScript中不支持hash256,所以将crypto-js库引入。再定义一个构造函数,目的是初始化区块的属性。表示每个区块都被赋予index属性,让它告诉我们当前区块在整个链上的位置。同时野生成了时间戳以及需要在区块里存储的一些数据。最后一个hash是指前一个区块的hash。
1.1.2创造一个链
要想将每个区块连接起来,就需要在Blockchain类中创建,JavaScript是这样实现的:
在构造函数里,我们需要创建一个包含创世区块的数组来初始化整个链。此时,第一个区块比较特殊,因为它不能指向前一个区块,所以可以调用以下方法:
●getLatestBlock()表示返回区块链上最新区块;
●add Block()表示添加新的区块到这条链上。
借此我们可以将上一个区块的hash添加到当前最新的区块中,这样也就可以保证整个链的完整性。因为我们如果变更了新区块中的内容,那么就需要重新计算他当前的hash值,计算完成后,再将这个区块放到链里(也就是一个数组);最后就要创建一个来确保无人篡改过区块链,此时它会遍历所有区块检查自己的hash是否正确。
然后通过比较来检查该区块是否正确指向上一个区块,如果正确它会返回true,指向错误会返回false,以此类推,将所有区块检查完毕。
1.1.3使用区块链
编写玩类就可以真正使用了。
创建一个区块链实例,且命名为SavjeeCoin,之后就要添加一些区块到链上。区块里可以放任何你想要的数据,以上只添加了一个带有amount属性的对象。
下面试一试不可变更的区块
一开始通过运行来验证整个链的完整性。我们操作过任何区块,所以它会返回true。之后我将链上的第一个(索引为1)区块的数据进行了变更。之后我再次检查整个链的完整性,发现它返回了false。我们的整个链不再有效了。
二、POW机制的实现
经过上面的JavaScript做简单的区块链工作原理演示,发现仍然不完整,还是能够篡改系统数据,因此,我们就需要另一种机制来抵御这种攻击。下面一起走进这个防御区一探究竟。
快速创造了区块后将其添加到区块链中,却发现导致了下面三个问题:
●人们可以快速创建区块,然后在我们的链里塞满垃圾。大量的区块会导致我们区块链过载并让它无法使用。
●因为创建一个有效的区块太容易了,人们可以篡改链中的某一个区块,然后重新计算所有区块的 hash。即使它们已经篡改了区块,他们仍然可以以有效的区块来作为结束。
●你可以通过结合上述两个破绽来有效控制区块链。区块链由 P2P 网络驱动,其中节点会将区块添加到可用的最长链中。
所以你可以篡改区块,然后计算所有其他的区块,最后添加任意多你想要添加的区块。你最后会得到一个最长的链,所有的其他节点都会接受它,然后往上添加自己的区块。
此时,就需要一个合理的解决方案—pow。
关于pow
Pow首先是一项简单技术,是通过一定数量的计算来防止滥用;其次,在第一个区块链创造之前它就已经存在。
工作量是防止垃圾填充和篡改的关键。如果它需要大量算力,那么垃圾的填充也就失去了意义。
以比特币的场景为例:
比特币要求hash以特定0的数目来实现pow,在其场景下,一个区块含各种交易信息,那么我们肯定是不希望为了获取正确的hash而混淆那些数据。此时区块链就添加了一个Nonce值来解决这个问题(需要说明的是Nonce是用来查找有效hash次数的)。
挖矿就是在无法预测hash函数输出时,为满足hash之前的条件,寻求有效hash而创建的一个新区块。
在修改区块类并在构造函数中添加Nonce变量,将初始化值设为0。
获取新方法添加Nonce,并获取有效hash。
变更函数
它们结合后得到新的区块类:
在区块链中增加一个新的属性,用于追踪整条链的难度,将它设为2.
改变 addBlock() 方法,以便在将其添加到链中之前确保实际挖到该区块:
现在pow可以作为防御遁甲抵挡攻击了!
三、挖矿与交易奖励
区块链创建好了,pow防护盾也有了,接下来我们需要给我们的矿工奖励。
重构区块类
目前我们的区块中已经拥有了previousHash,timestamp,data,hash和nonce属性。现在我们还需要将data改名为transactions,如下:
更改了区块类我们就需要同时更改它对应的calculateHash()函数
定义交易类,便于我们交易时锁定它的属性:
由于pow在区块链中可以稳定创建区块,在比特币的场景下,难度被设置为每10分钟创在一个新区块。那么就要创建一个新的属性,用于定义矿工劳动所获的奖励:
调用addBlock()方法,并重写,杜绝直接在链上添加区块。使交易添加到下一曲快中,因此将addBlock()更名为createTransaction():
挖矿
将新的交易添加处理到交易列表后,还需要将其清理并移入实际区块中。因此就要创建一个minePendingTransactions()方法,用它来挖掘所有新交易的区块,并向采矿者发送奖励。
测试
完成以上工作后,我们需要检测代码运行情况:
检查账户余额:
结果输出0,很意外啊,仔细检查会发现系统会创建一个交易,然后会把挖矿奖励添加为新的待处理交易。这笔交易会包含在下一区块中,如果继续挖矿,会得到100的奖励。
现在我们可以在这个区块链上的区块中存储交易信息,并为矿工带来汇报。
这只是一个原理性的区块链实现,因为它还欠缺很多功能和奖励机制,今天我们只为论证区块链技术的概念来做工作原理的解释,具体的实现还需完整的编码实现。
本文章内容为币晓区块链原创首发,如需转载,请联系我们并注明出处,对未经许可擅自使用者,将保留追究其法律责任的权利。
- end -
作者 | 千淘万漉
喜欢今天的内容吗?
看完记得分享给更多的人
即可加入船长区块链社区
以上是关于纯干货!区块链用JavaScript这样写,你就能玩转币圈!的主要内容,如果未能解决你的问题,请参考以下文章