項目概述
相信大家在聽到區塊鏈的時候跟我一樣,一臉發懵,不清楚這是什麼東西,是一門技術?還是一種數據結構?再聽到比特幣的時候,感覺深不可測,可能會聯想到手裏攥着的一摞硬幣QAQ。那麼請你放心往下看,本項目就是小白入門練手的項目,旨在簡單瞭解區塊鏈系統的工作流程,所以與比特幣的真正複雜底層實現差距很大,只是簡易模擬。
這個項目呢,是我在圖靈學院諸葛老師的課程上看到的,並非原創,也並非廣告,只不過在自己的理解上,加了點改動,是基於maven的,需要有一點點java的基礎,後端框架選用的是Spring boot,數據結構那方面只需要知道哈希算法是什麼就好,我使用的IDE是idea。由於初學Spirng boot,嘗試着儘量使用B/S架構開發整個項目,但是整個系統暫時不涉及到數據庫的操作(後邊優化中會提到),目前還是缺少了傳統三層架構中的持久層開發,整個項目大概就是這個樣子(請大家忽略帥氣的佳航哥壁紙)。
剛剛接觸後端開發,才知道Spring boot這個框架,還在學習當中,對於它另外一些強大的功能還有待深入研究。這個項目也可以當作Spring boot的練習項目吧,對於它剩餘強大的功能暫不介紹,也不涉及到數據庫的操作,只先實現前後端的交互,沒學過的不要慌,跟着我慢慢來。
相關概念
首先,讓我們來開始明確一下相關的概念。
專業的概念以及歷史淵源這裏不再贅述,有興趣的小夥伴可以自行百度,在這裏,僅基於我的理解說一下,不足之處還請多多指正。
爲了以示區分,免得大家混淆,我們這套系統就叫做球球幣吧。好了,正式開始!
什麼是區塊鏈?
區塊鏈,顧名思義,是一條由區塊鏈接成的鏈條。那麼區塊會保存一些信息,在這些信息中其中有一條信息與上一個區塊有關,因此就像是數據結構中鏈表的指針一樣,把區塊連接到了一起。
它還有一個名字就叫做分佈式記賬系統。區塊鏈就類似於一個大賬本一樣,記錄着所有人的交易,每一個區塊都是賬本中的一頁賬單。之所以叫做分佈式記賬系統,就是因爲每一個參與的人都會擁有這份賬本。不像現實生活中,大家無法知曉其他人的交易,銀行保存了所有人的交易記錄,相當於一箇中心化的系統,因此說區塊鏈是去中心化的。
比特幣就是基於區塊鏈這個分佈式記賬系統的。
什麼是區塊?
區塊相當於一個數據的集合,類似於C中的結構體,記錄着許多信息,有區塊的編號(id)、時間戳(一個時間的標記)、交易的集合、指向前一個區塊的指針(其實是區塊hash)、還有當前區塊的hash。
區塊的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>
那麼在這個區塊中,工作量證明是什麼呢?
第二個區塊又是怎麼來的呢?
歡迎去看下一篇文章:編程小白模擬簡易比特幣系統(二)