1. 程式人生 > >3分鐘通過一個App的演示深入理解區塊鏈執行原理

3分鐘通過一個App的演示深入理解區塊鏈執行原理

作者:黎躍春,資深講師,全棧工程師;專注於「區塊鏈+內容」產品的開發以及區塊鏈技術培訓。

公眾號:區塊鏈部落

QQ群:348924182

微信:liyc1215

安裝命令列工具

  • 開啟終端,輸入npm install blockchain-cli -g
Last login: Wed Sep 13 15:48:00 on ttys000
liyuechun:~ yuechunli$ npm install blockchain-cli -g
/usr/local/bin/blockchain -> /usr/local/lib/node_modules/blockchain-cli/main.js

> 
[email protected]
0.0.62 install /usr/local/lib/node_modules/blockchain-cli/node_modules/wrtc > node-pre-gyp install --fallback-to-build [wrtc] Success: "/usr/local/lib/node_modules/blockchain-cli/node_modules/wrtc/build/wrtc/v0.0.62/Release/node-v57-darwin-x64/wrtc.node" is installed via remote + [email protected]
1.0.5 added 263 packages in 89.506s liyuechun:~ yuechunli$
  • 終端輸入blockchain
liyuechun:~ yuechunli$ blockchain
��  Welcome to Blockchain CLI!

  Commands:

    help [command...]      Provides help for a given command.
    exit                   Exits application.
    blockchain             See the current state of the blockchain.
    mine <data>            Mine a new
block. Eg: mine hello! open <port> Open port to accept incoming connections. Eg: open 2727 connect <host> <port> Connect to a new peer. Eg: connect localhost 2727 peers Get the list of connected peers. discover Discover new peers from your connected peers. blockchain →

區塊(block)長什麼樣子?

