精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

你連編程語言都不懂?看完這篇你也會寫區(qū)塊鏈

開發(fā) 前端 區(qū)塊鏈
各種不同的【編程語言】就像這不同的建筑原材料,每一種都能夠建造出完整的建筑,也可以混合使用。而這些半成品材料,就是這個語言的【類庫】,他們決定了這個到底語言能夠構(gòu)建什么樣的項(xiàng)目。今天將會用 JavaScript 來創(chuàng)建一個簡單的區(qū)塊鏈來演示它們的內(nèi)部究竟是如何工作的。

咨詢了一下業(yè)內(nèi)的程序員叔叔們,對于寫區(qū)塊鏈的語言他們是這樣說的:“本質(zhì)上,原理搞懂了,什么主流語言都能實(shí)現(xiàn)。” “呵呵”狼而,我連什么是編程語言都不懂。

中成才叔叔解釋道:“我們知道,從遠(yuǎn)古時(shí)期到當(dāng)代,建筑的形態(tài)經(jīng)歷了巨變。原材料也從山洞、石板、木材、水泥、鋼材演變到復(fù)合木材。但原材料要能夠被用于構(gòu)筑大型建筑,還需要先把它們改造成各種不同形狀不同用途的半成品材料,再由這些半成品材料二次組裝成完整建筑。各種不同的【編程語言】就像這不同的建筑原材料,每一種都能夠建造出完整的建筑,也可以混合使用。而這些半成品材料,就是這個語言的【類庫】,他們決定了這個到底語言能夠構(gòu)建什么樣的項(xiàng)目。類庫到底有多重要,開發(fā)起來又有多難呢?想想為什么手機(jī)操作系統(tǒng)只有 Android 和 iOS,而我國就開發(fā)不出來自己的手機(jī)操作系統(tǒng)呢?說明這個世界上,有能力建造這種類庫的組織只有這兩家,這比生產(chǎn)建筑預(yù)制材料其實(shí)更難。而像這種功能單一數(shù)量龐大的類庫叫做 SDK,有了它們,我們才能夠花很少的人在短時(shí)間內(nèi)開發(fā)出一個 App。編程語言同時(shí)又是一種粘合劑,要把這些類庫粘合起來才能開發(fā)出一個項(xiàng)目,這往往也需要好幾個月甚至幾年,與建樓的復(fù)雜度無異!”

區(qū)塊鏈學(xué)習(xí)更多的是去理解這種去中心化的思想和去中心化的價(jià)值所在,語言是程序員們的執(zhí)行工具。不過由于以太坊和Hyperledger Fabric 對go語言支持最好,所以go語言肯定是要學(xué)習(xí)的。并且go更專業(yè)一些,但是JavaScript 門檻低,運(yùn)行效率也低,JavaScript 大多用于網(wǎng)頁,在服務(wù)端跑也是可以。

廢話少說,今天將會用 JavaScript 來創(chuàng)建一個簡單的區(qū)塊鏈來演示它們的內(nèi)部究竟是如何工作的。


連編程語言都不懂?看完這篇你也會寫區(qū)塊鏈

具體分為以下三個部分:

  • 實(shí)現(xiàn)一個基本的區(qū)塊鏈
  • 實(shí)現(xiàn) POW交易與挖礦獎勵
  • 實(shí)現(xiàn)一個基本的區(qū)塊鏈,區(qū)塊鏈?zhǔn)怯梢粋€個任何人都可以訪問的區(qū)塊構(gòu)成的公共數(shù)據(jù)庫。

這好像沒什么特別的,不過它們有一個有趣的屬性:它們是不可變的。一旦一個區(qū)塊被添加到區(qū)塊鏈中,除非讓剩余的其余區(qū)塊失效,否則它是不會再被改變的。這就是為什么加密貨幣是基于區(qū)塊鏈的原因。你肯定不希望人們在交易完成后再變更交易!

創(chuàng)造一個區(qū)塊區(qū)塊鏈?zhǔn)怯稍S許多多的區(qū)塊鏈接在一起的(這聽上去好像沒毛病..)。鏈上的區(qū)塊通過某種方式允許我們檢測到是否有人操縱了之前的任何區(qū)塊。那么我們?nèi)绾未_保數(shù)據(jù)的完整性呢?每個區(qū)塊都包含一個基于其內(nèi)容計(jì)算出來的 hash。同時(shí)也包含了前一個區(qū)塊的 hash。

