區塊鏈入門-1

引言

區塊鏈可以看做是一種數據的分佈式存儲方法。每一個節點所存儲的數據都是完整的(即每一個節點的數據都是一個備份),且不可修改。目前區塊鏈主要應用於金融領域,希望有朝一日該技術能在其他地方展露鋒芒。

區塊鏈起源

區塊鏈技術起源於2008年中本聰《比特幣:一種點對點電子現金系統》,區塊鏈誕生自中本聰的比特幣,目前區塊鏈最經典的應用就是比特幣,當然現在也出現了一些如:以太坊這樣的新應用

區塊鏈基礎結構(bitcoin)

bitcoin中的區塊鏈結構
圖中各參數(在實際情況中,參數可能會更多)
Time:該區塊建立的時間,有特殊的作用,見參考資料[4]
Nonce:一個隨機數。因爲要獲得一個區塊的打包權,需要使得該給定區塊的隨機散列值的前綴出現多個0(0的數量是有一定要求的),這通常要進行大量的計算(bitcoin的工作量證明(POW)就是如此)。因爲同樣的輸入數據在經過哈希算法加工後所得的結果是一樣的,故現在要引入一個變量(實際情況可能由多個變量控制)來改變這種結果以求得符合要求的隨機散列值。


如:bitcoin中第558781個區塊的隨機散列值:0000000000000000000fbb90ac16fce1fa83d6908005548781a91c840fa10f17

    public static void main(String[] args) {
   
   
        int nonce = 0;
        String result = null;
        String data = "Dylan";
        do {
   
   
            result = HashCalculator.hashResult(data + nonce);
            nonce++;
        }while (!result.startsWith("0000"));
        System.out.println("nonce: " + nonce);
        System.out.println(result);
    }
    /*
    代碼中所調用方法在下文
    如我們要獲取隨機散列值是由0000起始時,則nonce的值爲604
    上述代碼輸出結果:
    nonce: 604
    000093a262d2529e30f182ad843ef07a556ce00af1adfe35d3700a326ba0808f
    */

在bitcoin中誰先求出這種符合要求的結果,誰就有把交易(數據)打包成區塊的所有權並獲取相應的獎勵。這種獎勵也是bitcoin的區塊鏈長度以及價值能夠進行到如今這種規模的原因之一(本文寫作時bitcoin的價格已經漲到每個比特幣:$39,197.57)。
Prevhash:前一個區塊的隨機散列值。每個區塊通過此隨機散列值鏈接(計算哈希值的過程可以看做給一個函數賦值x,則輸出一個y,此時的x與y是一對一的關係且不可由y推出x)。而且這個參數的加入,賦予了區塊鏈不可修改的特性,這在後文會簡單介紹。
<Transactions>:圖中指的是交易數據,其實我們可以廣義化;如放一些可以公佈但又不可修改的數據。

網絡

共識算法

在生活當中,共識指的就是對某件事達成一致的看法。在計算機中,就本文來說,共識就是網絡中各個節點之間對區塊鏈上的數據達成一致。
如bitcoin上的共識大致過程:

1.新的交易(數據)向全網進行廣播;
2.每一個節點都將收到的交易信息納入一個區塊中;
3.每個節點都嘗試在自己的區塊中找到一個具有足夠難度的工作量證明(找起始爲特定個數0的隨機散列值,即POW);
4.當一個節點找到了一個工作量證明,它就向全網進行廣播;
5.當且僅當包含在該區塊中的所有交易都是有效的且之前未存在過的,其他節點才認同該區塊的有效性;
6.其他節點表示他們接受該區塊,而表示接受的方法,則是在跟隨該區塊的末尾,製造新的區塊以延長該鏈條,而將被接受區塊的隨機散列值視爲先於新區塊的隨機散列值。




節點始終都將最長的鏈條視爲正確的鏈條,並持續工作和延長它。如果有兩個節點同時廣播不同版本的新區塊,那麼其他節點在接收到該區塊的時間上將存在先後差別。當此情形,他們將在率先收到的區塊基礎上進行工作,但也會保留另外一個鏈條,以防後者變成最長的鏈條。該僵局的打破要等到下一個工作量證明(POW)被發現,而其中的一條鏈條被證實爲是較長的一條,那麼在另一條分支鏈條上工作的節點將轉換陣營,開始在較長的鏈條上工作。 所謂“新的交易要廣播”,實際上不需要抵達全部的節點。只要交易信息能夠抵達足夠多的節點,那麼他們將很快被整合進一個區塊中。而區塊的廣播對被丟棄的信息是具有容錯能力的。如果一個節點沒有收到某特定區塊,那麼該節點將會發現自己缺失了某個區塊,也就可以提出自己下載該區塊的請求。

特點

去中心化

現在落地的大多數應用,都是中心化、第三方平臺搭建的,而區塊鏈最重要的一個特點就是去中心化。中心化往往會帶來一些不必要的第三方資源消耗,而且容易遭受攻擊。像bitcoin這樣的去中心化應用,則不用爲第三方耗費資源(只有一個打包費,也可以不交費,但後果就是你的交易可能不能被及時打包成區塊),而且也不容易遭受攻擊,這主要是因爲全網的節點都是一個數據備份點,其中任何一個節點被攻擊,對整個bitcoin網絡來說,起不到任何威脅作用,如果要想攻擊全網所有節點的話,目前來說幾乎不可能(未來的量子計算機可能行吧)。

去中心化圖解
上圖描述的只是去中心化應用的一小部分優點(也就是p2p交易)。

不可修改性

區塊鏈是不可修改,開放的。這主要由計算隨機散列值的算法決定的,因爲輸入數據的一個微小改變都會造成輸出的隨機散列值發生大的變化。
在這裏插入圖片描述

//這是一段使用SHA-256算法的代碼
public static String hashResult(String data) {
   
   
        StringBuilder result = new StringBuilder();
        MessageDigest object = null;
        byte[] encrypted = new byte[0];

        try {
   
   
            object = MessageDigest.getInstance("SHA-256");
            encrypted = object.digest(data.getBytes("UTF-8"));
        } catch (UnsupportedEncodingException e) {
   
   
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
   
   
            e.printStackTrace();
        }

        for (byte b : encrypted) {
   
   
            result.append(String.format("%02x", b));//16進制輸出
        }
        return result.toString();
    }

當輸入的data有一個微小改變時,輸出的result發生了大的改變
如輸入數據分別爲:

System.out.println(HashCalculator.hashResult(“Dylan123”));
運行結果:0e66e671e182bae61d8e1b3d93134927cbbe574cd35f50b78cdc22fb8b278c5b
System.out.println(HashCalculator.hashResult(“Dylan123.”));
運行結果:85b8ce6ee069be094ec8405a327cb41faaeb05861e70f22bd46499d74b79ad8d
可見輸入數據的微小改變,輸出結果有多麼千差萬別。



所以當區塊把前一個區塊的隨機散列值,加入到該區塊中並進行哈希計算,得出的隨機散列值再放入到下一區塊中進行計算,週而復始。當你修改前面的區塊的一個數據,哪怕只是一個標點符號,那麼後面的所有區塊的隨機散列值都要重新計算,在bitcoin中這種計算量是相當大的,如果非要去修改它,那麼這個過程所花費的代價是得不償失的。所以這就賦予了區塊鏈的不可修改性。

參考資料

[1] 比特幣白皮書
[2] 以太坊白皮書
[3] 區塊鏈起源介紹
[4] 時間戳簡單理解
[5]七個步驟入門區塊鏈
[6] 簡單入門區塊鏈




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章