2017年区块链正在风口上。媒体上大量涌现出的区块链项目,表明了更多的人对区块链概念的接受,并积极地投入到实际应用中。但是对于一个多年的区块链研究者和从业者,我们更应该有清醒的认识,不断地反问自己:现阶段,区块链到底能给社会治理和企业运营带来什么真实的价值?
很多区块链项目还都在“概念验证”阶段,甚至有些项目跟区块链根本没有任何关系。从软件技术架构的角度来说,这些项目更适合采用“传统的关系型数据库”技术,比如 Oracle 和 SQL Server这样的企业级产品,或者MySQL 和 PostgreSQL这样的轻量级产品。直接明了地说就是:
“如何一个项目需求,如果用关系型数据库技术就可以满足,那么你用区块链就是愚蠢的!”
为什么这么说呢?因为像Oracle 或MySQL 这样的数据系统,都有几十年的发展进程,已经部署在全球数以百万计的服务器上的数据库系统,每天运行数以万亿计的查询。这些系统都经过了严格测试和性能优化,每秒处理几千次的交易都毫不费劲。同时,这些系统背后还有数以万计的软件工程师和系统工程师在做技术支撑。实际上,我们常用的软件应用,在数据库技术上都能找到成熟的解决方案。
而区块链技术,即便是代表性的比特币网络,虽然经过8年的运行,仍然在稳定性和可靠性上面临挑战。更不要说其他区块链开发平台了,基本都处在白皮书和Alpha版本阶段。
这里,我不是说区块链的无用之处,而是因为整个区块链的技术发展仍然处在初级探索的阶段。如果我们采用区块链的技术路线,那么在IT规划阶段,我们就应该明白区块链运行需要一系列的约束条件。如果不满足这些条件,还是应该回到数据库的路线来,也许这能让你更准确地定义项目,或者节省更多的时间和成本。
下面我将介绍,使用区块链需要的8个基本条件:
基于数据库
如果你想开发区块链项目,那么首先它应该是个数据库项目。从技术上,区块链可以看做是一种“共享型数据库”。
关系型数据库是用多个表来存储结构化的数据,还有现在比较时尚的NoSQL是利用文件系统来存储数据。(在理论的层面上,NoSQL数据库都是关系型数据库的一个子集而已)
区块链中的数据,以经常讨论的银行账单为例,也可以表示为数据库中的一张表,其中每一行对应一个银行账户信息,每行数据又包含三个列,分别代表:
账户的标示,如唯一性的银行账号;
资产类型,如“人民币”或“美元”等;
所拥有的资产数量。
数据库中对数据的操作,可以通过简单的SQL命令执行,对于复杂的交易类型的操作,通常是通过“存储过程”这个功能实现的。存储过程就是多个SQL命令组合在一起,它们要么全部成功执行、要么全部失败。例如,一个人向另一个人发起了支付交易,对应就是数据库中减少某一行的资产数量,同时增加另一行的资产数量。
需要多个“写操作者”
对于数据的操作类型,可以分为“读操作”(对应数据库中的查询命令)和“写操作”(对应数据库中的增加、修改、删除操作),拥有写操作权限就表示对数据有了完全的控制能力。
区块链可以认为是具有多个写操作者的共享型数据库。也就是说,可以有多个用户发起交易命令,对区块链中的数据进行修改。你知道这些写操作者是谁吗?在区块链的网络中,这些写操作者通常都是“区块链节点”的运行者,他们每个人都拥有一份区块链数据的备份,并且通过P2P的方式传递交易命令。
当然,也有很多用户可以发起交易,但是他们并没有运行节点,他们通过其他节点,间接地对区块链数据进行修改。例如,一个由多个银行共同维护的区块链支付系统,但在移动设备上拥有数百万终端用户,他们只与自己的银行系统通信。
存在信任缺失的情况
如果多个用户同时需要对区块链数据进行修改,那么一定存在某种程度的不信任关系。区块链就是一种支持多个相互不信任的写操作者的数据库技术。
你也许会认为,不信任关系只存在于分散的组织之间,比如在一个跨国的贸易市场中的多个银行之间的交易等。实际上,不信任关系也存在于组织内部,比如不同副总裁管辖的部门之间。
在数据层面的“不信任”是指,每个用户都不希望其他人对自己的数据就行修改,同时也不会相信其他人对你报告的数据情况(不是自己查询到的数据是不可信的),因为每个人都有不同的利益诉求或者代表了不同的价值主张。
需要去中心化(或者去中介化、或脱媒)
到此,我们讨论到区块链可以应对多个不信任的主体对数据的操作问题。其实这个问题,我们还有一个众所周知的解决方案,就是找一个大家都信赖的中介。也就是说,所有人都信任这个中介,但是每个人相互不需要信任。
这种解决方案在现实中大量应用,比如银行账单系统就是这样。我们每个人对自己的银行账户进行数据查询或修改,其实并不是你直接进行数据库操作的,而是委托了银行后台系统的一个数据库用户来完成的。因为我们都信任银行,银行确保我们交易的有效性和账户的安全性。
区块链可以摆脱对这种中介机构的依赖,也就是所有用户可以直接发起交易,完成对数据的操作。所有这些交易由区块链节点进行授权认证和有效性认证。
有个问题会经常困扰我们?找个可靠的中介有什么不好?为什么非要搞去中心化?一个很好的理由就是,基于区块链的去中心化的结构,在降低成本、提高交易速度方面更具优势,同时有自动对账的特点,况且在很多系统中,选择或确定一个可信的中介方也是一件头疼的事情。
交易之间的交互
前面提到一个区块链系统涉及的多个操作者、不需要信任、去中介化等,但是这还不是部署区块链系统真正的理由。如果你的需求中,需要处理多个交易之间的交互关系,那么区块链是个很好的选择。
什么是多个交易之间的交互?简单说就是,不同操作者发起的交易之间存在互相依赖的关系。例如,A向B发起一个交易,B又向C发起一个交易。这种情况B的交易就依赖于A的交易,如果不验证A交易的合法性,也就无法验证B交易的合法性。
再进一步说,区块链还有一个特性是,交易可以由多个用户共同发起(三角债或多方债务)清算,任何一方都不需要承担风险,这也是为什么银行间结算可以安全地在区块链上运行,且不需要一个中介结构的参与。
还有一个例子是在身份识别系统中,一个客户的身份信息的不同方面可以被不同的主体进行独立的验证,比如公安部门验证户籍信息、银行部门验证金融信息、医院验证医疗信息等。虽然这些验证都是相互独立的,区块链提供了一个机制让这些信息可以统一起来。
制定交易规则的需要
这不是采用区块链技术的一个条件,而是使用区块链面临的一个必然结果。当多个相互不信任的主体,发起不同的交易时,那么区块链中需要有某种内置的交易规则进行约束。
这种区块链中的交易约束规则,跟数据库中的约束规则不同。数据库的约束主要是检查特定时间点的数据库状态;区块链的交易约束规则是要验证交易的合法性。每一个区块链节点都利用这些规则,对每一个交易进行验证,验证结果是:那么交易被拒绝,要么就传递给下一个节点,继续进行验证。
在区块链的金融系统中,一个基本的交易规则要防止交易凭空创造资产。规则规定,每次交易之前和之后,资产的总量必须相同。
需要选择交易仲裁者
前面几项要求都是针对数据层面的,那么在交易组织上,区块链的工作角色是交易仲裁者,它是一种权威性的交易结果的日志。如果你的项目中需要选择交易仲裁,那么区块链是一种很好的解决方案。
为什么需要这个日志呢?
第一,当区块链中增加新的节点时,它可以从头下载所有的交易历史记录,不需要从其他不信任的节点下载信息。
第二,有些节点可以由于系统故障或网络故障,错过了某些交易。如果没有这些日志,就会导致一个节点的数据库与其他节点的数据库分离,从而破坏共享数据库的目标。
第三,两个交易可能同时发生,但是只有一个交易被接受。一个典型的例子就是“双重消费”,一个区块链中的资产被同时支付了两个不同的主体,由于区块链是通过P2P方式进行信息传递的,不同的节点可以对交易有不同的看法,因此需要把交易“confirm”到区块中,确保不同节点达到统一的决策。
第四,在Ethereum风格的区块链平台中,交易的顺序起到了至关重要的作用,每一个交易都影响到后续的一个交易。这种情况下,没有区块链,交易根本无法进行。
区块链,从字面上讲就是多个区块组成一个链,每个区块中包含了若干个已经被confirm的交易。那么谁来决定,哪个交易应该进入到哪个区块中呢? 这就需要区块链网络中某些节点承担“仲裁者”的角色,在比特币中就是“矿工”,他们可以创造新的区块,并通过数字签名的方式保证这些区块的合法性。
仲裁者跟中介的一个本质区别是,仲裁者对数据操作的权限要小得多,他们不能虚假交易或者违反规则修改数据内容。在金融系统案例中,仲裁者不能花别人的钱,也不能改变资产的总数量。
在企业级的区块链项目中,可以选择或指定仲裁者,通常有三种方案:
某个组织控制下的多个节点;
不同组织成立一个核心小组来负责维护区块链;
所有节点。
锚定现实资产
我对区块链的认识,更趋向于“共享数据库”,而不是大家经常提到的“共享账单”。作为一种技术,区块链的应用范围远远超出对金融资产所有权的跟踪问题,只不过用区块链做资产账单管理,是最简单、最自然的一个应用,这跟比特币的发展有关。
用区块链做金融资产管理,一个核心的问题是?谁来为区块链中的交易数据做背书?也就是说,我在区块链上有十个单位的资产,谁能给我兑换现实世界的十个单位资产?或者说,如果没人给我兑换,我找谁去起诉或索赔?
当然在不同的项目案例中,答案是不同的。对于货币资产,我们可以想象托管银行收取了传统形式上的货币,然后把储户的账户信息发布到区块链上,那么托管银行就负责区块链上资产的兑换。在贸易融资中,信用证和提单将分别由进口商的银行和船运公司支持。我们还可以想象,未来某一天,公司可以直接在区块链上发行债券,成为一种新的融资工具,当然公司要为区块链上数据进行背书。
总结
就像我开始提到的那样,如果一个项目不符合上述8个条件中的每一个,那就不应该选择区块链技术,你应该考虑:
常规的文件存储;
中心化的关系型数据库;
主-从数据库复制技术;
基于用户订阅机制的多数据库系统。
如果你的项目需求满足前5个条件,你还要考虑如何设定应用中的交易规则,你需要对你选择的仲裁者充满信心。最后,让你开发的区块链系统需要锚定一种或多种金融产品时,你需要找到能为这些金融产品背书的机构。
新闻热点
疑难解答