偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

使用Javascript實(shí)現(xiàn)簡單的小型區(qū)塊鏈

開發(fā) 前端 區(qū)塊鏈
這個區(qū)塊也叫創(chuàng)世區(qū)塊。通過這個創(chuàng)世區(qū)塊,不停地通過變化隨機(jī)數(shù)(nonce)來計算出符合條件的區(qū)塊。以下是創(chuàng)世區(qū)塊基本信息。

區(qū)塊鏈概念

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

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

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

  1. const initBlock = {  
  2.     index: 0,  
  3.     data: 'hey,this is a block chain',  
  4.     previousHash: '0',  
  5.     timestamp: '1551806536961',  
  6.     nonce: 80490,  
  7.     hash: '0000352fb27dd1141fa7265833190a53e5776b1111e275db0d9a77bf840081e6'  
  8. }; 
  1.   index:是指每個區(qū)塊的序號
  2.   data: 這里存放著區(qū)塊中所有的信息,例如轉(zhuǎn)賬,余額等數(shù)據(jù)
  3.   previousHash: 指的是上一個區(qū)塊的hash值,創(chuàng)世區(qū)塊沒有上一個,顯示0即可
  4.   timestamp:指的是創(chuàng)建這個區(qū)塊的時間
  5.   nonce:這個是隨機(jī)數(shù),挖礦就是通過不停變換這個nonce來計算出符合條件的哈希。
  6.   hash: 本區(qū)塊的hash值,通過前面5個字段的信息進(jìn)行hash運(yùn)算得出的值。

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

哈希的計算: 

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

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

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

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

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

區(qū)塊鏈的網(wǎng)絡(luò)是去中心化的,即沒有中心服務(wù)器的網(wǎng)絡(luò),客戶端不需要依賴中心服務(wù)器來獲取或者處理數(shù)據(jù)。區(qū)塊鏈網(wǎng)絡(luò)中,有這許許多多的節(jié)點(diǎn),每個節(jié)點(diǎn)都是一個獨(dú)立的成員,他們既是客戶端也是服務(wù)器,節(jié)點(diǎn)與節(jié)點(diǎn)直接都是點(diǎn)對點(diǎn)進(jìn)行連接(peer-to-peer),不需要通過某一個中心服務(wù)器進(jìn)行中轉(zhuǎn),所以,信息安全的角度來說,點(diǎn)對點(diǎn)的連接方式對信息私密性是非常可靠的。

[[261341]]

雖然,區(qū)塊鏈?zhǔn)峭ㄟ^點(diǎn)對點(diǎn)的連接方式進(jìn)行數(shù)據(jù)傳輸,但是,在這之前還需要一個東西作為引導(dǎo),這個就是種子節(jié)點(diǎn)。因?yàn)?,兩個節(jié)點(diǎn)之間他們可能不是處在同一個域下,他們之間想要聯(lián)系,必須有一方知道對方的ip和端口,這樣才能和對方聯(lián)系上。節(jié)點(diǎn)ip和端口號,在這個節(jié)點(diǎn)創(chuàng)建出來之后,種子節(jié)點(diǎn)就會發(fā)給它在這個區(qū)塊鏈中所有節(jié)點(diǎn)的ip和端口號同時記錄下這個新伙伴的ip和端口號。那么,新的節(jié)點(diǎn)拿到了這一份"通訊錄"之后,就會給這個"通訊錄"中的所有小伙伴發(fā)個消息,告訴他們有一位新的小伙伴加入,之后,其他節(jié)點(diǎn)收到了這個信息,也會在自己的"通訊錄"中加上新伙伴的ip和端口號,相當(dāng)于加入了白名單。這樣新的節(jié)點(diǎn)接下來就可以和任意的的節(jié)點(diǎn)進(jìn)行通信了。

