• 首页
  • 产品服务
  • 新闻资讯
  • 政策法规
  • 通知公告
  • 关于我们
    • 机构简介
    • 机构领导
    • 联系我们
    • 央视报道
    • 相关资质
  • 您所在的位置: 首页> 新闻资讯> 正文

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

    来源:币晓区块链 2018-08-13 21:37:11 244

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

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

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

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

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

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

    那么,区块链技术到底是什么样的,下面我们用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这样写 你就能玩转币圈

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

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

    区块链 JavaScript 挖矿

    本文来源: 币晓区块链 文章作者: 千淘万漉 我要纠错


    ">

    热门文章

    • 16 :区块链渗入各行各业 五大最佳使用典范
    • 17 :央视财经对话栏目《把脉区块链》,正面普及区块链技术
    • 18 :区块链+跨境结算:支付宝跨境汇款的创举
    • 19 :区块链是一场技术革命 每个人都在摸着石头过河
    • 21 :区块链自运转的核心:浅谈区块链共识机制的演化
    • 22 :高培勇:区块链需主动“对表”新金融时代
    • 23 :一文看懂国内区块链产业 到底哪块最赚钱?
    • 24 :2018世界区块链大会行业前瞻盘点
    • 25 :一句话告诉你什么是区块链3.0,未来区块链如何赚钱?
    • 26 :区块链:通向下一代互联网的钥匙

    百科

    比特币

    区块链

    加密货币

    以太坊

    快速链接
  • 首页
  • 产品与服务
  • 关于我们
  • 机构简介
  • 机构领导
  • 联系我们
  • 服务与支持
  • 电话咨询:400-847-0006
  • 技术支持:xieyu@adpanshi.com
  • 商务联系:sunhao8754@szfw.org
  • 市场合作:sunguangyi@szfw.org
  • 工作时间:9:00 - 18:00(工作日)
  • 中国移动通信联合会全球区块链产业研究院 版权所有 ©2018 未经许可 不得转载 京ICP备15016997号-2

    All Rights Reserved