區塊鏈技術基本架構原理:從「區塊」談起
區塊鏈領域,鏈神探很專註
財經365訊(編輯 章馨),區塊鏈是21世紀最具革命性的技術之一,它仍然處於不斷成長的階段,而且還有很多潛力尚未顯現。 本質上,區塊鏈只是一個分散式資料庫而已。 不過,使它獨一無二的是,區塊鏈是一個公開的資料庫,而不是一個私人資料庫,也就是說,每個使用它的人都有一個完整或部分的副本。 只有經過其他「資料庫管理員」的同意,才能向資料庫中添加新的記錄。 此外,也正是由於區塊鏈,才使得加密貨幣和智能合約成為現實。
區塊
首先從「區塊」談起。在區塊鏈中,真正存儲有效信息的是區塊(block)。而在比特幣中,真正有價值的信息就是交易(transaction)。實際上,交易信息是所有加密貨幣的價值所在。除此以外,區塊還包含了一些技術實現的相關信息,比如版本,當前時間戳和前一個區塊的哈希。
不過,我們要實現的是一個簡化版的區塊鏈,而不是一個像比特幣技術規範所描述那樣成熟完備的區塊鏈。所以在我們目前的實現中,區塊僅包含了部分關鍵信息,它的數據結構如下:
我們這裡的 Timestamp,PrevBlockHash, Hash,在比特幣技術規範中屬於區塊頭(block header),區塊頭是一個單獨的數據結構。完整的 比特幣的區塊頭(block header)結構 如下:
下面是比特幣的 golang 實現 btcd 的 BlockHeader 定義:
// BlockHeader defines information about a block and is used in the bitcoin // block (MsgBlock) and headers (MsgHeaders) messages.type BlockHeader struct { // Version of the block. This is not the same as the protocol version.
Version int32 // Hash of the previous block in the block chain.
PrevBlock chainhash.Hash // Merkle tree reference to hash of all transactions for the block.
MerkleRoot chainhash.Hash // Time the block was created. This is, unfortunately, encoded as a // uint32 on the wire and therefore is imited to 2106.
Timestamp time.Time // Difficulty target for the block.
Bits uint32 // Nonce used to generate the block. Nonce uint32}
而我們的 Data, 在比特幣中對應的是交易,是另一個單獨的數據結構。為了簡便起見,目前將這兩個數據結構放在了一起。在真正的比特幣中,區塊的數據結構如下:
在我們的簡化版區塊中,還有一個 Hash 欄位,那麼,要如何計算哈希呢?哈希計算,是區塊鏈技術一個非常重要的部分。正是由於它,才保證了區塊鏈的安全。計算一個哈希,是在計算上非常困難的一個操作。即使在高速電腦上,也要耗費很多時間 (這就是為什麼人們會購買 GPU,FPGA,ASIC 來挖比特幣) 。這是一個架構上有意為之的設計,它故意使得加入新的區塊十分困難,繼而保證區塊一旦被加入以後,就很難再進行修改。在接下來的內容中,我們將會討論和實現這個機制。
目前,我們僅取了 Block 結構的部分欄位(Timestamp, Data 和 PrevBlockHash),並將它們相互拼接起來,然後在拼接後的結果上計算一個 SHA-256,然後就得到了哈希。
Hash = SHA256(PrevBlockHash + Timestamp + Data)
在 SetHash 方法中完成這些操作:
func (b *Block) SetHash() {
timestamp := []byte(strconv.FormatInt(b.Timestamp, 10))
headers := bytes.Join([][]byte, []byte{})
hash := sha256.Sum256(headers)
b.Hash = hash[:]}
接下來,按照 Golang 的慣例,我們會實現一個用於簡化創建區塊的函數 NewBlock:
func NewBlock(data string, prevBlockHash []byte) *Block {
block := &Block} block.SetHash()
return block}
區塊鏈
有了區塊,下面讓我們來實現區塊鏈。本質上,區塊鏈就是一個有著特定結構的資料庫,是一個有序,每一個塊都連接到前一個塊的鏈表。也就是說,區塊按照插入的順序進行存儲,每個塊都與前一個塊相連。這樣的結構,能夠讓我們快速地獲取鏈上的最新塊,並且高效地通過哈希來檢索一個塊。
在 Golang 中,可以通過一個 array 和 map 來實現這個結構:array 存儲有序的哈希(Golang 中 array 是有序的),map 存儲 hash -> block 對(Golang 中, map 是無序的)。 但是在基本的原型階段,我們只用到了 array,因為現在還不需要通過哈希來獲取塊。
type Blockchain struct { blocks []*Block}
這就是我們的第一個區塊鏈!是不是出乎意料地簡單? 就是一個 Block 數組。
現在,讓我們能夠給它添加一個區塊:
func (bc *Blockchain) AddBlock(data string) {
prevBlock := bc.blocks[len(bc.blocks)-1]
newBlock := NewBlock(data, prevBlock.Hash)
bc.blocks = append(bc.blocks, newBlock)}
結束!不過,就這樣就完成了嗎?
為了加入一個新的塊,我們必須要有一個已有的塊,但是,初始狀態下,我們的鏈是空的,一個塊都沒有!所以,在任何一個區塊鏈中,都必須至少有一個塊。這個塊,也就是鏈中的第一個塊,通常叫做創世塊(genesis block). 讓我們實現一個方法來創建創世塊:
func NewGenesisBlock() *Block { return NewBlock("Genesis Block", []byte{})}
現在,我們可以實現一個函數來創建有創世塊的區塊鏈:
func NewBlockchain() *Blockchain {
return &Blockchain{[]*Block}}
檢查一個我們的區塊鏈是否如期工作:
func main() {
bc := NewBlockchain()
bc.AddBlock("Send 1 BTC to Ivan")
bc.AddBlock("Send 2 more BTC to Ivan")
for _, block := range bc.blocks {
fmt.Printf("Prev. hash: %x
", block.PrevBlockHash)
fmt.Printf("Data: %s
", block.Data)
fmt.Printf("Hash: %x
", block.Hash)
fmt.Println()
}}
輸出:
Prev. hash:
Data: Genesis Block
Data: Send 1 BTC to Ivan
Hash: d75ce22a840abb9b4e8fc3b60767c4ba3f46a0432d3ea15b71aef9fde6a314e1
Prev. hash: d75ce22a840abb9b4e8fc3b60767c4ba3f46a0432d3ea15b71aef9fde6a314e1
Data: Send 2 more BTC to Ivan
總結
我們創建了一個非常簡單的區塊鏈原型:它僅僅是一個數組構成的一系列區塊,每個塊都與前一個塊相關聯。真實的區塊鏈要比這複雜得多。在我們的區塊鏈中,加入新的塊非常簡單,也很快,但是在真實的區塊鏈中,加入新的塊需要很多工作:你必須要經過十分繁重的計算(這個機制叫做工作量證明),來獲得添加一個新塊的權力。並且,區塊鏈是一個分散式資料庫,並且沒有單一決策者。因此,要加入一個新塊,必須要被網路的其他參與者確認和同意(這個機制叫做共識(consensus))。還有一點,我們的區塊鏈還沒有任何的交易!
進入 src 目錄查看代碼,執行 make 即可運行:
$ cd src
$ make==> Go build==> Running
Prev hash:
Data: Genesis Block
Data: Send 1 BTC to Ivan
Hash: 839380a2d0af1dc4686f16ade5423fecdc5f287db9322d9e18adcb4071e7c8ff
Prev hash: 839380a2d0af1dc4686f16ade5423fecdc5f287db9322d9e18adcb4071e7c8ff
Data: Send 2 more BTC to Ivan
Hash: b38052a029bd2b1b9d4bb478af45b4c88605e99bc64e49031ba06d21ad4b0b38。關於區塊鏈技術更多相關新聞資訊,請關注財經365外匯頻道!
本文「區塊鏈技術基本架構原理:從 「區塊」 談起」由財經365首發,歡迎轉載,轉載請帶上本文鏈接。
http://www.caijing365.com/html/quanqiu/waihui/20180409/140310.html
聲明:本文版權屬作者所有,轉載須註明"來源:鏈神探 章馨",違者將依法追究責任。
要了解更多鏈圈幣圈的資訊,可以加入鏈神探社區
加入方式:關注鏈神探公眾號


※真實:真正的區塊鏈項目投資回報率將超過100倍
※韓國首都首爾將區塊鏈技術融入其市政系統
TAG:鏈神探 |