国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題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關(guān)鍵字專題關(guān)鍵字專題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
當(dāng)前位置: 首頁(yè) - 科技 - 知識(shí)百科 - 正文

javascript實(shí)現(xiàn)小型區(qū)塊鏈的方法介紹(附代碼)

來(lái)源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-27 19:26:51
文檔

javascript實(shí)現(xiàn)小型區(qū)塊鏈的方法介紹(附代碼)

javascript實(shí)現(xiàn)小型區(qū)塊鏈的方法介紹(附代碼):本篇文章給大家?guī)?lái)的內(nèi)容是關(guān)于javascript實(shí)現(xiàn)小型區(qū)塊鏈的方法介紹(附代碼),有一定的參考價(jià)值,有需要的朋友可以參考一下,希望對(duì)你有所幫助。區(qū)塊鏈概念狹義:區(qū)塊鏈?zhǔn)且环N按照時(shí)間順序?qū)?shù)據(jù)區(qū)塊以順序相連的方式組合成的一種鏈?zhǔn)綌?shù)據(jù)結(jié)構(gòu),并以密碼方
推薦度:
導(dǎo)讀javascript實(shí)現(xiàn)小型區(qū)塊鏈的方法介紹(附代碼):本篇文章給大家?guī)?lái)的內(nèi)容是關(guān)于javascript實(shí)現(xiàn)小型區(qū)塊鏈的方法介紹(附代碼),有一定的參考價(jià)值,有需要的朋友可以參考一下,希望對(duì)你有所幫助。區(qū)塊鏈概念狹義:區(qū)塊鏈?zhǔn)且环N按照時(shí)間順序?qū)?shù)據(jù)區(qū)塊以順序相連的方式組合成的一種鏈?zhǔn)綌?shù)據(jù)結(jié)構(gòu),并以密碼方
本篇文章給大家?guī)?lái)的內(nèi)容是關(guān)于javascript實(shí)現(xiàn)小型區(qū)塊鏈的方法介紹(附代碼),有一定的參考價(jià)值,有需要的朋友可以參考一下,希望對(duì)你有所幫助。

區(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ū)塊。通過這個(gè)創(chuàng)世區(qū)塊,不停地通過變化隨機(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. index:是指每個(gè)區(qū)塊的序號(hào)
  2. data: 這里存放著區(qū)塊中所有的信息,例如轉(zhuǎn)賬,余額等數(shù)據(jù)
  3. previousHash: 指的是上一個(gè)區(qū)塊的hash值,創(chuàng)世區(qū)塊沒有上一個(gè),顯示0即可
  4. timestamp:指的是創(chuàng)建這個(gè)區(qū)塊的時(shí)間
  5. nonce:這個(gè)是隨機(jī)數(shù),挖礦就是通過不停變換這個(gè)nonce來(lái)計(jì)算出符合條件的哈希。
  6. hash: 本區(qū)塊的hash值,通過前面5個(gè)字段的信息進(jìn)行hash運(yùn)算得出的值。

接著,通過不停的hash運(yùn)算計(jì)算出符合條件的哈希,即挖礦。挖礦也可以調(diào)節(jié)難度的大小,例如算出的哈希值必須前3位數(shù)必須為1或者末3位數(shù)必須為1等等,這個(gè)可以自行的去定義,只要最后留一個(gè)控制的開關(guān),方便控制即可。可以在定義一個(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è)鏈沒有任何關(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è)塊的信息是正確的,是沒有被篡改過的是合法的。

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

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

723324283-5ca342a9a2412_articlex.png

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

下面用代碼演示一下:

(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)遍歷檢查一下,沒有相同的就寫進(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

1531674164-5ca342bceabc3_articlex.png

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

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

在區(qū)塊鏈中,進(jìn)行記錄轉(zhuǎn)賬交易的時(shí)候是需要一個(gè)加密的算法,把所有的信息進(jìn)行加密之后再push到新區(qū)塊中的data中,從而完成一筆新交易的記錄。以BTC為例,BTC的加密算法是使用elliptic這個(gè)加密算法,elliptic是一個(gè)非對(duì)稱性的加密算法,非對(duì)稱的加密算法的特點(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ō)公鑰代表的就是自己的錢包。

校驗(yàn)的方法,首先使用字段“from”,“to”,“amount”的參數(shù)進(jìn)行sign簽名,然后在每次挖礦(記賬)的時(shí)候,則使用verify(),通過前面的三個(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),通過校驗(yàn)之后就會(huì)寫入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í)忽略精度上的問題。

 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
 }

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

【相關(guān)推薦:JavaScript視頻教程】

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

javascript實(shí)現(xiàn)小型區(qū)塊鏈的方法介紹(附代碼)

javascript實(shí)現(xiàn)小型區(qū)塊鏈的方法介紹(附代碼):本篇文章給大家?guī)?lái)的內(nèi)容是關(guān)于javascript實(shí)現(xiàn)小型區(qū)塊鏈的方法介紹(附代碼),有一定的參考價(jià)值,有需要的朋友可以參考一下,希望對(duì)你有所幫助。區(qū)塊鏈概念狹義:區(qū)塊鏈?zhǔn)且环N按照時(shí)間順序?qū)?shù)據(jù)區(qū)塊以順序相連的方式組合成的一種鏈?zhǔn)綌?shù)據(jù)結(jié)構(gòu),并以密碼方
推薦度:
  • 熱門焦點(diǎn)

最新推薦

猜你喜歡

熱門推薦

專題
Top
主站蜘蛛池模板: 91精品国产免费久久久久久 | 亚洲一区二区三区久久精品 | 国产一区二区三区在线 | 免费国产线观看免费观看 | 久久久久久国产精品视频 | 美女视频黄a视频全免费应用 | 欧美3p在线观看一区二区三区 | 国产视频资源在线观看 | 美国一级大黄大色毛片视频一 | 亚洲永久精品一区二区三区 | 亚洲午夜一区二区三区 | 伊人精品在线视频 | 视频在线一区 | 国产精品高清久久久久久久 | 黄色精品视频 | 99999久久久久久亚洲 | 欧美日韩国产综合视频在线看 | 免费视频一区二区 | 亚洲精品国产成人99久久 | 国产成人高清一区二区私人 | 日本aⅴ精品一区二区三区久久 | 日本在线不卡一区二区 | 欧美日本一区二区三区 | 欧美v亚洲v国产v | 欧美专区日韩专区 | 国产中文字幕在线观看 | 99久久精品国内 | 欧美日韩亚洲高清不卡一区二区三区 | 欧美在线观看网站 | 欧美高清亚洲欧美一区h | 国产精品视频专区 | 精品国产一区二区三区久久久狼 | 日韩欧美在线观看成人 | 在线日韩亚洲 | 在线综合亚洲欧美自拍 | 永久免费毛片 | 日韩在线视频观看 | 91原创在线 | 99国内精品久久久久久久 | 久久久久久久岛国免费播放 | 日本a在线 |