NodeJS写了一个简单的区块链

NodeJS写了一个简单的区块链

我们每天都听到新的数字货币发现消息,或者有人说它们是一个很快就会爆炸的大泡沫,其中只有区块链会留下来。但是,区块链是什么

Blocks是由加密技术链接和保护的记录的不断增长的列表。

因此,区块链是一个不可变的连续记录链,称为块。每个块可以包含事务文件或任何您喜欢数据。重要的是,它们是用散列连接在一起的。

区块链被设计为安全的,是具有高拜占庭容错的分布式计算系统的一个例子。这使得区块链可以记录事件医疗记录和其他记录管理活动,如身份管理、交易处理或投票。

区块链在技术上是如何工作的?

00-1010创建新项目的第一步是创建徽标。它让一切变得真实。为此我用了Squarespace logo creator,结果如下:

现在我们可以开始我们的项目了。

00-1010为了便于创建与区块链交互的API,我使用npm express-generator包直接用ExpressJS启动了这个项目。

npm安装-g快速-发电机

快递。/奇克科因

cd chiccocoin

故事

完整代码在github-chicco in中

00-1010现在,我们将创建我们的区块链。

重新阅读区块链的定义,我们可以得出结论,绝对必要的职能是:

1.newBlock:创建新块的函数

2.newTransaction:一个函数,它创建一个事务,并对它进行排队,以便在下次创建块时保存。

3.哈希:加密块的函数

4.lastBlock:将返回链中最后一个块的函数

所以我们可以用下面的结构创建blockchain.js文件:

类区块链{

构造函数(){

//创建链和事务

this.chain=[]

this.current_transactions=[]

//此的绑定

this . new block=this . new block . bind(this)

this . new transaction=this . new transaction . bind(this)

this . last block=this . last block . bind(this)

this . proofofwork=this . proofofwork . bind(this)

}

newBlock () { /*创建新块*/}

newTransaction () { /*存储新事务*/}

hash (block) { /*散列块*/}

lastBlock () { /*返回最后一个块*/}

}

module.exports=区块链

我们的构造函数将创建两个重要的变量,chain和current_transaction。该链将按顺序包含我们所有的块。Current_transactions将包含将在下一次挖掘中添加到块中的所有事务。

3.1创建一个块

但是什么是街区呢?将使用该块的表示是一个javascript对象,它将包含:

1.索引

2.印时戳

3.交易列表

4.证明

5.前一个块的哈希

常量块={

索引\' : 1,

时间戳\' : 1506057125.900785,

交易\' : [

{

发件人\' : \' 8527147 fe1f 5426 f9dd 545 de 4b 27 ee 00 \',

收件人\' : \' a 77 F5 cdfa 2934 df 3954 a5 C7 c 7 da 5d f1f \':

金额\' : 5,

}

],

证明\' : 324984774000,

previous _ hash \' : \' 2 cf 24 DBA 5 FB 0 a 30 e 26 e 83 B2 AC 5b 9 e 29 E1 e 1b 161 E5 C1 fa 7425 e 73043362938 b 9824 \'

}

这样,区块链的想法就变得更加清晰了。是一组连接到前一个并受加密(previous_hash)保护的顺序块(索引)。块内的Previous_hash是整个区块链的密钥。它使我们能够确保整个链的安全性和不变性。如果攻击者可以在这个块之后立即修改链的块,那么所有散列都是错误的。显然,它可能会尝试重新计算整个链的哈希值,这就是为什么更多的块和更多的区块链是安全的。此外,每个节点都有区块链的(相同的)副本(在本例中是NodeJS的实例),这使得黑客几乎不可能同时修改所有副本。

所以在我们的例子中创建一个新的块非常简单。我们只需要将一个新的对象推入链中。这个函数将接收证明(然后我们将讨论它是什么)和先前的块散列,并将返回块。该函数还会将所有未保存的事务添加到块中,并清除变量current_transactions。

哈希函数

我们的Chiccocoin使用的散列函数是一个简单的SHA256,但是您可以使用自己喜欢的散列函数。执行前一个块的散列很重要,所以我们将执行序列化对象的散列。

3.2创建交易

添加新交易的功能非常简单。添加到current_transaction数组中的事务。交易是由发送方、接收方和金额组成的对象。将事务存储在块中是一个挖掘功能。对于该实用程序,我们将确保该函数向我们返回它将被保存的块的索引。

