亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

javascript實現小型區塊鏈功能

2024-05-06 16:49:31
字體:
來源:轉載
供稿:網友
區塊鏈概念
狹義:區塊鏈是一種按照時間順序將數據區塊以順序相連的方式組合成的一種鏈式數據結構,并以密碼方式保證的不可篡改和不可偽造的分布式賬本。
一、挖礦(產生新區塊)

首先,區塊鏈是由每一個區塊聯系而形成的,在產生新區塊之前必須先有一個最初始的區塊,這個區塊也叫創世區塊。通過這個創世區塊,不停地通過變化隨機數(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等等,這個可以自行的去定義,只要最后留一個控制的開關,方便控制即可??梢栽诙x一個變量

哈希的計算:

.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),不需要通過某一個中心服務器進行中轉,所以,信息安全的角度來說,點對點的連接方式對信息私密性是非常可靠的。

javascript,區塊鏈

雖然,區塊鏈是通過點對點的連接方式進行數據傳輸,但是,在這之前還需要一個東西作為引導,這個就是種子節點。因為,兩個節點之間他們可能不是處在同一個域下,他們之間想要聯系,必須有一方知道對方的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

javascript,區塊鏈

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

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

在區塊鏈中,進行記錄轉賬交易的時候是需要一個加密的算法,把所有的信息進行加密之后再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 }

至此,區塊鏈的最簡單的功能就實現完畢。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對VeVb武林網的支持。


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品福利观看| 日韩www在线| 久久久成人的性感天堂| 91sa在线看| 92看片淫黄大片看国产片| 精品国产福利在线| 欧美成人激情在线| 青青久久av北条麻妃海外网| 亚洲激情视频在线观看| 日韩精品极品在线观看播放免费视频| 97精品国产91久久久久久| 国产91露脸中文字幕在线| 精品久久国产精品| 日韩一级裸体免费视频| 九九久久久久久久久激情| 国产精品mp4| 成人a免费视频| 久久av.com| 亚洲午夜av电影| 日韩精品黄色网| 日韩免费av一区二区| 日韩欧美综合在线视频| 久久在线观看视频| 日韩免费在线播放| 欧美国产视频一区二区| 欧美极度另类性三渗透| 日韩中文字幕在线视频| 亚洲最大福利视频网站| 国产精品88a∨| 2019av中文字幕| 亚洲男人第一av网站| 国产成人一区二区三区小说| 日韩欧美一区视频| 亚洲最新视频在线| 亚洲国语精品自产拍在线观看| 国产mv免费观看入口亚洲| 成人免费网视频| 久久久久久久一区二区| 亚洲自拍在线观看| 国产日韩av高清| 国产成一区二区| 最近2019中文字幕mv免费看| 欧美午夜片在线免费观看| 91精品久久久久久久久不口人| 中文字幕久久亚洲| 色妞久久福利网| 日本aⅴ大伊香蕉精品视频| 午夜精品一区二区三区在线视频| 亚洲国产美女久久久久| 成人中心免费视频| 日韩美女视频在线观看| 中文日韩电影网站| 黑人巨大精品欧美一区二区一视频| 黄色成人在线播放| 亚洲第一在线视频| 国内精品久久久久久| 尤物yw午夜国产精品视频明星| 国产97在线视频| 亚洲国产成人久久综合一区| 久久影视电视剧免费网站清宫辞电视| 亚洲国产精品高清久久久| 性欧美亚洲xxxx乳在线观看| 国产精品第三页| 国产福利视频一区| 欧美成人午夜激情视频| 国产成人亚洲综合91| 国产不卡av在线免费观看| 91免费在线视频网站| 色先锋资源久久综合5566| 日韩欧美亚洲成人| 国产精品黄色av| 尤物九九久久国产精品的特点| 伊人久久大香线蕉av一区二区| 欧美极度另类性三渗透| 国产激情999| 亚洲国产精品va在线看黑人动漫| 亚洲成人性视频| 色诱女教师一区二区三区| 国产精品久久久久久久av电影| 欧美激情a∨在线视频播放| 国产精品日日摸夜夜添夜夜av| 亚洲精品一区av在线播放| 亚洲国产日韩精品在线| 久久在线观看视频| 国产成人精品一区二区| 国产成人免费av| 57pao精品| 久久久影视精品| 亚洲精品视频中文字幕| 欧美专区福利在线| 欧美激情va永久在线播放| 国内精品免费午夜毛片| 一区二区欧美亚洲| 91在线网站视频| 亚洲一区二区三区在线视频| 国产精品国产三级国产专播精品人| 久久九九国产精品怡红院| 狠狠躁天天躁日日躁欧美| 国产精品福利观看| 91精品国产91| 午夜精品一区二区三区在线视| 日韩在线观看免费全集电视剧网站| 精品久久久中文| 91精品在线观| 欧美亚洲一级片| 国产精品丝袜视频| 欧美资源在线观看| 亚洲成人av在线| 国产精品视频中文字幕91| 亚洲精选在线观看| 国产一区av在线| 精品国产一区二区三区久久狼黑人| 在线观看国产精品91| 欧美在线亚洲一区| 91老司机精品视频| 91欧美日韩一区| 亚洲国产精品久久久久秋霞不卡| 夜夜嗨av色一区二区不卡| 日韩的一区二区| 欧美巨猛xxxx猛交黑人97人| 美女性感视频久久久| 成人黄色片网站| 久久躁狠狠躁夜夜爽| 91麻豆桃色免费看| 国产va免费精品高清在线观看| 精品国偷自产在线| 国产91精品青草社区| 亚洲美女精品久久| 成人国产在线视频| 亚洲人精品午夜在线观看| 成人免费视频网址| 欧美日韩国产影院| 国产精品久久久久一区二区| 久久久久久久香蕉网| 国产综合视频在线观看| 国产主播在线一区| 精品久久久国产精品999| 国产精品极品美女在线观看免费| 欧美亚洲视频在线观看| 日韩欧美aaa| 91精品久久久久久久久久久| 久久天天躁狠狠躁老女人| 国产精品久久久久久久久久99| 亚洲免费成人av电影| 国产欧美久久一区二区| 久久久久久国产精品美女| 久久久久五月天| 日韩视频中文字幕| 中文综合在线观看| 久久亚洲电影天堂| 欧美黑人性生活视频| 久久综合免费视频影院| 亚洲黄色成人网| 欧美激情高清视频| 91精品久久久久久久久久久久久| 最近2019中文字幕第三页视频| 久久成人精品一区二区三区| 国产丝袜一区二区| 正在播放欧美一区| 国产精品第8页| 国产精品夫妻激情| 不用播放器成人网| 91丝袜美腿美女视频网站| 尤物99国产成人精品视频|