本文转载自微信公众号《区块链研究实验室》,作者连三丰。转载本文请联系区块链研究实验室公众号。在上一篇文章中,我们讨论了区块链的概念,并搭建了一个DEMO原型【运输者:区块链研究实验室|如何从0构建区块链(1)],在这一集中,我们将使用另一种编程语言Javascript实现相同的概念,这可能很难用Go编写代码。所以请参考我们在第1集中绘制的图表:这次,我们将使用Javascript应用相同的机制。为了使这成为可能,我们需要一个可以运行我们的Javascript代码的服务器,一个网络浏览器就可以了,但让我们专业地做事。要求:Nodejs:用于在Web浏览器之外执行JavaScript代码的运行时环境。安装它并尝试构建一个项目,您可以按照此处的步骤操作。Express:一个nodejs中间件web应用,后面会用到,先安装一下。Nodemon:一种帮助开发基于node.js的应用程序的工具,通过在修改文件后自动重新启动节点应用程序Bcrypt:一个用于快速加密的库,您还可以使用任何您想要的哈希函数。让我们开始吧:创建一个名为javascript的文件夹并添加一个名为entry.js的文件在npminit用于初始化项目的文件夹类型中,填写所有要求,对于入口点输入entry.js打开终端,然后键入npmi--save-devnodemon安装nodemon工具。同时运行npmiexpress来安装ExpressJS。安装bcryptnpmibcrypt在我的package.json看起来像这样之后:文件夹结构如下所示:打开终端并转到javascript文件夹,如果看到错误,请输入“npmrunstartdon'tmind”,这是因为的条目。js文件里面什么都没有。现在我们准备开始编写我们的区块链。entry.js在任意IDE中打开文件,写这段代码看懂,请跳过评论:这里有一些说明:在上面的代码中,我们创建了一个B锁类,它包含一个id,timestamp,haHi,以前是hash和数据属性。为了将来使用这个类,我们创建了一个构造函数并添加了一个生成哈希的方法。由于区块链是一组块,我们创建了另一个名为Blockchain的类来存储所有块,它只是一个带有数组的Javascript承包商,然后我们添加了方法AddBlock以将块添加到我们的链中。最后,我们初始化链并通过发出3笔不同的交易对其进行测试。结果:如果你安装了nodemon,只需检查你运行它的终端,你就会看到整个区块链信息。恭喜!这在Javascript中非常简单,我们只用了几行代码就完成了。整个代码:constbcrypt=require('bcrypt')//importthebcryptjslibrairyclassBlock{//createtheblockstructureorclassconstructor(blockid,previousHash,data){//createacontractor.inablockwefindthisinformation:this.blockid=blockid;//theblockidthis.timestamp=Date.now();//thetimestampthis.blockhash=this.getHash();//theblockhashthis.prevHash=previousHash;//thehashofthepreviousblockthis.data=data;//andallthetransactions}getHash(){returnbcrypt.hashSync(String(this.blockid+this.timestamp+this.blockhash+this.previousHash+JSON.stringify(this.data)),10)//thismethodwillhashtheblockusingasaltof10andreturnthathash.Weusethebcryptlibrary};}classBlockChain{//theblochainstructureorclassconstructor(){//createaconstractor.this.chain=[];//区块链是一系列区块,soweneedanarray[]}addBlock(data){//创建一个方法,将整个区块添加到区块链letblockid=this.chain.length;//区块id将是链中区块的长度或区块总数减去1,sothefirstblockwillhave0asanindexletpreviousHash=this.chain.length!==0?this.chain[this.chain.length-1].blockhash:'';//如果是第一个块那么nitsprevioushash会是空的,如果不是那么它会取上一个block的hashletblock=newBlock(blockid,previousHash,data);//现在创建块this.chain.push(block);//将区块加入区块链}}constMyfirstblockchain=newBlockChain();Myfirstblockchain.addBlock({sender:"sinai",receiver:"kazadi",amount:24034});//firsttransactionMyfirstblockchain.addBlock({sender:"Dahouda",receiver:"Pat",amount:32032});//secondtransactionMyfirstblockchain.addBlock({sender:"Nkolomoni",receiver:"Mao",amount:20993});//thirdtransactionconsole.log(JSON.stringify(Myfirstblockchain,null,6));//将结果转换为json并在控制台显示
