比特币中的拜占庭将军问题
㈠ 比特币机制研究
现今世界的电子支付系统已经十分发达,我们平时的各种消费基本上在支付宝和微信上都可以轻松解决。但是无论是支付宝、微信,其实本质上都依赖于一个中心化的金融系统,即使在大多数情况这个系统运行得很好,但是由于信任模型的存在,还是会存在着仲裁纠纷,有仲裁纠纷就意味着不存在 不可撤销的交易 ,这样对于 不可撤销的服务 来说,一定比例的欺诈是不可避免的。在比特币出来之前,不存在一个 不引入中心化的可信任方 就能解决在通信通道上支付的方案。
比特币的强大之处就在于:它是一个基于密码学原理而不是依赖于中心化机构的电子支付系统,它能够允许任何有交易意愿的双方能直接交易而不需要一个可信任的第三方。交易在数学计算上的不可撤销将保护 提供不可撤销服务 的商家不被欺诈,而用来保护买家的 程序化合约机制 也比较容易实现。
假设网络中有A, B ,C三个人。
A付给B 1比特币 ,B付给C 2比特币 ,C付给A 3比特币 。
如下图所示:
为了刺激比特币系统中的用户进行记账,记账是有奖励的。奖励来源主要有两方面:
比特币中每一笔交易都会有手续费,手续费会给记账者
记账会有打包区块的奖励,中本聪在08年设计的方案是: 每10分钟打一个包,每打一个包奖励50个比特币,每4年单次打包的奖励数减半,即4年后每打一个包奖励25个比特币,再过四年后就奖励12.5个比特币... 这样我们其实可以算出比特币的总量:
要说明打包的记录以谁为准的问题,我们需要引入一个知名的 拜占庭将军问题 (Byzantine failures)。拜占庭将军问题是由莱斯利·兰伯特提出的点对点通信中的基本问题。含义是在存在消息丢失的不可靠信道上试图通过消息传递的方式达到一致性是不可能的。
假设有9个互相远离的将军包围了拜占庭帝国,除非有5个及以上的将军一起攻打,拜占庭帝国才能被打下来。而这9个将军之间是互不信任的,他们并不知道这其中是否有叛徒,那么如何通过远距离协商来让他们赢取战斗呢?
口头协议有3个默认规则:
1.每个信息都能够被准确接收
2.接收者知道是谁发送给他的
3.谁没有发送消息大家都知道
4.接受者不知道转发信息的转发者是谁
将军们遵循口头规则的话,那就是下面的场景:将军1对其他8个将军发送了信息,然后将军2~9将消息进行转达(广播),每个将军都是消息的接受者和转发者,这样一轮下来,总共就会有9×8=72次发送。这样将军就可以根据自己手中的信息,选择多数人的投票结果行动即可,这个时候即便有间谍,因为少数服从多数的原则,只要大部分将军同意攻打拜占庭,自己就去行动。
这个方案有很多缺点:
1.首先是发送量大,9个将军之间要发送72次,随着节点数的增加,工作量呈现几何增长。
2.再者是无法找出谁是叛徒,因为是口头协议,接受者不知道转发信息的转发者是谁,每个将军手里的数据仅仅只是一个数量的对比:
这里我们假设有3个叛徒,在一种最极端的情况下即叛徒转发信息时总是篡改为“不进攻”,那么我们最坏的结果就如上图所示。将军1根据手里的信息可以推出要进攻的结论,却无法获知将军里面谁是叛徒。
这样我们就有了方案二:书面协议。
书面协议即将军在接受到信息后可以进行签字,并且大家都能够识别出这个签字是否是本人,换种说法就是如果有人篡改签字大家可以知道。书面协议相对比口头协议就是增加了一个认证机制,所有的消息都有记录。一旦发现有人所给出的信息不一致,就是追查间谍。
有了书面协议,那么将军1手里的信息就是这样的:
可以很明显得看出,在最坏的一种情况——叛徒总是转发“不进攻”的消息之下,将军7、8、9是团队里的叛徒。
这个方案解决了口头协议里历史信息不可追溯的问题,但是在发送量方面并没有做到任何改进。
在我们的示例中,比特币系统里的每个用户发起了一笔交易,都会通过自己的私钥进行签名,用数学公式表示就是:
所以之前的区块就变成了这样:
这样每一笔交易都由交易发起者通过私钥进行数字签名,由于私钥是不公开的,所以交易信息也就无法被伪造了。
如书面协议末尾所说的那样,书面协议未能解决信息交流过多的问题。当比特币系统中存在上千万节点的时候,如果要互相广播验证,请求响应的次数那将是一个非常庞大的数字,显然势必会造成网络拥堵、节点处理变慢。为了解决这个问题,中本聪干脆让整个10分钟出一个区块,这个区块由谁来打包发出呢?这里就采用了工作量证明机制(PoW)。工作量证明,说白了就是解一个数学题,谁先解出来数学题,谁就能有打包区块的权力。换在拜占庭将军的例子中就是,谁先做出数学题,谁就成为将军们里面的总司令,其他将军听从他发号的命令。
首先,矿工会将区块头所占用的128字节的字符串进行两次sha256求值,即:
这样求得一个值Hash,将其与目标值相比对,如果符合条件,则视为工作量证明成功。
工作量证明成功的条件写在了区块链头部的 难度数 字段,它要求了最后进行两次sha256运算的Hash值必须小于定下的目标值;如果不是的话,那就改变区块头的 随机数 (nonce),通过一次次地重复计算检验,直到符合条件为止。
此外, 比特币有自己的一套难度控制系统,使得比特币系统要在全网不同的算力条件下,都保持10分钟生成一个区块的速率。这也就意味着:难度值必须根据全网算力的变化进行调整。难度调整的策略是由最新2016个区块的花费时长与期望时长(期望时长为20160分钟即两周,是按每10分钟一个区块的产生速率计算出的总时长)比较得出的,根据实际时长与期望时长的比值,进行相应调整(或变难或变易)。也就是说,如果区块产生的速率比10分钟快则增加难度,比10分钟慢则降低难度。
PoW其实在比特币中是做了以下的三件事情。
这样可以防止一台高性能机器同时跑上万个节点,因为每完成一个工作都要有足够的算力。
有经济奖励就会加速整个系统的去中心化,也鼓励大家不要去作恶,要积极地按照协议本来的执行方式去执行。(所以说,无币区块链其实是不可行的,无币区块链一定导致中心化。)
也就是说,每个节点都不能以自身硬件条件去控制出快速度。现在的比特币上平均10分钟出一个块,性能再好的机器也无法打破这个规则,这就能够保证 区块链是可以收敛到共同的主链上的 ,也就是我们所说的共识。
综上,共识只是PoW三个作用中的一点,事实上PoW设计的作用有点至少有这么三种。
默克尔树的概念其实很简单,如图所示
这样,我们区块的结构就大致完整了,这里分成了区块头和区块体两部分。
区块链的每个节点,都保存着区块链从创世到现在的每一区块,即每一笔交易都被保存在节点上,现在已经有几百个GB了。
每当比特币系统中有一笔新的交易生成,就会将新交易广播到所有的节点。每个节点都把新交易收集起来,并生成对应的默克尔根,拼接完区块头后,就开始调整区块头里的随机数值,然后就开始算数学题
将算出的result和网络中的目标值进行比对,如果是结果是小于的话,就全网广播答案。其他矿工收到了这个信息后,就会立马放下手里的运算,开始下一个区块的计算。
举个例子,当前A节点在挖38936个区块,A挖矿节点一旦完成计算,立刻将这个区块发给它的所有相邻节点。这些节点在接收并验证这个新区块后,也会继续传播此区块。当这个新区块在网络中扩散时,每个节点都会将它作为第38936个区块(前一个区块为38935)加到自身节点的区块链副本中。当挖矿节点收到并验证了这个新区块后,它们会放弃之前对构建这个相同高度区块的计算,并立即开始计算区块链中下一个区块的工作。
整个流程就像下一张图所展示的这样:
简单来说,双花问题是一笔钱重复花了两次。具体来讲,双花问题可分为两种情况:
1.同一笔钱被多次使用;
2.一笔钱只被使用过一次,但是通过黑客攻击或造假等方式,将这笔钱复制了一份,再次使用。
在我们生活的数字系统中,由于数据的可复制性,使得系统可能存在同一笔数字资产因不当操作被重复使用的情况,为了解决双花问题,日常生活中是依赖于第三方的信任机构的。这类机构对数据进行中心化管理,并通过实时修改账户余额的方法来防止双重支付的出现。而作为去中心化的点对点价值传输系统,比特币通过UTXO、时间戳等技术的整合来解决双花问题。
UTXO的英文全称是 unspent transaction outputs ,意为 未使用的交易输出 。UTXO是一种有别于传统记账方式的新的记账模型。
银行里传统的记账方式是基于账户的,主要是记录某个用户的账户余额。而UTXO的交易方式,是基于交易本身的,甚至没有账户的概念。在UTXO的记账机制里,除了货币发行外,所有的资金来源都必须来自于前面某一个或几个交易。任何一笔的交易总量必须等于交易输出总量。UTXO的记账机制使得比特币网络中的每一笔转账,都能够追溯到它前面一笔交易。
比特币的挖矿节点获得新区块的挖矿奖励,比如 12.5 个比特币,这时,它的钱包地址得到的就是一个 UTXO,即这个新区块的币基交易(也称创币交易)的输出。币基交易是一个特殊的交易,它没有输入,只有输出。
当甲要把一笔比特币转给乙时,这个过程是把甲的钱包地址中之前的一个 UTXO,用私钥进行签名,发送到乙的地址。这个过程是一个新的交易,而乙得到的是一个新的 UTXO。
这就是为什么有人说在这个世界上根本没有比特币,只有 UTXO,你的地址中的比特币是指没花掉的交易输出。
以Alice向Bob进行转账的过程举例的话:
UTXO 与我们熟悉的账户概念的差别很大。我们日常接触最多的是账户,比如,我在银行开设一个账户,账户里的余额就是我的钱。
但在比特币网络中没有账户的概念,你可以有多个钱包地址,每个钱包地址中都有着多个 UTXO,你的钱是所有这些地址中的 UTXO 加起来的总和。
中本聪发明比特币的目标是创建一个点对点的电子现金,UTXO 的设计正可以看成是借鉴了现金的思路:我们可能在这个口袋里装点现金,在那个柜子角落里放点现金,在这种情况下不存在一个账户,你放在各处的现金加起来就是你所有的钱。
采用 UTXO 设计还有一个技术上的理由,这种特别的数据结构可以让双重花费更容易验证。对比一下:
㈡ 拜占庭将军很忙—《区块链思维》第21块
无论在链圈,还是在币圈混,经常听到一个名词“拜占庭将军问题”。
到底拜占庭是啥,拜占庭将军怎么啦,到处都被提及,这位将军好忙啊!
先说拜占庭这个地方。很久很久以前的欧洲,建立在比中世纪还古老的时期,历史上就是东罗马帝国,跨越了千年的历史期盼。
扯远了,回到正题,什么是拜占庭将军问题。
拜占庭这个地方异常坚固,同时被十个独立邻邦环伺,分别有一位将军,单独攻城必败,只有一半以上的将军同时攻打才能破城。
十位将军为了协调一致,在那个古老的时代,累死传令兵,要么飞鸽传书(那时的欧洲比中国落后,好像没有这个高速通信手段)。十位将军相互通信一次就需要90次传信,每位将军都有各自的攻城计划,要想达成统一就需要往复传递不知道多少次。
我们可以假设一个场景,一个桌子上坐着十位将军,每个人各自说着自己的想法,同时听其他九位的说法,但是信息的传递不是实时的,有快有慢,有早有晚。想明白了吗?也就是说,这十位将军如果想达成一致,理论上有可能,实际上他们的有生之年都实现不了,难怪拜占庭帝国经历了千年也没有被这十位将军攻破。
中本聪这个神人,利用互联网信息传递的及时性特点,引入时间戳可以明确知道“谁先说、谁后说”的特性,创造性地加入挖矿机制(就是用计算机算随机数满足一定难度才算成功)比拼各位将军的智商来决定谁做本次进攻的统帅,使用非对称加密保证信息传输的安全性等等手段融合到比特币中,用实例说明自己破解了这个历史难题“拜占庭将军问题”。从而向世人证明解决60亿人口的互信问题是有去中心化解决方案地。
币圈和链圈的朋友很焦虑的另一个关键问题就是:这个圈子概念太TM多。除了这个“拜占庭将军问题”,还有一个“拜占庭容错”,这是什么鬼?这两个是一样的吗?这两个是故意有一个被写错了吗?还是说我的智商税没交够?其实,你都说对了。
“拜占庭将军问题”假设所有十个将军都是好的,都想攻破拜占庭,只是达成共识很难,比特币提供了好人达成共识的方案。
“拜占庭容错”是说十个将军可以很好地达成共识。但是,如果其中出了坏人,怎么解决?
如果十个将军中出现了坏人(叫叛徒也行),进攻计划是否会永远无法达成共识呢?
“拜占庭容错”告诉大家,是可以达成地,并且,还能找出这些“叛徒”是谁。只是,10个将军中叛徒的数量不能超过3个,超出了就无法“容错”,也找不出这些叛徒是谁。对应的公式就是:3n+1。其中3n+1是将军总数(区块链的账本/矿机总数),n是能够“容错”的“叛徒”(恶意记错账)总数。
对于十个将军来说,最多容忍三个叛徒,多了就彻底没戏啦。为了比特币的容错能力越来越强,就需要更多的节点,这样才能容忍并找出更多的叛徒。懂了吧。
小结一下:拜占庭将军问题是假设都是好人前提下如何达成共识,拜占庭容错就是全网最多能够容忍多少叛徒并且能找出他们。
请交智商税到如下地址:
国税BTC到Kcash:
地税ETH及各种原生Token到 Imtoken:
不交税的,祝你做“韭菜”一切顺利 :D
㈢ 区块链几种共识算法
理解区块链中的共识问题,我们首先从著名的“拜占庭将军问题”开始。这个问题描述了一支分隔开来的军队,需要全体将军一致决定是否发动攻击。然而,军队中可能存在叛徒,他们会误导将军们,导致决策不一致。这个问题在分布式系统中形成了共识问题的核心。
在区块链领域,共识问题尤为重要。中心化的记账系统如支付宝,虽然高效,但也存在单点故障和操作人员篡改数据的风险。区块链通过去中心化记账,利用分布式算法,密码学,经济学原理,以及智能合约等技术,确保了账本的一致性和安全性。
其中,工作量证明(Proof of Work,POW)机制是比特币系统的核心,它要求网络中的节点通过计算复杂的问题来获取记账权。POW机制确保了网络的安全性,但也引发了能源消耗的争议。权益证明(Proof of Stake,POS)机制则基于持有加密货币的权益来分配记账权,降低了对能源的需求,但面临着中心化风险和激励机制复杂性的问题。委任权益证明(Delegated Proof of Stake,DPOS)则通过引入代理人角色,以减少中心化的影响,提高系统的效率和安全性。
在POW机制下,节点通过解决复杂的计算问题来获取记账权,这种机制保证了系统的安全性和去中心化。然而,随着矿机技术的发展,POW机制面临着算力集中化的问题,导致能源消耗巨大。POS机制通过持有加密货币的权益来分配记账权,这减少了对能源的需求,但存在中心化风险和代币经济复杂性的问题。DPOS机制通过引入代理角色,将记账权分配给经过投票选举的代理人,从而在提高效率的同时,减少中心化的影响。
总的来说,区块链的共识机制旨在解决分布式系统中的决策一致性问题,以确保数据的安全性、完整性和不可篡改性。不同的共识算法,如POW、POS、DPOS等,各有优劣,但共同的目标是为区块链应用提供一个公平、安全、高效的共识机制,以支持去中心化的数字资产交易和数据共享。
㈣ 比特币因为什么可以被称为主流币
拜占庭将军问题
在讨论比特币为什么会被称为主流币之前先看一个有趣的问题,这个问题的名字叫做拜占庭将军问题。
这个问题是由莱斯利·兰伯特提出的点对点通信的基本问题。
为什么会被称为拜占庭将军问题呢?有两大历史渊源。
一、拜占庭位于如今土耳其的伊斯坦布尔,是东罗马帝国的首都,由于罗马帝国当时土地辽阔,每个军队都相隔较远,信息传递全靠信差。而在战争时拜占庭的所有将军必须达成是否攻击的共识,这样才能赢得战争。但是因为有叛徒和间谍的存在就会扰乱秩序,使得难以形成正确的共识。拜占庭将军问题就这样形成了。
二、Leslie Lamport(2013 年的图灵讲得主)用来为描述分布式系统一致性问题(Distributed Consensus)在论文中抽象出来一个著名的例子。
Leslie Lamport在20页的文章中举了一个具体的例子来描述什么是拜占庭将军问题,拜占庭排出了10支部队去围攻一个城池,10支部队由10个将军带领,分布在城池的四周靠通信兵传递信息,由于敌人实力强悍,必须要6队或以上的人马同时发起进攻才能赢得战争。如何保证至少6支军队可以同时发起进攻。
从字面上看起来似乎不是一个很难的问题,其实际解决起来却没那么容易,在中本聪提出比特币网络概念之前这个问题一直就没有得到较好的解决。
为什么这么难解决呢?
因为信息传递是分散的,并且其中还可能存在间谍叛徒捣乱。
先不考虑有叛徒和间谍的情况,光10个将军想要统一一个发动进攻的时间都很难,举例:每一个将军都有着自己的进攻想法,想要统一一个进攻时间就要将自己的想法让通信兵传达给剩余的9位将军,并询问是否同意在这个时间发起进攻,又由于路途远近的不同,收到的提议的时间都不同,这样就很容易形成一个混乱的局面。
如果再加上叛徒和间谍就更可怕了,叛徒和间谍可以向不同的将军发出不同的提案,或者同意多个将军的进攻提案。
这样来看这个问题是不是就极其复杂了。
其实拜占庭将军问题,就是要解决分散的人们在没有一个中心化指挥时,如何达成共识的问题。
那中本聪如何成功解决拜占庭将军问题的呢?
POW工作量证明
中本聪提出用工作量证明的方法解决这个问题。
POW工作量证明通过增加信息发送的成本,降低节点发送信息的速率,保证在一个时间只有很少的节点进行信息的传递,并且信息的传递附上签名的办法很好的解决了拜占庭将军问题。
那工作量证明是什么呢?其实际就是一个散列函数,当你输入一个任意值X进入这个函数进行运算,会对应得到H(X)的结果,但当你稍微变动一下X,H(X)就会发生巨大的变化 , 也就是说理论上你无法在得知H(X)的情况下反推出X的结果,想要算出X唯一的办法就是穷举运算,也就是我们常说的一个一个带进去试 。 由于这个运算量很大,而运算的过程就是工作的过程。
哈希函数
前面说到的散列函数实际上就是哈希函数,只是翻译不同哈希是Hash的音译。
其实在比特币网络的整体架构中,哈希函数到处都有体现,整个网络的运行就是围绕中哈希函数展开的。
比特币在记账时,使用哈希函数对记录的数据进行哈希,数据哈希可以带来一下好处,首先信息变短并且原始信息被隐藏,其次有了标识和验证信息的办法。
下面用一个大概流程进行展示。
区块链在记账时先把正常的信息进行Hash,会得到一个Hash值。
1.Hash(序号0、记账时间、交易记录) = 123456ABC
账页的信息和Hash值组合就构成了一个完整的区块。
在记下一页账时,将上一个区块的Hash值和当前的账页信息一同Hash。
2.Hash(上一个Hash值、序号1、记账时间、交易记录) = 654321CBA
这样第二个区块不仅包含自己区块的信息还间接包含了前一个区块的信息。
矿工在挖矿时,实际上就是在计算Hash函数。之后会专门写一篇文章来讲解挖矿的过程。
在确定数字货币所有权方面,其实也是经过两次Hash从私钥得到了地址,这个地址平常我们打币使用的地址。谁拥有私钥谁就可以进行交易,私钥就是你唯一的资产凭证,所以一定要保管好自己的私钥。
为什么比特币可以被称为主流币呢?不是因为它涨幅有多么惊人,市值有多高,而是因为它的出现解决了许多问题,给人们提供了一种全新的点对点电子分布式网络架构。