怎么用JavaScript写一个区块链?

  几乎所有语言都可以编写区块链开发程序。那么如何用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。我们的整个链不再有效了。

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

转载于:https://www.cnblogs.com/ETHqkl/p/10050526.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 很高兴能够帮助您,使用uniapp来一个区块链应用程序很容易。uniapp是一个跨平台的开发框架,它可以让您使用一套代码来快速构建出本地应用程序,而且uniapp还支持使用JavaScript/TypeScript来编区块链应用程序。因此,您可以使用uniapp来快速构建出一个区块链应用程序。 ### 回答2: Uniapp是一个跨平台的开发框架,可以将Vue.js框架应用于多个平台,例如iOS、Android和Web。要用Uniapp一个区块链应用,可以按照以下步骤进行: 1. 首先,了解区块链的原理和相关的技术,例如分布式账本、加密算法和智能合约。 2. 在Uniapp创建一个新的项目,并选择合适的模板。可以选择基于Vue的模板,因为Uniapp是建立在Vue.js之上的。 3. 在Uniapp创建应用的视图。根据区块链应用的需求,设计并创建相应的页面,包括显示区块链信息的页面、用户操作界面以及交易记录页面等。 4. 使用Vue.js的数据绑定和组件化开发方式,将区块链的数据与应用的视图进行绑定。可以通过调用区块链的相关API获取和更新区块链的数据,并将数据展示到相应的视图。 5. 实现区块链的交易功能。利用Uniapp的网络请求功能,向区块链进行交易请求,并将交易结果实时反馈给用户。 6. 加入区块链的安全性功能。根据区块链应用的需求,加入合适的加密算法和安全机制,保障区块链的数据安全。 7. 测试、调试和部署。在本地环境进行测试和调试,确保应用的功能和用户体验符合预期。最后,根据目标平台的要求,将应用部署到对应的平台上。 需要注意的是,以上只是一个简要的步骤概述,实际开发还需要深入了解区块链和Uniapp的具体细节,并根据应用需求进行详细的开发和测试。对于区块链的功能和安全性要求较高,因此在开发过程需要仔细考虑和实现相关的功能和机制,确保应用的稳定性和安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值