类区块链{

构造函数(){

//创建链和事务

this.chain=[]

this.current_transactions=[]

//此的绑定

this . new block=this . new block . bind(this)

this . new transaction=this . new transaction . bind(this)

this . last block=this . last block . bind(this)

this . proofofwork=this . proofofwork . bind(this)

}

newBlock (proof,previousHash) {

常量块={

索引: this.chain.length 1,

timestamp:新日期(),

交易: this.current_transactions,

proof:证明,

previous_hash:前一个哈希

}

this.current_transactions=[]

this.chain.push(块)

导回滑轮

}

newTransaction(发件人,收件人,金额){

this . current _ transactions . push({

发送者:发送者,

收件人:收件人:

金额:金额

})

返回this.lastBlock()[\'index\'] 1

}

哈希(块){

const block string=JSON . stringify(block)

const hash=crypto . create hmac(process . env . hash _ TYPE,process.env.CRYPTO_SECRET)。更新(块字符串)。摘要(“十六进制”)

返回散列

}

lastBlock () {

返回this.chain.slice(-1)[0]

}

}

module.exports=区块链

00-1010通常,工作证明是一种发明的功能或协议,用于阻止拒绝服务攻击,但区块链使用它来确定如何在自身上创建或挖掘新块。POW的目标是找到一个数字来解决问题。这个数字一定很难找到,但很容易核实。就像像素个数的计算一样,我们找到的数字越多,就越难找到一个,但要理解它却是一件非常平庸的努力

为了开采奇克科因,我们决定制造一个c4ff3。我们力量看起来像这样:

c4ff3e9373e.5e3600155e860

我们编码吧。必要的功能有两个:

1.validProof:给出之前的幂和ap数,检查问题的解法是否正确。

2.proofOfWork:循环直到找到解决方案

validProof (lastProof,proof) {

const guess hash=crypto . create hmac(process . env . hash _ TYPE,process.env.CRYPTO_SECRET)。更新(` ${lastProof}${proof} `)。摘要(“十六进制”)

return guessHash.substr(0,5)===process . env . resolution _ HASH

}

proofOfWork (lastProof) {

假设证明=0

while (true) {

如果(!this.validProof(lastProof,proof)) {

证明

}否则{

破裂

}

}

退货证明

}

00-1010通过API服务expressjs。这将是非常简单的开始我们的区块链项目

我们将创建三个API:

1./transactions/new为块创建新的事务。

2./mine告诉我们的服务器挖掘一个新块。

3./chain返回完整的区块链。

我创建了一个Chiccocoin支持类/middleware/chiccocoin.js,它包含了API所有必需的中间件,并实例化了一个新的区块链。

5.1链端点

这个终点很简单。只需返回存储在区块链中的链数组。

5.2交易终点

端点将检查传递的数据,并将调用区块链的newTransaction函数。将来,我们可以使用这个中间件来检查实际的发送者和接收者是否正确和/或交易是否可以完成。我们将使用newTransaction函数返回的信息来通知用户保存事务的块。

5.3开采终点

我们的采矿目的地是奇克科因成为现实地方。它必须做四件事:

计算工作证书

增加一项交易,奖励矿工(美国)1枚硬币

添加所有待定交易。

通过将块添加到链中来构造新的块。

const Blockchain=require(\'。/区块链’)

const { validation result }=require(\' express-validator/check \')

Chiccocoin类

构造函数(){

this.blockchain=new Blockchain()

this . get chain=this . get chain . bind(this)

这是我的

这个。新交易=这个。新交易。装订(这个)

}

getChain (req,res,next) {

req.responseValue={

消息: \'获取链,

链:这个。区块链。链条

}

返回下一个()

}

我的(请求、结果、下一个){

const last block=this。区块链。最后一个块()

const lastProof=lastBlock.proof

常数证明=这个。区块链。校样(最后的校样)

//创建一个从0(此节点)到我们的1个鸡蛋饼节点(节点名称)的新事务

这个。区块链。新事务(“0”,process.env.NODE_NAME,1)

//通过将新块添加到链中来伪造新块

const先前的散列=this。区块链。哈希(最后一个证明)

const new block=this。区块链。新块(校样,以前的哈希)

常量响应值=对象。分配({

消息:\"开采了新块\"

},newBlock)

req.responseValue=响应值

返回下一个()

}

newTransaction (req,res,next) {

常量错误=验证结果(请求)

如果(!errors.isEmpty()) {

返回结果状态(422)。JSON({ errors :错误。mapped()})

}

常量传输=req .主体

常量索引=this。区块链。新交易(交易[\'发送方],trans[\'接收方],trans[\'金额\'])

const responseValue={

消息:\"事务将被添加到块${index} \"

}

req.responseValue=响应值

返回下一个()

}

}

module.exports=new Chiccocoin()

我们可以通过卷曲或邮递员测试我们所有的API。我在存储库中添加了邮差_收藏。json,以简化邮递员的使用。

牛逼的区块链他背后的想法是什么新的或复杂的,因为我们都看到了平庸地开发人员天使用区块链而没有意识到它(git)。然而,这是一个非常古老的概念,在新的观点下重新焕发生机,正在改变对经济的思考方式,创造泡沫(在我看来)和从\"金融时代\"开始的\"更安全\"经济的新可能性。常识观。有能力控制交易的时间和方式,这种情况正在悄然发生,但具有巨大的潜力。

我们创建的是一个简单的区块链,它只与一个节点一起工作,只有一个节点可以制作它(有基于此的加密货币)。当然,关于这个主题的多节点和所有问题的管理同样有趣。

我希望这篇文章让你超越比特币交易本身,并让你对区块链真正做的事感兴趣

版权声明:区块链数字货币交易平台 发表于 2022-04-26 6:05:26。
转载请注明:NodeJS写了一个简单的区块链 | 零零洞洞

暂无评论

暂无评论...