应用使用区块链进行数据存证时,一般根据应用场景可以分为两类模式
- 数据存证模式
- 数据存取模式
数据存证模式指利用区块链不可篡改,共识时间撮的技术特性,将区块链应用为数据存证系统。该模式下,应用将关键的业务凭证信息(如合同、支付凭证等关键业务信息)写入区块链,应用保存区块链交易hash存根,将区块链视为存证系统。当有举证需求时,根据区块链的交易hash查询之前存证的原始数据以证明业务凭证信息的存在性。
数据存取模式指利用区块链不可篡改,分布式的技术特性,将区块链应用为可信分布式账本,完成基于共享的可信的数据账本的分布式业务协作。该模式下,应用将关键的业务数据写入区块链,多个参与方可根据业务数据属性在链上准实时查询检索业务数据。
以下介绍两种常用的应用交互模式。
数据存证交互模式
存证模式下,区块链系统职责是一个存证系统,共识并储存业务的存证数据,业务在需要时根据交易Hash从区块链查询原始存证数据。
应用交互流程
- 应用远程调用区块链节点写入数据
- 区块链节点写入交易池
- 区块链节点返回受理成功
- 应用保存交易Hash,与本地业务配置关联
- 区块链异步完成数据共识上链
- 应用根据交易Hash查询区块链交易(存在性证明)
内容存证查询
// 加载client配置文件Properties p = new Properties();p.load(new FileInputStream("sdk.properties"));ClientConfig config = new ClientPropertyConfig(p);// 使用指定client配置初始化clientClient client = new Client(config);// 根据tx Hash查询Response<TransactionDO> response =client.getTransaction("462da7df7c10f9b12137549b83bd77b7335cfdd5bf8a060013a111748b564e94");if(response.isSuccess()){TransactionDO tx = response.getData();// 查询成功if(null == tx){// 链上未存在该Txreturn null;}// 根据交易类型读取具体交易内容if (tx.getType() == PayloadType.TX_TYPE_NOTARY_CONTENT_ONLY.code) {// 读取内容存证交易// case the payload typeContentOnlyNotaryPayloadDO payloadDO = (ContentOnlyNotaryPayloadDO)tx.getPayload();// do something about the payload// ...// read contentSystem.out.println(new String(payloadDO.getContent(), "UTF-8"));// read biz timeSystem.out.println(payloadDO.getTimestamp());}return tx.getTxHashValue()}else{// 查询异常,}
Block查询
// 加载client配置文件Properties p = new Properties();p.load(new FileInputStream("sdk.properties"));ClientConfig config = new ClientPropertyConfig(p);// 使用指定client配置初始化clientClient client = new Client(config);// 查询区块高度Response<Block> response = client.getBlock(4);if(response.isSuccess()){// 查询成功if(null == response.getData()){// 链上未存在该块return null;}// read block// ....}
数据存取交互模式
数据存取模式下,区块链系统应用为一个分布式账本,多个参与方共同读写共享账本完成分布式协作。
数据存取系统架构
为了满足多样化的业务领域扩展需求,数据存取模式下区块链架构分为2层
- 区块链
- 业务系统
区块链完成数据共识,账本存储,及提供交易验证能力。
业务系统实时同步区块链账本,按业务需求处理区块上的交易信息,完成定制化业务逻辑、数据存储与相关索引建立。业务系统可以集群化部署,提供稳定高效的查询能力。
整体交互流程:
- 应用远程调用区块链节点写入数据
- 区块链节点写入交易池,返回受理成功
- 区块链异步完成数据共识上链,并发布出块通知
- 业务系统订阅并接收区块链节点出块通知,按需从区块链拉取区块
- 业务系统根据业务需求处理交易数据,格式化存储,建立相关业务索引
- 应用根据业务数据属性查询链上数据
出块事件订阅
// 订阅节点的出块事件,当节点生成区块时会发送推送区块通知// 远程节点当有区块生成时会回调Consumer,在Consumer处理出块通知即可// groupId相同的订阅方,只选择一台推送Response<Boolean> response = client.subscribeBlockEvent("group0", new Consumer<NewBlockEventBody>() {@Overridepublic void accept(NewBlockEventBody body) {// 获取块高Long final_height = body.getHeight();// 拉取区块并处理交易数据,格式化存储// ...}});if(!response.isSuccess()){// 订阅失败// 处理失败流程}
除事件订阅外,还可以通过定时任务的方式获取最新区块。
@Scheduled(cron="* 1/1 * * * *")public void fetchBlock() {final Response<BlockHeader> blockHeader = client.getLatestBlockHeader();if(!blockHeader.isSuccess()) {LOGGER.error("Get block header fail: ", blockHeader.getErrorMsg());return;}// 获取块高long finalHeight = blockHeader.getData().getHeight();// 拉取区块并处理交易数据,格式化存储// ...}
该文章对您有帮助吗?