前言
《最小可行性區(qū)塊鏈設(shè)計(jì)系列》的第二講(http://www.itdecent.cn/p/cac671988e2a) 實(shí)現(xiàn)了區(qū)塊鏈交易的簽名與驗(yàn)證功能,本講將會(huì)討論區(qū)塊(Block)的構(gòu)造。
本文的代碼地址:https://github.com/qikh/mini-block-chain/commit/08cbfc755701699c7fcbcc35f279b087a6e4b607 (開發(fā)語言為Kotlin,更簡潔的Java)
正文
區(qū)塊鏈的客戶端日常的工作就是登記賬本,登記成功就會(huì)獲得一定數(shù)量的代幣(比特幣、以太幣)作為獎(jiǎng)賞(Incentive),所以也被稱為礦工(Miner)。每次記賬都會(huì)產(chǎn)生一個(gè)新的區(qū)塊(Block),區(qū)塊的內(nèi)容包含了區(qū)塊高度(Height)、上一個(gè)區(qū)塊的哈希碼(Parent Hash)、礦工(Miner)的賬戶地址、尚未登記的交易(Transaction)列表和時(shí)間戳(time)。
/**
* 區(qū)塊(Block)類,包含了區(qū)塊高度(height),上一個(gè)區(qū)塊哈希值(parentHash),曠工賬戶地址(minerAddress),交易列表(transactions)和時(shí)間戳(time)。
*/
class Block(val height: Long, val parentHash: ByteArray, val minerAddress: String, val transactions: List<Transaction>,
val time: DateTime) {
/**
* 區(qū)塊(Block)的哈希值(KECCAK-256)
*/
val hash: ByteArray
get() = CryptoUtil.hashBlock(this)
}
每個(gè)區(qū)塊的parentHash都會(huì)指向上一個(gè)區(qū)塊的哈希值,這一機(jī)制構(gòu)成了鏈狀的區(qū)塊鏈。每增加一個(gè)區(qū)塊,區(qū)塊鏈的高度(height)就會(huì)增加1個(gè)。
登記賬本的主要工作內(nèi)容就是校驗(yàn)交易(Transaction)的合法性,如果通過校驗(yàn)就執(zhí)行交易并更改相關(guān)賬戶(發(fā)送方和接收方)的狀態(tài)。
/**
* 構(gòu)造新的區(qū)塊,要素信息為:區(qū)塊高度(height),父區(qū)塊的哈希值(parentHash), 交易記錄(transactions),時(shí)間戳(time)
*/
fun createNewBlock(parent: Block, transactions: List<Transaction>): Block {
val block = Block(parent.height + 1, parent.hash, minerAddress, transactions, DateTime())
for (trx in transactions) {
applyTrx(trx)
}
return block
}
這樣我們就完成了一個(gè)簡單區(qū)塊(Block)的構(gòu)造,區(qū)塊鏈客戶端的工作就是不斷地檢查網(wǎng)絡(luò)里的尚未登記的交易記錄并構(gòu)造區(qū)塊,但是每個(gè)區(qū)塊鏈的客戶端都面臨其他客戶端的競爭,我們需要一套機(jī)制來決定最終哪個(gè)客戶端的賬本才是有效并能夠得到登記區(qū)塊的獎(jiǎng)賞(Incentive),下一講我們將會(huì)討論區(qū)塊鏈的競爭機(jī)制:挖礦(Mining)。