作者:陈天
前言:为纪念中本聪发表比特币白皮书10周年,ArcBlock研发副总裁陈天特撰此文阐述他对区块链与数据库的关系的独特观察和思考。
10月31日,陈天发朋友圈感慨自己投身区块链创业“半年过去了,无数打了鸡血的三点钟群已经悄无声息,一票在泡沫里仰泳的投机者消失了,而我,像钻进了兔子洞的爱丽丝,徜徉在这个奇妙的世界里……”
如果说牛顿的经典物理是爱因斯坦相对论在低速环境下的一种体现的话,我们所熟知的数据库技术,可以认为是区块链技术在弱分布式环境下的一个特例。
「弱分布式」环境是我胡扯的一个词,你可以将其理解为节点数量极其有限,运行环境高度可控的一种分布式环境。一个数据库集群运行在同一数据中心,或者不同数据中心,只要是同一个管理者,那么这就是可控的运行环境。在可控的运行环境下,默认不存在「作恶」的节点,也就无所谓BFT,因此我们不需要复杂的共识算法,一般两阶段提交或者paxos/raft就能收敛共识,满足需要。所以,数据库的共识算法是区块链共识算法的特例。
在区块链的世界里,交易和交易产生的状态是严格分离的。若干交易由被共识算法选择出来的矿工验证并打包成为区块并广播出去,然后网络里其他参与者验证区块中每个交易的合法性,并写入自己的statedb。在bitcoin里,statedb是UTXO,在ethereum里,则是其worldstate。
数据库的世界里仿佛没有类似于区块链的交易记录,但仔细想想,它的交易历史其实就是WAL。从外界接收到的请求,数据库会先将其写入WAL,确保其进入持久化存储,才会往它自己的“states”里面写入。从这个角度,我们可以认为WAL里的每一个记录,就对应区块链里的一个交易,它是区块链交易的特例。
Solana生态房地产衍生品协议Parcl正式上线:金色财经报道,Solana生态房地产衍生品协议Parcl Protocol今日宣布已正式上线。Parcl是一家通过Solana区块链将房地产投资数字化的初创公司,通过合成资产Parcls提供投资敞口,使每个人都有机会参与房地产市场,而无需承担与拥有或交易硬资产相关的负担。
去年5月,Parcl完成750万美元战略融资,Archetype、Dragonfly、NotBoring、SolanaVentures等参投。[2023/1/10 11:03:42]
如果你再认真思考一下,WAL,blockchain,以及MartinFowler很早就提倡的CQRS在这个层面上其实都是「一中各表」:大家都强调「事件」和「状态」的分离,通过前一个状态+当前事件,可以推演出当前状态。这样,我们只要有一个初始的「状态」,然后记录系统发生过的所有的「事件」,就可以复原任意一个时刻的「状态」。
我们回到交易和容纳交易的「区块」。你会发现,「区块」是一个怪怪的存在,为什么数据库不需要「区块」这样的概念作为容器装载「交易」,而区块链却需要呢?我们知道,在区块链的世界里,不确定性和确定性仿佛一对孪生兄弟,确定的是规则,不确定的是规则的执行者。所谓矿工轮流做,下回到我家,那怎么定义一个「回合」呢?为了回答这个问题,我们需要某种机制明确一个回合矿工地位的起止——这个起止就是一个「区块」。不仅如此,在一个物理时钟并不一致的分布式环境下,「区块」还承载着全局时钟的功能,滴答滴答将整个网络往前推进。「区块」的概念是如此重要,以至于它当仁不让地成为共识算法的基础——大家先得对下一个要出的区块序号达成共识,否则这个游戏无法进行。反观数据库系统,在一个数据库集群中,master是固定的,master令旗一挥,slave就迅速跟进,指哪打哪,不存在轮流坐庄,也就无所谓回合,所以其实每个「交易」就是一个「区块」。所以在数据库的世界里,逻辑上每个交易,或者说WAL的每个记录,自成一个隐性的「区块」。
The Block CEO因未披露从Alameda Research获得4300万美元贷款引咎辞职:金色财经报道,加密媒体和研究平台 The Block 发布公告称,The Block首席执行官 Michael McCaffrey 因未能披露曾从 Alameda Research 获得贷款而辞职,The Block 首席营收官 Bobby Moran 将接任首席执行官一职,立即生效,McCaffrey 还将辞去公司董事会的职务。McCaffrey 仍是 The Block 的大股东。
据报道,McCaffrey 总共获得了三笔贷款,共4300 万美元贷款,第一笔金额为 1200 万美元,用于在 2021 年收购加密新闻、数据和研究提供商The Block,McCaffrey 以首席执行官的身份接管了日常运营。1 月份的第二笔 1500 万美元贷款用于资助日常运营,而今年早些时候的另一笔 1600 万美元用于在巴哈马购置个人房产。[2022/12/10 21:35:39]
我们从另一个角度来探讨这个结论。「区块」的另一个重要的作用是crashrecovery。在一个区块链网路中,某个节点无论是断网还是崩溃,其状态和网络中达成共识的状态必不一致,那么,如何从这种不一致的状态恢复同步的状态呢?答案是「区块」,因为它是唯一明确的共识的产物。节点总是能够找到最近的commit的和网络中一致的区块高度,然后从这个高度往后一个区块一个区块同步,依次运行区块中包含的所有交易并更新本地的状态,最终可以保证和网络中的状态达成一致。在这里,「区块」就是检测和达成状态一致的最小单元。而在数据库系统中,在崩溃发生后,系统会从其他节点同步最新的WAL,并从上次commit的WAL的位置往后一个记录一个记录执行命令,直到所有记录运行完毕,这时数据库状态恢复到集群的当前状态。在这里,WAL的记录是检测和达成一致的最小单元,所以我们称其为隐性的「区块」,没毛病。
Vitalik Buterin通过Archer Swap抛售超4000万美元meme代币:5月14日消息,昨日以太坊创始人VitalikButerin大量抛售meme代币中,超4000万美元通过ArcherSwap抛售。起初,V神通过Uniswap将meme代币换成ETH,然而由于抢跑导致交易失败耗费很多ETH,后V神转用ArcherSwap进行交易。
注:ArcherSwap可倚靠Uniswap和Sushiswap流动性,而不公开向mempool广播交易,由匿名团队开发的以太坊矿工可提取价值(MEV)套利产品Archer于三周前推出。[2021/5/14 22:02:16]
在区块链的世界里,一笔交易需要被验证。这里的验证有两重含义:1)身份验证——交易是由其发起人正确签名的;2)完整性验证——交易对状态的变更是合法的。身份验证好理解,你用自己钱包的私钥签名给我转1个ABT的交易,系统会验证你的确是你;完整性验证则是指在statesdb里,你的账号下的确有超过1个ABT的token,才能发起这个交易。在数据库的世界里,身份验证直接赤果果用诸如RBAC的访问控制系统解决了,而完整性验证和区块链类似。
接下来我们看看确定性。所谓确定性,就是在同一个状态Sn-1下,大家拿着同样一笔交易,不依赖任何第三方信息独立执行,执行的结果完全一致。这一点仅就纯粹的从交易到statesdb的处理来说,区块链和数据库是完全一致的,大家都能保证确定性。然而,如果某个区块链要支持交易中携带额外信息,这些信息触发某些链上部署好的代码的执行,那么,我们就得注意代码本身需要具备确定性。所谓确定性,无非是:
现场 | Marco Streng:三分之二算力集中于大型矿池 这是行业最大挑战:金色财经现场报道,2019年10月12日由MinerUpdate在成都举行的“2019全球矿业领袖峰会”上,Genesis mining创始人Marco Streng表示,三分之二的算力集中于大型矿池,算力分布并不完全去中心化,这是行业所面对的最大的一个挑战。非常开心地看到中国矿工也想要将他们的矿池移到中国之外的地区,这样会让比特币网络更加国际化,数据更加安全,同时我认为这也是一个趋势,因为实际上有非常多的地区的电费是非常低廉的,在中国之外也有很多适宜的地区可以来做发展的,不止是四川。[2019/10/12]
代码中不要使用不确定的随机数生成器——比如使用计算机的时钟作为种子生成随机数,这就是不确定的。因为交易在被执行的那一刻,我们无法保证所有参与者的时钟是精确同步的。
代码避免使用多线程。多线程引发的racecondition具有不确定性。
不要使用系统时钟。不解释。
不要使用未初始化的内存。鬼知道上面是陈冠希还是诸子百家。
不要使用浮点数——这个很奇葩,因为不同的CPUarch,编译器,甚至不同CPU型号间,由于支持的浮点数指令集不同,会导致结果不同。
不要使用编程语言的可能有随机行为的数据结构。比如遍历一个map
基本上避免了这些,代码就具备了确定性,可以在区块链上执行。那么,为什么数据库中的存储过程可以允许没有确定性的代码的执行?比如,一个存储过程里可以使用当前时间插入一条记录?我们如果再回归本源,从「交易」的角度看待问题,可以发现,存储过程类似于“off-chain”执行的代码,它虽然植根于数据库之中,但其实是「交易」的源头,存储过程的执行产生真正的交易,也就是WAL记录,然后同步给其它节点。所以存储过程可以non-deterministic,因为其产生的WAL记录已经是deterministic的——添加一条带当前时间的记录这件事情,在master执行时,已经将取「当前时间」这个动作完成并得到一个确定的值,携带于WAL之中。这跟区块链的smartcontract的概念有本质的区别,这也是为什么存储过程可以不必具备确定性,而“on-chain”执行的smartcontract需要确定性。从这个角度来讲,数据库系统也是一个弱化的区块链系统。
动态 | BSV 成功进行计划中的压力测试,BitMEX Research 监测到异常实为压力测试影响:区块链安全公司慢雾表示,注意到 BitMEX Research 昨日发推称,「根据 420 个 BSV 节点,这些节点目前处于不同的链和区块高度:当前为 65%;17% 卡在 210MB 的大数据块上;19% 处在旧的预订的硬分叉链上。此外,自 7 月 24 日的硬分叉后,原链延长了 52 个区块」,后与 BSV 社区成员沟通后获知,这是一次计划中的压力测试。慢雾表示,客观来说,这是一次成功的压测,压测持续了约 2 小时(20:00 ~ 23:00),未造成区块回滚,且不影响正常交易。慢雾团队表示,这次的压测暂无收到合作的各大交易所的异常反馈,相比上一次在 4 月份的 BSV 压测反应来看,这次更加温和,「看得出整个 BSV 生态对这次压测持有正面积极的态度」。[2019/8/4]
既然区块链和数据库存储的对象都是数据,那么,提过了数据的完整性和确定性,接下来就是数据的一致性。区块链显然是最终一致性的典范——网络越大,参与的节点越多,区块的扩散就越慢,任何时刻在不同的节点上读取状态就很大几率出现不一致的情况。然而,只要节点能同步到最新的区块,整个网络的状态是收敛的,最终大家能够得到一个一致的状态数据。其实,按照这个道理,所有使用WAL,CQRS思想的分布式系统,其数据的状态都是最终一致的——这似乎和我们对经典数据库强一致性的印象不匹配。然而,如果我们把视角拉到数据库内部,可以发现,强一致性只不过是最终一致性之上添加了一些条件,是个特例。如果我们假定一个区块链满足下面的条件:
任何节点收到新的区块,必须在交易执行完成,写入statesdb中之后,给矿工节点发送确认
矿工节点在收到所有确认之后广播给网络中所有节点这个区块大家已经commit成功
在一个区块没有收到矿工节点的上述广播之前,客户端发送来的查询进入队列排队
那么在外界看来,它也是强一致性。当然,第三点有些过于苛刻,一般的数据库实现都会采用MVCC,让每个client看到当前状态的一个snapshot,因而存在一个很小的窗口,大家看到的数据是不一致的。如果较真,MVCC不算强一致性,当然没人会这么认为。
通过上面的规则,数据库可以通过牺牲一些性能来打造对外而言的强一致性。但有时候,为了一些崇(wo)高(chuo)的理想,数据库系统也可以打破这些规则来号称更高的性能。mongdb可以在cluster的环境下,写操作不需要节点确认即可返回,于是有了美其名曰的,如薛定谔的猫一般的「弱一致性」。
一个区块链网络理论上可以通过上述规则把自己营造成对外强一致性的感觉,但这实际上没有可操作性。能力越大,责任越大网络越大,延迟越大,所以,实际可操作的强一致性只能发生在节点数量很少,且节点都在同一个datacenter的环境下。从数据一致性的角度来说,数据库也是区块链在特殊场景下的一个特例。
最后说说性能。性能这事,和网络规模成反比。两个主要原因:1)节点越多,达成共识的难度就越大。2)节点越多,「交易」在网络中传播所需的时间就越长。那想要达到宇宙无敌的TPS怎么办?其实不难——既然数据库是一个弱分布式环境下的特例,那么,咱就把区块链往数据库的方向退化就好。PoW说「王侯将相,宁有种乎」,让全网参与铁王座的竞争,PoS就让「一小部分人先富起来」,DPoS再进一步,「让领导先走」,也许不久的将来,有人会则憋出终极大招,全网就一个九五之尊,把数据库里能用的招数,replicaSet,Sharding等等统统用上,再使用兵法中不战而屈人之兵之术:「今治水军八十万众,方与将军会猎于吴」…于是,可以名正言顺地抢下性能的桂冠。
只不过…就像非诚勿扰里车晓问葛优:那事儿,就那么有意思吗?
ArcBlockTechnicalLearningSeries第七期
Tendermint:ConsensusMadeEasy
下周三,11月7日下周三上午8时,由ArcBlock研发副总裁陈天授课,介绍Tendermint及其架构,共识算法如何工作,以及如何复制应用程序数据。
主讲
陈天
ArcBlock研发副总裁
●前旧金山创业公司TubiTV研发副总裁,比图科技(TubiTV中国全资子公司)总经理,创建中国团队,并领导TubiTV研发团队在过去两年半时间帮助业务成长数十倍
●前JuniperNetworksTechLead&Sr.StaffEngineer
●2011-2013曾在北京创立在线旅游创业公司途客圈,获创新工场和金沙江投资,在结束途客圈的创业生涯后,将创业经历撰写成《途客圈创业记》一书,由人邮出版社出版。
●技术爱好者,涉猎网络安全,云计算,分布式系统和区块链。主力语言:elixir,nodejs和python。github:tyrchen。
●公众号「程序人生」(programmer_life)作者,知乎专栏「迷思」作者。自2014年以来,撰写技术文章近四百篇,很多文章被知乎日报推荐。
报名听课,登录官网注册:
https://hack.arcblock.io/learning/
或登陆掘金注册:
https://juejin.im/events/all
或扫描二维码注册:
ArcBlock课堂①|IntrotoGraphQLandAbsinthe
ArcBlock课堂②|IntrotoEthereumSmartContract
ArcBlock课堂③|IntrotoAWSDataPipelineServices
ArcBlock课堂④|IntrotoAWSAthena
ArcBlock课堂⑤|WhatisAWSKinesis
ArcBlock课堂⑥|多步验证那些事
ArcBlock课堂⑦|IntrotoCQRSandCommanded
郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。