讓我們通過構建一個應用程序來展示區(qū)塊鏈是如何工作的。根據(jù)維基百科的描述,區(qū)塊鏈是:一種分布式數(shù)據(jù)庫,用于維護不斷增長的記錄列表,稱為塊。這聽起來似乎不錯,但它到底是如何工作的?
為了說明區(qū)塊鏈如何工作,我們將使用名為 Blockchain CLI 的開源命令行界面。
我還在這里構建了一個 基于瀏覽器的版本 。
安裝命令行界面版本
如果還沒有 Node.js ,先安裝一下。
然后在終端中運行以下命令:
# Clone this repository
$ git clone https://github.com/seanseany/blockchain-cli
# Go into the repository
$ cd blockchain-cli
# Install dependencies
$ npm install
# Run the app
$ npm start
你應該看到,歡迎使用Blockchain CLI!和區(qū)塊鏈提示準備好了,可以接受命令。
區(qū)塊看起來像什么?
要查看當前的區(qū)塊鏈,請在命令提示符中輸入blockchain或bc。你應該看到如下圖所示的塊。
Block的索引:表示它是哪個塊,Genesis塊的索引為0。
哈希:表示塊是否有效。
上一個哈希:表示前一個塊是否有效。
時間戳:表示塊何時添加。
數(shù)據(jù):塊上存儲了哪些信息。
Nonce:在找到有效塊之前,我們經(jīng)歷了多少次迭代?
Genesis Block
每個區(qū)塊鏈都將從Genesis Block開始。正如你稍后將看到的,區(qū)塊鏈上的每個塊都依賴于前一個塊。因此,需要Genesis塊來挖掘我們的第一個塊。
開采新區(qū)塊時會發(fā)生什么?
讓我們來看看我們的第一塊。輸入 mine freeCodeCamp 進入提示。
區(qū)塊鏈查看區(qū)塊鏈上最新的索引和前一個哈希塊。在這種情況下,Genesis塊是最新的塊。
索引:o + 1 = 1
上一哈希:0000018035a828da0 ……
時間戳:添加塊時間。
數(shù)據(jù):freeCodeCamp
哈希:??
Nonce:??
如何計算哈希值?
哈希值是唯一標識數(shù)據(jù)的固定長度的數(shù)值。
通過將索引,先前塊哈希,時間戳,塊數(shù)據(jù)和隨機數(shù)作為輸入來計算哈希。
CryptoJS.SHA256(index + previousHash + timestamp + data + nonce)
在給定這些輸入的情況下,SHA256算法將計算唯一的哈希值。相同的輸入將始終返回相同的哈希值。
是否注意到塊哈希中的四個前導0?
四個前導0是有效hash的最低要求。所需的前導0的數(shù)量稱為難度。
function isValidHashDifficulty(hash, difficulty) {
for (var i = 0, b = hash.length; i < b; i ++) {
if (hash[i] !== '0') {
break;
}
}
return i >= difficulty;
}
這也稱為工作量證明系統(tǒng)。
什么是nonce?
隨機數(shù)是用于查找有效哈希的數(shù)字。
let nonce = 0;let hash;let input;
while(!isValidHashDifficulty(hash)) {
nonce = nonce + 1;
input = index + previousHash + timestamp + data + nonce;
hash = CryptoJS.SHA256(input)
}
nonce迭代直到哈希有效。在我們的例子中,有效哈希至少有四個前導0。查找與有效哈希相對應的隨機數(shù)的過程是挖掘。
隨著難度的增加,可能的有效哈希的數(shù)量減少。利用較少的有效哈希值,查找有效哈希需要更多處理能力。
為什么這很重要?
這很重要,因為它使區(qū)塊鏈不變。
如果我們有以下區(qū)塊鏈A→B→C,并且有人想要更改塊A上的數(shù)據(jù)。這是會發(fā)生的事情:
塊A上的數(shù)據(jù)更改。
塊A的哈希值發(fā)生變化,因為數(shù)據(jù)用于計算哈希值。
塊A變?yōu)闊o效,因為其哈希不再具有四個前導0。
塊B的哈希值發(fā)生變化,因為塊A的哈希值用于計算塊B的哈希值。
塊B變?yōu)闊o效,因為其哈希不再具有四個前導0。
塊C的哈希值發(fā)生變化,因為塊B的哈希值用于計算塊C的哈希值。
塊C變?yōu)闊o效,因為其哈希不再具有四個前導0。
改變塊的唯一方法是再次挖掘塊,然后是所有塊。由于總是添加新塊,因此幾乎不可能改變區(qū)塊鏈。
我希望這個教程對你有所幫助!
如果想查看演示版的網(wǎng)絡版,請訪問http://blockchaindemo.io
分享一些比特幣、以太坊、EOS、Fabric等區(qū)塊鏈相關的交互式在線編程實戰(zhàn)教程:
java比特幣開發(fā)教程,本課程面向初學者,內(nèi)容即涵蓋比特幣的核心概念,例如區(qū)塊鏈存儲、去中心化共識機制、密鑰與腳本、交易與UTXO等,同時也詳細講解如何在Java代碼中集成比特幣支持功能,例如創(chuàng)建地址、管理錢包、構造裸交易等,是Java工程師不可多得的比特幣開發(fā)學習課程。
php比特幣開發(fā)教程,本課程面向初學者,內(nèi)容即涵蓋比特幣的核心概念,例如區(qū)塊鏈存儲、去中心化共識機制、密鑰與腳本、交易與UTXO等,同時也詳細講解如何在Php代碼中集成比特幣支持功能,例如創(chuàng)建地址、管理錢包、構造裸交易等,是Php工程師不可多得的比特幣開發(fā)學習課程。
c#比特幣開發(fā)教程,本課程面向初學者,內(nèi)容即涵蓋比特幣的核心概念,例如區(qū)塊鏈存儲、去中心化共識機制、密鑰與腳本、交易與UTXO等,同時也詳細講解如何在C#代碼中集成比特幣支持功能,例如創(chuàng)建地址、管理錢包、構造裸交易等,是C#工程師不可多得的比特幣開發(fā)學習課程。
java以太坊開發(fā)教程,主要是針對java和android程序員進行區(qū)塊鏈以太坊開發(fā)的web3j詳解。
python以太坊,主要是針對python工程師使用web3.py進行區(qū)塊鏈以太坊開發(fā)的詳解。
php以太坊,主要是介紹使用php進行智能合約開發(fā)交互,進行賬號創(chuàng)建、交易、轉賬、代幣開發(fā)以及過濾器和交易等內(nèi)容。
以太坊入門教程,主要介紹智能合約與dapp應用開發(fā),適合入門。
以太坊開發(fā)進階教程,主要是介紹使用node.js、mongodb、區(qū)塊鏈、ipfs實現(xiàn)去中心化電商DApp實戰(zhàn),適合進階。
ERC721以太坊通證實戰(zhàn),課程以一個數(shù)字藝術品創(chuàng)作與分享DApp的實戰(zhàn)開發(fā)為主線,深入講解以太坊非同質(zhì)化通證的概念、標準與開發(fā)方案。內(nèi)容包含ERC-721標準的自主實現(xiàn),講解OpenZeppelin合約代碼庫二次開發(fā),實戰(zhàn)項目采用Truffle,IPFS,實現(xiàn)了通證以及去中心化的通證交易所。
C#以太坊,主要講解如何使用C#開發(fā)基于.Net的以太坊應用,包括賬戶管理、狀態(tài)與交易、智能合約開發(fā)與交互、過濾器和交易等。
EOS入門教程,本課程幫助你快速入門EOS區(qū)塊鏈去中心化應用的開發(fā),內(nèi)容涵蓋EOS工具鏈、賬戶與錢包、發(fā)行代幣、智能合約開發(fā)與部署、使用代碼與智能合約交互等核心知識點,最后綜合運用各知識點完成一個便簽DApp的開發(fā)。
深入淺出玩轉EOS錢包開發(fā) ,本課程以手機EOS錢包的完整開發(fā)過程為主線,深入學習EOS區(qū)塊鏈應用開發(fā),課程內(nèi)容即涵蓋賬戶、計算資源、智能合約、動作與交易等EOS區(qū)塊鏈的核心概念,同時也講解如何使用eosjs和eosjs-ecc開發(fā)包訪問EOS區(qū)塊鏈,以及如何在React前端應用中集成對EOS區(qū)塊鏈的支持。課程內(nèi)容深入淺出,非常適合前端工程師深入學習EOS區(qū)塊鏈應用開發(fā)。
Hyperledger Fabric 區(qū)塊鏈開發(fā)詳解 ,本課程面向初學者,內(nèi)容即包含Hyperledger Fabric的身份證書與MSP服務、權限策略、信道配置與啟動、鏈碼通信接口等核心概念,也包含F(xiàn)abric網(wǎng)絡設計、nodejs鏈碼與應用開發(fā)的操作實踐,是Nodejs工程師學習Fabric區(qū)塊鏈開發(fā)的最佳選擇。
Hyperledger Fabric java 區(qū)塊鏈開發(fā)詳解 ,課程面向初學者,內(nèi)容即包含Hyperledger Fabric的身份證書與MSP服務、權限策略、信道配置與啟動、鏈碼通信接口等核心概念,也包含F(xiàn)abric網(wǎng)絡設計、java鏈碼與應用開發(fā)的操作實踐,是java工程師學習Fabric區(qū)塊鏈開發(fā)的最佳選擇。