下面是一個區(qū)塊類用 JavaScript 寫出來大致的樣子: 

  1. const SHA256 = require("crypto-js/sha256"); 
  2. class Block { constructor(indextimestamp, data, previousHash = '') {  
  3.     this.index = index 
  4.     this.previousHash = previousHash;  
  5.     this.timestamp = timestamp; this.data = data;  
  6.     this.hash = this.calculateHash(); 
  7.     }  
  8.     calculateHash() { return SHA256(this.index + this.previousHash + this.timestamp + JSON.stringify(this.data)).toString(); }  
  9.  

因?yàn)?JavaScript 中并不支持 sha256 所以我引入了 crypto-js 庫。然后我定義了一個構(gòu)造函數(shù)來初始化區(qū)塊的屬性。每一個區(qū)塊上都被賦予了 index 屬性來告知我們這個區(qū)塊在整個鏈上的位置。我們同時(shí)也生成了一個時(shí)間戳,以及需要在區(qū)塊里存儲的一些數(shù)據(jù)。最后是前一個區(qū)塊的 hash。 創(chuàng)造一個鏈現(xiàn)在我們可以在 Blockchain 類中將區(qū)塊鏈接起來了。下面是用 JavaScript 實(shí)現(xiàn)的代碼: 

  1. class Blockchain{  
  2.   constructor() { this.chain = [this.createGenesisBlock()]; }  
  3.   createGenesisBlock() { return new Block(0, "01/01/2017""Genesis block""0"); }  
  4.   getLatestBlock() { return this.chain[this.chain.length - 1]; }  
  5.   addBlock(newBlock) { newBlock.previousHash = this.getLatestBlock().hash; newBlock.hash = newBlock.calculateHash(); this.chain.push(newBlock); }  
  6.   isChainValid() {  
  7.     for (let i = 1; i < this.chain.length; i++)    {  
  8.         const currentBlock = this.chain[i];  
  9.         const previousBlock = this.chain[i - 1];  
  10.         if (currentBlock.hash !== currentBlock.calculateHash())  
  11.         { return false; }  
  12.         if (currentBlock.previousHash !== previousBlock.hash)  
  13.         { return false; }  
  14.     }  
  15.   return true 
  16.   }  
  17.  

在構(gòu)造函數(shù)里,我通過創(chuàng)建一個包含創(chuàng)世塊的數(shù)組來初始化整個鏈。

第一個區(qū)塊是特殊的,因?yàn)樗荒苤赶蚯耙粋€區(qū)塊。

我還添加了下面兩個方法:

  • getLatestBlock() 返回我們區(qū)塊鏈上最新的區(qū)塊。
  • addBlock() 負(fù)責(zé)將新的區(qū)塊添加到我們的鏈上。

為此,我們將前一個區(qū)塊的 hash 添加到我們新的區(qū)塊中。這樣,我們就可以保持整個鏈的完整性。因?yàn)橹灰覀冏兏俗钚聟^(qū)塊的內(nèi)容,我們就需要重新計(jì)算它的 hash。當(dāng)計(jì)算完成后,我將把這個區(qū)塊推進(jìn)鏈里(一個數(shù)組)。

最后,我創(chuàng)建一個 isChainValid() 來確保沒有人篡改過區(qū)塊鏈。它會遍歷所有的區(qū)塊來檢查每個區(qū)塊的 hash 是否正確。它會通過比較 previousHash 來檢查每個區(qū)塊是否指向正確的上一個區(qū)塊。如果一切都沒有問題,它會返回 true 否則會返回 false。

使用區(qū)塊鏈我們的區(qū)塊鏈類已經(jīng)寫完啦,可以真正的開始使用它了。 

  1. let savjeeCoin = new Blockchain();  
  2. savjeeCoin.addBlock(new Block(1, "20/07/2017", { amount: 4 }));  
  3. savjeeCoin.addBlock(new Block(2, "20/07/2017", { amount: 8 }));  

在這里我僅僅是創(chuàng)建了一個區(qū)塊鏈的實(shí)例,并且命名它為 SavjeeCoin。之后我在鏈上添加了一些區(qū)塊。區(qū)塊里可以包含任何你想要放的數(shù)據(jù),不過在上面的代碼里,我選擇添加了一個帶有 amount 屬性的對象。 試著操作吧!

在介紹里我曾說過區(qū)塊鏈?zhǔn)遣豢勺兊摹R坏┨砑樱瑓^(qū)塊就不可能再變更了。讓我們試一下。 

  1. // 檢查是否有效(將會返回true)
  2. console.log('Blockchain valid? ' + savjeeCoin.isChainValid());
  3. // 現(xiàn)在嘗試操作變更數(shù)據(jù)
  4. savjeeCoin.chain[1].data = { amount: 100 };
  5. // 再次檢查是否有效 (將會返回false)
  6. console.log("Blockchain valid? " + savjeeCoin.isChainValid()); 

我會在一開始通過運(yùn)行 isChainValid() 來驗(yàn)證整個鏈的完整性。我們操作過任何區(qū)塊,所以它會返回 true。之后我將鏈上的第一個(索引為 1)區(qū)塊的數(shù)據(jù)進(jìn)行了變更。之后我再次檢查整個鏈的完整性,發(fā)現(xiàn)它返回了 false。我們的整個鏈不再有效了。 結(jié)論這個小栗子還遠(yuǎn)未達(dá)到完成的程度。它還沒有實(shí)現(xiàn) POW(工作量證明機(jī)制)或 P2P 網(wǎng)絡(luò)來與其他礦工來進(jìn)行交流。但它確實(shí)證明了區(qū)塊鏈的工作原理。

