vargetGenesisBlock=()=>{returnnewBlock(0,"0",1465154705,"mygenesisblock!!","816534932c2b7154836da6afc367695e6337db8a921823784c14378abed4f7d7");};varblockchain=[getGenesisBlock()]; ⑥ 确认区块完整性。在任何时候,都必须确保一个区块或者一整条链的区块的完整性能够被确认。在从其他节点接收到新的区块,并需要决定接受或拒绝它们时,这一点尤为重要。 用代码表现为: varisValidNewBlock=(newBlock,previousBlock)=>{if(previousBlock.index+1!==newBlock.index){console.log('invalidindex');returnfalse;}elseif(previousBlock.hash!==newBlock.previousHash){console.log('invalidprevioushash');returnfalse;}elseif(calculateHashForBlock(newBlock)!==newBlock.hash){console.log('invalidhash:'+calculateHashForBlock(newBlock)+''+newBlock.hash);returnfalse;}returntrue;⑦ 选择下一个链。任何时候在链中都应该只有一组明确的块。万一出现冲突(例如,两个节点都生成72号块时,如图5-3所示),前面的主干区块链会选择有最大数目认同的链。 图5-3 不被承认的区块 varreplaceChain=(newBlocks)=>{if(isValidChain(newBlocks)&&newBlocks.length>blockchain.length){console.log('Receivedblockchainisvalid.Replacingcurrentblockchainwithreceivedblockchain');blockchain=newBlocks;broadcast(responseLatestMsg());}else{console.log('Receivedblockchaininvalid');⑧ 节点控制。某种程度上,用户必须能够控制节点。这一点可以通过搭建一个HTTP服务器实现。代码如下: varinitHttpServer=()=>{varapp=express();app.use(bodyParser.json());app.get('/blocks',(req,res)=>res.send(JSON.stringify(blockchain)));app.post('/mineBlock',(req,res)=>{varnewBlock=generateNextBlock(req.body.data);addBlock(newBlock);broadcast(responseLatestMsg());console.log('blockadded:'+JSON.stringify(newBlock));res.send();});app.get('/peers',(req,res)=>{res.send(sockets.map(s=>s._socket.remoteAddress+':'+s._socket.remotePort));});app.post('/addPeer',(req,res)=>{connectToPeers([req.body.peer]);res.send();});app.listen(http_port,()=>console.log('Listeninghttponport:'+http_port));};至此,一个区块链世界已经创建完成,在短短两百多行代码中,这个数字世界的法律被建立,“代码即法律”得到了完美的诠释。 但值得注意的是,以上的代码只是最简单的一种代码架构,像比特币和以太坊的代码经过这么长时间的发展,已经发生了一些变化,它们要复杂得多,架构肯定也完整得多。 (责任编辑:admin) |