当前位置:首页 > 其它计算机 > 区块链电子书网盘下载
区块链2.0实战:以太坊+Solidity编程从入门到精通 区块链2.0实战:以太坊+Solidity编程从入门到精通
码农之家

码农之家 提供上传

资源
27
粉丝
40
喜欢
351
评论
9

    区块链2.0实战:以太坊+Solidity编程从入门到精通 PDF 完整超清版

    区块链电子书
    • 发布时间:

    给大家带来的一篇关于区块链相关的电子书资源,介绍了关于区块链、以太坊、Solidity方面的内容,本书是由电子工业出版社出版,格式为PDF,资源大小179.2 MB,黄振东编写,目前豆瓣、亚马逊、当当、京东等电子书综合评分为:9.3,更多相关的学习资源可以参阅DB2入门HTML5labview实战需求Netty、等栏目。

  • 区块链2.0实战:以太坊+Solidity编程从入门到精通 PDF 下载
  • 下载地址:https://pan.baidu.com/s/1VldCjP49Bw3t-Dbi0HVJp
  • 提取码:48s4
  • 区块链2.0实战:以太坊+Solidity编程从入门到精通 PDF

    系统软件:包揽区块链4个层级、12个控制模块、100 知识结构图
    技术专业:5年区块链科学研究工作经验,紧抓全世界流行区块链开发设计
    深层次:从宏观经济到外部经济,从整体到部分,深层编解码硬核专业知识
    最前沿:超出40组官方网强烈推荐源代码,效仿流行通用性编程实例

    互联网中的各种各样区块链专业知识尽管许多但无法搭建成体系,这书依据读者的要求,以详细的体系详细介绍了当今*时髦的区块链技术。本书从整体来看,详细介绍了区块链的发展史、典型性运用、在社会发展各层面的运用市场前景,并进一步深层次到基本技术性方面,详解了区块链技术的每个构成,*后详细介绍了区块链2.0——以太坊的发展趋势状况和开发设计编程,正确引导这书读者由远及近、由理性到客观、从基本原理到实践活动,创建起了全方位的区块链知识结构,正确引导读者逐渐深层次地把握区块链技术,并具有运用以太坊程序语言开发设计分布式应用程序流程的分步工作能力。这书以经济全球化的目光致力于区块链技术的体系构建,精准定位高档,专业能力强,內容全方位,有利于实际操作,既合适金融业的项目投资工作人员科学研究和把握区块链的技术性与经济收益,也合适想在区块链行业从业自主创业发展趋势的创业人,可以做为编程开发者的参考文献,也适用各种想掌握区块链技术的大专学校做为学习材料。

    目录

    • 第1章 区块链基础 1
    • 1.1 什么是区块链 1
    • 1.1.1 定义区块链 2
    • 1.1.2 区块链运行流程和特点 5
    • 1.1.3 区块链类型 6
    • 1.2 区块链的发展经过和现状 7
    • 1.2.1 区块链产生的背景 7
    • 1.2.2 比特币的诞生 9
    • 1.2.3 比特币的底层技术是区块链 11
    • 1.2.4 区块链全球发展的不均衡特点 12
    • 1.2.5 区块链在全球的发展现状 13
    • 1.3 区块链在中国的发展现状 18
    • 1.3.1 重视底层突破,区块链技术创新加速 18
    • 1.3.2 资本快速进入,区块链融资增长迅猛 19
    • 1.3.3 全产业链布局,区块链应用领域逐步拓展 19
    • 1.3.4 抱团发展,各种区块链行业组织纷纷成立 20
    • 1.4 中国区块链行业发展前景 21
    • 1.4.1 90后创业者人群大量入场 22
    • 1.4.2 大型企业积极参与,区块链技术基础更加深厚 22
    • 1.4.3 各地政府高度支持区块链 23
    • 第2章 区块链的商业价值 24
    • 2.1 区块链在银行业的应用 24
    • 2.1.1 区块链对银行业的改变 25
    • 2.1.2 国内银行业的区块链应用 25
    • 2.2 区块链与电子商务 28
    • 2.3 区块链在法律行业的应用 30
    • 2.3.1 区块链证据 31
    • 2.3.2 智能交易 31
    • 2.3.3 区块链权证 32
    • 2.4 区块链应用于影音娱乐和媒体业 33
    • 2.5 区块链在医疗行业的应用 35
    • 2.6 结语 37
    • 第3章 区块链技术原理 39
    • 3.1 比特币带来了区块链 39
    • 3.2 比特币白皮书 41
    • 3.2.1 简介 41
    • 3.2.2 交易 42
    • 3.2.3 时间戳服务器 43
    • 3.2.4 工作量证明 44
    • 3.2.5 网络 45
    • 3.2.6 激励 46
    • 3.2.7 回收硬盘空间 46
    • 3.2.8 简化的支付确认 47
    • 3.2.9 价值的组合与分割 48
    • 3.2.10 隐私 49
    • 3.2.11 计算 49
    • 3.2.12 结论 52
    • 3.3 比特币系统的参与者 53
    • 3.4 比特币区块 56
    • 3.4.1 比特币交易过程 56
    • 3.4.2 比特币挖矿 57
    • 3.5 长链与短链 59
    • 3.6 比特币的安全性 61
    • 3.7 比特币挖矿设备的发展 62
    • 3.7.1 比特币挖矿设备的发展阶段 63
    • 3.7.2 矿机与矿场 64
    • 3.7.3 矿池 66
    • 3.7.4 云挖矿的应用 68
    • 3.8 比特币交易中的非对称加密 69
    • 3.8.1 非对称加密原理 69
    • 3.8.2 生成钱包地址 72
    • 3.8.3 交易加密过程 73
    • 3.9 从比特币到区块链 75
    • 3.10 区块链的系统框架 77
    • 3.11 分布式网络 79
    • 3.11.1 分布式网络(又称P2P网络) 79
    • 3.11.2 分布式网络的特点 80
    • 3.11.3 分布式网络的两种架构 81
    • 3.12 广播与验证机制 83
    • 3.12.1 广播 84
    • 3.12.2 验证 85
    • 第4章 区块链共识机制 87
    • 4.1 共识机制的意义 87
    • 4.2 工作量证明机制(PoW) 88
    • 4.2.1 哈希函数 89
    • 4.2.2 工作量证明的基本原理 90
    • 4.2.3 比特币的工作量证明过程 91
    • 4.2.4 工作量证明机制PoW的优缺点 94
    • 4.3 权益证明机制(PoS) 94
    • 4.3.1 PoS与PoW的区别 95
    • 4.3.2 PoS区块创建 98
    • 4.3.3 PoS发展过程 99
    • 4.4 授权股权证明机制(DPoS) 100
    • 4.4.1 DPoS概述 100
    • 4.4.2 选举见证人 101
    • 4.4.3 授权代表 102
    • 4.5 区块链的三大类型 103
    • 4.5.1 公有链 103
    • 4.5.2 私有链 105
    • 4.5.3 联盟链 107
    • 第5章 区块链数据结构 110
    • 5.1 区块链的数据结构 110
    • 5.1.1 区块的数据结构 111
    • 5.1.2 区块链数据结构的技术基础 112
    • 5.1.3 哈希值 113
    • 5.1.4 Merkle根 114
    • 5.1.5 时间戳 117
    • 5.1.6 难度目标值Difficulty Target 118
    • 5.1.7 Nonce随机数 120
    • 5.2 区块链技术的算法 121
    • 5.2.1 哈希算法概况 121
    • 5.2.2 SHA256算法 124
    • 5.3 椭圆曲线加密算法 131
    • 5.3.1 椭圆曲线加密算法的特点 131
    • 5.3.2 椭圆曲线加密算法的数学原理 132
    • 5.3.3 椭圆曲线加密算法的加密原理 138
    • 5.4 区块链运行机理 140
    • 5.5 区块链的交易机理 141
    • 5.5.1 交易流程 141
    • 5.5.2 比特币钱包 143
    • 5.5.3 交易身份验证 144
    • 5.6 区块链的造链机理 146
    • 5.6.1 验证接收信息 146
    • 5.6.2 创建区块 149
    • 5.7 区块数据解读 154
    • 第6章 以太坊Ethereum区块链 162
    • 6.1 以太坊概述 162
    • 6.2 以太坊的创立和发展 163
    • 6.3 以太坊技术原理 166
    • 6.3.1 以太坊与比特币的联系 166
    • 6.3.2 以太坊账户 168
    • 6.3.3 交易和消息 169
    • 6.3.4 燃料(Gas) 170
    • 6.3.5 合约 172
    • 6.3.6 智能合约示例 178
    • 6.3.7 以太坊挖矿 180
    • 6.3.8 以太坊区块 184
    • 第7章 以太坊应用开发基础 196
    • 7.1 以太坊开发环境的建立 196
    • 7.2 Geth开发环境 199
    • 7.2.1 初次启动 199
    • 7.2.2 命令行安装模式 200
    • 7.2.3 Geth的使用 201
    • 7.2.4 Geth在私有链上的应用 203
    • 7.3 轻节点模式 208
    • 7.3.1 Ganache图形界面 208
    • 7.3.2 安装Truffle 210
    • 7.3.3 运行Ganache 212
    • 7.4 网页模式 214
    • 7.5 Mist浏览器 218
    • 7.5.1 Mist安装 219
    • 7.5.2 Mist应用 222
    • 7.6 用MetaMask建立开发账户 226
    • 7.7 以太坊开发的编程语言Solidity 230
    • 7.7.1 Solidity简介 231
    • 7.7.2 Solidity语言的常用语句 231
    • 7.7.3 Solidity程序初步解读 237
    • 第8章 Solidity开发基础 240
    • 8.1 Solidity语言的数据类型 241
    • 8.1.1 数值类型 241
    • 8.1.2 地址类型 243
    • 8.1.3 字节数组 245
    • 8.1.4 地址常量 246
    • 8.1.5 有理数和整数常量 246
    • 8.1.6 字符串常量 247
    • 8.1.7 十六进制常量 248
    • 8.1.8 枚举类型 248
    • 8.1.9 函数类型 249
    • 8.1.10 数据位置 252
    • 8.1.11 数组 253
    • 8.1.12 结构structs 256
    • 8.1.13 映射(mapping) 258
    • 8.1.14 包含左值的运算符 259
    • 8.1.15 删除delete 259
    • 8.1.16 基本类型的转换 260
    • 8.1.17 类型推导 261
    • 8.2 Soldity语言的表达式和控制结构 262
    • 8.2.1 函数的输入参数和输出参数 262
    • 8.2.2 控制结构 263
    • 8.2.3 返回多元值 263
    • 8.2.4 函数调用 263
    • 8.2.5 函数参数的显名调用 264
    • 8.2.6 省略函数参数的名称 265
    • 8.2.7 在合约中创建新合约 265
    • 8.2.8 解构赋值和返回多元值 266
    • 8.2.9 范围和声明 267
    • 8.2.10 错误处理:断言、请求、还原与异常 268
    • 8.3 以太坊合约 271
    • 8.3.1 创建合约 271
    • 8.3.2 可见性 273
    • 8.3.3 取值函数 275
    • 8.3.4 函数修饰符 276
    • 8.3.5 常数状态变量 278
    • 8.3.6 视图函数 278
    • 8.3.7 纯函数(Pure Functions) 279
    • 8.3.8 后备函数(Fallback Functions) 279
    • 8.3.9 函数重载 280
    • 8.3.10 事件 281
    • 8.3.11 继承 283
    • 8.3.12 构造器 286
    • 8.3.13 抽象合约 287
    • 8.3.14 接口 288
    • 8.3.15 库 288
    • 8.3.16 用于“using for” 292
    • 8.4 Solidity汇编 293
    • 8.4.1 内联汇编 293
    • 8.4.2 句法 295
    • 8.4.3 操作码 295
    • 8.4.4 访问外部变量和函数 298
    • 8.4.5 本地汇编变量的声明 299
    • 8.4.6 赋值 300
    • 8.4.7 if语句 300
    • 8.4.8 switch语句 300
    • 8.4.9 循环 301
    • 8.4.10 函数 302
    • 8.4.11 独立汇编 302
    • 第9章 Solidity语言开发以太坊游戏 305
    • 9.1 以太坊游戏的特点 305
    • 9.2 以太坊游戏开发准备 307
    • 9.3 以太坊游戏Influence代码框架 309
    • 9.4 以太坊游戏Influence源代码解读 312
    • 9.4.1 游戏界面 313
    • 9.4.2 库文件lib 315
    • 9.4.3 游戏主功能:小行星拍卖 324
    • 9.4.4 游戏主功能:小行星代币 332
    • 9.4.5 小结 342
    • 后记 深入区块链,用技术改变未来 343

    读书笔记

    JavaScript实现区块链

    几乎每个人都听说过像比特币和以太币这样的加密货币,但是只有极少数人懂得隐藏在它们背后的技术。在这篇文中,我将会用JavaScript来创建一个简单的区块链来演示它们的内部究竟是如何工作的。我将会称之为SavjeeCoin!

    全文分为三个部分:

    1. part1:实现一个基本的区块链
    2. part2:实现POW
    3. part3:交易与挖矿奖励

    Part1:实现一个基本的区块链

    区块链

    区块链是由一个个任何人都可以访问的区块构成的公共数据库。这好像没什么特别的,不过它们有一个有趣的属性:它们是不可变的。一旦一个区块被添加到区块链中,除非让剩余的其余区块失效,否则它是不会再被改变的。

    这就是为什么加密货币是基于区块链的原因。你肯定不希望人们在交易完成后再变更交易!

    创造一个区块

    区块链是由许许多多的区块链接在一起的(这听上去好像没毛病..)。链上的区块通过某种方式允许我们检测到是否有人操纵了之前的任何区块。

    那么我们如何确保数据的完整性呢?每个区块都包含一个基于其内容计算出来的hash。同时也包含了前一个区块的hash。

    下面是一个区块类用JavaScript写出来大致的样子:

    const SHA256 = require("crypto-js/sha256");
    class Block {
     constructor(index, timestamp, data, previousHash = '') {
     this.index = index;
     this.previousHash = previousHash;
     this.timestamp = timestamp;
     this.data = data;
     this.hash = this.calculateHash();
     }
     calculateHash() {
     return SHA256(this.index + this.previousHash + this.timestamp + JSON.stringify(this.data)).toString();
     }
    }

    因为JavaScript中并不支持sha256所以我引入了 crypto-js 库。然后我定义了一个构造函数来初始化我区块的属性。每一个区块上都被赋予了 index 属性来告知我们这个区块在整个链上的位置。我们同时也生成了一个时间戳,以及需要在区块里存储的一些数据。最后是前一个区块的hash。

    创造一个链

    现在我们可以在Blockchain类中将区块链接起来了!下面是用JavaScript实现的代码:

    class Blockchain{
     constructor() {
     this.chain = [this.createGenesisBlock()];
     }
     createGenesisBlock() {
     return new Block(0, "01/01/2017", "Genesis block", "0");
     }
     getLatestBlock() {
     return this.chain[this.chain.length - 1];
     }
     addBlock(newBlock) {
     newBlock.previousHash = this.getLatestBlock().hash;
     newBlock.hash = newBlock.calculateHash();
     this.chain.push(newBlock);
     }
     isChainValid() {
     for (let i = 1; i < this.chain.length; i++){
      const currentBlock = this.chain[i];
      const previousBlock = this.chain[i - 1];
      if (currentBlock.hash !== currentBlock.calculateHash()) {
      return false;
      }
      if (currentBlock.previousHash !== previousBlock.hash) {
      return false;
      }
     }
     return true;
     }
    }

    在构造函数里,我通过创建一个包含创世块的数组来初始化整个链。第一个区块是特殊的,因为它不能指向前一个区块。我还添加了下面两个方法:

    • getLatestBlock() 返回我们区块链上最新的区块。
    • addBlock() 负责将新的区块添加到我们的链上。为此,我们将前一个区块的hash添加到我们新的区块中。这样我们就可以保持整个链的完整性。因为只要我们变更了最新区块的内容,我们就需要重新计算它的hash。当计算完成后,我将把这个区块推进链里(一个数组)。

    最后,我创建一个 isChainValid() 来确保没有人篡改过区块链。它会遍历所有的区块来检查每个区块的hash是否正确。它会通过比较 previousHash 来检查每个区块是否指向正确的上一个区块。如果一切都没有问题它会返回 true 否则会返回 false 。

    使用区块链

    我们的区块链类已经写完啦,可以真正的开始使用它了!

    let savjeeCoin = new Blockchain();
    savjeeCoin.addBlock(new Block(1, "20/07/2017", { amount: 4 }));
    savjeeCoin.addBlock(new Block(2, "20/07/2017", { amount: 8 }));

    在这里我仅仅是创建了一个区块链的实例,并且命名它为SavjeeCoin!之后我在链上添加了一些区块。区块里可以包含任何你想要放的数据,不过在上面的代码里,我选择添加了一个带有 amount 属性的对象。

    试着操作吧!

    在介绍里我曾说过区块链是不可变的。一旦添加,区块就不可能再变更了。让我们试一下!

    // 检查是否有效(将会返回true)
    console.log('Blockchain valid? ' + savjeeCoin.isChainValid());
    // 现在尝试操作变更数据
    savjeeCoin.chain[1].data = { amount: 100 };
    // 再次检查是否有效 (将会返回false)
    console.log("Blockchain valid? " + savjeeCoin.isChainValid());

    我会在一开始通过运行 isChainValid() 来验证整个链的完整性。我们操作过任何区块,所以它会返回true。

    之后我将链上的第一个(索引为1)区块的数据进行了变更。之后我再次检查整个链的完整性,发现它返回了false。我们的整个链不再有效了。

    结论

    这个小栗子还远未达到完成的程度。它还没有实现POW(工作量证明机制)或P2P网络来与其它矿工来进行交流。

    但他确实证明了区块链的工作原理。许多人认为原理会非常复杂,但这篇文章证明了区块链的基本概念是非常容易理解和实现的。

    Part2:实现POW(proof-of-work:工作量证明)

    在part1中我们用JavaScript创建了一个简单的区块链来演示区块链的工作原理。不过这个实现并不完整,很多人发现依旧可以篡改该系统。没错!我们的区块链需要另一种机制来抵御攻击。那么让我们来看看我们该如何做到这一点!

    问题

    现在我们可以很快的创造区块然后非常迅速的将它们添加进我们的区块链中。不过这导致了三个问题:

    • 第一:人们可以快速创建区块然后在我们的链里塞满垃圾。大量的区块会导致我们区块链过载并让其无法使用。
    • 第二:因为创建一个有效的区块太容易了,人们可以篡改链中的某一个区块,然后重新计算所有区块的hash。即使它们已经篡改了区块,他们仍然可以以有效的区块来作为结束。
    • 第三:你可以通过结合上述两个破绽来有效控制区块链。区块链由p2p网络驱动,其中节点会将区块添加到可用的最长链中。所以你可以篡改区块,然后计算所有其他的区块,最后添加多任意你想要添加的区块。你最后会得到一个最长的链,所有的其它节点都会接受它然后往上添加自己的区块。

    显然我们需要一个方案来解决这些问题:POW。

    什么是POW

    POW是在第一个区块链被创造之前就已经存在的一种机制。这是一项简单的技术,通过一定数量的计算来防止滥用。工作量是防止垃圾填充和篡改的关键。如果它需要大量的算力,那么填充垃圾就不再值得。

    比特币通过要求hash以特定0的数目来实现POW。这也被称之为 难度

    不过等一下!一个区块的hash怎么可以改变呢?在比特币的场景下,一个区块包含有各种金融交易信息。我们肯定不希望为了获取正确的hash而混淆了那些数据。

    为了解决这个问题,区块链添加了一个 nonce 值。Nonce是用来查找一个有效Hash的次数。而且,因为无法预测hash函数的输出,因此在获得满足难度条件的hash之前,只能大量组合尝试。寻找到一个有效的hash(创建一个新的区块)在圈内称之为挖矿。

    在比特币的场景下,POW确保每10分钟只能添加一个区块。你可以想象垃圾填充者需要多大的算力来创造一个新区块,他们很难欺骗网络,更不要说篡改整个链。

    实现POW

    我们该如何实现呢?我们先来修改我们区块类并在其构造函数中添加Nonce变量。我会初始化它并将其值设置为0。

    constructor(index, timestamp, data, previousHash = '') {
     this.index = index;
     this.previousHash = previousHash;
     this.timestamp = timestamp;
     this.data = data;
     this.hash = this.calculateHash();
     this.nonce = 0;
    }

    我们还需要一个新的方法来增加Nonce,直到我们获得一个有效hash。强调一下,这是由难度决定的。所以我们会收到作为参数的难度。

    mineBlock(difficulty) {
     while (this.hash.substring(0, difficulty) !== Array(difficulty + 1).join("0")) {
      this.nonce++;
      this.hash = this.calculateHash();
     }
     console.log("BLOCK MINED: " + this.hash);
    }

    最后,我们还需要更改一下 calculateHash() 函数。因为目前他还没有使用Nonce来计算hash。

    calculateHash() {
     return SHA256(this.index +
     this.previousHash +
     this.timestamp +
     JSON.stringify(this.data) +
     this.nonce
     ).toString();
    }

    将它们结合在一起,你会得到如下所示的区块类:

    class Block {
     constructor(index, timestamp, data, previousHash = '') {
     this.index = index;
     this.previousHash = previousHash;
     this.timestamp = timestamp;
     this.data = data;
     this.hash = this.calculateHash();
     this.nonce = 0;
     }
     calculateHash() {
     return SHA256(this.index + this.previousHash + this.timestamp + JSON.stringify(this.data) + this.nonce).toString();
     }
     mineBlock(difficulty) {
     while (this.hash.substring(0, difficulty) !== Array(difficulty + 1).join("0")) {
      this.nonce++;
      this.hash = this.calculateHash();
     }
     console.log("BLOCK MINED: " + this.hash);
     }
    }

    修改区块链

    现在,我们的区块已经拥有Nonce并且可以被开采了,我们还需要确保我们的区块链支持这种新的行为。让我们先在区块链中添加一个新的属性来跟踪整条链的难度。我会将它设置为2(这意味着区块的hash必须以2个0开头)。

    constructor() {
     this.chain = [this.createGenesisBlock()];
     this.difficulty = 2;
    }

    现在剩下要做的就是改变 addBlock() 方法,以便在将其添加到链中之前确保实际挖到该区块。下面我们将难度传给区块。

    addBlock(newBlock) {
     newBlock.previousHash = this.getLatestBlock().hash;
     newBlock.mineBlock(this.difficulty);
     this.chain.push(newBlock);
    }


    大功告成!我们的区块链现在拥有了POW来抵御攻击了。

    测试

    现在让我们来测试一下我们的区块链,看看在POW下添加一个新区块会有什么效果。我将会使用之前的代码。我们将创建一个新的区块链实例然后往里添加2个区块。

    let savjeeCoin = new Blockchain();
    console.log('Mining block 1');
    savjeeCoin.addBlock(new Block(1, "20/07/2017", { amount: 4 }));
    console.log('Mining block 2');
    savjeeCoin.addBlock(new Block(2, "20/07/2017", { amount: 8 }));

    如果你运行了上面的代码,你会发现添加新区块依旧非常快。这是因为目前的难度只有2(或者你的电脑性能非常好)。

    如果你创建了一个难度为5的区块链实例,你会发现你的电脑会花费大概十秒钟来挖矿。随着难度的提升,你的防御攻击的保护程度越高。

    免责声明

    就像之前说的:这绝不是一个完整的区块链。它仍然缺少很多功能(像P2P网路)。这只是为了说明区块链的工作原理。

    并且:由于单线程的原因,用JavaScript来挖矿并不快。

    Part3:交易与挖矿奖励

    在前面两部分我们创建了一个简单的区块链,并且加入了POW来抵御攻击。然而我们在途中也偷了懒:我们的区块链只能在一个区块中存储一笔交易,而且矿工没有奖励。现在,让我们解决这个问题!

    重构区块类

    现在一个区块拥有 index , previousHash , timestamp , data , hash 和 nonce 属性。这个 index 属性并不是很有用,事实上我甚至不知道为什么开始我要将它添加进去。所以我把它移除了,同时将 data 改名为 transactions 来更语义化。

    class Block{
     constructor(timestamp, transactions, previousHash = '') {
     this.previousHash = previousHash;
     this.timestamp = timestamp;
     this.transactions = transactions;
     this.hash = this.calculateHash();
     this.nonce = 0;
     }
    }

    当我们改变区块类时,我们也必须更改 calculateHash() 函数。现在它还在使用老旧的 index 和 data 属性。

    calculateHash() {
     return SHA256(this.previousHash + this.timestamp + JSON.stringify(this.transactions) + this.nonce).toString();
    }

    交易类

    在区块内,我们将可以存储多笔交易。因此我们还需要定义一个交易类,一边我们可以锁定交易应当具有的属性:

    class Transaction{
     constructor(fromAddress, toAddress, amount){
     this.fromAddress = fromAddress;
     this.toAddress = toAddress;
     this.amount = amount;
     }
    }

    这个交易例子非常的简单,仅仅包含了发起方( fromAddress )和接受方( toAddress )以及数量。如果有需求,你也可以在里面加入更多字段,不过这个只是为了最小实现。

    调整我们的区块链

    当前的最大任务:调整我们的区块链来适应这些新变化。我们需要做的第一件事就是存储待处理交易的地方。

    正如你所知道的,由于POW,区块链可以稳定的创建区块。在比特币的场景下,难度被设置成大约每10分钟创建一个新区块。但是,是可以在创造两个区块之间提交新的交易。

    为了做到这一点,首先需要改变我们区块链的构造函数,以便他可以存储待处理的交易。我们还将创造一个新的属性,用于定义矿工获得多少钱作为奖励:

    class Blockchain{
     constructor() {
      this.chain = [this.createGenesisBlock()];
      this.difficulty = 5;
      // 在区块产生之间存储交易的地方
      this.pendingTransactions = [];
      // 挖矿回报
      this.miningReward = 100;
     }
    }

    下一步,我们将调整我们的 addBlock() 方法。不过我的调整是指删掉并重写它!我们将不再允许人们直接为链上添加区块。相反,他们必须将交易添加至下一个区块中。而且我们将 addBlock() 更名为 createTransaction() ,这看起来更语义化:

    createTransaction(transaction) {
     // 这里应该有一些校验!
     // 推入待处理交易数组
     this.pendingTransactions.push(transaction);
    }

    挖矿

    人们现在可以将新的交易添加到待处理交易的列表中。但无论如何,我们需要将他们清理掉并移入实际的区块中。为此,我们来创建一个 minePendingTransactions() 方法。这个方法不仅会挖掘所有待交易的新区块,而且还会向采矿者发送奖励。

    minePendingTransactions(miningRewardAddress) {
     // 用所有待交易来创建新的区块并且开挖..
     let block = new Block(Date.now(), this.pendingTransactions);
     block.mineBlock(this.difficulty);
     // 将新挖的看矿加入到链上
     this.chain.push(block);
     // 重置待处理交易列表并且发送奖励
     this.pendingTransactions = [
       new Transaction(null, miningRewardAddress, this.miningReward)
     ];
    }

    请注意,该方法采用了参数 miningRewardAddress 。如果你开始挖矿,你可以将你的钱包地址传递给此方法。一旦成功挖到矿,系统将创建一个新的交易来给你挖矿奖励(在这个栗子里是100枚币)。

    有一点需要注意的是,在这个栗子中,我们将所有待处理交易一并添加到一个区块中。但实际上,由于区块的大小是有限制的,所以这是行不通的。在比特币里,一个区块的大小大概是2Mb。如果有更多的交易能够挤进一个区块,那么矿工可以选择哪些交易达成哪些交易不达成(通常情况下费用更高的交易容易获胜)。

    地址的余额

    在测试我们的代码钱让我们再做一件事!如果能够检查我们区块链上地址的余额将会更好。

    getBalanceOfAddress(address){
     let balance = 0; // you start at zero!
     // 遍历每个区块以及每个区块内的交易
     for(const block of this.chain){
      for(const trans of block.transactions){
       // 如果地址是发起方 -> 减少余额
       if(trans.fromAddress === address){
        balance -= trans.amount;
       }
       // 如果地址是接收方 -> 增加余额
       if(trans.toAddress === address){
        balance += trans.amount;
       }
      }
     }
     return balance;
    }

    测试

    好吧,我们已经完成并可以最终一切是否可以正常工作!为此,我们创建了一些交易:

    let savjeeCoin = new Blockchain();
    console.log('Creating some transactions...');
    savjeeCoin.createTransaction(new Transaction('address1', 'address2', 100));
    savjeeCoin.createTransaction(new Transaction('address2', 'address1', 50));

    这些交易目前都处于等待状态,为了让他们得到证实,我们必须开始挖矿:

    console.log('Starting the miner...');
    savjeeCoin.minePendingTransactions('xaviers-address');

    当我们开始挖矿,我们也会传递一个我们想要获得挖矿奖励的地址。在这种情况下,我的地址是 xaviers-address (非常复杂!)。

    之后,让我们检查一下 xaviers-address 的账户余额:

    console.log('Balance of Xaviers address is', savjeeCoin.getBalanceOfAddress('xaviers-address'));
    // 输出: 0

    我的账户输出竟然是0?!等等,为什么?难道我不应该得到我的挖矿奖励么?那么,如果你仔细观察代码,你会看到系统会创建一个交易,然后将您的挖矿奖励添加为新的待处理交易。这笔交易将会包含在下一个区块中。所以如果我们再次开始挖矿,我们将收到我们的100枚硬币奖励!

    console.log('Starting the miner again!');
    savjeeCoin.minePendingTransactions("xaviers-address");
    console.log('Balance of Xaviers address is', savjeeCoin.getBalanceOfAddress('xaviers-address'));
    // 输出: 100

    局限性与结论

    现在我们的区块链已经可以在一个区块上存储多笔交易,并且可以为矿工带来回报。

    不过,还是有一些不足:发送货币是,我们不检查发起人是否有足够的余额来实际进行交易。然而,这其实是一件容易解决的事情。我们也没有创建一个新的钱包和签名交易(传统上用公钥/私钥加密完成)。

    免责声明 & 源代码

    我想指出的是,这绝不是一个完整的区块链实现!它仍然缺少很多功能。这只是为了验证一些概念来帮助您来了解区块链的工作原理。

    该项目的源代码就放在我的 GitHub

    总结

    以上所述是小编给大家介绍的JavaScript实现区块链,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对码农之家网站的支持!

    上一篇:Spring Boot 企业级应用开发实战  下一篇:分布式机器学习:算法、理论与实践

    展开 +

    收起 -

     
    区块链 相关内容
    区块链2.0

    区块链是脱胎于比特币协议的分布式技术,它同时又是一个完美的信用系统。区块链的原理和特性决定其先天肩负着重构金融在内的各行业未来形态的使命,更有甚者寄希望于由其来创造更理

    查看详情
    C#区块链编程

    C#区块链编程 详细的讲解了区块链与比特币的关系,并且阐述了关键的存储和数字生成机制,让读者了解区块链的实在,并且知道如何运用区块链编程。 本书将带你从区块链的基本应用走向高

    查看详情
    区块链供应链金融

    本书结合供应链管理的逻辑架构和供应链金融的业务模式,从基础的单证、合同等要素开始,详细分析区块链技术对业务流程和商业模式的重构过程和创新效应

    查看详情
    区块链启示录:中本聪文集

    本书整理了中本聪所发表的比特币白皮书、在几个网络论坛的对话精选以及部分相关的私人往来邮件,翔实地记录了比特币和区块链的孕育、创立和发展过程,以及围绕着理念、逻辑、原理、实

    查看详情
    商业区块链:开启加密经济新时代 查看详情
    精通区块链开发技术

    本书详细阐述了与区块链开发相关的基本解决方案,主要包括区块链、去中心化、密码学和基本技术、比特币、替代币、智能合约、以太坊、超级账本等内容。此外,本书还提供了相应的示例、

    查看详情
    区块链2.0 以太坊应用开发指南

    本书主要介绍区块链第二代技术主导平台“以太坊”的应用开发方法。第1章主要讲解区块链的概念、发展历程、区块链的应用本质及思维模式

    查看详情
    去中心化应用:区块链技术概述 查看详情
    《区块链2.0实战:以太坊+Solidity编程从入门到精通》学习笔记
    网友NO.897481

    Python实现基于POS算法的区块链

    区块链中的共识算法 在比特币公链架构解析中,就曾提到过为了实现去中介化的设计,比特币设计了一套共识协议,并通过此协议来保证系统的稳定性和防攻击性。 并且我们知道,截止目前使用最广泛,也是最被大家接受的共识算法,是我们先前介绍过的POW(proof of work)工作量证明算法。目前市值排名前二的比特币和以太坊也是采用的此算法。 虽然POW共识算法取得了巨大的成功,但对它的质疑也从来未曾停止过。 其中最主要的一个原因就是电力消耗。据不完全统计,基于POW的挖矿机制所消耗的电量是非常巨大的,甚至比绝大多数国家耗电量还要多。这对我们的资源造成了极大的浪费,此外随着比特大陆等公司的强势崛起,造成了算力的高度集中。 基于以上种种原因,更多的共识算法被提出来 POS、DPOS、BPFT等等。 今天我们就来认识POS(proof of stake)算法。 Proof of stake,译为权益证明。你可能已经猜到了,权益证明简单理解就是拥有更多token的人,有更大的概率获得记账权利,然后获得奖励。 这个概率具体有多大呢? 下面我们在代码实现中会展示,分析也放在后面。 当然,POS是会比POW更好吗? 会更去中心化吗? 现在看来未必,所以我们这里也不去对比谁优谁劣。 我们站在中立的角度,单纯的来讨论讨论POS这种算法。 代码实……

    网友NO.380080

    python简单区块链模拟详解

    最近学习了一点python,那就试着做一做简单的编程练习。 首先是这个编程的指导图,如下: 对的,类似一个简单区块链的模拟。 代码如下: class DaDaBlockCoin: #index 索引,timestamp 时间戳,data 交易记录,self_hash交易hash,last_hash,上个hash def __init__(self,idex,timestamp,data,last_hash): self.idex = idex self.timestamp = timestamp self.data = data self.last_hash = last_hash self.self_hash=self.hash_DaDaBlockCoin() def hash_DaDaBlockCoin(self): sha = hashlib.md5()#加密算法,这里可以选择sha256,sha512,为了打印方便,所以选了md5 #对数据整体加密 datastr = str(self.idex)+str(self.timestamp)+str(self.data)+str(self.last_hash) sha.update(datastr.encode("utf-8")) return sha.hexdigest()def create_first_DaDaBlock(): # 创世区块 return DaDaBlockCoin(0, datetime.datetime.now(), "love dadacoin", "0")# last_block,上一个区块def create_money_DadaBlock(last_block): # 其它块 this_idex = last_block.idex + 1 # 索引加1 this_timestamp = datetime.datetime.now() this_data = "love dada" + str(this_idex) # 模拟交易数据 this_hash = last_block.self_hash # 取得上一块的hash return DaDaBlockCoin(this_idex, this_timestamp, this_data, this_hash)DaDaBlockCoins = [create_first_DaDaBlock()] # 区块链列表,只有一个创世区块nums = 10head_block = DaDaBlockCoins[0]print(head_block.idex, head_block.timestamp, head_block.self_hash, head_block.last_hash)for i in range(nums): dadaBlock_add ……

    网友NO.546662

    如何用120行Java代码写一个自己的区块链

    区块链是目前最热门的话题,广大读者都听说过比特币,或许还有智能合约,相信大家都非常想了解这一切是如何工作的。这篇文章就是帮助你使用 Java 语言来实现一个简单的区块链,用不到 120 行代码来揭示区块链的原理! “用不到120行 Java 代码就能实现一个自己的区块链!” 听起来不可思议吧?有什么能比开发一个自己的区块链更好的学习实践方法呢?那我们就一起来实践下! 因为我们是一家从事互联网金融的科技公司,所以我们采用虚拟资产金额作为这篇文章中的示例数据。大家可以先为自己想一个数字,后面我们会用到。 通过本文,你将可以做到: 1、创建自己的区块链 2、理解 hash 函数是如何保持区块链的完整性的 3、如何创造并添加新的块 4、多个节点如何竞争生成块 5、通过浏览器来查看整个链 6、所有其他关于区块链的基础知识 但是,对于比如工作量证明算法(PoW)以及权益证明算法(PoS)这类的共识算法文章中将不会涉及。 同时为了让你更清楚得查看区块链以及块的添加,我们将网络交互的过程简化了,关于 P2P 网络比如“对等网络”等内容将在将来的文章中讲解。 让我们开始吧! 设置 我们假设你已经具备一点 Java 语言的开发经验,以及maven项目构建经验。在安装和配置 Java 开发环境后之后,我们新……

    Copyright 2018-2020 xz577.com 码农之家

    本站所有电子书资源不再提供下载地址,只分享来路

    免责声明:网站所有作品均由会员网上搜集共同更新,仅供读者预览及学习交流使用,下载后请24小时内删除

    版权投诉 / 书籍推广 / 赞助:QQ:520161757