使用Node.js构建一个简单的加密货币区块链
区块链是一个开放的、数字化的、重复的交易账本。每个新的交易历史都被记录下来,并以加密的方式存储,很难改变或修改。这些记录的信息的副本会跨区块链网络发送。因此,使其高度安全。
加密货币是一种在当前大多数贸易中使用的数字安全货币。加密技术的使用在确保加密货币安全方面发挥了重要作用。
这确保只有真正的交易被记录和记录。大多数加密货币采用区块链技术的去中心化原则。
在本教程中,我们将详细了解区块链和去中心化的一些情况。我们还将建立一个简单的加密货币系统,称为thecoin 。
Thecoin 是我们将在本文中构建的一个加密货币的实现。
先决条件
为了保持本教程的顺利进行,你需要对以下方面有一个很好的了解。
- [JavaScript]
- [Node.js]
首先,你必须有。
- 在你的机器上安装Node.js。
- 一个代码编辑器。
什么是区块链?

比特币图片
比特币和以太坊是数字加密货币,由一种叫做区块链的强大技术驱动和采用。它使用密码学来安全地连接和维护一个不断增长的记录列表,称为区块。

以太坊图片
区块链顾名思义,就是交易数据的区块不断增长,形成一个交易发生的链条。有效的交易数据按照参与者制定的点对点规则被记录到区块链网络中。
去中心化
通常情况下,数据库中的数据是集中的。通过集中化,我们只基于一个服务器进行操作。由于系统的故障,风险的几率是最大的。另外,去中心化允许数据存储在任何地方,从而使其更快,更安全,是存储数据的更好方式。
区块链将其信息存储在几个地方。每当一个新的区块被添加到区块链中,一个副本就会被发送到所有的计算机上。这使得篡改区块链变得非常困难,因为网络中的所有计算机必须同意将要进行的更改,以便进行更改。
在本文结束时,我们将对区块链和加密货币及其运作有更好的了解。
让我们进入代码。我将把我的应用程序命名为thecoin 。
创建名为thecoin.js 的应用程序,并在你的代码编辑器中打开它。
在开发文件夹中,让我们使用命令安装我们要使用的crypto 库。
npm install --save crypto-js
我们将使用这个库来导入我们项目中的模块。
我将首先创建一个类BlockCypto ,如下图所示。
const SHA256 = require('crypto-js/sha256');
class BlockCypto{
constructor(index, current_time, info, nextHash=" "){
this.index = index;
this.current_time = current_time;
this.info = info;
this.nextHash = nextHash;
this.hash = this.computeHash();
}
computeHash(){
return SHA256(this.info + this.nextHash + this.current_time + JSON.stringify(this.info)).toString();
}
}
我将在这里解释代码的每个部分。
我已经为我的BlockCrytpo 。 块并添加了一个构造函数,就像其他的JavaScript类一样。
在构造函数中,我们初始化它的属性并给它分配参数,如下所示。
crypto-js/sha256:这是我们导入的模块,用于计算每个块的哈希值。我们使用toString()方法将其转换为字符串,因为该模块将返回对象。index:这是一个独特的数字,追踪区块链中每个区块的索引。current_time:顾名思义,它记录了每笔交易完成的时间。info:所有已完成的交易数据都通过这种方法记录和存储。nexthash:它指向的是网络链中下一个区块的哈希_key。它主要用于保持和维护区块链的完整性。computeHash:基于传递给这个方法的属性,它被用来计算链上下一个区块的哈希键。
区块链定理
它是一种数据库,将数据集合在一起分组存储,具有一定的存储容量。这些区块与已经创建的区块相连,这就形成了一个数据树的链。
该链是不可逆的,因为该系统是分散的。在这里,每个区块在添加到链上时都被分配了一个时间戳。
现在,让我们创建一个类Blockchain ,它将维护这一操作。
class Blockchain{
constructor(){
this.block1chain = [this.startGenesisBlock()];
}
initGenesisBlock(){
return new BlockCrypto(0, "06/04/2021", "Initial Block in the Chain", "0");
}
latestBlock(){
return this.block1chain[this.block1chain.length - 1];
}
addNewBlock(newBlock){
newBlock.nextHash = this.latestBlock().hash;
newBlock.hash = newBlock.computeHash();
this.block1chain.push(newBlock);
}
}
让我们来理解上面的代码片段。
像往常一样,我们有我们的构造函数,它将区块链实例化。
但是这一次,我们把它传给了initGenesisBlock() 方法,该方法初始化了链上的区块。在我们的例子中,这个属性指的是一个区块数组。
initGenesisBlock():这是点对点网络中创建的第一个区块,没有与任何其他区块链接。根据我们的索引知识,它的索引是0。
注意,我们使用之前创建的
BlockCrypto类来创建它,并将所有的参数作为参数传递。
-
latestBlock:正如命名的那样,我们用它来寻找链上最后添加的块。如前所述,它有助于确保当前区块的哈希值,并将其映射到前一个区块的哈希值,以确保链的完整性。 -
addNewBlock:使用这种方法,一个新的区块被添加到链上。之前的哈希区块与当前的哈希区块相匹配,以确保链上的篡改最小或没有篡改。
现在,我们的区块链已经准备好工作了。我们缺少一些东西,这是区块链的核心原则,即区块链的完整性。
让我们看看如何验证它并测试我们的应用程序。
验证区块链的完整性
区块链的主要特点是,一旦一个区块被添加到网络中,在不使整个区块链完整性失效的情况下,它就不能被改变。
为了执行这一点,我们使用数字安全或加密哈希,通过每次在区块中进行更改时产生一个新的哈希来确保区块链的安全和验证。
我们将在整个区块链上进行循环,检查是否有任何哈希值被篡改,同时考虑到第一个区块的例外情况,这是硬编码的。
此外,这种方法还可以验证每两个串联的区块的加密密钥是否指向对方。如果区块链的完整性被破坏,它将返回false ;否则,如果没有遇到异常,它将返回true 。
我们将在Blockchain 类中创建这个方法。
checkValidity(){
// Checking validity
for(let i = 1; i < this.block1chain.length; i++) {
const currentBlock = this.block1chain[i];
const nextBlock= this.blockchain[i-1];
// Checking current blcok hash
if(currentBlock.hash !== currentBlock.computeHash()) {
return false;
}
// Comparing current block hash with the next block
if(currentBlock.nextHash !== nextBlock.hash) {
return false;
}
return true;
}
现在,我们可以测试我们的应用程序,看看结果。
但是,在我们深入运行代码之前,让我们创建一个新的Blockchain 类的实例,并将其命名为thecoin ,并使用随机值在区块链中添加一些区块。
let thecoin = new Blockchain();
thecoin.addNewBlock(new BlockCrypto(1, "06/04/2021", {sender: "Rabin Yitzack", recipient: "Loyd Eve", quantity: 20}));
thecoin.addNewBlock(new BlockCrypto(2, "07/04/2021", {sender: "Anita Vyona", recipient: "Felix Mush", quantity: 349}));
console.log(JSON.stringify(thecoin, null, 4));
运行我们的区块链
在我们的终端node thecoin.js ,输入这个命令将导致。

注意:在运行该命令之前,确保在你的终端上导航到正确的路径。
提示:使用命令pwd 来检查路径。
结论
你已经使用Node.js构建了你自己的加密货币。这一步让你更接近于让你开始使用Node.js构建专业的应用程序,或者说,你可以直接在我们简单的区块链上添加更多的功能,并与市场分享它。
尽管如此,我希望这个教程已经为你提供了基本的技能熟练度,让你在刺激的Node.js开发中前进。