許多人認(rèn)為原理會非常復(fù)雜,但這篇文章證明了區(qū)塊鏈的基本概念是非常容易理解和實(shí)現(xiàn)的。實(shí)現(xiàn) POW在上文中我們用 JavaScript 創(chuàng)建了一個簡單的區(qū)塊鏈來演示區(qū)塊鏈的工作原理。不過這個實(shí)現(xiàn)并不完整,很多人發(fā)現(xiàn)依舊可以篡改該系統(tǒng)。

沒錯!我們的區(qū)塊鏈需要另一種機(jī)制來抵御攻擊。讓我們來看看我們該如何做到這一點(diǎn)。 問題現(xiàn)在我們可以很快的創(chuàng)造區(qū)塊,然后非常迅速的將它們添加進(jìn)我們的區(qū)塊鏈中。

不過這導(dǎo)致了三個問題:人們可以快速創(chuàng)建區(qū)塊,然后在我們的鏈里塞滿垃圾。大量的區(qū)塊會導(dǎo)致我們區(qū)塊鏈過載并讓它無法使用。因?yàn)閯?chuàng)建一個有效的區(qū)塊太容易了,人們可以篡改鏈中的某一個區(qū)塊,然后重新計(jì)算所有區(qū)塊的 hash。即使它們已經(jīng)篡改了區(qū)塊,他們?nèi)匀豢梢砸杂行У膮^(qū)塊來作為結(jié)束。你可以通過結(jié)合上述兩個破綻來有效控制區(qū)塊鏈。區(qū)塊鏈由 P2P 網(wǎng)絡(luò)驅(qū)動,其中節(jié)點(diǎn)會將區(qū)塊添加到可用的最長鏈中。所以你可以篡改區(qū)塊,然后計(jì)算所有其他的區(qū)塊,最后添加任意多你想要添加的區(qū)塊。你最后會得到一個最長的鏈,所有的其他節(jié)點(diǎn)都會接受它,然后往上添加自己的區(qū)塊。

顯然我們需要一個方案來解決這些問題:POW(proof-of-work:工作量證明)。 什么是 POWPOW 是在第一個區(qū)塊鏈被創(chuàng)造之前就已經(jīng)存在的一種機(jī)制。這是一項(xiàng)簡單的技術(shù),通過一定數(shù)量的計(jì)算來防止濫用。工作量是防止垃圾填充和篡改的關(guān)鍵。如果它需要大量的算力,那么填充垃圾就不再值得。比特幣通過要求 hash 以特定 0 的數(shù)目來實(shí)現(xiàn) POW。這也被稱之為難度,不過等一下!

一個區(qū)塊的 hash 怎么可以改變呢?在比特幣的場景下,一個區(qū)塊包含有各種金融交易信息。我們肯定不希望為了獲取正確的 hash 而混淆了那些數(shù)據(jù)。為了解決這個問題,區(qū)塊鏈添加了一個 Nonce 值。Nonce 是用來查找一個有效 hash 的次數(shù)。而且,因?yàn)闊o法預(yù)測 hash 函數(shù)的輸出,因此在獲得滿足難度條件的 hash 之前,只能大量組合嘗試。尋找到一個有效的 hash(創(chuàng)建一個新的區(qū)塊)在圈內(nèi)稱之為挖礦。

在比特幣的場景下,POW 確保每 10 分鐘只能添加一個區(qū)塊。你可以想象垃圾填充者需要多大的算力來創(chuàng)造一個新區(qū)塊,他們很難欺騙網(wǎng)絡(luò),更不要說篡改整個鏈。 實(shí)現(xiàn) POW我們該如何實(shí)現(xiàn)呢?我們先來修改我們區(qū)塊類并在其構(gòu)造函數(shù)中添加 Nonce 變量。我會初始化它并將其值設(shè)置為 0。 

  1. constructor(indextimestamp, data, previousHash = ''){ this.index = index; this.previousHash = previousHash; this.timestamp = timestamp; this.data = data; this.hash = this.calculateHash(); this.nonce = 0;} 

我們還需要一個新的方法來增加 Nonce,直到我們獲得一個有效 hash。強(qiáng)調(diào)一下,這是由難度決定的。所以我們會收到作為參數(shù)的難度。 

  1. mineBlock(difficulty) { while (this.hash.substring(0, difficulty) !== Array(difficulty + 1).join("0")) { this.nonce++; this.hash = this.calculateHash(); } console.log("BLOCK MINED: " + this.hash);} 

最后,我們還需要更改一下 calculateHash() 函數(shù)。因?yàn)槟壳八€沒有使用 Nonce 來計(jì)算 hash。 

  1. calculateHash() { return SHA256(this.index + this.previousHash + this.timestamp + JSON.stringify(this.data) + this.nonce ).toString();} 

