《電子技術(shù)應(yīng)用》
您所在的位置:首頁(yè) > 通信與網(wǎng)絡(luò) > 業(yè)界動(dòng)態(tài) > 一文讀懂區(qū)塊鏈的工作方式

一文讀懂區(qū)塊鏈的工作方式

2019-06-06

  讓我們通過(guò)構(gòu)建一個(gè)應(yīng)用程序來(lái)展示區(qū)塊鏈是如何工作的,。根據(jù)維基百科的描述,,區(qū)塊鏈?zhǔn)牵阂环N分布式數(shù)據(jù)庫(kù),,用于維護(hù)不斷增長(zhǎng)的記錄列表,,稱(chēng)為塊。這聽(tīng)起來(lái)似乎不錯(cuò),,但它到底是如何工作的,?

  為了說(shuō)明區(qū)塊鏈如何工作,我們將使用名為 Blockchain CLI 的開(kāi)源命令行界面,。

  我還在這里構(gòu)建了一個(gè) 基于瀏覽器的版本 ,。

5cf75b9ec2b5a-thumb.png

  安裝命令行界面版本

  如果還沒(méi)有 Node.js ,先安裝一下,。

  然后在終端中運(yùn)行以下命令:

  # 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

  你應(yīng)該看到,歡迎使用Blockchain CLI,!和區(qū)塊鏈提示準(zhǔn)備好了,,可以接受命令。

  區(qū)塊看起來(lái)像什么,?

  要查看當(dāng)前的區(qū)塊鏈,,請(qǐng)?jiān)诿钐崾痉休斎隻lockchain或bc。你應(yīng)該看到如下圖所示的塊,。

