![](http://static.javashuo.com/static/loading.gif)
unitimes.media算法
![](http://static.javashuo.com/static/loading.gif)
全球視角,獨到看法數據庫
什麼是區塊鏈?npm
從字面上看:區塊鏈是由一個個記錄着各類信息的小區塊連接起來組成的一個鏈條,相似於咱們將一塊塊磚頭疊起來,並且疊起來後是沒辦法拆掉的,每一個磚頭上面還寫着各類信息,包括:誰疊的,何時疊的,磚頭用了什麼材質等等,這些信息你也沒辦法修改。安全
從計算機上看:區塊鏈是一種比較特殊的分佈式數據庫。分佈式數據庫就是將數據信息單獨放在每臺計算機,且存儲的信息的一致的,若是有一兩臺計算機壞掉了,信息也不會丟失,你還能夠在其餘計算機上查看到。服務器
區塊鏈是一種分佈式的,因此它是沒有中心點的,信息存儲在全部加入到區塊鏈網絡的節點當中,節點的數據是同步的。節點能夠是一臺服務器,筆記本電腦,手機等。微信
你要知道的是這些節點的存儲的數據都是如出一轍。網絡
區塊鏈特性分佈式
去中心化:由於它是分佈式存儲的,因此不存在中心點,也能夠說各個節點都是中心點,生活中應用就是不須要第三方系統了(銀行、支付寶、房產中介等都屬於第三方)。工具
開放性:區塊鏈的系統數據是公開透明的,每一個人均可以參與進來,好比租房子,你能夠知道這個房子之前的出租信息,有沒出現過問題,固然這裏頭的一些我的私有信息是加密的。區塊鏈
自治性:區塊鏈採用基於協商一致的規範和協議(好比一套公開透明的算法),而後各個節點就按照這個規範來操做,這樣就是全部的東西都有機器完成,就沒有人情成分。 使得對"人"的信任改爲了對機器的信任,任何人爲的干預不起做用。
信息不可篡改:若是信息存儲到區塊鏈中就被永久保存,是沒辦法去改變,至於 51% 攻擊,基本不可能實現。
匿名性:區塊鏈上面沒有我的的信息,由於這些都是加密的,是一堆數字字母組成的字符串,這樣就不會出現你的各類身份證信息、電話號碼被倒賣的現象。
區塊結構
區塊包含兩個部分:
一、區塊頭(Head):記錄當前區塊的元信息
二、區塊體(Body):實際數據
包含數據以下圖所示:
![](http://static.javashuo.com/static/loading.gif)
安裝命令行工具
打開終端,輸入npm install blockchain-cli -g
![](http://static.javashuo.com/static/loading.gif)
終端輸入blockchain
![](http://static.javashuo.com/static/loading.gif)
區塊(block)長什麼樣子?
在blockchian ->後面輸入blockchain或者bc(簡寫)查看創始區塊結構。
![](http://static.javashuo.com/static/loading.gif)
Index (Block #): 第幾個區塊? (創世區塊鏈的索引爲0)
Hash: 當前區塊的hash值
Previous Hash: 上一個區塊的hash值
Timestamp:當前區塊建立時的時間戳
Data: 存儲在當前區塊上的交易信息
Nonce: 在找到有效區塊以前,咱們經歷的迭代次數
創世區塊(Genesis Block)
每一個區塊鏈都是由一個創始區塊「 Genesis Block」開始。後面你所看到的區塊都依賴於上一個區塊。所以,創始區塊是咱們挖取第一個區塊的基礎。
當一個區塊挖礦時都發生了什麼?
咱們在blockchain →中輸入`mine youdi,挖取咱們的第一個區塊。
![](http://static.javashuo.com/static/loading.gif)
Index: o+1 = 1
Previous Hash: 0000018035a828da0…
Timestamp: 這個區塊建立的時間
Data:youdi
Hash: 00006c10b10baee43
Nonce: 22269
Hash是怎麼計算的?
Hash值是一個十六進制固定長度爲64位的惟一的標識。
hash值是由index, previous block hash, timestamp, block data, 和 nonce 做爲輸入數據計算而得。
![](http://static.javashuo.com/static/loading.gif)
SHA256算法將根據給出的輸入數據計算出一個惟一的hash值,只要輸入值不變,永遠返回相同的結果。
![](http://static.javashuo.com/static/loading.gif)
輸入數據爲youdi時,它的hash值永遠爲2e4f702517a39db2c3614921b136d05b0bde291b0c5720cc899f6091668599fd
你是否注意到塊哈希中的四個前導0?
四個前導0是有效散列的最低要求。 所需的前導0的數量稱爲難度。
下面的方法驗證hash難度是否有效。
![](http://static.javashuo.com/static/loading.gif)
這就是咱們所熟知的POW工做量證實系統 - Proof-of-Work system。
什麼是nonce?
nonce是一個用來找到知足條件的hash值的數字。
![](http://static.javashuo.com/static/loading.gif)
![](http://static.javashuo.com/static/loading.gif)
nonce值一直迭代,直到hash值有效爲止。在咱們案例中一個有效的hash值是最少有4個前導0。找到nonce值以知足合適條件的hash值的過程就叫作挖礦。
隨着難度的增長,可能的有效散列數減小。 使用較少可能的有效散列,須要更多的處理能力才能找到有效的散列。
Hash爲何如此重要?
hash散列很重要是由於它可使區塊鏈不能被改變。
若是咱們有三個區塊鏈1 -> 2 -> 3 -> 4 -> 5,當某我的想要試圖修改區塊A時,下面幾點將是會發生的幾種狀況。
![](http://static.javashuo.com/static/loading.gif)
區塊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的條件。
若是想要無效的區塊三、四、5變得有效,必須從區塊3開始再一次從新依次挖礦,當你的區塊鏈足夠長,節點足夠多時,就算你將這條鏈上的區塊鏈改變而且從新挖礦成功,可是由於超過50%的節點的數據和你的節點的數據不一致,你這個被改變的節點的數據也依然無效。
![](http://static.javashuo.com/static/loading.gif)
在這個demo的演示中,一共有三個節點,我修改了節點2的區塊鏈3而且從新挖礦取得合法的hash值,可是由於節點B和節點C中區塊3的hash值和A的不一樣,因此,我爲了改變數據,必須超過51%的節點,這樣會消耗不少的資源,從而保證數據的安全,分佈式保證數據的安全可靠。
來源:簡書
做者:若與
原文連接:
https://www.jianshu.com/p/5ec29f9ede88
【文章版權歸原做者全部,其內容與觀點不表明Unitimes立 場。轉載文章僅爲傳播更有價值的信息,合做或受權聯繫請發郵件至 contact@unitimes.media或添加微信unitimes2017】
![](http://static.javashuo.com/static/loading.gif)
國際金融科技新媒體和社區平臺
UNITIMES
網址 : unitimes.media
新浪微博:@Unitimes__Media
等你點贊轉發都等出蜘蛛網了
![](http://static.javashuo.com/static/loading.gif)
本文分享自微信公衆號 - Unitimes(Uni-times)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。