一、存证
1.什么是存证?
简单的说就是比对前后的哈希值的过程,哈希发生了变化就证明整个文件就被修改过了,涉及到的技术是分布式存储就是我们常说的IPFS,还有区块链网络。
2.存证是如何进行的的?
区块链网络存的是交易,交易都存在各个区块中,每个区块是有大小限制的,所以就决定了交易也是有大小限制的,区块链本身的区块不会特别大,一般是8k到10M之间,8k就是我们常说的区块头的大小,每一个区块里面再存交易,那么每一笔交易注定也不会特别的大,行业限定的一笔交易的大小最佳范围是在100k左右,所以我们一般用区块链存结构化的数据。
我们常说的存证,要比对两个哈希值,一个是经过IPFS换算过后的非结构化 数据的哈希值,一个是上传到区块链中交易的哈希值,俗称txhash,tx就是英文交易的缩写,IPFS换算的哈希保障了非结构化数据是否被篡改过,他可以细到什么程度呢?比如说一份电子文档,我们修改了其中某些文字,那么它的哈希值就会发生变化,而上链的txhash也就是上面提到的交易哈希,可以查询操作指纹(比如什么人、什么时间做了什么事情等等)。
4.什么是结构化数据呢?
结构化数据就是什么人什么时间操作了什么事情,一般序列有几k大小,这些是完全可以打包到一笔交易中的。
5.非结构化数据。
就是我们常说的图片、视频这种,需要经过IPFS换算,换算过后产生了几k的哈希值,然后哈希值存到区块链中,大文件被分片(IPFS的一种技术),分片后文件一般会得到一个几k大小的哈希值,当基于这个哈希值,IPFS首先会给出一个分布式的哈希对照表,然后再去相应的节点挖取对应的分片,然后组合成一个文件,这几k的哈希值是可以上链的。PS.我们的操作指纹,还有这个几k 的哈希值他们的大小控制在100k的范围,然后一笔交易的显示记录到区块链中。
6.补充:关于IPFS与区块链耦合的问题
对于90%以上的场景,IPFS仅仅是解决了非结构化数据上链的问题,也就是上面提到的图片视频这种数据,IPFS还可以纵向切分结构化的数据(什么人什么时间干了什么事情),我们用IPFS打个比方,我用结构化的数据记录7个字段分别是:1.姓名、2.年龄、3.性别、4.身高、5.转账金额、6.转账状态、7.接收者,这就是一个人发生了转账的七个字段,为了保障数据的安全,我们常用的做法是把这七个字段统一打包然后分片分散到不同的服务器上,其实这就是最简单的一个思路,换一个玩法就是把1.3.5字段打一个包,2.4.6字段打一个包,7字段单独打一个包,再把3个包分片到不同的服务器上,这样就分别形成了3个子哈希,这样有的用户想看1.3.5字段,有的想看看2.4.6字段,这样只要分用户相应的子哈希就可以了。再延伸一下,为了更安全还可以进一步设定3个子哈希进行拼凑才能看到完整的字段,所以一个单纯的IPFS就可以玩出很多类似于授权的这样的花样来,比如说只能看1.3.5字段的话就只分配相应的子哈希就行了,这就是一个最简单的授权。
7.存证设计
存证对比的是哈希值,而哈希值需要比对两个哈希值,第一是经过IPFS换算过的哈希,第二个是上交易网络的交易哈希(txhash),这就是存证精髓要考虑的地方。
8.具体设计方案,存证的可感知
做存证一般要经过哪些步骤?
主要的步骤是上传、下载,然后前后哈希比对,在实际使用中还要加入token的概念,可以把数据的上传和下载,以token的方式加入经济激励系统。
首先,数据的上传分3个步骤:
第一、申请授权,持有相应token的人有权利上传;
第二、上传到分布式网络系统中,也就是IPFS;
第三、上传到区块链网络系统中,涉及到的角色除了上传者和下载者之外呢,还有一个审核员,存证多数都是使用联盟链是形式而不是公链,用中心化和审核员这样的角色也是必不可少的,根据实际需求呢,可以进一步细分具有权限的用户设置上传文件的安全标记、密级、访问价格、访问控制规则,这些都是上传要考虑的四个方面,安全标记大概有两部分构成,一部分是属于用户的信息,这个信息是通过通证平台反馈的用户信息来自动生成的,也可以用户自己设置,比如自己的个人信息这些,还有一部分是用户通过客户端提供的界面来自己的配置的,类似于我们的身份信息,你可以把我们的身份信息想象成一个安全标记。
密级:也就是安全的等级,我们有的文件可能是完全私有的,有的文件可以对部分人公开,有的完全是公开的,这里面可以设置一个密级,这是我们设计的时候需要考虑的事情,再一个访问价格大家都知道就不需要过度介绍了。
访问控制规则:也就是文件的访问控制权限,其实这个访问控制权限可以由用户通过客户端提供的界面来自行配置,配置好了之后,平台提供相应的接口生成合约,这个合约要经过平台的安全管理员(也就是审核员)审核,最后到链上,也就是它的访问规则由上传者自行设置一个智能合约形式跑到链上,哪些人设置的智能合约一定要经过审核员审核后才能上链部署,就如我们前边提到的过程,在数据上传的过程中,要给用户展现两个数据,一个是传入IPFS分布式存储网络的文件哈希,在一个是最终上传到区块链上的txhash(交易哈希),数据上传的时候做的更专业一点,可以用u盾的方式,我们可以把身份信息,比如姓名、公钥、私钥经过对称加密后存入到u盘中,我们每次操作上传文件时,需要u盘先解密身份文件,解密成功后才允许上传,也就是说上传前通过U盘再过滤下,进行一个秘密的保护,而且上传中一定要提取一个存储分布式网络中的文件哈希,还有一个是上传到区块链网络的txhash,这两个哈希一定要给用户展现出来,不要在后台生成,因为这是用户可感知的区块链产品中最重要的两个环节,上传完了之后,接下来就是数据的下载,大家可能觉得下载很简单,直接付token下载就可以了,其实在我们的实际需求中,下载也是具有一层授权过程的,授权通过之后才可以支付token,进行下载,另外会给上传者进行反馈下载的数据,比如说下载了多少份,谁下载了等等,因为下载本身也是一笔交易,下载的这个过程也会以txhash(交易哈希)的方式存到区块链中,数据下载的这个模块在实际产品设计中,要注意前后哈希的比对,因为进行前后哈希的比对才会有存证的意义,不能说我随便上传一个,你付完token,那你下载正确与否怎么知道呢,这就是前后哈希比对的意义,这个场景里面简单的说下,比如用户A上传了一份资料,他得到了一个分布式存储文件的哈希,还有一个上链的交易哈希,这两个哈希给他了,然后B用户经过审核之后呢,打个比方,在今天晚上8点付费购买了下载权限,这时候一定要反馈一个当前文件的哈希和交易哈希,B可能临时有事他不能立即下载,B用户到了第二天才去下载的时候,当B下载完也要展示他这个时候的两个哈希,B用户就会拿着这两个哈希和他当初购买的哈希还有最早上传的哈希进行比对;如果B用户晚上8点付费购买了下载权限但是没下载,一个小时后就是9点,A用户改了上传文件,其实这个哈希就已经发生变化了,B用户根据明天下载的哈希,他如果根据今天晚上8点的哈希来比对的话,A已经进行了数据篡改,区块链是不能删除数据的,它只能更新数据,它以前的数据都以交易的方式把历史记录存到了区块链的链条中,这样我们就可以从整个区块链的链条中查询到A上传数据,B购买数据、A修改数据、B又下载数据,然后B又比对前后数据不一致,然后他可以进行留言,说存证被篡改,A这家伙不靠谱,所以根据规则,A因为擅自修改数据会得到相应的处罚,在实际中A想修改数据一般要经过审核才可以。
用户可感知的产品过程是非常少的,在做区块链产品可感知上一定要注意让用户感知到两个哈希的变化,让上传者一定要得到两个哈希,第一个哈希比如分布式存储网络哈希是为了保障非结构数据存储结构的核心,第二个哈希是存储整个过程,另外可感知的产品一定不要忘记区块链浏览器,我们从中任何的交易哈希都可以去浏览器中查询交易历史,区块链浏览器是非常重要的。
PS.目前我们在宣传比如说分布式钱包、分布式交易所等,之所以让别人认为你的分布式钱包、分布式交易所是正确的,区块链网络也要配一个区块链浏览器去搭配他们的宣传,这才能达到分布式的目的。
分布式钱包:有很多人其实考虑到我们的分布式交易所如何宣传的问题,大部分还是想中心化的想法,比如用机器人制造大量的交易买来买去的,然后让用户一见到你的分布式钱包会看到大量的交易记录,还有很好的市场深度,其实这是不对的,因为分布式交易所是靠大家共同维护,你反面的来想我以真实的宣传去做,这就是分布式钱包配着很牛叉的分布式区块链浏览器,虽然里面没什么交易数据,但我可以保障这些数据都是真实可靠的,使用分布式浏览器的用户都不是小白用户,他们反而会很认可你,而不是要抱着中心化的思维去做很多假数据的买卖操作这样是不行的。
关于存证还需要补充一点,很多时候我们还是有一个第三方监管机构的存在,而我们常用的做法是给第三方监管机构配置相应的权限节点就可以了,他可以通过节点查询到链上的所有数据,在最近的一个落地案例中监管机构居然要求自己要搭建一条链,他们要求存证的区块链网络要把数据完整的映射到他们自己的区块链网络中,这种方式原则也是可以的,不过就是开放成本高一点。
可感知补充一点,我看到很多平台为了展示自己存证的公信力,你把文件上传完毕后它会给你盖一个电子版的证书,然后版权归属你所有,另外有的的平台还添加了前后哈希值变化率比对,比如文件是进行了修改,我们可以根据IPFS换算出来的哈希变化的幅度可以估算变化的修改率有多少。其实这个意义不大,例如我把一个合同从100万改到200万,我的修改的内容是非常重要的,而对应的哈希变化率在0.001%,这个巨大的差距从哈希变化率上完全看不出来,刚才说的盖一个电子版的证书戳,或者是哈希变化率其实都是好的产品体验,大家都可以借鉴,他们在实际中还是有一定的实际意义,至少用户的感知程度会更高。
存证其实是一个重要的领域,如果你已经开发了一条公链,并且上面木有什么可以跑的DAPP,建议你做一些牛逼的demo,就比如说前面介绍的供应链金融啦,清算结算类啦,包括今天的存证还有后面的防伪溯源等,这些都是区块链领域最常用的落地场景,你可以做一些demo放到你的公链网络中,相比做一个简单的页面和没有说服力的白皮书来讲,已经是非常高的提升了,而且做这些demo并不会费很大的力气,也就是说我们做这些demo的目的是为了让我们的公链跑的领域更多,更有说服力。这样无论对你的投资人还是你和其他用户来说都是很不错的。你完全可以在你的demo上跑一跑存证,去跑一跑溯源,来感知一下你的产品设计。
二、防伪
其实防伪和存证的概念是类似的,防伪无非是先保障了一个正确的数据,然后给这个数据流通到不同的客户中进行比对,防伪目前更多的是在区块链中进行比对,因为防伪是数据一般都不大就是一串数字,这些数字大小基本就在100k以内,是完全可以上链的,大多数情况下并不涉及到图片、视频等非结构化数据,也就是说防伪不需要借助IPFS,一个区块链几乎就能把它搞定了,当然防伪一定要保障数据源头的准确性。
什么叫数据源头的准确性呢?
这个和接下来介绍的溯源是分不开的,防伪和存证一个最大的不同是防伪体现在是一般实物,存证一般是虚拟物品,实物的防伪就涉及到真实物品与链进行交互,这个场景伪命题一般是比较多的,相比实物来讲虚拟资产的存证更容易理解而且更容易做到。
三、溯源
简单一句话概括:就是保障数据上链的数据源头也要是分布式的,打个比方,比如我们借助区块链溯源养鸡,白皮书里面完全可以大谈阔论这只鸡的命运是如何一步步记录到链上去的,但若我们刨根问底的话你就会发现这类溯源最大的一个问题,那就是鸡出生后数据是谁上链的,若这只鸡从出生就定为一只纯正的土鸡,那谁说了算,目前基本是养鸡场说了算,也就是说数据的源头还是中心化的养鸡场,若源头造假的话,区块链是溯源不到的。
总结一下,区块链可以溯源,但是若源头造假区块链是溯源不到的,若数据源头无法保障分布式去中心的话,那这个溯源八成也是个伪命题,下面结合一个客户案例来说一下,红酒溯源和医疗美容领域的溯源,目前来看均无法解决这种源头的分布式数据上链的问题,大家借助溯源更多的还是停留在宣传噱头这个阶段,当然也不能一概而论,如果说数据的源头是可信的核心企业或者是大企业,那么它的溯源还是很有意义的。
另外,溯源要涉及到实物与链要交互的问题,目前性价比比较高的形式也就有三种,二维码、射频芯片、还有智能家居,因为智能家居天生具备联网功能,而二维码和射频芯片破坏和更换问题是实物溯源要考虑的。用区块链溯源可以,但是要注意一个问题,并不是所有的数据都要上链,因为要抓核心数据溯源。这里大家不要想象成我要溯源就溯源产品的每一个环节,其实我们只溯源核心环节就足够了,例如在红酒的溯源中,红酒的品质很大程度上源于其产地和加工,所以说我们把红酒的溯源体系分为产品信息、产地溯源、生产加工溯源、和质检报告四个方面,而这四个方面也要继续细分哪些数据是要上链进行溯源的等等。因为区块链承载网络是有限的,最终能上链的数据也是有限的。就如我们结合智能家居做事情的话,智能家居每时每刻都会产生大量的数据,所以说不可能数据全部上链交互的,一定要有一个数据筛选的智能合约来控制上链数据的价值,另外要注意下区块链不能每时每刻都给你反馈,因为区块是按照一个一个来生成来保证它的数据不可篡改有时间戳的功能,所以说的它的数据落帐是串行而不是并行,串行可以认为是排队,也就是经过审核确认的数据排队后才能入链,这就是我们常说的tps变换量,tps目前业界公认的是1000-10000之间,数据再多就需要排队。排队归排队,数据是不会丢的,但是入链时间会晚,所以这些要求在做产品时,最好是每天固定一个时间点更新前一天的数据,就比如我们现在用的各类挖矿产品一样都是每天固定一个时间点来更新前一天的收益值,因为它不可能做到实时的。
四、补充内容:区块链和数据库的关系
1.区块链中的数据库和常用的数据库之间的差异性
首先说区块链中的数据库,区块链数据库存的是全量数据,而这些数据是经过序列化压缩存储的,每一个区块链都有本身的数据库,比如说比特币、以太坊他们用的数据库应该都是levelDB,你若跑公链的全量节点,本地必须配相应的硬盘去接收这些数据,我们拿瑞波网络打比方,瑞波是最容易理解的,瑞波带两个数据库,一个是NUDB,一个是RocksDB,NUDB装在Windows系统下,RocksDB是在Linux系统下,实际上他们两的功能是一样的,也就是说瑞波的节点是在一个数据库NUDB或者RocksDB下的,它主要存储的也是经过序列化跟压缩的数据,也就是全量数据,瑞波还自带另外一个数据库,它的名字叫SQLite,这个数据库主要存储区块跟交易哈希的索引,也就是为了方便查询是使用。区块链本身是带数据库的,这一点要明确,不然其冗余数据存在哪,好多人以为区块链是不带数据库,那是不可能的,不然产生的数据怎么存呢?
区块链是不能拿来就直接用的,其性能是受到限制的,一般还要再配一个本地数据库,本地数据库主要是来映射数据的,我们可以在本地搭建一个普遍使用的MySQL,这是一个很好用的数据库,它主要是映射链上的数据,方便查询使用,区块链的TPS是个瓶颈,但
2.链上的数据库和本地是数据库的差异什么呢?
链上存的是整个的状态,例如一个数字从四变成了五,又从五变成了三那么本地的MySQL数据库记录的就是一个终态3映射下来,而链上的数据库会记录整个的变化过程,把4变成5又如何变成3的过程完整记录下来,这样才能体现区块链的本质,来保障过程的每个环节都上链而且不可篡改。
区块链与数据库的关系简单总结:以瑞波网络为例,区块链都会有数据库,瑞波自带的一个是RocksDB,用来存经过序列化和压缩过的数据,但是它还有一个SQLite,用来存区块跟交易哈希的索引,方便查询,这两个数据库共同组成瑞波网络自带的数据,而我们为了方便查询,把它们的数据映射下来,所以我们在本地搭建一个MySQL等瑞波支持的数据库把数据映射下来到本地,方便查询使用,而映射下来的数据库存的是终态,区块链上的数据库存的是整个过程。