区块链的目的之一是让我们所需要的“有价值”的信息得以保存且不可更改,这些信息都储存在一个叫做“区块(block)”的结构中。以比特币为例,被认为是有价值的信息是“交易”,所有的交易储存在区块中,通过区块的hash、时间戳等实现信息的可追溯以及不可更改性。
我们这里首先实现的是一个简易的区块链,并不是像比特币这样成熟的区块链,暂不涉及交易结构、验证以及UTXO。
一、区块(block)
首先,创建一个区块(Block)类。我们的区块仅包含了一部分关键信息,它的结构如下:
class Block{
constructor(data){
this.hash = "", // 当前区块的Hash值
this.height = 0, // 当前区块的高度
this.body = data, // 区块实际存储的有效信息
this.time = 0, // 时间戳,即区块创建的时间
this.previousBlockHash = ""。// 前一个区块的Hash值
}
}
这里,hash、height、time和previousBlockHash在比特币规范中属于区块头(header),区块头是一个单独的数据结构,而body部分用于储存交易信息或者其他数据。
二、区块链(blockchain)
首先,我们要把区块存在哪里?我们可以把区块直接放进一个数组(let blockchain = arr[]),但是这显然不是我们想要的。这里我们选择leveldb作为底层的数据储存方案。
const level = require('level');
const chainDB = './.data/blockchain';
const db = level(chainDB);
然后,我们要思考一下,一个blockchain实例需要具有哪些功能?
1、getBlockHeight():获取当前区块的高度,即该区块链的高度;
2、getBlockByHeight(height):通过区块高度来获取区块;
3、getBlockByHash(hash):通过区块哈希来获取区块;
4、validateBlock(height):验证某高度