5cf75b9e92559-thumb.png

  Block的索引:表示它是哪個(gè)塊,,Genesis塊的索引為0。

  哈希:表示塊是否有效,。

  上一個(gè)哈希:表示前一個(gè)塊是否有效,。

  時(shí)間戳:表示塊何時(shí)添加。

  數(shù)據(jù):塊上存儲(chǔ)了哪些信息,。

  Nonce:在找到有效塊之前,,我們經(jīng)歷了多少次迭代?

  Genesis Block

  每個(gè)區(qū)塊鏈都將從Genesis Block開(kāi)始,。正如你稍后將看到的,,區(qū)塊鏈上的每個(gè)塊都依賴(lài)于前一個(gè)塊。因此,,需要Genesis塊來(lái)挖掘我們的第一個(gè)塊,。

  開(kāi)采新區(qū)塊時(shí)會(huì)發(fā)生什么?

  讓我們來(lái)看看我們的第一塊,。輸入 mine freeCodeCamp 進(jìn)入提示,。

  區(qū)塊鏈查看區(qū)塊鏈上最新的索引和前一個(gè)哈希塊。在這種情況下,,Genesis塊是最新的塊,。

  索引:o + 1 = 1

  上一哈希:0000018035a828da0 ……

  時(shí)間戳:添加塊時(shí)間,。

  數(shù)據(jù):freeCodeCamp

  哈希:??

  Nonce:??

  如何計(jì)算哈希值?

  哈希值是唯一標(biāo)識(shí)數(shù)據(jù)的固定長(zhǎng)度的數(shù)值,。

  通過(guò)將索引,,先前塊哈希,時(shí)間戳,,塊數(shù)據(jù)和隨機(jī)數(shù)作為輸入來(lái)計(jì)算哈希,。

  CryptoJS.SHA256(index + previousHash + timestamp + data + nonce)

  在給定這些輸入的情況下,SHA256算法將計(jì)算唯一的哈希值,。相同的輸入將始終返回相同的哈希值,。

  是否注意到塊哈希中的四個(gè)前導(dǎo)0?

  四個(gè)前導(dǎo)0是有效hash的最低要求,。所需的前導(dǎo)0的數(shù)量稱(chēng)為難度,。

  function isValidHashDifficulty(hash, difficulty) {

  for (var i = 0, b = hash.length; i < b; i ++) {

  if (hash[i] !== '0') {

  break;

  }

  }

  return i >= difficulty;

  }

  這也稱(chēng)為工作量證明系統(tǒng)。

  什么是nonce,?

  隨機(jī)數(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迭代直到哈希有效。在我們的例子中,,有效哈希至少有四個(gè)前導(dǎo)0,。查找與有效哈希相對(duì)應(yīng)的隨機(jī)數(shù)的過(guò)程是挖掘。

  隨著難度的增加,,可能的有效哈希的數(shù)量減少,。利用較少的有效哈希值,查找有效哈希需要更多處理能力,。

  為什么這很重要,?

  這很重要,因?yàn)樗箙^(qū)塊鏈不變,。

  如果我們有以下區(qū)塊鏈A→B→C,,并且有人想要更改塊A上的數(shù)據(jù)。這是會(huì)發(fā)生的事情:

  塊A上的數(shù)據(jù)更改,。

  塊A的哈希值發(fā)生變化,,因?yàn)閿?shù)據(jù)用于計(jì)算哈希值。

  塊A變?yōu)闊o(wú)效,,因?yàn)槠涔2辉倬哂兴膫€(gè)前導(dǎo)0,。

  塊B的哈希值發(fā)生變化,因?yàn)閴KA的哈希值用于計(jì)算塊B的哈希值,。

  塊B變?yōu)闊o(wú)效,,因?yàn)槠涔2辉倬哂兴膫€(gè)前導(dǎo)0。

  塊C的哈希值發(fā)生變化,,因?yàn)閴KB的哈希值用于計(jì)算塊C的哈希值,。

  塊C變?yōu)闊o(wú)效,,因?yàn)槠涔2辉倬哂兴膫€(gè)前導(dǎo)0。

  改變塊的唯一方法是再次挖掘塊,,然后是所有塊,。由于總是添加新塊,因此幾乎不可能改變區(qū)塊鏈,。

  我希望這個(gè)教程對(duì)你有所幫助,!

  如果想查看演示版的網(wǎng)絡(luò)版,請(qǐng)?jiān)L問(wèn)http://blockchaindemo.io

  分享一些比特幣,、以太坊,、EOS、Fabric等區(qū)塊鏈相關(guān)的交互式在線(xiàn)編程實(shí)戰(zhàn)教程:

  java比特幣開(kāi)發(fā)教程,,本課程面向初學(xué)者,,內(nèi)容即涵蓋比特幣的核心概念,例如區(qū)塊鏈存儲(chǔ),、去中心化共識(shí)機(jī)制,、密鑰與腳本、交易與UTXO等,,同時(shí)也詳細(xì)講解如何在Java代碼中集成比特幣支持功能,例如創(chuàng)建地址,、管理錢(qián)包,、構(gòu)造裸交易等,是Java工程師不可多得的比特幣開(kāi)發(fā)學(xué)習(xí)課程,。

  php比特幣開(kāi)發(fā)教程,,本課程面向初學(xué)者,內(nèi)容即涵蓋比特幣的核心概念,,例如區(qū)塊鏈存儲(chǔ),、去中心化共識(shí)機(jī)制、密鑰與腳本,、交易與UTXO等,,同時(shí)也詳細(xì)講解如何在Php代碼中集成比特幣支持功能,例如創(chuàng)建地址,、管理錢(qián)包,、構(gòu)造裸交易等,是Php工程師不可多得的比特幣開(kāi)發(fā)學(xué)習(xí)課程,。

  c#比特幣開(kāi)發(fā)教程,,本課程面向初學(xué)者,內(nèi)容即涵蓋比特幣的核心概念,,例如區(qū)塊鏈存儲(chǔ),、去中心化共識(shí)機(jī)制,、密鑰與腳本、交易與UTXO等,,同時(shí)也詳細(xì)講解如何在C#代碼中集成比特幣支持功能,,例如創(chuàng)建地址、管理錢(qián)包,、構(gòu)造裸交易等,,是C#工程師不可多得的比特幣開(kāi)發(fā)學(xué)習(xí)課程。

  java以太坊開(kāi)發(fā)教程,,主要是針對(duì)java和android程序員進(jìn)行區(qū)塊鏈以太坊開(kāi)發(fā)的web3j詳解,。

  python以太坊,主要是針對(duì)python工程師使用web3.py進(jìn)行區(qū)塊鏈以太坊開(kāi)發(fā)的詳解,。

  php以太坊,,主要是介紹使用php進(jìn)行智能合約開(kāi)發(fā)交互,進(jìn)行賬號(hào)創(chuàng)建,、交易,、轉(zhuǎn)賬、代幣開(kāi)發(fā)以及過(guò)濾器和交易等內(nèi)容,。

  以太坊入門(mén)教程,,主要介紹智能合約與dapp應(yīng)用開(kāi)發(fā),適合入門(mén),。

  以太坊開(kāi)發(fā)進(jìn)階教程,,主要是介紹使用node.js、mongodb,、區(qū)塊鏈,、ipfs實(shí)現(xiàn)去中心化電商DApp實(shí)戰(zhàn),適合進(jìn)階,。

  ERC721以太坊通證實(shí)戰(zhàn),,課程以一個(gè)數(shù)字藝術(shù)品創(chuàng)作與分享DApp的實(shí)戰(zhàn)開(kāi)發(fā)為主線(xiàn),深入講解以太坊非同質(zhì)化通證的概念,、標(biāo)準(zhǔn)與開(kāi)發(fā)方案,。內(nèi)容包含ERC-721標(biāo)準(zhǔn)的自主實(shí)現(xiàn),講解OpenZeppelin合約代碼庫(kù)二次開(kāi)發(fā),,實(shí)戰(zhàn)項(xiàng)目采用Truffle,,IPFS,實(shí)現(xiàn)了通證以及去中心化的通證交易所,。

  C#以太坊,,主要講解如何使用C#開(kāi)發(fā)基于.Net的以太坊應(yīng)用,包括賬戶(hù)管理,、狀態(tài)與交易,、智能合約開(kāi)發(fā)與交互,、過(guò)濾器和交易等。

  EOS入門(mén)教程,,本課程幫助你快速入門(mén)EOS區(qū)塊鏈去中心化應(yīng)用的開(kāi)發(fā),,內(nèi)容涵蓋EOS工具鏈、賬戶(hù)與錢(qián)包,、發(fā)行代幣,、智能合約開(kāi)發(fā)與部署、使用代碼與智能合約交互等核心知識(shí)點(diǎn),,最后綜合運(yùn)用各知識(shí)點(diǎn)完成一個(gè)便簽DApp的開(kāi)發(fā),。

  深入淺出玩轉(zhuǎn)EOS錢(qián)包開(kāi)發(fā) ,本課程以手機(jī)EOS錢(qián)包的完整開(kāi)發(fā)過(guò)程為主線(xiàn),,深入學(xué)習(xí)EOS區(qū)塊鏈應(yīng)用開(kāi)發(fā),,課程內(nèi)容即涵蓋賬戶(hù)、計(jì)算資源,、智能合約,、動(dòng)作與交易等EOS區(qū)塊鏈的核心概念,同時(shí)也講解如何使用eosjs和eosjs-ecc開(kāi)發(fā)包訪(fǎng)問(wèn)EOS區(qū)塊鏈,,以及如何在React前端應(yīng)用中集成對(duì)EOS區(qū)塊鏈的支持,。課程內(nèi)容深入淺出,非常適合前端工程師深入學(xué)習(xí)EOS區(qū)塊鏈應(yīng)用開(kāi)發(fā),。

  Hyperledger Fabric 區(qū)塊鏈開(kāi)發(fā)詳解 ,,本課程面向初學(xué)者,內(nèi)容即包含Hyperledger Fabric的身份證書(shū)與MSP服務(wù),、權(quán)限策略、信道配置與啟動(dòng),、鏈碼通信接口等核心概念,,也包含F(xiàn)abric網(wǎng)絡(luò)設(shè)計(jì)、nodejs鏈碼與應(yīng)用開(kāi)發(fā)的操作實(shí)踐,,是Nodejs工程師學(xué)習(xí)Fabric區(qū)塊鏈開(kāi)發(fā)的最佳選擇,。

  Hyperledger Fabric java 區(qū)塊鏈開(kāi)發(fā)詳解 ,課程面向初學(xué)者,,內(nèi)容即包含Hyperledger Fabric的身份證書(shū)與MSP服務(wù),、權(quán)限策略、信道配置與啟動(dòng),、鏈碼通信接口等核心概念,,也包含F(xiàn)abric網(wǎng)絡(luò)設(shè)計(jì)、java鏈碼與應(yīng)用開(kāi)發(fā)的操作實(shí)踐,,是java工程師學(xué)習(xí)Fabric區(qū)塊鏈開(kāi)發(fā)的最佳選擇,。


本站內(nèi)容除特別聲明的原創(chuàng)文章之外,,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀點(diǎn),。轉(zhuǎn)載的所有的文章,、圖片、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有,。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無(wú)法一一聯(lián)系確認(rèn)版權(quán)者,。如涉及作品內(nèi)容、版權(quán)和其它問(wèn)題,,請(qǐng)及時(shí)通過(guò)電子郵件或電話(huà)通知我們,,以便迅速采取適當(dāng)措施,避免給雙方造成不必要的經(jīng)濟(jì)損失,。聯(lián)系電話(huà):010-82306118,;郵箱:[email protected]