將它們結(jié)合在一起,你會得到如下所示的區(qū)塊類: 

  1. class Block {  
  2.   constructor(indextimestamp, data, previousHash = '') {  
  3.     this.index = index; this.previousHash = previousHash;  
  4.     this.timestamp = timestamp 
  5.     this.data = data;  
  6.     this.hash = this.calculateHash();  
  7.     this.nonce = 0;  
  8.   }  
  9.   calculateHash() { return SHA256(this.index + this.previousHash + this.timestamp + JSON.stringify(this.data) + this.nonce).toString(); }  
  10.   mineBlock(difficulty) {  
  11.         while (this.hash.substring(0, difficulty) !== Array(difficulty + 1).join("0")) { this.nonce++; this.hash = this.calculateHash(); }  
  12.         console.log("BLOCK MINED: " + this.hash);  
  13.   }  
  14.  

修改區(qū)塊鏈現(xiàn)在,我們的區(qū)塊已經(jīng)擁有 Nonce 并且可以被開采了,我們還需要確保我們的區(qū)塊鏈支持這種新的行為。讓我們先在區(qū)塊鏈中添加一個新的屬性來跟蹤整條鏈的難度。我會將它設(shè)置為 2(這意味著區(qū)塊的 hash 必須以 2 個 0 開頭)。 

  1. constructor() { this.chain = [this.createGenesisBlock()]; this.difficulty = 2;} 

現(xiàn)在剩下要做的就是改變 addBlock() 方法,以便在將其添加到鏈中之前確保實(shí)際挖到該區(qū)塊。下面我們將難度傳給區(qū)塊。 

  1. addBlock(newBlock) { newBlock.previousHash = this.getLatestBlock().hash; newBlock.mineBlock(this.difficulty); this.chain.push(newBlock);} 

大功告成!我們的區(qū)塊鏈現(xiàn)在擁有了 POW 來抵御攻擊了。測試現(xiàn)在讓我們來測試一下我們的區(qū)塊鏈,看看在 POW 下添加一個新區(qū)塊會有什么效果。我將會使用之前的代碼,我們將創(chuàng)建一個新的區(qū)塊鏈實(shí)例,然后往里添加 2 個區(qū)塊。 

  1. let savjeeCoin = new Blockchain();
  2. console.log('Mining block 1');
  3. savjeeCoin.addBlock(new Block(1, "20/07/2017", { amount: 4 }));
  4. console.log('Mining block 2');
  5. savjeeCoin.addBlock(new Block(2, "20/07/2017", { amount: 8 })); 

如果你運(yùn)行了上面的代碼,你會發(fā)現(xiàn)添加新區(qū)塊依舊非常快。這是因?yàn)槟壳暗碾y度只有 2(或者你的電腦性能非常好)。如果你創(chuàng)建了一個難度為 5 的區(qū)塊鏈實(shí)例,你會發(fā)現(xiàn)你的電腦會花費(fèi)大概 10 秒鐘來挖礦。隨著難度的提升,你的防御攻擊的保護(hù)程度越高。免責(zé)聲明就像之前說的:這絕不是一個完整的區(qū)塊鏈。它仍然缺少很多功能(像 P2P 網(wǎng)路)。這只是為了說明區(qū)塊鏈的工作原理。并且:由于單線程的原因,用 JavaScript 來挖礦并不快。交易與挖礦獎勵在前面兩部分我們創(chuàng)建了一個簡單的區(qū)塊鏈,并且加入了 POW 來抵御攻擊。然而我們在途中也偷了懶:我們的區(qū)塊鏈只能在一個區(qū)塊中存儲一筆交易,而且礦工沒有獎勵。

