2021SC@SDUSC
一、数据账本的设计核心
1.数据账本模型
数据账本的核心任务是对数据进行有效地组织和管理,因此,需要定义数据的结构和数据处理的操作模型。
JD Chain的数据账本模型以“键值”结构来组织业务数据,定义标准的读写操作,记录数据变更历史,维护数据完整性与不可否认性,管理数据的存在性证明。
二、数据账本的介绍
数据账本为各参与方提供区块链底层服务功能,包括区块、账户、配置和存储等。
区块是JD Chain账本主要组成部分,包含交易信息和交易执行状态的数据快照哈希值,但不存储具体的交易操作和状态数据。JD Chain将账本状态和合约进行分离,并约束合约对账本状态的访问,来实现数据与逻辑分离,提供无状态逻辑抽象。
JD Chain通过细化账户分类、分级分类授权的方式,对区块链系统中的账户进行管理,达到逻辑清晰化、隔离业务和保护相关数据内容的目的。
配置文件包括密钥信息,存储信息以及共享的参与者身份信息等内容,使JD Chain系统中各节点能够执行诸如连接其他节点、验证信息、存储并更新账本等操作。
存储格式采用简洁的KV数据类型, 使用较为成熟的NoSQL数据库来实现账本的持久化存储,使区块链系统能够支持海量交易。
三、合约样例一览
提供通过合约创建用户/数据账户/事件账户,写入KV,发布事件等功能
1.设置KV
/**
* 设置KV
*
* @param address 数据账户地址
* @param key 键
* @param value 值
* @param version 版本
*/
@ContractEvent(name = "setKVWithVersion")
void setKVWithVersion(String address, String key, String value, long version);
/**
* 设置KV,基于最新数据版本
*
* @param address 数据账户地址
* @param key 键
* @param value 值
*/
@ContractEvent(name = "setKV")
void setKV(String address, String key, String value);
如上代码,我们可以看到,第一段代码调用了setKVWithVersion的方法,该方法可以帮助初始数据账户、键、值、以及版本的信息。
@Override
public void setKVWithVersion(String address, String key, String value, long version) {
eventContext.getLedger().dataAccount(Bytes.fromBase58(address)).setText(key, value, version);
}
第二段代码的setKV可以基于最新版本的KV进行设置,if语句用于判别该版本是否为最新版本,若不为最新版本则version = entries[0].getVersion();该语句可以更新到最新版本。
@Override
public void setKV(String address, String key, String value) {
// 查询最新版本,初始为-1
// 查询已提交区块数据,不包括此操作所在未提交区块的所有数据
// TypedKVEntry[] entries = eventContext.getLedger().getDataEntries(eventContext.getCurrentLedgerHash(), address, key);
// 可查询包括此操作所在未提交区块的所有数据
TypedKVEntry[] entries = eventContext.getUncommittedLedger