使用Node.js语言,如何打造属于你的区块链


来源:IT新闻网

最近,数字货币和底层区块链技术非常火爆,引领了世界潮流。这些天,区块链都是非常热门的词汇,但是很少有人真正地了解这项技术是如何来推动数字货币,类似比特币和以太坊的发展的。

此文中,我们尝试来告诉大家如何使用Node.js语言,来编写你们自己的区块链项目。

区块链

区块链一直在逐渐增加记录列表,这可以对标为区块,而区块之间是通过加密算法互相连接。区块的接连,让区块链中的任何区块如果发生改变,那么链上其他的记录就会无效。

无法更改的特性是数字货币增长的关键,因为它会让人们在完成转账后,很难去进行更改。

创建区块 就像刚才所说,区块链是由很多区块连接构成。加密哈希被用来维持区块链的完整性。

每个区块都会有基于数据计算出来的哈希。它也会有前面区块的哈希。如果任何区块的哈希改变,它就会使得剩下的区块无效。 在Node.js语言下,区块算法就会是如下:

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.computeHash(); this.nonce = 0; } computeHash() { return SHA256(this.index + this.previousHash + this.timestamp + JSON.stringify(this.data) + this.nonce).toString(); }

像我们看到的,以上的函数中会实例化等级,并且引用如下的参数:  索引:它会追踪区块链中区块的位置  时间戳:它会在每个转账完成的时候,放入时间戳。  数据:它会在转账完成的时候,提供信息,例如购买量。  前个哈希- 它代表区块链中前个区块的哈希值。

我们使用computeHash 这个函数来根据上面的数值,计算出每个区块的加密哈希。为了完成这个,我们会导入crypto-js library 并且使用它的SHA256哈希功能。

SH256是一个很强大的,不可逆哈希功能,它会应用在大多数数字货币中,从而确保它们的安全。

为了设置crypto-js数据库,定位到终点,并且在同样的项目文件夹中,我们使用npm来安装它。

你可以使用下面的代码:

//remember to run npm init first npm install –save crypto-js

创建区块链

区块链的意思是这些区块都互相链接。因此,我们会开始将这些区块和其他的链接在区块链上。

代码如下:

class Blockchain{ constructor() { this.chain = [this.buildGenesisBlock()]; this.complexity = 5; } buildGenesisBlock() { return new Block(0, “17/07/2018”, “genesis block”, “0”); } obtainLatestBlock() { return this.chain[this.chain.length – 1]; } addBlock(newBlock) { newBlock.previousHash = this.obtainLatestBlock().hash; newBlock.mineBlock(this.complexity); this.chain.push(newBlock); } }

从上面代码,我们可以看出,这个等级是由以下函数实现的: A). 构造函数 区块链是通过buildGenesisBlock来启动的。 B). 创建创世区块 在区块链中,创世区块是区块链的开始。这个区块之前没有数据,接下来会有区块基于它。我们会使用buildGenesisBlock() 函数来创建。

C). 获得最新区块 为了获得区块链中的最新区块,我们使用obtainLatestBlock() 函数。 D). 增加新区块 为了给区块链Node.js增加新区块,我们使用addBlock() 函数。为了完成这步骤,我们会将前个区块的哈希加到新区块上,为了保证区块链的完整性。

因为我们改变了新区块的细节,所以很有必要去再次计算哈希。在完成之后,我们会将区块放入链的数据集。 E). 确定区块链的有效性

confirmValidity() 功能是为了确保区块链的完整性,并确保缺陷不存在。这个函数中引用了很多if功能,来确认是否每个区块的哈希是不可以更改的。

并且,它也会检查是否每两个相关区块的哈希值指向对方。如果所有都有效,那么就回复true,不然就回复false。

下面是代码:confirmValidity() { for (let i = 1; i < this.chain.length; i++){ const currentBlock = this.chain[i]; const previousBlock = this.chain[i – 1]; if (currentBlock.hash !== currentBlock.computeHash()) { return false; } if (currentBlock.previousHash !== previousBlock.hash) { return false; } } return true; }

测试区块链

这是最令人兴奋的部分!

代码如下:let liveEduCoin = new Blockchain(); console.log(‘<>’); liveEduCoin.addBlock(new Block(1, “27/07/2018”, { quantity: 10 })); console.log(‘<>’); liveEduCoin.addBlock(new Block(2, “27/07/2018”, { quantity: 20 })); We’ll create a new instance of the Blockchain class and name it liveEduCoin. Thereafter, we’ll add some arbitrary blocks into the blockchain. You can add any kind of data into the blocks. In this simple blockchain Node.js tutorial, we decided to add an object with the quantityproperty. Here is the entire code for our project: 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.computeHash(); this.nonce = 0; } computeHash() { return SHA256(this.index + this.previousHash + this.timestamp + JSON.stringify(this.data) + this.nonce).toString(); } mineBlock(complexity) { while (this.hash.substring(0, complexity) !== Array(complexity + 1).join(“0”)) { this.nonce++; this.hash = this.computeHash(); } console.log(“Mining is taking place: ” + this.hash); } } class Blockchain{ constructor() { this.chain = [this.buildGenesisBlock()]; this.complexity = 5; } buildGenesisBlock() { return new Block(0, “17/07/2018”, “genesis block”, “0”); } obtainLatestBlock() { return this.chain[this.chain.length – 1]; } addBlock(newBlock) { newBlock.previousHash = this.obtainLatestBlock().hash; newBlock.mineBlock(this.complexity); this.chain.push(newBlock); } confirmValidity() { for (let i = 1; i < this.chain.length; i++){ const currentBlock = this.chain[i]; const previousBlock = this.chain[i – 1]; if (currentBlock.hash !== currentBlock.computeHash()) { return false; } if (currentBlock.previousHash !== previousBlock.hash) { return false; } } return true; } } let liveEduCoin = new Blockchain(); console.log(‘<>’); liveEduCoin.addBlock(new Block(1, “27/07/2018”, { quantity: 10 })); console.log(‘<>’); liveEduCoin.addBlock(new Block(2, “27/07/2018”, { quantity: 20 }));

如果我们将代码保存为blockchain.js 文件,并且在终端上运行,那么下面就是结果:成功运行

结论

上面所说的Node.js中的数字货币区块链还远没有完成。其实,如果你努力完成,你可以是唯一使用它的人!

例如,它会缺少成功数字货币的关键要素,例如工作量证明和P2P网络。尽管如此,区块链node.js演示展示了区块链运行的方法。和很多人想的不同,这个简单的项目揭示了区块链概念其实是很容易实施的。