摘要:最近了解了一些區塊鏈的東西,動了一些深入了解的心思。同時,為了使區塊的添加速率趨于平均比特幣的設計是大約分鐘生成一個新的區塊,并不是隨便一個新建的區塊都可以被添加到鏈上。
最近了解了一些區塊鏈的東西,動了一些深入了解的心思。
了解的過程中會不斷補充和完善這篇文章,理解的不一定對,隨意看看得了,每篇文章都會把閱讀過的資料列出來,也方便大家去源頭看看。
區塊鏈(blockchain)區塊鏈是什么?
一句話,它是一種特殊的分布式數據庫
這句定義中有兩個關鍵詞分布式和數據庫.
首先,我們可以把區塊鏈看成是數據庫,但是這個數據庫并沒有管理員,也沒有中心,每個應用鏈的人,都具有平等的權利。
區塊區塊鏈是由一個個的區塊(block)組成的, 每個區塊可以看做是一個存儲數據的單元,每寫入一次數據,就會新建一個區塊,一個一個區塊連接起來,就成了鏈狀。
每個區塊分成兩個部分:
區塊頭(Block Head)
包含了當前區塊的基本信息,包括 生成時間, 區塊體的 hash 值, 上一個區塊的 hash 等信息。
區塊的 hash 就是根據區塊頭的內容來生成的。
區塊體(Block Body)
區塊體就是所含數據的真實內容
hash區塊的根本是源于 hash, 如果把區塊鏈想象成一個真實的鏈狀結構的話,那么 hash 就是每個元素之間的連接點。
關于 hash 的詳盡定義,可以在 wikipedia中查看,這里簡單總結一下 hash 的特征:
如果兩個 hash 是不相同的(根據同一函數),那么這兩個 hash 的原始輸入也是不相同的
hash 的輸入和輸出不是唯一對應關系的,如果兩個 hash 值相同,兩個輸入值很可能是相同的,但也可能不同,這是由具體的 hash 計算方法決定的
區塊的內容與 hash 是一一對應的,每個區塊的 hash 值都是不同的。同時,每一個區塊又都保存著上一個區塊的 hash 值。
按照這個邏輯,如果一個區塊的 hash 值變了的話,那么它之后的每一個區塊的 hash 值都需要進行更新。
進而延伸一下,如果有人想更新某一區塊上的內容,那么他必須有能力依次更新這個區塊后面所有區塊的 hash 值才行,否則的話,被更新的區塊就會脫離整個鏈了。由于更新區塊 hash 的計算很復雜且耗時,所以除非掌握了全網 50% 以上的運算能力,否則更新某一區塊的行為根本不可能成功。
正是通過這種環環相扣的機制,區塊鏈才可以保證自身數據的不可修改的特性。
區塊鏈是如何運行的 挖礦由于區塊鏈是一條單一的鏈,每個區塊都依賴于上一個區塊,所以同一時間,只能向鏈上添加一個區塊。
又由于必須保證各個節點間的同步,所以添加完一個區塊,各個節點又必須進行同步。
也就是說,假設節點 A 正忙著生成新的區塊,突然收到消息:“B 已經在鏈上添加了一個區塊!”。這個時候 A 之前做的計算就都白做了,又得基于 B 新添加的節點,重新剛才的計算。并且計算的過程中,還會有類似的事情發生。
上面我們說過,在區塊鏈的運行機制中,通過區塊自身的 hash 來判斷當前區塊是否可以被加入到鏈上。
同時,為了使區塊的添加速率趨于平均(比特幣的設計是大約10分鐘生成一個新的區塊),并不是隨便一個新建的區塊都可以被添加到鏈上。
通常會設置一個準入條件,只有符合該條件的區塊,才可以被添加到鏈上,設計者通過設置海量的計算,來使計算滿足加入條件的區塊 hash 值變得非常困難,這個過程就叫做挖礦,也叫(mining), 繼續挖礦計算的機器, 我們就叫做礦機, 操作機器的人(其實是程序), 我們就叫做礦工。
用 js 代碼運行一下簡單的挖礦機制首先,每一個區塊,我們可以看成是由這幾部分組成:
這是我們這個鏈上的第一個區塊,這個區塊包括了這樣幾個信息
index: 區塊的 index 值, 這里應該是 0
previous hash: 前一個區塊的 hash
timestamp: 區塊創建時的時間戳
data: 區塊包含的數據內容
hash: 區塊本身的 hash
nonce: 計算區塊 hash 的難度系數
我們先假定這個區塊的名字是 A, 接下來,我們在它后面再添加個區塊 B.
那么我的這個 B 將包含以下這些信息:
index: 1
previous hash: 也就是 A 的 hash
timestamp
data: I love Blockchain
hash: ?
nonce: ?
如果要將 B 添加到鏈上,那么我們接下來的工作就是計算出 hash 和 nonce 的值,
那么就假設我們計算 hash 的算法是這樣的:
CryptoJS.SHA256(index + previousHash + timestamp + data + nonce)
接下來我們來計算這個 hash 值是否是一個準入的 hash, 代碼如下:
function isValidHashDifficulty(hash, difficulty) { for (var i = 0, b = hash.length; i < b; i ++) { if (hash[i] !== "0") { break; } } return i >= difficulty; }
我們這里的準入條件為 hash 中連續不為 0 的值必須不小于 difficulty.
參數中的 difficulty, 也可以稱為難度系數, 通過這個系數的動態調整,可以維持新增區塊的平均速率。
另外,我們上面計算 hash 的算法中 index, previousHash, timestamp 和 data 都是固定的,所以重復計算出來的 hash 值也應該是一樣的,為了使每次計算出的 hash 不同, nonce被設計成了一個變化的值, 通過 nonce值的變化, 計算出不同的 hash, 從而判斷 hash 值是否符合準入條件, 用代碼表示的話. 就是這樣:
let nonce = 0; let hash; let input; while(!isValidHashDifficulty(hash, difficulty)) { nonce = nonce + 1; input = index + previousHash + timestamp + data + nonce; hash = CryptoJS.SHA256(input) }
看到這里, 我們可以發現, 其實礦工的工作就是去猜nonce的值, 因為這個值很大, 所以計算難道也就比較大, 挖礦也就成了一件費時費力的事情。
相應的, 既然挖礦是如此費時費力的一件事, 那么礦工也不會是義務勞動的, 礦工獲得的相應收益, 會在下一部分 比特幣 中, 以比特幣的運行規則來描述一下。
Reference區塊鏈入門教程
How does blockchain really work? I built an app to show you
Ethereum for web developers
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/24253.html
摘要:和比特幣協議有所不同的是,以太坊的設計十分靈活,極具適應性。超級賬本區塊鏈的商業應用超級賬本超級賬本是基金會下的眾多項目中的一個。證書頒發機構負責簽發撤 showImg(https://segmentfault.com/img/bV2ge9?w=900&h=385); 從比特幣開始 一個故事告訴你比特幣的原理及運作機制 這篇文章的定位會比較科普,盡量用類比的方法將比特幣的基本原理講出來...
摘要:圍繞以太坊的開發生態是目前相對最成熟的,比如有開發框架,有智能合約在線集成開發環境,還有專設的開發者問答頻道。 showImg(https://segmentfault.com/img/bVbaJOL?w=1200&h=514); 張泉靈說,時代拋棄我們的時候連聲再見都不會說,馬云說對于新興事物,絕大多數人是看不見、看不起、看不懂、來不及。自從學完 Coursera 上的 Crypto...
摘要:圍繞以太坊的開發生態是目前相對最成熟的,比如有開發框架,有智能合約在線集成開發環境,還有專設的開發者問答頻道。 showImg(https://segmentfault.com/img/bVbaJOL?w=1200&h=514); 張泉靈說,時代拋棄我們的時候連聲再見都不會說,馬云說對于新興事物,絕大多數人是看不見、看不起、看不懂、來不及。自從學完 Coursera 上的 Crypto...
摘要:本文分享自華為云社區技術解析代碼實戰,帶你入門華為云政務區塊鏈平臺,作者敏捷的小智。點擊關注,第一時間了解華為云新鮮技術 摘要:政務區塊鏈平臺是行業區塊鏈平臺的初步實踐,未來在區塊鏈技術的發展下,還會打造面向其他領域的鏈管平臺,構建多方協同的分布式賬本,讓區塊鏈應用更便捷高效的為產業服務。...
閱讀 1114·2023-04-25 14:35
閱讀 2846·2021-11-16 11:45
閱讀 3444·2021-09-04 16:48
閱讀 2199·2021-08-10 09:43
閱讀 543·2019-08-30 13:17
閱讀 1637·2019-08-29 13:27
閱讀 908·2019-08-26 13:58
閱讀 2167·2019-08-26 13:48