現(xiàn)在,讓我們解決這個問題!重構(gòu)區(qū)塊類現(xiàn)在一個區(qū)塊擁有 index,previousHash,timestamp,data,hash 和 nonce 屬性。這個 index 屬性并不是很有用,事實(shí)上我甚至不知道為什么開始我要將它添加進(jìn)去。所以我把它移除了,同時(shí)將 data 改名為 transactions 來更語義化。 

  1. class Block{ 
  2. constructor(timestamp, transactions, previousHash = '') { 
  3. this.previousHash = previousHash; 
  4. this.timestamp = timestamp
  5. this.transactions = transactions; 
  6. this.hash = this.calculateHash(); 
  7. this.nonce = 0; 
  8. }

當(dāng)我們改變區(qū)塊類時(shí),我們也必須更改 calculateHash()函數(shù)。現(xiàn)在它還在使用老舊的 index 和 data 屬性。 

  1. calculateHash() { return SHA256(this.previousHash + this.timestamp + JSON.stringify(this.transactions) + this.nonce).toString();} 

交易類在區(qū)塊內(nèi),我們將可以存儲多筆交易。因此我們還需要定義一個交易類,這樣我們可以鎖定交易應(yīng)當(dāng)具有的屬性: 

  1. class Transaction{ constructor(fromAddress, toAddress, amount){ this.fromAddress = fromAddress; this.toAddress = toAddress; this.amount = amount; }} 

這個交易例子非常的簡單,僅僅包含了發(fā)起方(fromAddress)和接受方(toAddress)以及數(shù)量。如果有需求,你也可以在里面加入更多字段,不過這個只是為了最小實(shí)現(xiàn)。調(diào)整我們的區(qū)塊鏈當(dāng)前的最大任務(wù):調(diào)整我們的區(qū)塊鏈來適應(yīng)這些新變化。我們需要做的第一件事就是存儲待處理交易的地方。正如你所知道的,由于 POW,區(qū)塊鏈可以穩(wěn)定的創(chuàng)建區(qū)塊。在比特幣的場景下,難度被設(shè)置成大約每 10 分鐘創(chuàng)建一個新區(qū)塊。但是可以在創(chuàng)造兩個區(qū)塊之間提交新的交易。為了做到這一點(diǎn),首先需要改變我們區(qū)塊鏈的構(gòu)造函數(shù),以便他可以存儲待處理的交易。我們還將創(chuàng)造一個新的屬性,用于定義礦工獲得多少錢作為獎勵: 

  1. class Blockchain{ 
  2. constructor() {
  3.   this.chain = [this.createGenesisBlock()]; 
  4. this.difficulty = 5; // 在區(qū)塊產(chǎn)生之間存儲交易的地方 
  5. this.pendingTransactions = []; // 挖礦回報(bào) 
  6. this.miningReward = 100; 
  7. }

下一步,我們將調(diào)整我們的 addBlock()方法。不過我的調(diào)整是指刪掉并重寫它!我們將不再允許人們直接為鏈上添加區(qū)塊。相反,他們必須將交易添加至下一個區(qū)塊中。而且我們將 addBlock()更名為 createTransaction(),這看起來更語義化: 

  1. createTransaction(transaction) { 
  2. // 這里應(yīng)該有一些校驗(yàn)! 
  3. // 推入待處理交易數(shù)組 
  4. this.pendingTransactions.push(transaction);

挖礦人們現(xiàn)在可以將新的交易添加到待處理交易的列表中。但無論如何,我們需要將他們清理掉并移入實(shí)際的區(qū)塊中。為此,我們來創(chuàng)建一個 minePendingTransactions()方法。這個方法不僅會挖掘所有待交易的新區(qū)塊,而且還會向采礦者發(fā)送獎勵。

  1. minePendingTransactions(miningRewardAddress) {
  2.  // 用所有待交易來創(chuàng)建新的區(qū)塊并且開挖.. 
  3. let block = new Block(Date.now(), this.pendingTransactions); 
  4. block.mineBlock(this.difficulty); 
  5. // 將新挖的看礦加入到鏈上 
  6. this.chain.push(block); 
  7. // 重置待處理交易列表并且發(fā)送獎勵 
  8. this.pendingTransactions = [ new Transaction(null, miningRewardAddress, this.miningReward) ];

請注意,該方法采用了參數(shù) miningRewardAddress。如果你開始挖礦,你可以將你的錢包地址傳遞給此方法。一旦成功挖到礦,系統(tǒng)將創(chuàng)建一個新的交易來給你挖礦獎勵(在這個栗子里是 100 枚幣)。

有一點(diǎn)需要注意的是,在這個栗子中,我們將所有待處理交易一并添加到一個區(qū)塊中。但實(shí)際上,由于區(qū)塊的大小是有限制的,所以這是行不通的。在比特幣里,一個區(qū)塊的大小大概是 2MB。如果有更多的交易能夠擠進(jìn)一個區(qū)塊,那么礦工可以選擇哪些交易達(dá)成哪些交易不達(dá)成(通常情況下費(fèi)用更高的交易容易獲勝)。地址的余額在測試我們的代碼前讓我們再做一件事!如果能夠檢查我們區(qū)塊鏈上地址的余額將會更好。 

  1. getBalanceOfAddress(address){ 
  2. let balance = 0;
  3. // you start at zero! 
  4. // 遍歷每個區(qū)塊以及每個區(qū)塊內(nèi)的交易 
  5. for(const block of this.chain){
  6.   for(const trans of block.transactions){ 
  7. // 如果地址是發(fā)起方 -> 減少余額 
  8. if(trans.fromAddress === address){ balance -= trans.amount; }
  9.  // 如果地址是接收方 -> 增加余額 
  10. if(trans.toAddress === address){ balance += trans.amount; }
  11.   } 
  12. }
  13. return balance;

測試好吧,我們已經(jīng)完成并可以正常工作。為此,我們創(chuàng)建了一些交易: 

  1. let savjeeCoin = new Blockchain();
  2. console.log('Creating some transactions...');
  3. savjeeCoin.createTransaction(new Transaction('address1''address2', 100));
  4. savjeeCoin.createTransaction(new Transaction('address2''address1', 50)); 

這些交易目前都處于等待狀態(tài),為了讓他們得到證實(shí),我們必須開始挖礦: 

  1. console.log('Starting the miner...');
  2. savjeeCoin.minePendingTransactions('xaviers-address'); 

當(dāng)我們開始挖礦,我們也會傳遞一個我們想要獲得挖礦獎勵的地址。在這種情況下,我的地址是 xaviers-address(非常復(fù)雜!)。之后,讓我們檢查一下 xaviers-address 的賬戶余額: 

  1. console.log('Balance of Xaviers address is', savjeeCoin.getBalanceOfAddress('xaviers-address'));// 輸出: 0我的賬戶輸出竟然是 0?! 

等等,為什么?難道我不應(yīng)該得到我的挖礦獎勵么?如果你仔細(xì)觀察代碼,你會看到系統(tǒng)會創(chuàng)建一個交易,然后將您的挖礦獎勵添加為新的待處理交易。這筆交易將會包含在下一個區(qū)塊中。所以如果我們再次開始挖礦,我們將收到我們的 100 枚硬幣獎勵!

  1. console.log('Starting the miner again!');
  2. savjeeCoin.minePendingTransactions("xaviers-address");
  3. console.log('Balance of Xaviers address is', savjeeCoin.getBalanceOfAddress('xaviers-address'));// 輸出: 100 

局限性與結(jié)論現(xiàn)在我們的區(qū)塊鏈已經(jīng)可以在一個區(qū)塊上存儲多筆交易,并且可以為礦工帶來回報(bào)。

不過,還是有一些不足:發(fā)送貨幣時(shí),我們不檢查發(fā)起人是否有足夠的余額來實(shí)際進(jìn)行交易。然而,這其實(shí)是一件容易解決的事情。我們也沒有創(chuàng)建一個新的錢包和簽名交易(傳統(tǒng)上用公鑰/私鑰加密完成)。這絕不是一個完整的區(qū)塊鏈實(shí)現(xiàn)!它仍然缺少很多功能。這里只是為了驗(yàn)證一些概念來幫助大家了解區(qū)塊鏈的工作原理。 

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

2021-09-06 07:58:47

鏈表數(shù)據(jù)結(jié)構(gòu)

2020-11-04 08:37:37

C語言C++內(nèi)存

2020-06-18 10:48:44

Linux 系統(tǒng) 數(shù)據(jù)

2015-03-16 11:33:16

程序員代碼bug

2024-11-20 08:09:19

RabbitMQ項(xiàng)目客戶端

2018-06-25 16:16:40

2021-06-16 00:57:16

JVM加載機(jī)制

2018-01-15 10:51:42

2022-02-18 06:56:18

Wi-Fi路由器局域網(wǎng)

2018-03-29 09:54:16

區(qū)塊鏈密碼學(xué)雙重支付

2023-10-08 19:06:41

2020-03-18 21:12:22

Nginx網(wǎng)站Linux

2017-02-09 19:45:07

Linux系統(tǒng)Linux 發(fā)行版

2018-07-25 16:36:18

2021-05-10 16:42:52

數(shù)據(jù)AI計(jì)算機(jī)

2019-01-30 13:44:34

JVM內(nèi)存服務(wù)器

2018-02-25 22:37:34

2023-08-09 09:03:49

CPU密集型運(yùn)算

2019-05-17 09:33:50

圖像識別三維重建文本識別

2019-11-27 15:19:44

系統(tǒng)緩存架構(gòu)
點(diǎn)贊
收藏

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

精品熟女一区二区三区| 成人在线免费观看网址| 日日夜夜狠狠操| 欧美丝袜一区| 欧美一区二区三区男人的天堂| 久久香蕉视频网站| 免费黄色在线视频网站| 欧美a级理论片| 久久九九有精品国产23| 国产黄色三级网站| 欧美三级电影网址| 岛国av午夜精品| 免费看av软件| 免费人成在线观看网站| 国产99精品在线观看| 日韩暖暖在线视频| 免费网站看av| 日韩啪啪电影网| 精品调教chinesegay| 久久精品一二三四| 中文另类视频| 欧美日韩国产丝袜美女| 裸体裸乳免费看| 国产福利小视频在线观看| 国产大陆a不卡| 国产欧美精品在线| 五月天激情国产综合婷婷婷| 欧美黄色aaaa| 久久精品国产91精品亚洲| 日本一区二区三区网站| 高清一区二区三区| 欧美一区二区三区啪啪| 午夜剧场在线免费观看| 日韩成人亚洲| 色综合夜色一区| 无码粉嫩虎白一线天在线观看| 蜜芽在线免费观看| 中文字幕av一区二区三区 | jizz18欧美18| 欧美欧美午夜aⅴ在线观看| 国产aaa一级片| xxxx视频在线| 亚洲国产日韩精品| 香港三级日本三级a视频| 国产乱色在线观看| 综合精品久久久| 椎名由奈jux491在线播放| аⅴ资源新版在线天堂| 久久久精品中文字幕麻豆发布| 激情伦成人综合小说| 性色av蜜臀av| 国产成人激情av| 3d精品h动漫啪啪一区二区| 国产女无套免费视频| 久草在线在线精品观看| 国产精品中文字幕在线观看| 做爰视频毛片视频| 毛片av一区二区| 国产精品专区第二| 国产又黄又大又爽| 国产精品自拍三区| 国产精华一区| 欧美一区二区黄片| 99久久婷婷国产综合精品电影 | 午夜精品久久17c| 国产一国产二国产三| 伊人久久综合| 欧美中在线观看| 天天干,天天干| 青青草精品视频| 91精品在线观看视频| 99久久久无码国产精品免费| 成人污视频在线观看| 国产乱码精品一区二区三区卡| 女人18毛片水真多18精品| heyzo一本久久综合| 欧美日本亚洲| 日本在线天堂| 亚洲国产美女搞黄色| 国产二区视频在线播放| av成人在线看| 欧美一级黄色录像| 精品无码人妻少妇久久久久久| 欧美日韩一区二区三区在线电影| 国产一区二区黑人欧美xxxx| 91狠狠综合久久久| 99成人在线| 国产精品99久久久久久久久| 在线观看免费中文字幕| 国产大陆精品国产| 色女人综合av| 性xxxfreexxxx性欧美| 欧美日韩在线免费| 免费黄频在线观看| 日韩三级视频| 日韩视频第一页| 国产真实乱偷精品视频| 日韩一区精品视频| av成人午夜| 国产在线一二三| 夜夜夜精品看看| 丰满少妇在线观看| 精品国产午夜肉伦伦影院| 在线观看欧美成人| 国产乡下妇女做爰毛片| 蜜桃av噜噜一区| 精品久久久久久一区| 乱人伦中文视频在线| 精品国产精品三级精品av网址| 亚洲欧美国产中文| 羞羞答答一区二区| 欧美日产国产成人免费图片| 中文字幕69页| 成人美女视频在线看| 伊人久久大香线蕉av一区| 免费看男女www网站入口在线| 欧美一区二区在线免费播放| 在线观看国产精品一区| 国产欧美日韩一区二区三区在线| 成人伊人精品色xxxx视频| 深夜福利在线视频| 亚洲国产人成综合网站| 91视频这里只有精品| 国产成人精品一区二区免费看京| 欧美精品久久久久久久| 国产日韩免费视频| 国产精品色眯眯| 欧美精品成人网| 日韩高清三区| 国模精品系列视频| 亚洲精品国产一区二| 亚洲免费在线视频一区 二区| 天天爽人人爽夜夜爽| 精品在线手机视频| 91国产精品视频在线| 亚洲精品国产精| 亚洲自拍偷拍网站| 初高中福利视频网站| 亚欧美无遮挡hd高清在线视频| 国产精品视频在线观看| 国产人成在线视频| 在线观看视频91| 精品国产av无码| 久久国产免费| 欧美裸体网站| 高清电影一区| 在线视频日本亚洲性| а中文在线天堂| 日本一区二区三区高清不卡| 国产第一页视频| 狠狠色丁香婷婷综合影院| 欧洲精品在线视频| 飘雪影院手机免费高清版在线观看 | 在线成人免费视频| 日韩精品久久久久久久的张开腿让| 男人操女人的视频在线观看欧美| 五月婷婷一区| 久久天天久久| 久久精品亚洲热| 国产三级三级在线观看| 亚洲一区二三区| 国产a级黄色片| 免费日韩av片| 日本一区二区三区www| 日本h片久久| 久久久999国产| 丰满人妻熟女aⅴ一区| 五月天欧美精品| 亚洲激情视频小说| 久久99精品久久久久久| 免费观看国产视频在线| 第一区第二区在线| 欧美一区二区.| 自拍视频在线| 精品久久五月天| 黄色片网站在线免费观看| 国产欧美日韩精品在线| 伊人成人免费视频| 一区二区三区四区五区精品视频| 日本一区免费在线观看| 91成人精品观看| 国内精品视频久久| 成人动漫在线免费观看| 日韩午夜av一区| 国产精品自拍99| 亚洲欧洲精品一区二区三区| 乱码一区二区三区| 日本sm残虐另类| 香港三级日本三级a视频| 教室别恋欧美无删减版| 91福利入口| 综合在线影院| 久久99精品久久久久久琪琪 | 一区二区三区高清国产| 国产极品久久久| 色综合久久综合网欧美综合网| 成年人二级毛片| 26uuu久久综合| 不用播放器的免费av| 国产精品久久777777毛茸茸 | 好看的日韩av电影| 日韩性感在线| 国产亚洲成av人片在线观黄桃| 国产精品女人久久久久久| 大香伊人久久| 久久精品国产一区二区三区| 天堂在线中文| 日韩欧美一区在线| 最近中文字幕免费观看| 欧美日韩亚洲国产一区| 青娱乐免费在线视频| 国产精品午夜在线| 亚洲欧美色图视频| 国产.欧美.日韩| 日本国产一级片| 日韩精品亚洲专区| 国产成人在线免费看| 你懂的网址国产 欧美| 一区二区三区四区视频在线| 西瓜成人精品人成网站| 国产精品xxxx| 日本成人手机在线| 国产日韩欧美综合| 国产综合色区在线观看| 欧美中文在线观看国产| 里番在线播放| 久久99热这里只有精品国产| 91美女视频在线| 亚洲一区二区国产| 免费在线高清av| 亚洲毛片在线免费观看| 凸凹人妻人人澡人人添| 精品国产欧美一区二区| 亚洲精品第五页| 欧美zozo另类异族| 精品二区在线观看| 欧美一区二区三区性视频| 夜夜骚av一区二区三区| 欧美天堂一区二区三区| 国产无遮挡又黄又爽又色视频| 欧美性69xxxx肥| 亚洲免费黄色网址| 精品久久久一区| 日韩欧美大片在线观看| 欧美日韩国产精品一区二区三区四区 | 欧美视频亚洲图片| 国产一区二区视频在线| а 天堂 在线| 国产乱人伦偷精品视频不卡| 日韩高清在线一区二区| 国产成人啪免费观看软件| 亚洲911精品成人18网站| 日日噜噜夜夜狠狠久久波多野| 国产盗摄女厕一区二区三区| 永久免费看片在线观看| 丁香啪啪综合成人亚洲小说| 国产原创剧情av| 91丨porny丨户外露出| 日韩网站在线播放| 久久精品人人做人人综合 | 国产精品福利电影一区二区三区四区| av在线网站观看| 久久久久88色偷偷免费| 亚洲色图日韩精品| 亚洲欧美一区二区三区孕妇| 青娱乐国产精品| 香蕉影视欧美成人| 中文人妻av久久人妻18| 在线观看日韩毛片| 国产精品午夜福利| 欧美成人女星排名| 天堂在线中文资源| 中文字幕日韩在线观看| 伊人春色在线观看| 97在线观看视频| 欧美日韩精品一区二区三区视频| 国产欧美精品xxxx另类| 亚洲天堂av资源在线观看| 精品欧美日韩在线| 成人系列视频| 激情六月天婷婷| 一本色道久久综合| 制服丝袜综合网| 国产传媒欧美日韩成人| 亚洲激情视频小说| 亚洲欧美色图小说| 男人午夜免费视频| 91精品婷婷国产综合久久性色| 理论片中文字幕| 一区三区二区视频| 青春草免费在线视频| 日韩av色综合| 精品一区二区三区免费看| 久久久久久亚洲精品不卡4k岛国| 日韩精品欧美| 午夜免费福利小电影| 美女国产一区二区| 国产ts丝袜人妖系列视频| 亚洲欧洲日本在线| 麻豆成人免费视频| 精品久久久久久无| 成人免费在线网| 欧美色图一区| 99在线观看视频免费| 日韩不卡在线观看日韩不卡视频| 日本中文字幕精品| 国产欧美日韩另类一区| 国产欧美日韩另类| 91麻豆精品国产无毒不卡在线观看 | 久久精品ww人人做人人爽| 91视频综合| 99色精品视频| 成人中文字幕电影| 神马午夜精品91| 91黄色在线观看| 天堂a√中文在线| 欧美精品在线网站| xxxxx.日韩| 久久99精品久久久久久秒播放器| 一区二区三区四区日韩| 天天干天天干天天干天天干天天干| 成人精品国产福利| 麻豆视频在线免费看| 欧美视频一区在线| 精华区一区二区三区| 8x拔播拔播x8国产精品| 国产一区在线电影| 日产精品久久久久久久蜜臀| 国内精品写真在线观看| 91激情视频在线观看| 色噜噜狠狠色综合中国| 天天摸天天碰天天爽天天弄| 久久久久久久久久久免费 | 久久激情中文| 国产伦精品一区二区三区精品| 亚洲欧美日韩一区二区| 91免费视频播放| 色爱av美腿丝袜综合粉嫩av| 欧美极品影院| 欧美久久电影| 久久亚洲色图| 美女爆乳18禁www久久久久久 | 欧美高清在线观看| 国产视频一区二区在线播放| 一本色道久久综合亚洲二区三区| 蜜桃视频在线一区| 四虎影视1304t| 欧美日韩国产大片| 日本在线视频站| 亚洲va欧美va国产综合剧情| 88国产精品视频一区二区三区| 欧美性受xxxxxx黑人xyx性爽| 亚洲日本在线视频观看| 99草在线视频| 欧美黄色性视频| 高潮久久久久久久久久久久久久| 秋霞无码一区二区| 91丨国产丨九色丨pron| 无码人妻久久一区二区三区不卡| 亚洲裸体xxxx| 福利一区视频| 9色视频在线观看| 国产91丝袜在线18| 91美女免费看| 亚洲视频专区在线| 日本午夜精品久久久久| 中文字幕中文字幕在线中心一区| 国产精品亚洲第一区在线暖暖韩国 | 亚洲乱熟女一区二区| 91国产美女视频| 国内精品久久久久久久影视简单| 男女视频在线看| 亚洲在线视频免费观看| 天堂成人在线视频| 国产盗摄xxxx视频xxx69| 日韩av有码| 中文字幕乱妇无码av在线| 午夜精品爽啪视频| 第九色区av在线| 亚洲最大成人网色| 一本综合精品| 青青青视频在线免费观看| 欧美成人性福生活免费看| 性感女国产在线| 一区二区三区的久久的视频| 成人妖精视频yjsp地址| 亚洲国产无线乱码在线观看| 欧美精品中文字幕一区| 亚洲美女15p| 女王人厕视频2ⅴk| 欧美天天综合色影久久精品| 69av在线| 狠狠久久综合婷婷不卡| 蓝色福利精品导航| 久久精品亚洲无码| www日韩欧美| 校花撩起jk露出白色内裤国产精品| 午夜两性免费视频| 精品欧美一区二区三区| 日本中文字幕在线播放|