张蕾
渡鸦区块链专栏作者
随着比特币和区块链概念的热炒,越来越多的投资人、创业者、研发人员和政府机构进入这个领域,但是大家的关注重点是有差别的。关注比特币的人,更关心价格的波动、钱包的安全和跨境的资产转移;关注区块链的人,更关心底层的技术、加密的算法和行业的实际应用。逐渐形成了两个圈子:“币圈”和“链圈”。
两个圈子之间,有一个持续已久的争论:一个区块链,如果没有原始货币,还有意义吗? 本文,我从技术的角度进行解释。
首先,我有一个基本的观点,比特币区块链既是一项经济学的创新,也是一项计算机科学的创新。(这里的创新含义是广义的,包括对现有技术的重新组合也算一种创新)。因此,区块链本身,即使没有原始货币,对计算机科学发展而言都是有价值的,只是跟比特币对金融的价值不一样而已。
坚持“原生币”观点的人认为,如果区块链上没有了币的概念,就无法维持比特币特有的“共识机制”,并通过“工作量证明proof-of-work”来维护去中心化网络的安全性。但是金额科技的一些巨头(区块链流派)对公有链(比特币流派)持有怀疑态度,认为比特币交易速度慢,交易成本高,不适合传统的金融业务需要。
我认为上面两种观点都正确。我要说,区块链对于组织内部的分散数据库的同步是非常有用的。当然,区块链还有其他技术特点,对于不完全信任的机构之间创建特定类型的交易是非常合适的。
下面,为了解释我的观点,我将从比特币的交易模式、数据库的多版本并发控制(MVCC)、多主数据库(multi-master database)复制的冲突问题讲起。我尽量用简单的语言进行解释,但是这是技术问题,难免比较晦涩。
比特币的交易模式
比特币的交易模式很简单也很强大。每一个比特币的交易都有一组输入(inputs)和一组输出(outputs)。每一个输入都“链接”着前一个交易的一个输出。所有的比特币都通过输入进入一个交易,再通过输出分散出去。这样所有的交易形成了“多分叉”的链条,最终这个链条在“coinbase”交易上结束,在这个交易中产生新的比特币。
比特币有一堆额外的规则,网络中的每个节点都要遵守:
1)一个交易中的每一个输入都必须证明,它有权利“链接”前一个交易的一个输出。这个权利是由输出中的内在的编码所限制的。
2)一个交易中,所有输入的比特币数量必须大于所有输出的比特币数量,唯一的例外是在“coinbase”交易中,因为它创造了新的货币单位。
3)每一个输出只能被“链接”一次,也就是只能和后一个交易的一个输入链接。就好比,你的一个币给了A,就不能再给B了。
正是因为最后一个规则,比特币网络必须要形成一种共识,用来决定哪些交易是有效的,哪些交易是无效的。而这正是区块链的作用所在。 重点解释一下:
如果两个交易的输入都试图链接前一个交易的同一个输出,这么这两个交易只有一个最终被接受。区块链作为一个统一的机制来检测和防止网络中的这些冲突。
区块链是一个线性链接的区块(block)组成链条,每一个区块包含了一组交易,这些交易之间互相不会冲突,也不会跟其他区块内的交易发生冲突。从理论上讲,比特币网络可以直接用交易的“多分叉”链条来运行,但是我们把多个交易分组后形成区块(block),是为了获得更高的效率,并且也更加实用。
那么区块链上的加密货币(比特币)是什么目的呢?它的存在主要是为了解决,在每个区块生成的时候,谁有决定权的问题。因为比特币网络是一个去中心化结构,没有所谓的管理员和绝对权威,只能通过其他的方式来进行决策和达成共识。
我们也许可以使用“民主”的模式,也就是让比特币网络中的每个节点参与投票的方式,然后获得大多数同意的获胜。不幸的是,任何网络民主投票都可以证实,因为存在网络伪装(也被称为女巫攻击),代议制的民主无法在网络上实现,一个黑客可以控制成千上万的电脑,并且决定他们如何投票,从而操控投票的结果,我们甚至都感觉不到就已经发生了。
为了解决这个问题,比特币网络通过“挖矿”的过程,故意增加了一个区块生成的难度。要想创建一个区块,你需要先要计算一个毫无意义的数学难题,这就意味着大量计算能力的消耗(因此就需要电力和其他费用的支出)。同时,你还必须要有一定运气,因为全世界还有很多其他的矿工在和你竞争。即使买一台更高性能的计算机,你也不能长期保持领先,因为比特币网络经常地调整问题的难度,保证每10分钟能稳定地产生一个区块。
既然,产生参与比特币网络中,又困难又费钱,谁傻才去做这种苦差事?答案就是比特币的“奖金”:一个成功的矿工产生一个新的区块,就能控制“coinbase”交易,从中获得25个比特币的奖励(每四年降低一半),目前的市场价值人民币135000多元,矿工们支付了电费等必须的费用外,还有一定的利润。(矿工们也能获得一定的交易费用,但是目前比重还很小)。
这样,比特币就利用“工作量证明proof-of-work”形成了一种共识机制,这也是坚持“原生币”观点的人一贯主张,如果区块链上没有了币的概念,就无法激励矿工们的工作,也就无法保护比特币网络的安全,无法防止假冒交易对比特币的攻击,因此,黑客就可能控制比特币网络上的交易数据,使得整个比特币毫无价值。
我对此是赞同的,就好比一个选举投票,没有了计票员和唱票员(他们的作用类似于矿工)的参与,选举结果肯定是没有意义的。
多版本并发控制(MVCC)
下面我们讨论一些不相关的话题,继续进行分析。
数据库是一项成熟的计算机技术,用来存储结构化的数据。数据库中的信息首先根据内容分成组,叫做“数据表”,每个表中又有很多列,叫做“数据项”。举一个例子,我们在银行的账户就是一张表,其中最重要的有两列:账号和金额。假设你的账号金额是2000元,今天你的信用卡要还款1500元,银行会自动从你账号中划走,同时你还想在ATM上提取现金800元。不幸的是,你的账号金额不足,肯定有一项交易要失败。
信用卡还款和ATM取现两笔操作是在不同的系统中进行的,但是它们都需要对你的银行账户进行操作,我们把这个操作过程分为:读取账号金额、判断是否足够执行操作、完成具体操作(划款或取现)、验证操作是否成功、计算余额并写入数据库中。
如果信用卡还款和ATM操作不重叠的话,那么交易逻辑非常简单。第一个操作可以顺利完成,第二个操作因为余额不足而终止。就看真实的操作顺序如何,也许你会收到信用卡中心的催款电话,业务你在ATM屏幕上会看到余额不足的提示。
如果这两个操作碰巧同时发生会出现怎样的结果?在这种情况下,每一个操作都要读取账号金额,判断金额都是足够的,然后各自完成自己的操作。信用卡划款后,重新计算余额是500元,并写入数据库中;ATM取款后,重新计算余额是1200元,并写入数据库。其中一个写入数据库余额会覆盖另一个写入数据库的余额。看你的幸运程度了,你相当于从银行获得了1500或800元的额外好处,如果你发现了这个秘密,你以后肯定会在信用卡还款的那一天去ATM取钱,这样你就发财了。
当然,在真实的银行交易中是不会发生的,因为数据库有一项“并发控制”的技术。并发控制保持我们的数据(尤其是金融)的正常和安全。它有许多形式,基本思路是把多个数据库操作分组后,形成数据库的“存储过程”,这意味着这些数据库操作必须作为一个整体,或者全部成功或者全部失败。当一个存储过程操作数据时,并发控制将对数据库(或其中的一部分)的进行锁定,以防止其他存储过程对信息的操作而造成冲突。
如果我们不需要并行运行存储过程,我们在可以一个存储过程运行时,对整个数据库进行锁定,但是这在实际运营环境中是不现实的。一个好的并发控制方案应该允许多个存储过程并行运行,锁定尽可能少的数据、锁定尽可能短的时间。在上面的例子中,最好的解决方案是,只有你的账号被锁定,其他人的账号不被锁定;只有当账号最终检查结果与金额扣减发生冲突的时刻被锁定,其他时刻不锁定。这样并行的存储过程不会为了锁定-解锁而等待太长的时间,效率才能提高。
一种比较流行的并发控制技术叫做多版本并发控制(MVCC)。每一个存储过程看到的都是在某个特定时间点的数据的快照。快照隔离的属性保证。
在背后,MVCC通过维持多个数据版本而发挥作用,每一个版本都有一个时间戳(timestamp)代表每个版本最后被修改的时间。在MVCC中修改一个数据,将当前版本标记为删除,然后在一个新的版本中执行修改操作,并附带一个更新后的时间戳。从数据存储的视角看,没有数据修改发生。每一个存储过程启动时,都准确地知道最后一个时间戳标识的数据版本。一旦没有存储过程可能使用这些数据版本,旧版本的快照就会从存储空间删除。
我阐述这些关键的目的是说,MVCC有效地防止了写操作之间的冲突。重点解释一下:
如果两个存储过程试图删除同一数据版本,那么这些存储过程中只有一个将最终被接受。MVCC作为一个统一的机制来检测和防止数据库中的这些冲突。
多主数据库复制(Multi-master database replication)
现在我们讨论一下数据库的复制,也就是数据库需要多个备份。很多应用场景需要用到数据库的复制:
1)为了增加系统可靠性。当一个数据库丢失时(数据意外删除或硬盘故障),我们可以立即切换到备份的数据库上;
2)增强系统的吞吐量,特别是当交易量过大,超过了单台服务器的荷载时;
3)降低延迟,针对一切全球性或跨区域的业务,通过在多地部署数据库降低系统的延迟。
如果只涉及到数据库的“读操作”时,数据库的复制是一种理想的解决方案,因为所有复制的数据库都包含相同的数据信息。但是当涉及到数据库的“写操作”时,问题就变得非常棘手,因为我们需要决策,写操作应该在哪里执行以及如何同步到其他数据库中。
最常用的解决思路是使用“主-从”数据库复制模式(master-slave),其中一台数据库(主数据库)被认为是绝对权威的,对数据的任何修改都只能在主数据库上进行,然后通过交易日志的模式,将数据修改同步到其他所有的从数据库上。这使得所有的数据库立即保持同步。
问题是,如果主数据库的修改特别频繁,那么主数据库就成为一个瓶颈,我们希望使用主-从模式解决的可靠性、吞吐量、延迟的问题仍然无法解决。
一个更复杂的解决方案是多主数据库复制模式(multi-master replication),也就是所有的数据库都可以是主数据库,每个数据库都可以执行“写操作”。这种模式下,各个数据之间通过peer-to-peer的方式保持同步。
理论上听起来好像很简单,但是多主数据库模式带来一个新的问题就是冲突可能会出现。如果两个数据库同时对同一个信息进行修改时,如何交换相互的更新信息呢?两个数据库都注意到了一个更新操作的冲突将要发生,它们必须商定一个策略来解决这个冲突。这个东西比较复杂,可以参考MYSQL,SQL Server或Oracle的一些冲突解决策略的案例。
这两个话题(MVCC和multi-master),给我们一个新的启发:
如果我们用多版本并发控制(MVCC),用来防止多主数据库复制(multi-master)发生的冲突,岂不是很好?
嗯,我想这会是非常好的。我相信这正是区块链技术正在做的。
区块链作为一种MVCC
让我们把前面我写的两段话对比一下:
如果两个存储过程试图删除同一数据版本,那么这些存储过程中只有一个将最终被接受。MVCC作为一个统一的机制来检测和防止数据库中的这些冲突。
如果两个交易的输入试图链接同一个输出,那么这些交易中只有一个将被最终接受。区块链作为一个统一的机制来检测和防止网络中的这些冲突。
这两句话基本是一致的,所以我对区块链有个新的定义:(技术上)
区块链提供了一种分布式的多版本并发控制机制。
当然我并不是说,区块链是解决分布式数据库同步问题的一个伟大的通用技术,因为还有其他技术,如Paxos、Raft等都运行的不错。但是我相信,区块链作为一个应用系统有很多闪光的特点:
1)我们接受交易之间的一个短暂的延迟,也就是交易的确认需要一定的时间(这个应该是秒级别的,而不是比特币的10分钟);
2)如果系统正常运行,冲突的交易是永远不会发生的;
3)每一个交易的容量有限(否则区块链交易就会有一堆数量庞大的输入了);
4)每个数据库的结构都不大(防止我们区块链不断膨胀)。
上面这几条都是金融(财务)系统普遍采用的标准。金融交易和最终结算通常都有延迟(最长需要3天)。在防止冲突方面,它有合同和规定,以检测欺诈行为,否则其后果可能是严重的。在每一笔交易中涉及的数据量是相当小的,考虑到上面的银行帐户例子。
到目前为止,我分析演示的是区块链作为分布式数据库的另外一种同步的机制。我们再看看区块链其他的特点。
区块链超越MVCC
比特币的交易模式不仅仅是一个输入对应一个输出,即使是最简单的比特币交易都有两个额外的目的。
首先,一个交易是否有效,判断规则中包含了我们的数据库的一些应用逻辑。在一个交易的输入比特币的总数量必须大于输出的总数量。翻译成数据库应用的逻辑,就是数据库事务(与coinbases除外)不允许增加数据库中的比特币总量。这种约束超出常规数据库存储过程的功能,因为它不能解决这个问题。
第二,回顾一下,每一个比特币交易输出中包含编码,它决定哪一个输入可以连接到这个输出上。对于常规的比特币的一个输出,这个编码是基于公钥密码,也就是一个公共地址被嵌入到输出的“脚本”内,它只能使用对应于公共地址的私钥来使用。如果我们认为这是一个数据库某一行数据,我们所拥有的是一个基于公共密钥加密的权限的数据库。此外,每一笔交易提出了一个公开的审计证明了它的创造者有权删除/修改。我相信这是一个真正的新颖的数据库技术。
这两个功能对金融财务系统是非常有用的。
币哪里去了?
比特币是一个美丽的P2P模式的金融系统,但是我们前面讲到了区块链的特点其实并没有依赖“币”而产生。如果我们将交易中的数据信息用来代表一个(或多个)资产,而不是区块链的原生货币,那么区块链就可以完全摆脱“货币”的名义,实现对任何资产的金融应用的安全和共识的达成。
但是只有一个小问题,谁来采矿产生这种共识?在比特币的网络中,匿名的矿工必须进行昂贵的计算,以获得区块链的原生货币(比特币)的奖励,我们还有其他选择吗?
我有一个解决方案,即对矿工采取“雇佣制”,通过支付报酬的方式,授权一部分矿工有采矿的权利。只要矿工的数量足够多,分布足够广,就可能维护区块链的共识的形成。同时,我们也会通过其他规则设计,防止挖矿被少数人控制,并且通过法律合同的约束,防止他们形成团伙。这在比特币网络中是不可能的,但是在高度管制的金融系统是,确实非常现实的。
总结
我希望我说清楚了自己的观点,一个区块链即使没有发行原生货币,也是很有价值的,特别是在真实的金融应用系统中价值将会越来越明显,甚至超越比特币的地位,对于研究企业级区块链的项目实际应该有借鉴意义。
虽然它们有不同的权限模型和经济激励,但是它们在“共享账单”的技术上是一致的,都提供了在一个分布式数据库上,通过区块形成的链的结构形成共识。
作者简介:张蕾
比特币和区块链研究者
“积分币”创始人
目前从事区块链的项目咨询、项目研发,并开展网络视频教学,网络视频课程《比特币和数字加密货币技术》正在招生。
加入渡鸦
(全职记者∕实习生):[email protected]
转载、投稿、入群 请联系微信号:lofeer88