其他
什么是“上链”?什么数据和逻辑应该“上链”?文件能不能上链?链上能不能批量查数据?“链下”又是什么?“链上”、“链下”诸多问题,一文说清。什么是“链上”和“链下”区块“链”的链,包含“数据链”和“节点链”。数据链指用链式结构组织区块数据,构成数据校验和追溯的链条;“节点链”指多个节点通过网络连接在一起,互相共享信息,其中的共识节点则联合执行共识算法,产生并确认区块。交易“上链”的简要过程如下:记账者们收录交易,按链式数据结构打包成“区块”。共识算法驱动大家验证新区块里的交易,确保计算出一致的结果。数据被广播到所有节点,稳妥存储下来,每个节点都会存储一个完整的数据副本。交易一旦“上链”,则意味着得到完整执行,达成了“分布式事务性”。简单地说,就像一段话经过集体核准后在公告板上公示于众,一字不错不少,永久可见且无法涂改。“上链”意味着“共识”和“存储”,两者缺一不可。交易不经过共识,则不能保证一致性和正确性,无法被链上所有参与者接受;共识后的数据不被多方存储,意味着数据有可能丢失或被单方篡改,更谈不上冗余可用。除此之外,如果仅仅是调用接口查询一下,没有改变任何链上数据,也不需要进行共识确认,则不算“上链”。或者,某个业务服务本身和区块链并不直接相关,或其业务流程无需参与共识,所生成的数据也不写入节点存储,那么这个业务服务称为“链下服务”,无论它是否和区块链节点共同部署在一台服务器,甚至和节点进程编译在一起。当这个业务服务调用区块链的接口发送交易,且交易完成“共识”和“存储”后,才称为“上链”;如果这个交易没有按预期被打包处理,那么可以叫“上链失败”。事实上,几乎所有的区块链系统,尤其是和实体经济、现实世界结合的区块链应用,都需要链上链下协同,用“混合架构“来实现,系统本身就包含丰富的技术生态。*注1:交易(transaction)是区块链里的通用术语,泛指发往区块链,会改动链上数据和状态的一段指令和数据*注2:本节描述的是简要的模型,在多层链、分片模型里,流程会更加复杂,事务划分更细,但“共识”和“存储”才叫上链的基本原则不变交易之轻和“上链”之重目前区块链底层平台逐步趋于成熟,性能和成本已经不是什么大问题,只是以下几个开销是因“分布式多方协作”而先天存在的:共识开销:主流共识算法里,PoW(工作量证明,也就是挖矿)消耗电力;PoS(权益证明)要抵押资产获得记账权;PBFT(联盟链常用的拜占庭容错算法)记账者要完成多次往返投票,流程步骤繁杂。计算开销:除了加解密、协议解析等计算之外,在支持智能合约的区块链上,为了验证合约的执行结果,所有节点都会无差别地执行合约代码,牵一发而动全身。网络开销:与节点数呈指数级比例,节点越多,网络传播次数越多,带宽和流量开销越大,如果数据包过大,就更雪上加霜。存储开销:和节点数成正比,所有的链上数据,都会写入所有节点的硬盘,在一个有100个节点的链上,就变成了100份副本,如果有1000个节点,那就是1000份。也许有人会说:“这就是‘信任’的成本,值得的!”我同意。只是理想无法脱离现实,毕竟硬件资源总是有限的。想象一下,如果每个交易都是一个复杂科学计算任务,那么每个节点CPU和内存会跑满;如果每个交易都包含一个大大的图片或视频,那么全网的带宽,以及各节点存储很快被塞爆;如果大家都敞开来滥用“链上”资源,“公地悲剧”就不可避免。调用API发个交易是很容易的,而链上的开销就像房间里的大象,难以视而不见。作为开发者,需要正视“交易之轻和链上之重”,积极“上链”的同时减少不必要的开销,找到平衡之道。*注1:常规联盟链节点参考配置:8核/16G内存/10m外网带宽/4T硬盘,不考虑“矿机”和其他特种配置。土豪随意,俗话说“钱能解决的问题都不是问题,问题是...”*注2:本节暂未讨论“局部/分片共识”,也不探讨“平行扩容”的情况,默认假定全网参与共识和存储让“链上”归链上,“链下”归链下开销只是成本问题,而本质上,应该让区块链干自己最该干的事情。链上聚焦多方协作,尽快达成共识,营造或传递信任,将好钢用到刀刃上;那些非全局性的、无需多方共识的、数据量大的、计算繁杂的...通通放到链下实现,一个好汉三个帮。如何进行切割?在业务层面,识别多方协作事务和数据共享中“最大公约数”,抓住要点痛点,四两拨千斤;在技术上,合理设计多层架构,扬长避短、因地制宜地运用多种技术,避免拿着锤子看什么都是钉子、一招打天下的思维。为避免过于抽象,下面给出几个例子。*注:每个例子其实都有大量的细节,考虑篇幅,这里做概要介绍,聚焦链上链下的区别和有机结合