NodeJS写了一个简单的区块链
我们每天都听到新的数字货币被发现的消息,或者有人说它们是一个很快就会爆炸的大泡沫,其中只有区块链会留下来。但是,区块链是什么?
因此,区块链是一个不可变的连续记录链,称为块。每个块可以包含事务、文件或任何您喜欢的数据。重要的是,它们是用散列连接在一起的。
区块链被设计为安全的,是具有高拜占庭容错的分布式计算系统的一个例子。这使得区块链可以记录事件、医疗记录和其他记录管理活动,如身份管理、交易处理或投票。
区块链在技术上是如何工作的?
00-1010创建新项目的第一步是创建徽标。它让一切变得真实。为此我用了Squarespace logo creator,结果如下:
现在我们可以开始我们的项目了。
00-1010为了便于创建与区块链交互的API,我使用npm express-generator包直接用ExpressJS启动了这个项目。
npm安装-g快速-发电机
快递。/奇克科因
cd chiccocoin
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,
交易: 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开采终点
计算工作证书
添加所有待定交易。
通过将块添加到链中来构造新的块。
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)。然而,这是一个非常古老的概念,在新的观点下重新焕发生机,正在改变对经济的思考方式,创造泡沫(在我看来)和从\"金融时代\"开始的\"更安全\"经济的新可能性。常识观。有能力控制交易的时间和方式,这种情况正在悄然发生,但具有巨大的潜力。
我们创建的是一个简单的区块链,它只与一个节点一起工作,只有一个节点可以制作它(有基于此的加密货币)。当然,关于这个主题的多节点和所有问题的管理同样有趣。