真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Javascript如何實(shí)現(xiàn)一個(gè)小型區(qū)塊鏈

這篇文章主要講解了“Javascript如何實(shí)現(xiàn)一個(gè)小型區(qū)塊鏈”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“Javascript如何實(shí)現(xiàn)一個(gè)小型區(qū)塊鏈”吧!

站在用戶的角度思考問(wèn)題,與客戶深入溝通,找到龍門(mén)網(wǎng)站設(shè)計(jì)與龍門(mén)網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類(lèi)型包括:成都做網(wǎng)站、網(wǎng)站設(shè)計(jì)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、國(guó)際域名空間、雅安服務(wù)器托管、企業(yè)郵箱。業(yè)務(wù)覆蓋龍門(mén)地區(qū)。

區(qū)塊鏈概念

狹義:區(qū)塊鏈?zhǔn)且环N按照時(shí)間順序?qū)?shù)據(jù)區(qū)塊以順序相連的方式組合成的一種鏈?zhǔn)綌?shù)據(jù)結(jié)構(gòu),并以密碼方式保證的不可篡改和不可偽造的分布式賬本。

一、挖礦(產(chǎn)生新區(qū)塊)

首先,區(qū)塊鏈?zhǔn)怯擅恳粋€(gè)區(qū)塊聯(lián)系而形成的,在產(chǎn)生新區(qū)塊之前必須先有一個(gè)最初始的區(qū)塊,這個(gè)區(qū)塊也叫創(chuàng)世區(qū)塊。通過(guò)這個(gè)創(chuàng)世區(qū)塊,不停地通過(guò)變化隨機(jī)數(shù)(nonce)來(lái)計(jì)算出符合條件的區(qū)塊。以下是創(chuàng)世區(qū)塊基本信息:

const initBlock = {      index: 0,      data: 'hey,this is a block chain',      previousHash: '0',      timestamp: '1551806536961',      nonce: 80490,      hash: '0000352fb27dd1141fa7265833190a53e5776b1111e275db0d9a77bf840081e6'  };
  1. 鴻蒙官方戰(zhàn)略合作共建——HarmonyOS技術(shù)社區(qū)

  2.   index:是指每個(gè)區(qū)塊的序號(hào)

  3.   data: 這里存放著區(qū)塊中所有的信息,例如轉(zhuǎn)賬,余額等數(shù)據(jù)

  4.   previousHash: 指的是上一個(gè)區(qū)塊的hash值,創(chuàng)世區(qū)塊沒(méi)有上一個(gè),顯示0即可

  5.   timestamp:指的是創(chuàng)建這個(gè)區(qū)塊的時(shí)間

  6.   nonce:這個(gè)是隨機(jī)數(shù),挖礦就是通過(guò)不停變換這個(gè)nonce來(lái)計(jì)算出符合條件的哈希。

  7.   hash: 本區(qū)塊的hash值,通過(guò)前面5個(gè)字段的信息進(jìn)行hash運(yùn)算得出的值。

接著,通過(guò)不停的hash運(yùn)算計(jì)算出符合條件的哈希,即挖礦。挖礦也可以調(diào)節(jié)難度的大小,例如算出的哈希值必須前3位數(shù)必須為1或者末3位數(shù)必須為1等等,這個(gè)可以自行的去定義,只要***留一個(gè)控制的開(kāi)關(guān),方便控制即可??梢栽诙x一個(gè)變量

哈希的計(jì)算:

.createHash('sha256')   .update(index + data + previousHash + timestamp + nonce)   .digest('hex')
_that.difficulty = 3 // 即前3位或者末3位數(shù)必須為1,數(shù)量越多難度越大

生成了符合條件的hash之后,則產(chǎn)生了新的區(qū)塊,但是還要對(duì)這個(gè)區(qū)塊進(jìn)行校驗(yàn)看看是否有效,因?yàn)榭赡苓@是一個(gè)被篡改的非法的區(qū)塊,也有可能和這個(gè)鏈沒(méi)有任何關(guān)系的區(qū)塊而僅僅只是符合上述哈希的規(guī)則而已。所以,需要進(jìn)行一下校驗(yàn),,前后區(qū)塊的有效性。

