写点什么

区块链与 CAP 原理

  • 2017-04-13
  • 本文字数:1078 字

    阅读完需:约 4 分钟

微软首席架构师 Yaron Goland 最近发表了一篇文章,讲述了一个区块链客户端如何可以被实现为 AP 的或 CP 的,这取决于它的实现方式。具体是要可以配置在一个事务结束之后必须有多少个区块收到这个事务,才认为它可以被接受了。在事务之后接收到它的区块越多,它就越可能获得系统范围内的共识,即一致性。

一个区块链就是一套点对点的分布式数据库,没有中心节点可以决定数据正确与否。Goland 讲述到在诸如比特币之类的数字货币等场景下,这个问题尤其会造成巨大的困扰。可能用户以为他已经用真实的货币换到了比特币,可是等了一会他去查看自己的钱包时,却发现比特币不翼而飞了。

可是区块链只是一系列的不可变的数据块,而且非常可能每个节点都各自构建起一套不同的事务历史链。这样的背离叫做分枝,也是 Goland 的例子中一致性问题的根源所在。他解释了区块链是如何用一致性算法解决这个问题的,最终会有绝大多数达成一致,抛弃掉某些分枝。

“这是最终一致性的一个非常经典的例子。两个相互冲突的值被记录下来,系统在内部各节点之间进行通信,最终使用一种冲突解决协议来选出优胜者。”

Goland 指出,选择是否等待区块链最终变成一致的,这决定了客户端是 AP 的还是 CP 的。要成为 AP 的,一旦事个事务被加入到区块链中,客户端就要马上接受它。这样,就没有对其它节点的依赖,并且可以使数据可用,但这里有个风险,就是别的节点有可能会拒绝这个事务,因而这样做牺牲了一致性。如果想要成为 CP 的,客户端就应该在区块链针对某个事务达成了一致决议之后,才接受它。这样做的负面影响在于,数据的确一致了,但在有网络分区问题存在时却可能会阻碍一致性的达成,从而使数据不可用。

关于如何等待一个事务达成系统内一致性的问题,Goland做了一番详细的解释,总结起来就是:“直到至少有X 个区块同意之后,才能认为某件事发生了”。这就意味着一个事务发生之后,客户端必须等待,直到再有X 个区块也收到了,才能接受它。

Yanos 还强调,让客户端在这个方面成为可配置的,这样做并不违反 CAP 原理。因为这样的配置方法是在可用性和一致性之间做出的权衡——是不可能同时拥有这两种特性的:

“所以我们上面解释的并不是在说比特币如何能既是 AP 的又是 CP 的。我们上面只是在讲述如何通过完全不同的 CAP 权衡来构建两种完全不同的系统,方法就是除了客户端之外,让比特币的所有部分都保持相同。”

总之,Goland 证明了尽管区块链是一种点对点的模型,强一致性的需求仍然是可以被满足的。这对于比特币之类的数字货币来说尤其重要,因为这种权衡意味着用户可以信任事务的结果。

阅读英文原文 The Blockchain and the CAP Theorem

2017-04-13 19:007413
用户头像

发布了 152 篇内容, 共 74.3 次阅读, 收获喜欢 64 次。

关注

评论

发布
暂无评论
发现更多内容

深入Redis数据结构和底层原理

闫同学

redis 缓存 11月月更

聚焦银行APP用户体验,易观千帆GX指数即将独家首发

易观分析

易观

运维进阶训练营 -W03H

b1a2e1u1u

运维

Vue基础学习(四)

Studying_swz

Vue 11月月更

opensd开源啦 !这套自动化部署OpenStack工具你值得拥有

openEuler

开源 操作系统 openEuler OpenStack

一款超好用的Json编辑工具

Jackpop

Zebec Chain有望成为公链赛道新兴生力军,地平线计划持续进击

小哈区块

汽车产业“芯事”何解?

易观分析

汽车芯片

【LeetCode】分割数组Java题解

Albert

算法 LeetCode 11月月更

Java Web(五)Web

浅辄

tomcat javaWeb 11月月更

涨姿势了,这 4 个场景可用 CSS 完全取代 JS ~

掘金安东尼

前端 11月月更

Vivado安装和使用

芯动大师

Verilog FPGA系统 vivado 11月月更

算法题学习---链表中环的入口结点

桑榆

算法题 11月月更

【愚公系列】2022年11月 微信小程序-app.json配置属性之networkTimeout

愚公搬代码

11月月更

探知数字化研发1-前言篇

薛飞

数字化 软件研发

HTML零基础入门教程(一)

异星球的小怪同志

前端 HTML5, CSS3 DW 零基础 11月月更

1.6k Star!可以优雅的使用Git了。。。

Jackpop

计算机网络:随机访问介质访问控制之令牌传递协议

timerring

令牌桶 11月月更

SAP UI5 数据绑定中的工厂函数

汪子熙

SAP Fiori SAP UI5 ui5 11月月更

麒麟信安携手 openEuler 支撑国家电网首批数字换流站试点项目安全高效运行

openEuler

CSS的学习笔记(五)

lxmoe

CSS 前端 学习笔记 11月月更

Go-MySQL-Driver,让Go语言拥抱MySQL

闫同学

Go MySQL 11月月更

Java实现List中集合的元素进行排序

共饮一杯无

Java List 11月月更

Python进阶(二十五)Python读写文件

No Silver Bullet

Python 文件读写 11月月更

2022-11-11:设计一个最大栈数据结构,既支持栈操作,又支持查找栈中最大元素。 实现 MaxStack 类: MaxStack() 初始化栈对象 void push(int x) 将元素 x 压

福大大架构师每日一题

Java 算法 福大大

Vue基础学习(五)

Studying_swz

Vue 11月月更

定了,2022双11 技术进化开启新未来

阿里技术

双11

Zebec Chain有望成为公链赛道新兴生力军,地平线计划持续进击

西柚子

初探Apollo远程服务配置中心

闫同学

阿波罗 11月月更 apllo 远程配置中心

类继承

Maybe_fl

部署和体验Helm(2.16.1版本)

程序员欣宸

Kubernetes Helm 11月月更

区块链与CAP原理_语言 & 开发_Andrew Morgan_InfoQ精选文章