由于是一个db,只是引入了一部分blockchain的机制,所以把名字统一一下吧
lightdb.lib 对rocksdb的本地化封装,简化暂时用不到的接口,加上数据类型,最后写入高度这些信息,支持table的概念,一个库里存多份不同的字典
lightdb.server 数据库服务器,websockets连接
lightdb.sdk 供客户端连接服务器用的帮助类库
httpserver 服务器模块
lightdb.testclient 一个数据库示例
由于最近从事区块链方面的工作
目前和多个区块链组织有染,有一些基础的工作,放在哪个组织的仓库里都似有不妥。 索性放在我的私有仓库里开源,谁想fork就fork,以解决这些基础工作的归属问题。
lightchain意欲打造一个轻量化的区块链,主要作为数据库使用。
lightchain 受了很多NEO的影响,有一些相似的地方是肯定的。
但在源码上不会直接copy Neo的代码,如使用第三方库均会以nuget的形式引用。
1.快照
因为数据库的公用属性,一定存在着一个需求读取,另外的需求要写入的情况, 快照就是为了避免此种情况下的数据不一致性。
我做个快照开始读取,此时小张的口袋有5块。我开始读,别人不停的给小张口袋塞钱。
但是我都是从快照里读取的,无论他们怎么塞,我读取到的都是5块。
一般的数据库,快照需要额外开销,而leveldb是特别的,他使用的LSM算法使得快照没有任何额外开销
lightchain使用rocksdb 作为数据仓库,rocksdb是facebook基于leveldb开发的,同样提供快照的支持。
2.数据类型
leveldb rocksdb 都是纯粹的读写数据块,也就是说都是byte[]
lightchain 会提供丰富的类型支持,如定长的数值类型,biginteger,byte[],string,bool
让使用和观察都更容易,不用猜测数据类型
3.读写分离、集群免配置
为了性能,lightchain同样使用读写分离设计,主节点负责写入,
从节点找主节点获取数据,负责应付大量的读取。
主从节点之间采用P2P连接,无需配置,任意打开一个从节点组网即可。
主从节点数据相同,主节点down机,可以将任意从节点作为主节点快速恢复。
至于采用多个主节点来共识,以提高系统稳定性,这个暂时还没有考虑。
4.快速节点同步
一个新开的从节点 找 其他节点同步数据总是很慢,比如NEO同步数据。
会研发一些独特的技术,保证新的从节点快速可用。
主要是
1.设置检查点,允许从节点读一个自己不确定的数据时向已有此数据的节点询问
检查点是数据一份额外的复制
比如,每1000块设置一个检查点,可以向任意一个已完全同步的节点询问
比如询问一个数据 在1000块时的值、2000块时的值
那么就意味着 一个 节点自己没同步完全时,可以向其他节点询问检查点时刻的值。
虽然不是所有的请求都是检查点时刻的,但是一个节点可以从最近的检查点开始同步,只需要同步最多两个检查点间隔的值,就可以 提供最新数据的服务了。
2.支持乱序同步
一般的区块链系统同步都是由前至后的,那是因为同步了太多的状态, 而我们将系统的范围压缩到数据,对任意数据来说,总是时刻较晚的值覆盖时刻较早的值。 只要将“被删除”作为一个值,再带上时刻,所有的数据我们可以以任意顺序同步。采用较晚的那一个就可以了。
这可以让一个节点比如从101000块开始快速同步到最新的,他为了尽快成为一个完整信息的节点。 可以从101000块向前同步(倒序同步),当然也可以比如分成10段一起同步,正序倒序均可。
但是因为访问的数据是从快照时间最近的值,正序同步得到的值未必是最新的,还是要从最近检查点确认一下。 倒序同步是最有效率的方式。