isValidaBlock(newBlock,lastBlock) {       if (newBlock.index !== lastBlock.index+1) return false       if (newBlock.previousHash !== lastBlock.hash) return false       if (newBlock.timestamp <= lastBlock.timestamp) return false       if (newBlock.hash.slice(1 ,_that.difficulty) !== '1'.repeat(_that.difficulty)) return false       if (newBlock.hash !== this.computeHashForBlock(newBlock)) return false  //確保隨機(jī)數(shù)正確          // 都滿足則返回true          return true      }

除了上面的校驗(yàn)之外,還需要使用上面這個(gè)函數(shù)對(duì)整一個(gè)chain進(jìn)行一個(gè)每一個(gè)塊的校驗(yàn),以保證每一個(gè)塊的信息是正確的,是沒(méi)有被篡改過(guò)的是合法的。

二、構(gòu)建P2P網(wǎng)絡(luò)

區(qū)塊鏈的網(wǎng)絡(luò)是去中心化的,即沒(méi)有中心

下面用代碼演示一下:

(res)=>{    _that.remotePeerInfo = res.data.data   //1    _that.addPeersList(res.peersList)             //2    _that.boardCast(_that.remotePeerInfo)    //3    _that.blockChainUpdate(blockChain,blockData)     //4  }  addPeersList(peers) {      peers.forEach(peer => {          if (!_that.peers.find(v => _that.isEqualPeer(peer, v))) {              _that.peers.push(peer)          }      })  }  boardCast(remotePeerInfo) {      this.peers.forEach(v => {          this.send(action, v.port, v.address)      })  }  blockChainUpdate(blockChain,blockData){    if(newChain.length === 1 ){      return      }      if(_that.isValidaChain(newChain) && newChain.length>_that.blockchain.length){      _that.blockchain = Object.assign({}, newChain)      }else{      console.log('error')      return      }      if (trans.every(v => _that.isValidTransfer(v))) {      _that.data = trans      } }

1.保存種子節(jié)點(diǎn)傳來(lái)的此新節(jié)點(diǎn)的信息包括ip和端口號(hào),因?yàn)?,新?jié)點(diǎn)的ip和端口號(hào)是會(huì)有改變的情況。

2.接受種子節(jié)點(diǎn)傳來(lái)的節(jié)點(diǎn)列表,將列表的節(jié)點(diǎn)遍歷檢查一下,沒(méi)有相同的就寫(xiě)進(jìn)列表中。

3.將新節(jié)點(diǎn)的信息廣播到所有的節(jié)點(diǎn)上,同時(shí)接受到信息的節(jié)點(diǎn)更新一下節(jié)點(diǎn)列表

4.將區(qū)塊鏈上信息同步一份都本地,同時(shí)對(duì)種子節(jié)點(diǎn)傳來(lái)的blockchain進(jìn)行每個(gè)區(qū)塊的信息

三、轉(zhuǎn)賬交易

BTC的交易模型是使用的是UTXO。

在區(qū)塊鏈中,進(jìn)行記錄轉(zhuǎn)賬交易的時(shí)候是需要一個(gè)加密的算法,把所有的信息進(jìn)行加密之后再push到新區(qū)塊中的data中,從而完成一筆新交易的記錄。以BTC為例,BTC的加密算法是使用elliptic這個(gè)加密算法,elliptic是一個(gè)非對(duì)稱(chēng)性的加密算法,非對(duì)稱(chēng)的加密算法的特點(diǎn)就是,私鑰是惟一的,只有擁有者才可以和他私鑰對(duì)應(yīng)的公鑰進(jìn)行校驗(yàn) 。 nodejs也有對(duì)應(yīng)的庫(kù)在github上搜索elliptic即可。

{    "privateKey": "34a425df3eb1f22fb6cb74b0e7298b16ffd7f3fb",    "publicKey": "ac208623a38d2906b090dbcf3a09378dfe79b77bf39c2b753ef98ea94fe08dc3995a1bd05c917"  }