blockchian ->後面輸入blockchain或者bc檢視創始區塊結構。

  • Index (Block #): 第幾個區塊? (創世區塊鏈的索引為0)
  • Hash: 當前區塊的hash值
  • Previous Hash: 上一個區塊的hash值
  • Timestamp:當前區塊建立時的時間戳
  • Data: 儲存在當前區塊上的交易資訊
  • Nonce: 在找到有效區塊之前,我們經歷的迭代次數

創世區塊(Genesis Block)

每個區塊鏈都是由一個創始區塊「�� Genesis Block」開始。後面你所看到的區塊都依賴於上一個區塊。因此,創始區塊是我們挖取第一個區塊的基礎。

當一個區塊挖礦時都發生了什麼?

我們在blockchain →中輸入mine liyc1215,「liyc1215是春哥微訊號,新增我微信,拉你進區塊鏈技術交流群」挖取我們的第一個區塊。

  • Index: o+1 = 1
  • Previous Hash: 0000018035a828da0…
  • Timestamp: 這個區塊建立的時間
  • Data: liyc1215
  • Hash: ??
  • Nonce: ??

Hash是怎麼計算的?

Hash值是一個十六進位制固定長度為64位的唯一的標識。

hash值是由index, previous block hash, timestamp, block data, 和 nonce 作為輸入資料計算而得。

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

The SHA256 algorithm will calculate a unique hash, given those inputs. The same inputs will always return the same hash.

SHA256演算法將根據給出的輸入資料計算出一個唯一的hash值,只要輸入值不變,永遠返回相同的結果。

輸入資料為liyc1215時,它的hash值永遠為dca0762d726738ebb8e6b7b43a4ba4186588a1b711f94ba9c694bffda8fcccf9

你是否注意到塊雜湊中的四個前導0?

四個前導0是有效雜湊的最低要求。 所需的前導0的數量稱為難度

下面的方法驗證hash難度是否有效。

function isValidHashDifficulty(hash, difficulty) {
  for (var i = 0, b = hash.length; i < b; i ++) {
      if (hash[i] !== '0') {
          break;
      }
  }
  return i >= difficulty;
}

什麼是nonce

nonce是一個用來找到滿足條件的hash值的數字。

let nonce = 0;
let hash;
let input;
while(!isValidHashDifficulty(hash)) {     
  nonce = nonce + 1;
  input = index + previousHash + timestamp + data + nonce;
  hash = CryptoJS.SHA256(input)
}

nonce值一直迭代,直到hash值有效為止。在我們案例中一個有效的hash值是最少有4個前導0。找到nonce值以滿足合適條件的hash值的過程就叫做挖礦。

隨著難度的增加,可能的有效雜湊數減少。 使用較少可能的有效雜湊,需要更多的處理能力才能找到有效的雜湊。

Hash為什麼如此重要?

hash雜湊很重要是因為它可以使區塊鏈不能被改變。

如果我們有三個區塊鏈1 -> 2 -> 3 -> 4 -> 5,當某個人想要試圖修改區塊A時,下面幾點將是會發生的幾種情況。

  • 區塊3上的區塊鏈被修改。
  • 區塊3上的hash值將發生改變,因為hash值是通過資料計算而得。
  • 區塊3變得無效,因為它的hash值不再具備4個前導0的條件。
  • 區塊4的hash值將發生改變,因為區塊3的hash值用來參與計算區塊4的hash值。
  • 區塊4變得無效,因為它的hash值不再具備4個前導0的條件。
  • 區塊5的hash值將發生改變,因為區塊4的hash值用來參與計算區塊5的hash值。
  • 區塊5變得無效,因為它的hash值不再具備4個前導0的條件。

如果想要無效的區塊3、4、5變得有效,必須從區塊3開始再一次重新依次挖礦,當你的區塊鏈足夠長,節點足夠多時,就算你將這條鏈上的區塊鏈改變並且重新挖礦成功,但是因為超過50%的節點的資料和你的節點的資料不一致,你這個被改變的節點的資料也依然無效。

這個demo的演示中,一共有三個節點,我修改了節點2的區塊鏈5並且重新挖礦取得合法的hash值,但是因為節點A節點C中區塊5的hash值為0000e4b9052fd8aae92a8afda42e2ea0f17972ea67cead67352e74dd6f7d217c,而節點B中的hash值為0000184634edadb8fc7f4bdee87aa9d7d2a46b0c26db221998e35c1f57c0b42c,少數服從多數,所以以節點A和C的區塊資料為準。

參考文件

打賞地址

**比特幣:**1FcbBw62FHBJKTiLGNoguSwkBdVnJQ9NUn
**以太坊:**0xF055775eBD516e7419ae486C1d50C682d4170645

技術交流

  • 區塊鏈技術交流QQ群:348924182

  • 「區塊鏈部落」官方公眾號

相關推薦

3分鐘通過一個App演示深入理解區塊執行原理

作者:黎躍春,資深講師,全棧工程師;專注於「區塊鏈+內容」產品的開發以及區塊鏈技術培訓。 公眾號:區塊鏈部落 QQ群:348924182 微信:liyc1215 安裝命令列工具 開啟終端,輸入npm i

通過App演示深入理解區塊執行原理

下載安裝 如果沒有安裝nodejs,需要先安裝 nodejs # Clone this repository $ git clone https://github.com/seanseany/blockchain-cli # Go into the r

區塊:通過演示Demo理解區塊執行原理

BlockChain Demo 開啟比特幣Demo演示網頁區塊鏈Demo演示地址,我們可以看到如下頁面。 點選開始演示 接下來是BlockChain Demo 2.0的新功能介紹 關於Demo功能區的介紹 顯示每個區塊儲存的資訊

通過7個python函式理解區塊

我想對於那裡的很多人來說,區塊鏈就是這種現象,很難不讓你頭腦發熱。我開始觀看視訊和閱讀文章,但對我個人而言,直到我編寫自己的簡單區塊鏈,我才真正理解它是什麼以及它的潛在應用價值。 我對區塊鏈的看法是它是一個公開的加密資料庫。如果你是亞馬遜並且你想使用該技術來跟蹤庫存水平,那

5分鐘用最簡單的道理理解區塊

區塊鏈到底是啥?不明真相的群眾一般都去查維基百科,上面是這麼說的: 區塊鏈(英語:blockchain 或 block chain)是用分散式資料庫識別、傳播和記載資訊的智慧化對等網路,也稱為價值網際網路。中本聰在 2008 年,於《比特幣白皮書》中提出「區塊鏈」概念,

轉載:2.2.3 配置項的註釋《深入理解Nginx》(陶輝)

href 深入 logs class tps 註釋 配置 blog bsp 原文:https://book.2cto.com/201304/19628.html如果有一個配置項暫時需要註釋掉,那麽可以加“#”註釋掉這一行配置。例如:#pid logs/ngi

3分鐘掌握一個有數小技能:回頭客分析

data- lte date The mage 最小 log gif 如果 本文由 網易雲 發布。 作者:汪謙 (本篇文章僅限知乎內部分享,如需轉載,請取得作者同意授權。) 企業要想良好經營,必須能留得住客戶,最好每個客戶都能成為回頭客。本篇將介紹如何利用網易有數

3分鐘掌握一個有數小技能:製作導航頁面

此文已由作者王文開授權網易雲社群釋出。 歡迎訪問網易雲社群,瞭解更多網易技術產品運營經驗。 隨著報告數量的增多,使用者進入有數後,需要在很多資料夾中找到自己想看的那張報告,這很費時間,那是否可以通過有數中做一個導航頁面,將相關的報告的地址都在一個頁面中顯示,然後通過點選進行報告間的跳轉。類似於下圖

3分鐘掌握一個有數小技能:利用引數完成動態排序

此文已由作者王文開授權網易雲社群釋出。 歡迎訪問網易雲社群,瞭解更多網易技術產品運營經驗。 下面這張圖是一個簡單的堆疊柱狀圖,並且按照了每個類別的總體銷售額進行了排序。 此時如何根據不同年份的銷售額進行動態的排序,而不是總體的銷售額,如下面這樣 切換不同的年份,就按照這一年的銷售額進

Zabbix監控平臺3.2.4(二)深入理解zabbix

一,Zabbix Web操作深入   1.1 Zabbix Web下的主機和模版以及監控項的新增方式 (1)建立一個模版 我們所有的功能幾乎都是在模版中定義的 我們再點進新建立的模版檢視 模版裡幾乎可以設定我們需要的所有功能 (2)在模版裡建立

一個class檔案深入理解Java位元組碼結構

前言 我們都知道,Java程式最終是轉換成class檔案執行在虛擬機器上的,那麼class檔案是個怎樣的結構,虛擬機器又是如何處理去執行class檔案裡面的內容呢,這篇文章帶你深入理解Java位元組碼中的結構。 1.Demo原始碼 首先,編寫一個簡單的

通過一個小故事,理解 HTTPS 工作原理

本文摘錄參考: HTTP 協議由於是明文傳送,所以存在三大風險: 1、被竊聽的風險:第三方可以截獲並檢視你的內容 2、被篡改的危險:第三方可以截獲並修改你的內容 3、被冒充的風險:第三方可以偽裝成通訊方與你通訊 HTTP 因為存在以上三大安全風險,所以才有了 HTTPS 的出現。 HTTPS 涉及到了很

一個sql問題深入理解左連線

資料準備 1.新建一個學生表t_student 如下 del_falg = ‘1’ ,’表示邏輯刪除’ 2.新建課程表 t_course 3.新建 學生選課表 r_course_student 4.上面的表結構並不複雜,需要關注的一個點是

Android 通過一個app 啟動另一個app

PackageManager packageManager = getPackageManager(); String packname="";//此處為包名 if (checkPackInfo(packname)) {//檢查是否有要開啟的app Intent intent = packag

通過JVM記憶體模型深入理解值傳遞和引用傳遞兩種方式

值傳遞和引用傳遞分析Java中資料型別分為兩大類:基本型別和引用型別(也就是物件型別)。基本型別:boolean、char、byte、short、int、long、float、double引用型別:類、介面、陣列因此,變數型別也可分為兩大類:基本型別和引用型別。在分析值傳遞

通過一個WPF例項進一步理解委託和事件

在前寫過“淺談C#中的委託”和“淺談C#中的事件”兩篇部落格,內容有些抽象,似乎難以說明委託和事件的關係。 今天通過一個小程式來進一步說明二者的使用及聯絡。 首先新建一個WPF應用程式,取名TestDelegateAndEvent。 在.xmal中加入

[Asp.net core 3.1] 通過一個小元件熟悉Blazor服務端元件開發

通過一個小元件,熟悉 Blazor 服務端元件開發。github 一、環境搭建 vs2019 16.4, asp.net core 3.1 新建 Blazor 應用,選擇 asp.net core 3.1。 根資料夾下新增目錄 Components,放置程式碼。 二、元件需求定義 Components 目錄下

分鐘通過一個實際問題,真正教會大家如何解決Bug

## 前言 這篇文章從實際問題 -> 問題解決步驟 -> 問題解決思路,幫助大家能夠明白如何在程式中發現問題,定位問題,解決問題。並真正理解那些問題解決思路。 首先說說這個實際問題是什麼,又是怎麼遇到的。 我這邊做了一個操作日誌模組,需要提供獨立查詢頁面。正好集團內部有一個xxx前端產品,可以簡單配置就生

手寫一個Redux,深入理解原理

Redux可是一個大名鼎鼎的庫,很多地方都在用,我也用了幾年了,今天這篇文章就是自己來實現一個Redux,以便於深入理解他的原理。我們還是老套路,從基本的用法入手,然後自己實現一個Redux來替代原始碼的NPM包,但是功能保持不變。本文只會實現Redux的核心庫,跟其他庫的配合使用,比如React-Redux

3 分鐘生成一個單元測試報告,這個樣式愛了

昨天有個小夥伴問我,有沒有什麼現成的測試報告模板,由於昨天實在比較忙就沒顧上,所以今個有時間趕緊補上。一般力所能及的事,只要我有時間都會為大家解決,但畢竟能力有限做不到的地方小夥伴們也多理解。 ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/2020081911435432