編程小白模擬簡易比特幣系統(一)

項目概述

相信大家在聽到區塊鏈的時候跟我一樣,一臉發懵,不清楚這是什麼東西,是一門技術?還是一種數據結構?再聽到比特幣的時候,感覺深不可測,可能會聯想到手裏攥着的一摞硬幣QAQ。那麼請你放心往下看,本項目就是小白入門練手的項目,旨在簡單瞭解區塊鏈系統的工作流程,所以與比特幣的真正複雜底層實現差距很大,只是簡易模擬

這個項目呢,是我在圖靈學院諸葛老師的課程上看到的,並非原創,也並非廣告,只不過在自己的理解上,加了點改動,是基於maven的,需要有一點點java的基礎,後端框架選用的是Spring boot,數據結構那方面只需要知道哈希算法是什麼就好,我使用的IDE是idea。由於初學Spirng boot,嘗試着儘量使用B/S架構開發整個項目,但是整個系統暫時不涉及到數據庫的操作(後邊優化中會提到),目前還是缺少了傳統三層架構中的持久層開發,整個項目大概就是這個樣子(請大家忽略帥氣的佳航哥壁紙)。

blockChain

剛剛接觸後端開發,才知道Spring boot這個框架,還在學習當中,對於它另外一些強大的功能還有待深入研究。這個項目也可以當作Spring boot的練習項目吧,對於它剩餘強大的功能暫不介紹,也不涉及到數據庫的操作,只先實現前後端的交互,沒學過的不要慌,跟着我慢慢來。

相關概念

首先,讓我們來開始明確一下相關的概念。

專業的概念以及歷史淵源這裏不再贅述,有興趣的小夥伴可以自行百度,在這裏,僅基於我的理解說一下,不足之處還請多多指正。

爲了以示區分,免得大家混淆,我們這套系統就叫做球球幣吧。好了,正式開始!

什麼是區塊鏈?

區塊鏈,顧名思義,是一條由區塊鏈接成的鏈條。那麼區塊保存一些信息,在這些信息中其中有一條信息與上一個區塊有關,因此就像是數據結構中鏈表的指針一樣,把區塊連接到了一起。

blockChain

它還有一個名字就叫做分佈式記賬系統。區塊鏈就類似於一個大賬本一樣,記錄着所有人的交易,每一個區塊都是賬本中的一頁賬單。之所以叫做分佈式記賬系統,就是因爲每一個參與的人都會擁有這份賬本。不像現實生活中,大家無法知曉其他人的交易,銀行保存了所有人的交易記錄,相當於一箇中心化的系統,因此說區塊鏈是去中心化的

比特幣就是基於區塊鏈這個分佈式記賬系統的。

什麼是區塊?

區塊相當於一個數據的集合,類似於C中的結構體,記錄着許多信息,有區塊的編號(id)、時間戳(一個時間的標記)、交易的集合、指向前一個區塊的指針(其實是區塊hash)、還有當前區塊的hash。

block

區塊的hash怎麼得到的呢?

我們規定:

區塊的哈希值 = 上一個區塊的哈希值 + 交易信息 + 隨機數

由於哈希算法的不確定性,隨機數的變化趨勢(增大減小)對於哈希值的改變我們根本無法判斷。所以對於這個隨機數的選擇,我們設計從1開始無限增大,直到哈希值滿足要求爲止。

那麼總是依靠上一個區塊的哈希值,第一個區塊怎麼辦呢?

因此,第一個區塊我們稱爲創世區塊,是我們在這個系統規定的區塊。

代碼實現

對照上面的概念,我們可以新建一個Block.java代表區塊,所以,傳說中的區塊鏈就可以理解爲一個List<Block>,怎麼樣,是不是很簡單?

public class Block {
    /**
     * 區塊索引
     */
    private int index;
    /**
     * 時間戳
     */
    private long timeStamp;
    /**
     * 當前區塊的交易集合
     */
    private List<Transaction> transactions;
    /**
     * 工作量證明,計算正確hash的次數
     * 隨機數
     */
    private int nonce;
    /**
     * 前一個區塊的hash值
     */
    private String previousHash;
    /**
     * 當前區塊hash值
     */
    private String hash;
}

那麼第一個區塊我們就簡單的設置爲下面這樣,這裏使用了idea中Lombok插件的Builder註解,爲了大家看起來更直觀一點,就是最基礎的構造函數,看代碼大家應該也懂。

Block firstBlock = Block.builder()
        .index(1)
        .timeStamp(System.currentTimeMillis())
        .transactions(new ArrayList<Transaction>())
        .nonce(1)
        .hash("1")
        .previousHash("1")
        .build();

Lombok的pom配置

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>

那麼在這個區塊中,工作量證明是什麼呢?

第二個區塊又是怎麼來的呢?

歡迎去看下一篇文章:編程小白模擬簡易比特幣系統(二)

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