前言
《最小可行性区块链设计系列》的第二讲(http://www.jianshu.com/p/cac671988e2a) 实现了区块链交易的签名与验证功能,本讲将会讨论区块(Block)的构造。
本文的代码地址:https://github.com/qikh/mini-block-chain/commit/08cbfc755701699c7fcbcc35f279b087a6e4b607 (开发语言为Kotlin,更简洁的Java)
正文
区块链的客户端日常的工作就是登记账本,登记成功就会获得一定数量的代币(比特币、以太币)作为奖赏(Incentive),所以也被称为矿工(Miner)。每次记账都会产生一个新的区块(Block),区块的内容包含了区块高度(Height)、上一个区块的哈希码(Parent Hash)、矿工(Miner)的账户地址、尚未登记的交易(Transaction)列表和时间戳(time)。
/**
* 区块(Block)类,包含了区块高度(height),上一个区块哈希值(parentHash),旷工账户地址(minerAddress),交易列表(transactions)和时间戳(time)。
*/
class Block(val height: Long, val parentHash: ByteArray, val minerAddress: String, val transactions: List<Transaction>,
val time: DateTime) {
/**
* 区块(Block)的哈希值(KECCAK-256)
*/
val hash: ByteArray
get() = CryptoUtil.hashBlock(this)
}
每个区块的parentHash都会指向上一个区块的哈希值,这一机制构成了链状的区块链。每增加一个区块,区块链的高度(height)就会增加1个。
登记账本的主要工作内容就是校验交易(Transaction)的合法性,如果通过校验就执行交易并更改相关账户(发送方和接收方)的状态。
/**
* 构造新的区块,要素信息为:区块高度(height),父区块的哈希值(parentHash), 交易记录(transactions),时间戳(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
}
这样我们就完成了一个简单区块(Block)的构造,区块链客户端的工作就是不断地检查网络里的尚未登记的交易记录并构造区块,但是每个区块链的客户端都面临其他客户端的竞争,我们需要一套机制来决定最终哪个客户端的账本才是有效并能够得到登记区块的奖赏(Incentive),下一讲我们将会讨论区块链的竞争机制:挖矿(Mining)。
网友评论