下面用代碼演示一下: 

  1. (res)=> 
  2.   _that.remotePeerInfo = res.data.data   //1  
  3.   _that.addPeersList(res.peersList)             //2  
  4.   _that.boardCast(_that.remotePeerInfo)    //3  
  5.   _that.blockChainUpdate(blockChain,blockData)     //4  
  6.  
  7. addPeersList(peers) {  
  8.     peers.forEach(peer => {  
  9.         if (!_that.peers.find(v => _that.isEqualPeer(peer, v))) {  
  10.             _that.peers.push(peer)  
  11.         }  
  12.     })  
  13.  
  14. boardCast(remotePeerInfo) {  
  15.     this.peers.forEach(v => {  
  16.         this.send(action, v.port, v.address)  
  17.     })  
  18.  
  19. blockChainUpdate(blockChain,blockData){  
  20.   if(newChain.length === 1 ){  
  21.     return  
  22.     }  
  23.     if(_that.isValidaChain(newChain) && newChain.length>_that.blockchain.length){  
  24.     _that.blockchain = Object.assign({}, newChain)  
  25.     }else{  
  26.     console.log('error')  
  27.     return  
  28.     }  
  29.     if (trans.every(v => _that.isValidTransfer(v))) {  
  30.     _that.data = trans  
  31.     } 

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

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

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

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

三、轉(zhuǎn)賬交易

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

而這個小型區(qū)塊鏈的交易模型使用的是最簡單的方法。

區(qū)塊鏈中"現(xiàn)金”,它是一個虛擬的東西就是一個字符串,來源于挖礦。每次挖礦成功都會有一定的獎勵,得到的這些“錢”就可以在區(qū)塊鏈網(wǎng)絡(luò)中自由的轉(zhuǎn)賬交易。

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

  1.  
  2.   "privateKey": "34a425df3eb1f22fb6cb74b0e7298b16ffd7f3fb",  
  3.   "publicKey": "ac208623a38d2906b090dbcf3a09378dfe79b77bf39c2b753ef98ea94fe08dc3995a1bd05c917"  

上面是一個生成好的密鑰對格式,僅作為展示,我刪減了一部分長度。

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

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

  1. verify(type,data){  
  2.     swtich(type){  
  3.         case 'sign':  
  4.             const bufferMsg = Buffer.from(`${data.from}-${data.to}-${data.amount}`)  
  5.             let signature = Buffer.from(keypair.sign(bufferMsg).toDER()).toString('hex')  
  6.                this.signature =  signature  
  7.         break;  
  8.         case 'verify':  
  9.              const keypairTemp = ec.keyFromPublic(pub, 'hex')  
  10.                 const bufferMsg = Buffer.from(`${data.from}-${data.to}-${data.amount}`)  
  11.              this.keypair = keypairTemp.verify(bufferMsg, sig)  
  12.         break;  
  13.         default;  
  14.     }  

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

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

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

四、查詢余額

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

  1. this.blance = blance(address)  
  2. blance(address) {  
  3.        let blance = 0 
  4.        this.blockchain.forEach(block => {  
  5.            block.data.forEach(trans => {  
  6.                if (address == trans.from) {  
  7.                    blance -trans.amount  
  8.                }  
  9.                if (address == trans.to) {  
  10.                    blance += trans.amount 
  11.                }  
  12.            })  
  13.        });  
  14.        return blance  
  15.    } 

至此,區(qū)塊鏈的最簡單的功能就實(shí)現(xiàn)完畢。 

責(zé)任編輯:龐桂玉 來源: segmentfault
相關(guān)推薦

2021-04-09 06:25:41

區(qū)塊鏈區(qū)塊鏈技術(shù)

2021-04-09 20:04:34

區(qū)塊鏈Go加密

2021-04-08 18:39:57

JavaScriptExpress區(qū)塊鏈

2019-01-24 15:50:06

區(qū)塊鏈數(shù)字貨幣比特幣

2023-02-01 08:00:00

Kubernetes區(qū)塊鏈微服務(wù)

2022-01-10 10:56:37

區(qū)塊鏈技術(shù)比特幣

2021-07-29 16:58:22

區(qū)塊鏈比特幣數(shù)字貨幣

2022-07-18 23:49:19

區(qū)塊鏈民主數(shù)據(jù)

2021-09-23 22:40:10

區(qū)塊鏈比特幣技術(shù)

2018-09-13 13:52:08

2018-04-02 16:35:57

區(qū)塊鏈數(shù)字貨幣比特幣

2017-11-16 14:25:04

WOT峰會

2021-08-11 14:37:27

區(qū)塊鏈加密貨幣技術(shù)

2018-05-15 10:26:10

區(qū)塊鏈數(shù)字貨幣比特幣

2018-03-27 09:52:30

區(qū)塊鏈數(shù)字貨幣比特幣

2022-11-21 17:50:32

區(qū)塊鏈數(shù)實(shí)融合數(shù)字經(jīng)濟(jì)

2020-05-13 09:45:08

區(qū)塊鏈公共區(qū)塊鏈私有區(qū)塊鏈

2022-01-19 15:11:34

區(qū)塊鏈云計算安全

2017-07-19 07:27:39

區(qū)塊鏈ICO監(jiān)管

2021-09-16 14:21:24

區(qū)塊鏈航天數(shù)字化
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號