
适用范围与设计起点
java区块链存储需要注意哪些问题,首先取决于应用保存的是业务文件、链上记录,还是用于查询的本地索引。Java是应用实现语言,存储能否长期读取、记录如何确认,取决于接入网络的协议和存储机制。以下讨论适用于Java应用的通用架构设计,不代表某个开发库已经提供相应保障。
区分链上记录与链下文件
以太坊存储文档指出,大体量数据直接上链会增加网络存储负担,并产生相应的链上费用。去中心化文件存储则可以通过不同的持久化机制保存内容。
据此设计应用时,应分别定义原始文件、内容摘要和定位信息的用途。对于需要校验完整性的文件,可考虑链下保存内容、链上记录校验信息的结构。读取文件后仍需核对内容;保存了摘要,并不意味着文件本身已经得到保存。
确认数据由谁持续保管
以太坊存储文档还说明,IPFS本身没有内置的存储激励机制,内容保留可借助固定服务或自行运行的节点;依赖存储协议的方案需要关注约定期限和续期。
因此,上传成功只能说明某个环节完成,不能单独证明长期可用。应用需要明确保管责任、保留期限和失效后的恢复方式。对于必须持续读取的业务,应把实际可检索性纳入检查,而不能只检查数据库里是否存在文件标识。
避免把区块高度当作唯一标识
比特币开发指南解释了区块通过前一区块头的哈希相互连接,以及分叉时同一高度可能存在多个区块。因此,区块高度不能作为全局唯一标识,区块通常通过区块头哈希引用。
Java应用建立区块索引时,应区分高度与身份:高度表达位置,哈希标识具体区块。需要关联链上记录的业务,还应保留其所属区块的信息,以便识别记录所在分支发生的变化。
处理本地索引与链的一致性
在可能发生链重组的网络中,本地曾经读取到的记录可能不再属于当前采用的链。应用应区分已观察到的记录与满足自身确认条件的记录,并考虑重新同步时如何修正关联状态。具体确认规则必须依据目标网络,不能直接跨链套用。
常见问题是把内容校验、存储可用性和链上确认混为一谈。内容校验回答数据是否匹配,存储检查回答能否取回,链上确认回答记录处于何种状态。Java应用的数据模型与异常处理需要分别表达这些结果。