区块链竟然还有孙子兵法?拜占庭将军问题究竟是什么?

如果你平时经常阅读区块链行业资讯文和白皮书,相信你对“拜占庭将军问题”这个名词并不陌生。“拜占庭将军问题”是由莱斯利·兰伯特提出的点对点通信的基本问题。那么在区块链中,这个问题又是怎样解决的呢?

拜占庭将军问题是什么

拜占庭将军问题是一个共识问题: 核心描述是军中可能有叛徒,却要保证进攻一致,由此引申到计算领域,发展成了一种容错理论。随着比特币的出现和兴起,这个著名问题又重入大众视野。

在区块链中文词典中,对这一问题是这样描述的:拜占庭将军问题是指“在存在消息丢失的不可靠信道上,试图通过消息传递的方式达到一致性是不可能的”。因此,在系统中存在除了消息延迟或不可送达的故障以外的错误,包括消息被篡改、节点不按照协议进行处理等问题,将会潜在地会对系统造成针对性的破坏。

拜占庭将军问题场景

关于拜占庭将军问题,一个简易的非正式描述如下:

拜占庭帝国想要进攻一个强大的敌人,为此派出了10支军队去包围这个敌人。这个敌人虽不比拜占庭帝国,但也足以抵御5支常规拜占庭军队的同时袭击。基于一些原因,这10支军队不能集合在一起单点突破,必须在分开的包围状态下同时攻击。他们任一支军队单独进攻都毫无胜算,除非有至少6支军队同时袭击才能攻下敌国。他们分散在敌国的四周,依靠通信兵相互通信来协商进攻意向及进攻时间。

困扰这些将军的问题是,他们不确定他们中是否有叛徒,叛徒可能擅自变更进攻意向或者进攻时间。在这种状态下,拜占庭将军们能否找到一种分布式的协议来让他们能够远程协商,从而赢取战斗?这就是著名的拜占庭将军问题。

应该明确的是,拜占庭将军问题中并不去考虑通信兵是否会被截获或无法传达信息等问题,即消息传递的信道绝无问。Lamport已经证明了在消息可能丢失的不可靠信道上试图通过消息传递的方式达到一致性是不可能的。

所以,在研究拜占庭将军问题的时候,我们已经假定了信道是没有问题的,并在这个前提下,去做一致性和容错性相关研究。

比特币的解决之道

拜占庭将军问题的核心就是如何在可能存在不可靠节点和不可靠通信的情况下交换信息,达成共识。而且根据科学家们对这个问题的研究,假如叛徒的数量大于等于1/3,那么拜占庭将军问题将不可解。

这个问题在1982年被提出,但直到2008年中本聪(Satoshi Nakamoto)提出比特币,才得到一定程度的解决。

我们可以看到,拜占庭将军问题有本质性的问题有两个:“一致性”和“正确性”问题。而它之所以难解,其中有两个重要的原因:

信息不加密,容易被破解,冒充和伪造;

节点恶意行为影响共识的成本很低;

比特币网络可以将节点发送的信息进行加密,即使用非对称加密技术保护节点发出的信息。这种技术有三个特点:

消息传送的私密性

能够确认身份

签名不可伪造、篡改

由于区块链网络是去中心化的,信息在每个节点上是共享的,因此,降低了由于信息不透明导致的向不同节点传递不同信息的可能性。另外,非对称加密算法的加密和解密使用不同的两个密钥:"公开密钥"(公钥)和"私有密钥"(私钥),这解决了节点信息被篡改,泄露,伪造的问题。

解决场景

如何利用区块链解决这个问题:

我们给每个将军都配一台电脑。大家在电脑上发送信息,这样就不用派通信兵出去给其他将军传令了,先把时间节约下来。然后我们再设定几个规则:

一个时间段内只能发起一个消息。比如10点到10点一刻,只能发出一个签名并盖上时间章的进攻消息,别的将军要想发动攻击,必须在10点一刻以后才行。

消息传递出去以后,收到进攻消息的将军必须也要在消息上签名,确认各自的身份,并盖上时间印章,然后把这个信息拷贝下来传递给其他将军。

为防止有将军签假名,信息都加了密。系统中各个将军都有一个公用密码和私人密码,公用密码是公开的。A将消息传递给B时,使用B的公用密码加密,而B则要用他的私人密码才能解密。B签完名后,所有将军都可以通过他的公用密码来验证他签名的真实性。

大家都能从各自的电脑上看到信息的传递进度。

这样做的好处是:

信息里每个将军都要签名验证身份,如果有将军篡改了消息,大家就能看到是哪些将军篡改了消息。

尽管有不一致的消息。但只要一个消息得到了6名或6名以上将军的同意,那么大家就达成了共识。

你可能感兴趣的:(区块链竟然还有孙子兵法?拜占庭将军问题究竟是什么?)