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 = 1Previous Hash:
0000018035a828da0…Timestamp:
這個區塊建立的時間Data:
liyc1215Hash:
??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