本文我們將開始制作一個(gè)本地的區(qū)塊鏈。
為什么要從本地開始?
很多人,受現(xiàn)在比特幣以太坊等明星產(chǎn)品的影響,可能會(huì)說“區(qū)塊鏈在本地有什么用啊要聯(lián)網(wǎng)才有用啊”。
其實(shí)并不然,區(qū)塊鏈不是必須要連上網(wǎng),并不是經(jīng)過共識(shí)了才叫區(qū)塊鏈。根據(jù)分類,區(qū)塊鏈可分成公共鏈,私有鏈 和聯(lián)盟鏈,其中只有公共鏈?zhǔn)窃诠W(wǎng)上且分布式的,而私有和聯(lián)盟根據(jù)其服務(wù)性質(zhì)而定,其中大部分都是一個(gè)本地鏈即可完成功能。好比銀行中需要數(shù)字賬簿,只需在本地用于該鏈的計(jì)算機(jī)上操作各類交易即可實(shí)現(xiàn)賬目審計(jì)。
簡(jiǎn)而言之,本地區(qū)塊鏈就是一個(gè)可追溯、可信、方便審計(jì)的數(shù)據(jù)庫(kù)。
我們這里選用Golang作為開發(fā)語(yǔ)言,因?yàn)樗鼑?yán)謹(jǐn)而又現(xiàn)代,適合搭建這樣可靠的服務(wù),而且未來在分布式的應(yīng)用方面Golang也有傲人之處。同樣你也可以把代碼根據(jù)思路翻譯成其他語(yǔ)言,JS、Typescript、Python等現(xiàn)代語(yǔ)言對(duì)于初學(xué)者來說會(huì)議更好的體驗(yàn)。
當(dāng)然本地區(qū)塊鏈也有利于新手先熟悉區(qū)塊鏈本身的樣子。由于不涉及網(wǎng)絡(luò)和其他附加元素,本地區(qū)塊鏈最為純凈。同樣也有利于將來將其他附加元素與區(qū)塊鏈分離,實(shí)現(xiàn)接口銜接。
開始,類型
Golang是一個(gè)靜態(tài)編譯的語(yǔ)言,是需要對(duì)其中變量常量對(duì)象進(jìn)行嚴(yán)格定義的。首先我們需要對(duì)區(qū)塊(Block)進(jìn)行定義:
type Block struct {
Index int64 `json:"index,string"`
PrevHash []byte `json:"prevhash,string"`
Timestamp int64 `json:"timestamp,string"`
Data []byte `json:"data,string"`
Hash []byte `json:"hash,string"`
}
這是最基本的區(qū)塊的定義。
首先說明下“`”和“`”之間的是tag內(nèi)容,方便json序列化,各位可以當(dāng)注釋看待。
Index是為了區(qū)塊排序用的索引,從0(即創(chuàng)世區(qū)塊)開始。Timestamp為創(chuàng)建本區(qū)塊時(shí)的時(shí)間。PrevHash表示上一個(gè)區(qū)塊的hash值,而Hash值即表示將本區(qū)塊所有信息(索引、前一區(qū)塊Hash、時(shí)間戳Timestamp、數(shù)據(jù)Data)經(jīng)過hash函數(shù)處理后獨(dú)一無二的內(nèi)容。
寫到這里插個(gè)題外話,要做數(shù)字資產(chǎn)而且想被市場(chǎng)接受就要有噱頭,或者說大賣點(diǎn)(至少現(xiàn)在是這樣的)。但是作為個(gè)人開發(fā)者沒核心技術(shù)突破的能力,不像有些幣有財(cái)團(tuán)背書有實(shí)驗(yàn)室背書,做不出什么抗量子算法,發(fā)明個(gè)抗ASIC挖礦算法都難。那就推薦這個(gè)bitcoin團(tuán)隊(duì)的repo:https://github.com/bitcoin/bips。這里面包含了所有Bitcoin升級(jí)的建議(BIP),而其中很多是因?yàn)锽TC的勢(shì)力對(duì)抗或者是重構(gòu)與分叉的難度而未能完成的,并不是代碼難度。因此作為一種新幣,只要解決這些問題中的一兩個(gè)就足夠作為噱頭。當(dāng)然我們也能從中看到什么樣的虛擬貨幣是人們真正想要的。其他部分就只要借鑒借鑒即可。