
一、先明确“存数据”具体指什么
区块链中的数据通常分为几类:合约状态数据、交易本身携带的数据、事件或日志,以及区块和交易结构中的必要字段。不同类型的可访问性、持久性和费用并不相同,不能简单地把它们都视为普通数据库字段。
以智能合约为例,写入合约存储区的状态变量会随着合约状态保留下来,适合记录需要被合约持续读取和验证的少量关键数据。函数执行期间使用的内存变量只在本次调用过程中存在,适合临时计算,不能替代持久化存储。比特币交易则以序列化格式记录输入、输出、锁定时间和脚本等内容,交易数据需要遵循网络共识规则。
二、成本与容量:不要把区块链当作普通文件服务器
持久化写入通常比临时内存操作更昂贵。智能合约每次修改链上状态都可能消耗交易资源,因此应先判断数据是否确实需要由链上程序直接读取。频繁变化、体积较大或可以重新计算的数据,不宜未经筛选地全部写入状态存储。
链上空间还受到数据结构和交易格式的约束。比特币交易包含输入、输出及脚本等字段,脚本和相关数据存在格式与大小限制;智能合约也需要为变量声明类型,以便系统确定存储布局。实际设计中应尽量采用紧凑的数据结构,减少重复内容,并在写入前评估更新频率和读取需求。
对于图片、视频、长文本或大量业务记录,更常见的思路是链下保存原始内容,链上只记录内容摘要、版本标识、时间关联信息或索引。这样可以利用链上数据验证内容是否被篡改,同时避免把大文件直接作为链上状态反复维护。摘要只能用于校验对应内容,不能在缺少原始文件时还原完整数据。
三、隐私与不可变性:公开记录前要谨慎
区块链数据一旦被确认并持续保存,通常不适合依赖传统数据库的“删除”或“修改”机制。因此,身份证号、联系方式、密钥、未公开合同内容和其他敏感信息不应直接以明文写入公开链。即使数据经过简单编码,也不等于实现了隐私保护。
需要注意的是,哈希或摘要主要提供完整性校验能力,并不能自动隐藏原始内容。如果攻击者能够猜测候选数据并计算其摘要,仍可能进行比对。涉及隐私的系统应在链下采用适当的访问控制和加密措施,链上只保留必要的证明信息,同时提前考虑密钥丢失、密钥轮换和授权撤销等问题。
还要区分“链上可验证”与“链上事实真实”。区块链可以帮助证明某份数据在特定记录中未被改动,但它本身不能保证外部输入一开始就真实。来自人工填报、传感器或第三方系统的数据,仍需要来源审查、签名、权限管理或其他校验机制。
四、数据结构、权限与程序逻辑同样重要
如果数据由智能合约维护,应明确哪些函数可以读取,哪些函数可以修改,以及修改者是否需要满足权限条件。公开函数可能被外部账户或其他合约调用;只读函数用于获取状态,不能被当作写入接口。数据写入函数还应校验输入范围、调用者身份和状态转换条件,避免无关账户任意修改。
事件和日志适合向前端或订阅应用传递操作记录,但它们与合约状态不是同一种数据。事件可以帮助检索“发生过什么”,却未必适合作为合约后续逻辑所依赖的唯一状态来源。需要由合约持续判断的数据,应使用合适的状态变量;主要用于通知和索引的数据,才考虑事件等机制。
在比特币交易中,输入通过交易标识和输出索引引用此前的特定输出,输出脚本定义花费条件。因此,设计或解析交易数据时必须严格遵守序列化、脚本和签名规则。任何对签名脚本、输入输出顺序或编码方式的误解,都可能导致验证失败或产生不可预期结果。
五、适用条件与常见问题
区块链适合保存需要多方共同验证、具有明确版本关系、希望留下可审计记录,且不宜由单一机构任意改写的少量关键数据。它不适合直接承担高频、大容量、强隐私或需要随时删除的全部业务数据。实际方案通常需要链上与链下配合,并明确两者之间的索引、校验和恢复流程。
常见问题一:把数据写入链上后能否删除?通常不能按普通数据库方式彻底删除,只能通过新增状态表示“作废”或“更新”,旧记录仍可能保留。因此,敏感数据应在写入前完成分类和脱敏。
常见问题二:只保存哈希是否足够?这取决于用途。哈希适合证明某份外部文件与当时记录的内容一致,但不能替代原始文件、访问权限、备份机制和业务解释。若原文件丢失,仅有哈希通常无法恢复原文。
常见问题三:存储数据越多,系统越可靠吗?不一定。数据越多可能带来更高的写入成本、同步负担、隐私暴露面和维护复杂度。更稳妥的做法是先定义必须由链上保证的事实,再将其余内容放在适合的链下系统,并建立清晰的校验关系。