几乎所有语言都可以编写区块链开发程序。那么如何用JavaScript写一个区块链?以下我将要用JavaScript来创建1个简单的区块链来演示它们的内部到底是怎样工作的。我将会称作SavjeeCoin!

  区块链是由一个个所有人能够访问的区块构成的公共数据库。这好像没有什么特别的,不过它们有个有意思的特性:它们是无法变的。要是1个区块被插入到区块链中,除非让剩下的另外区块失效,不然这是不会再被更改的。

  区块链是由千千万万的区块连接在一起的。链上的区块根据某一方法容许人们检验到是不是有人控制了以前的一切区块。

  那么人们怎样保证数据的完整性呢?每一区块都含有1个基于其内容计算出来的hash。同时也涵盖了前1个区块的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。我们的整个链不再有效了。

  其实区块链的原理并不复杂,这个小例子证明了区块链的工作原理。

怎么用JavaScript写一个区块链?的更多相关文章

  1. 用JavaScript写一个区块链

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

  2. ZT-----用javascrip写一个区块链

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

  3. 用GO写一个区块链

    总结下最近用GO实现区块链实现下面的模块 基本原型 工作量证明,这里用的POW 持久化和命令行,这里用的BoltDB存储区块 地址,这里用的比特币的地址方案 交易 P2P网络,这里为方便本地调试,采用 ...

  4. 40多行python代码开发一个区块链。

    40多行python代码开发一个区块链?可信吗?我们将通过Python 2动手开发实现一个迷你区块链来帮你真正理解区块链技术的核心原理.python开发区块链的源代码保存在Github. 尽管有人认为 ...

  5. [区块链\理解BTCD源码]GO语言实现一个区块链原型

    摘要 本文构建了一个使用工作量证明机制(POW)的类BTC的区块链.将区块链持久化到一个Bolt数据库中,然后会提供一个简单的命令行接口,用来完成一些与区块链的交互操作.这篇文章目的是希望帮助大家理解 ...

  6. 用 Python 撸一个区块链

    本文翻译自 Daniel van Flymen 的文章 Learn Blockchains by Building One 略有删改.原文地址:https://hackernoon.com/learn ...

  7. JavaScript写一个连连看的游戏

    天天看到别人玩连连看, 表示没有认真玩过, 不就把两个一样的图片连接在一起么, 我自己写一个都可以呢. 使用Javascript写了一个, 托管到github, 在线DEMO地址查看:打开 最终的效果 ...

  8. 50行ruby代码开发一个区块链

    区块链是什么?作为一个Ruby开发者,理解区块链的最好办法,就是亲自动手实现一个.只需要50行Ruby代码你就能彻底理解区块链的核心原理! 区块链 = 区块组成的链表? blockchain.ruby ...

  9. 用javascript写一个前端等待控件

    前端等待控件有啥新奇的?什么jquery啦,第三方控件啦,好多好多,信手拈来. 因为项目使用了bootstrap的原因,不想轻易使用第三方,怕不兼容.自己写一个. 技术点包括动态加载CSS,javas ...

随机推荐

  1. laravel 安装步骤

    1.将laravel安装文件里的 (composer.bat 和 composer.phar)放在你要使用的php版本 里的:如:D:\phpStudy\php\php-7.0.12-nts 2.进入 ...

  2. XtraEditors四、TextEdit、ButtonEdit、PictureEdit、RadioGroup、PopupContainerEdit

    TextEdit控件 以文本框的形式绑定各种形式的选择框: 文本框设置 输入 密码 字符 时, 要有 * 号掩盖输入的字符, 代码如下: textEdit1.Properties.PasswordCh ...

  3. Symbol Tables

    符号表 符号表是键值对的集合,支持给定键查找值的操作,有很多应用: API put() 和 get() 是最基础的两个操作,为了保证代码的一致性,简洁性和实用性,先说下具体实现中的几个设计选择. 泛型 ...

  4. 一、git创建版本库及提交

    第一步:从Git官网直接   下载安装程序  ,并自行配置环境变量. git config --global user.name "Your Name" // 设置用户名 git ...

  5. ThreadLocal解决SimpleDateFormat多线程安全问题中遇到的困惑

    测试代码: public class Main { public static void main(String[] args) { for (int k = 0; k < 10; k++) { ...

  6. linux 的常用命令---------第三阶段

    用户管理 为什么需要用户? 答:linux是一个多用户系统 权限管理(使之权限最小化) 用户:它是对系统中的资源做归属的 : 用户组:在用户组中包含一个或者多个用户,每个用户都同时拥有用户组的权限. ...

  7. Kubernetes1.91(K8s)安装部署过程(五)--安装flannel网络插件

    node节点需要安装flannel网络插件才能保证所有的pod在一个局域网内通信,直接使用yum安装即可,版本是0.7.1. 1.安装flannel插件: 注意是2个node节点都需要安装,都需要修改 ...

  8. OpenCV (C++) 几何形状识别(面积过滤、横纵比过滤等等)

    #include <opencv2/opencv.hpp> #include <iostream> #include <math.h> using namespac ...

  9. create_buffer_tree example

    假设这样一种情况: 绕线完修完timing 后,designer 修改了netlist,给了eco.v,其中改动了 clock tree 的一个分支,导致这个分支上的buffer 都没有了,如下图 一 ...

  10. CentOS7.5服务器安装(并添加用户) anaconda3 并配置 PyTorch1.0

    ===========================================================================================[admin@lo ...