上面是一個(gè)生成好的密鑰對(duì)格式,僅作為展示,我刪減了一部分長(zhǎng)度。

使用銀行卡進(jìn)行轉(zhuǎn)賬交易的時(shí)候,會(huì)有一個(gè)轉(zhuǎn)出的賬號(hào)和一個(gè)轉(zhuǎn)入的賬號(hào),在區(qū)塊鏈中的記賬也會(huì)有這個(gè)賬號(hào),這個(gè)賬號(hào)就是上面使用生成的密鑰對(duì)中的公鑰,公鑰就是地址,或者說(shuō)公鑰代表的就是自己的錢(qián)包。

校驗(yàn)的方法,首先使用字段“from”,“to”,“amount”的參數(shù)進(jìn)行sign簽名,然后在每次挖礦(記賬)的時(shí)候,則使用verify(),通過(guò)前面的三個(gè)參數(shù),和sig進(jìn)行校驗(yàn)

verify(type,data){      swtich(type){          case 'sign':              const bufferMsg = Buffer.from(`${data.from}-${data.to}-${data.amount}`)              let signature = Buffer.from(keypair.sign(bufferMsg).toDER()).toString('hex')                 this.signature =  signature          break;          case 'verify':               const keypairTemp = ec.keyFromPublic(pub, 'hex')                  const bufferMsg = Buffer.from(`${data.from}-${data.to}-${data.amount}`)               this.keypair = keypairTemp.verify(bufferMsg, sig)          break;          default;      }  }

轉(zhuǎn)帳的時(shí)候需要3步,分別是校驗(yàn)轉(zhuǎn)出賬戶是否有足夠的金額,轉(zhuǎn)出賬戶就是本地公鑰。如有則進(jìn)行記賬并且使用兩個(gè)地址、金額、時(shí)間,還有簽名加密打包,之后進(jìn)行全節(jié)點(diǎn)廣播。其他節(jié)點(diǎn)收到這個(gè)信息之后***件事也是對(duì)新區(qū)塊的有效性做一個(gè)校驗(yàn),通過(guò)校驗(yàn)之后就會(huì)寫(xiě)入data中。

transfer(data)  {      const timestamp = new Date().getTime()      const sig = rsa.sign({data.from, data.to, data.amount , timestamp})      const sigTrans = {data.from, data.to, data.amount ,timestamp, sig }           // 非創(chuàng)世區(qū)塊      if (trans.from !== '0') {              // 檢驗(yàn)余額          if (!(_that.blance < amount)) { //_that.blance 當(dāng)前賬戶余額              //全節(jié)點(diǎn)廣播              _that.send('trans', sigTrans)          }else{              console.log('not enough blance')              return          }      }      this.data.push(sigTrans)      return sigTrans  }

其他節(jié)點(diǎn)收到消息之后,先進(jìn)行去重校驗(yàn),然后再更新數(shù)據(jù)。

四、查詢余額

這個(gè)鏈的查詢方法比較簡(jiǎn)單,就是將區(qū)塊中的每一條交易的信息進(jìn)行校驗(yàn)和匹配,滿足條件的就進(jìn)行增減,同時(shí)忽略精度上的問(wèn)題。

this.blance = blance(address)  blance(address) {         let blance = 0;         this.blockchain.forEach(block => {             block.data.forEach(trans => {                 if (address == trans.from) {                     blance -= trans.amount                 }                 if (address == trans.to) {                     blance += trans.amount                }             })         });         return blance     }

感謝各位的閱讀,以上就是“Javascript如何實(shí)現(xiàn)一個(gè)小型區(qū)塊鏈”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)Javascript如何實(shí)現(xiàn)一個(gè)小型區(qū)塊鏈這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!


當(dāng)前題目:Javascript如何實(shí)現(xiàn)一個(gè)小型區(qū)塊鏈
URL地址:
http://weahome.cn/article/jpgpep.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部