<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        javascript實現小型區塊鏈的方法介紹(附代碼)

        來源:懂視網 責編:小采 時間:2020-11-27 19:26:51
        文檔

        javascript實現小型區塊鏈的方法介紹(附代碼)

        javascript實現小型區塊鏈的方法介紹(附代碼):本篇文章給大家帶來的內容是關于javascript實現小型區塊鏈的方法介紹(附代碼),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。區塊鏈概念狹義:區塊鏈是一種按照時間順序將數據區塊以順序相連的方式組合成的一種鏈式數據結構,并以密碼方
        推薦度:
        導讀javascript實現小型區塊鏈的方法介紹(附代碼):本篇文章給大家帶來的內容是關于javascript實現小型區塊鏈的方法介紹(附代碼),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。區塊鏈概念狹義:區塊鏈是一種按照時間順序將數據區塊以順序相連的方式組合成的一種鏈式數據結構,并以密碼方
        本篇文章給大家帶來的內容是關于javascript實現小型區塊鏈的方法介紹(附代碼),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。

        區塊鏈概念

        狹義:區塊鏈是一種按照時間順序將數據區塊以順序相連的方式組合成的一種鏈式數據結構,并以密碼方式保證的不可篡改和不可偽造的分布式賬本。

        一、挖礦(產生新區塊)

        首先,區塊鏈是由每一個區塊聯系而形成的,在產生新區塊之前必須先有一個最初始的區塊,這個區塊也叫創世區塊。通過這個創世區塊,不停地通過變化隨機數(nonce)來計算出符合條件的區塊。以下是創世區塊基本信息:

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

        接著,通過不停的hash運算計算出符合條件的哈希,即挖礦。挖礦也可以調節難度的大小,例如算出的哈希值必須前3位數必須為1或者末3位數必須為1等等,這個可以自行的去定義,只要最后留一個控制的開關,方便控制即可。可以在定義一個變量

        哈希的計算:

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

        生成了符合條件的hash之后,則產生了新的區塊,但是還要對這個區塊進行校驗看看是否有效,因為可能這是一個被篡改的非法的區塊,也有可能和這個鏈沒有任何關系的區塊而僅僅只是符合上述哈希的規則而已。所以,需要進行一下校驗,,前后區塊的有效性。

        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 //確保隨機數正確
         // 都滿足則返回true
         return true
         }

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

        二、構建P2P網絡

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

        723324283-5ca342a9a2412_articlex.png

        雖然,區塊鏈是通過點對點的連接方式進行數據傳輸,但是,在這之前還需要一個東西作為引導,這個就是種子節點。因為,兩個節點之間他們可能不是處在同一個域下,他們之間想要聯系,必須有一方知道對方的ip和端口,這樣才能和對方聯系上。節點ip和端口號,在這個節點創建出來之后,種子節點就會發給它在這個區塊鏈中所有節點的ip和端口號同時記錄下這個新伙伴的ip和端口號。那么,新的節點拿到了這一份"通訊錄"之后,就會給這個"通訊錄"中的所有小伙伴發個消息,告訴他們有一位新的小伙伴加入,之后,其他節點收到了這個信息,也會在自己的"通訊錄"中加上新伙伴的ip和端口號,相當于加入了白名單。這樣新的節點接下來就可以和任意的的節點進行通信了。

        下面用代碼演示一下:

        (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.保存種子節點傳來的此新節點的信息包括ip和端口號,因為,新節點的ip和端口號是會有改變的情況。

        2.接受種子節點傳來的節點列表,將列表的節點遍歷檢查一下,沒有相同的就寫進列表中。

        3.將新節點的信息廣播到所有的節點上,同時接受到信息的節點更新一下節點列表

        4.將區塊鏈上信息同步一份都本地,同時對種子節點傳來的blockchain進行每個區塊的信息

        三、轉賬交易

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

        1531674164-5ca342bceabc3_articlex.png

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

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

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

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

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

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

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

        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;
         }
        }

        轉帳的時候需要3步,分別是校驗轉出賬戶是否有足夠的金額,轉出賬戶就是本地公鑰。如有則進行記賬并且使用兩個地址、金額、時間,還有簽名加密打包,之后進行全節點廣播。其他節點收到這個信息之后第一件事也是對新區塊的有效性做一個校驗,通過校驗之后就會寫入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 }
        
         // 非創世區塊
         if (trans.from !== '0') {
         // 檢驗余額
         if (!(_that.blance < amount)) { //_that.blance 當前賬戶余額
         //全節點廣播
         _that.send('trans', sigTrans)
         }else{
         console.log('not enough blance')
         return
         }
         }
         this.data.push(sigTrans)
         return sigTrans
        }

        其他節點收到消息之后,先進行去重校驗,然后再更新數據。

        四、查詢余額

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

         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視頻教程】

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        javascript實現小型區塊鏈的方法介紹(附代碼)

        javascript實現小型區塊鏈的方法介紹(附代碼):本篇文章給大家帶來的內容是關于javascript實現小型區塊鏈的方法介紹(附代碼),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。區塊鏈概念狹義:區塊鏈是一種按照時間順序將數據區塊以順序相連的方式組合成的一種鏈式數據結構,并以密碼方
        推薦度:
        標簽: 方法 區塊鏈 實現
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: AV大片在线无码永久免费| 久久久久久一品道精品免费看| 黄色永久免费网站| 亚洲欧洲综合在线| 四虎永久在线精品免费观看视频| 国产成人精品日本亚洲专| 无码人妻一区二区三区免费手机| 亚洲三级高清免费| 全部免费毛片在线| 国产成人无码精品久久久免费| 国产av无码专区亚洲av桃花庵 | 免费国产怡红院在线观看| 免费手机在线看片| 亚洲啪啪综合AV一区| 91制片厂制作传媒免费版樱花| 国产精品高清视亚洲精品| 国产成人免费全部网站| 最近免费字幕中文大全| 色拍自拍亚洲综合图区| 妞干网免费视频在线观看| 一级人做人爰a全过程免费视频| 亚洲国产精品VA在线观看麻豆| 在线观看免费av网站| 亚洲偷自拍另类图片二区| 亚洲国产一区二区三区| 久久久久久国产精品免费免费男同| 亚洲国产视频网站| 亚洲AV无码专区日韩| 免费国产成人α片| 亚洲中文字幕久久精品无码A| 亚洲男女内射在线播放| 最近中文字幕免费mv在线视频| 亚洲av成人一区二区三区观看在线| 久久亚洲色一区二区三区| 美女视频黄免费亚洲| fc2成年免费共享视频网站| 亚洲乱码中文字幕小综合| 亚洲一本大道无码av天堂| 免费精品国偷自产在线在线| yellow视频免费看| 学生妹亚洲一区二区|