比特币机制研究

一、起源

现今世界的电子支付系统已经十分发达,我们平时的各种消费基本上在支付宝和微信上都可以轻松解决。但是无论是支付宝、微信,其实本质上都依赖于一个中心化的金融系统,即使在大多数情况这个系统运行得很好,但是由于信任模型的存在,还是会存在着仲裁纠纷,有仲裁纠纷就意味着不存在不可撤销的交易,这样对于不可撤销的服务来说,一定比例的欺诈是不可避免的。在比特币出来之前,不存在一个不引入中心化的可信任方就能解决在通信通道上支付的方案。
比特币的强大之处就在于:它是一个基于密码学原理而不是依赖于中心化机构的电子支付系统,它能够允许任何有交易意愿的双方能直接交易而不需要一个可信任的第三方。交易在数学计算上的不可撤销将保护提供不可撤销服务的商家不被欺诈,而用来保护买家的程序化合约机制也比较容易实现。

二、交易

假设网络中有A, B ,C三个人。
A付给B 1比特币,B付给C 2比特币,C付给A 3比特币
如下图所示:

交易记录

他们在现实中发生了这样的交易行为,所以在网络上,这样的交易记录会被一个人打包起来(这个过程叫做记账),然后广播给对方。打包起来的样子,就是所谓区块:
区块

一个区块,就长这样子,上面写了三者之间的交易记录。

记账的好处

为了刺激比特币系统中的用户进行记账,记账是有奖励的。奖励来源主要有两方面:

1.手续费

比特币中每一笔交易都会有手续费,手续费会给记账者

2.打包奖励

记账会有打包区块的奖励,中本聪在08年设计的方案是:每10分钟打一个包,每打一个包奖励50个比特币,每4年单次打包的奖励数减半,即4年后每打一个包奖励25个比特币,再过四年后就奖励12.5个比特币...这样我们其实可以算出比特币的总量:

比特币的总量计算

这2100万个比特币,就是通过记账者获得打包奖励扩散出去的。
正因为有这两个奖励机制,比特币系统中的用户,都会抢着去打包。那么就有下一个问题了:
那么打包的记录该以谁为准呢?
A, B, C都可以打包,但是他们打包的区块里头的交易顺序可能有所不同,更有甚者,假如其中某个人修改了某条交易记录后,再打包,那整个比特币系统将要如何运行呢?

三、拜占庭将军问题与比特币

要说明打包的记录以谁为准的问题,我们需要引入一个知名的拜占庭将军问题(Byzantine failures)。拜占庭将军问题是由莱斯利·兰伯特提出的点对点通信中的基本问题。含义是在存在消息丢失的不可靠信道上试图通过消息传递的方式达到一致性是不可能的。

在战争的时候,拜占庭军队内所有将军和副官必须达成一致的共识,决定是否有赢的机会才去攻打敌人的阵营。但是,在军队内有可能存有叛徒和敌军的间谍,左右将军们的决定又扰乱整体军队的秩序。在进行共识时,结果并不代表大多数人的意见。这时候,在已知有成员谋反的情况下,其余忠诚的将军在不受叛徒的影响下如何达成一致的协议,拜占庭问题就此形成。
在互联网大背景下,当需要与不熟悉的对方进行价值交换活动时,人们如何才能防止不会被其中的恶意破坏者欺骗、迷惑从而作出错误的决策。进一步将“拜占庭将军问题”延伸到技术领域中来,其内涵可概括为:在缺少可信任的中央节点和可信任的通道的情况下,分布在网络中的各个节点应如何达成共识。在我们这里例子中,就是A, B, C如何在无中心化机构的情况下达到共识——谁记的账本是公认正确的?

1.拜占庭将军问题的解决方案

假设有9个互相远离的将军包围了拜占庭帝国,除非有5个及以上的将军一起攻打,拜占庭帝国才能被打下来。而这9个将军之间是互不信任的,他们并不知道这其中是否有叛徒,那么如何通过远距离协商来让他们赢取战斗呢?

方案一:口头协议

口头协议有3个默认规则:
1.每个信息都能够被准确接收
2.接收者知道是谁发送给他的
3.谁没有发送消息大家都知道
4.接受者不知道转发信息的转发者是谁
将军们遵循口头规则的话,那就是下面的场景:将军1对其他8个将军发送了信息,然后将军2~9将消息进行转达(广播),每个将军都是消息的接受者和转发者,这样一轮下来,总共就会有9×8=72次发送。这样将军就可以根据自己手中的信息,选择多数人的投票结果行动即可,这个时候即便有间谍,因为少数服从多数的原则,只要大部分将军同意攻打拜占庭,自己就去行动。
这个方案有很多缺点:
1.首先是发送量大,9个将军之间要发送72次,随着节点数的增加,工作量呈现几何增长。
2.再者是无法找出谁是叛徒,因为是口头协议,接受者不知道转发信息的转发者是谁,每个将军手里的数据仅仅只是一个数量的对比:


将军1手里的信息(口头协议)

这里我们假设有3个叛徒,在一种最极端的情况下即叛徒转发信息时总是篡改为“不进攻”,那么我们最坏的结果就如上图所示。将军1根据手里的信息可以推出要进攻的结论,却无法获知将军里面谁是叛徒。
这样我们就有了方案二:书面协议。

方案二:书面协议

书面协议即将军在接受到信息后可以进行签字,并且大家都能够识别出这个签字是否是本人,换种说法就是如果有人篡改签字大家可以知道。书面协议相对比口头协议就是增加了一个认证机制,所有的消息都有记录。一旦发现有人所给出的信息不一致,就是追查间谍。
有了书面协议,那么将军1手里的信息就是这样的:


将军1手里的信息(书面协议)

可以很明显得看出,在最坏的一种情况——叛徒总是转发“不进攻”的消息之下,将军7、8、9是团队里的叛徒。
这个方案解决了口头协议里历史信息不可追溯的问题,但是在发送量方面并没有做到任何改进。

2.比特币对拜占庭将军问题的解决

(1)非对称加密

在书面协议里,我们假设的是将军们的签名是不可伪造的。在密码学中,也有数字签名,数字签名是由私钥加密生成的,公钥可以对数字签名进行解密。并且公钥是由私钥产生的,而且从公钥难以倒推私钥(以当前电脑的算力很难很难通过公钥计算得到私钥)。这是密码学中已有的概念,名为非对称加密。私钥是个人拥有的,公钥是公开的。非对称加密可以解决签名伪造的问题。
公钥私钥

在我们的示例中,比特币系统里的每个用户发起了一笔交易,都会通过自己的私钥进行签名,用数学公式表示就是:

Signature = Sign(trans_text, private_key)

所以之前的区块就变成了这样:


签名后的区块

这样每一笔交易都由交易发起者通过私钥进行数字签名,由于私钥是不公开的,所以交易信息也就无法被伪造了。

(2)工作量证明(PoW)

如书面协议末尾所说的那样,书面协议未能解决信息交流过多的问题。当比特币系统中存在上千万节点的时候,如果要互相广播验证,请求响应的次数那将是一个非常庞大的数字,显然势必会造成网络拥堵、节点处理变慢。为了解决这个问题,中本聪干脆让整个10分钟出一个区块,这个区块由谁来打包发出呢?这里就采用了工作量证明机制(PoW)。工作量证明,说白了就是解一个数学题,谁先解出来数学题,谁就能有打包区块的权力。换在拜占庭将军的例子中就是,谁先做出数学题,谁就成为将军们里面的总司令,其他将军听从他发号的命令。

前面我们说过了,成功打包区块就可以得到两方面的奖励,一是手续费,二是打包奖励。
完整的区块结构
一个完整的区块结构是这样的,PoW的算法机制如下:

首先,矿工会将区块头所占用的128字节的字符串进行两次sha256求值,即:

Hash = sha256(sha256(区块头))

这样求得一个值Hash,将其与目标值相比对,如果符合条件,则视为工作量证明成功。
工作量证明成功的条件写在了区块链头部的难度数字段,它要求了最后进行两次sha256运算的Hash值必须小于定下的目标值;如果不是的话,那就改变区块头的随机数(nonce),通过一次次地重复计算检验,直到符合条件为止。

此外, 比特币有自己的一套难度控制系统,使得比特币系统要在全网不同的算力条件下,都保持10分钟生成一个区块的速率。这也就意味着:难度值必须根据全网算力的变化进行调整。难度调整的策略是由最新2016个区块的花费时长与期望时长(期望时长为20160分钟即两周,是按每10分钟一个区块的产生速率计算出的总时长)比较得出的,根据实际时长与期望时长的比值,进行相应调整(或变难或变易)。也就是说,如果区块产生的速率比10分钟快则增加难度,比10分钟慢则降低难度。

四、工作量证明的作用

PoW其实在比特币中是做了以下的三件事情。

1.控制节点准入机制

这样可以防止一台高性能机器同时跑上万个节点,因为每完成一个工作都要有足够的算力。

2.经济上的一种激励

有经济奖励就会加速整个系统的去中心化,也鼓励大家不要去作恶,要积极地按照协议本来的执行方式去执行。(所以说,无币区块链其实是不可行的,无币区块链一定导致中心化。)

3.确保每个块的出块时间有最小的间隔

也就是说,每个节点都不能以自身硬件条件去控制出快速度。现在的比特币上平均10分钟出一个块,性能再好的机器也无法打破这个规则,这就能够保证区块链是可以收敛到共同的主链上的,也就是我们所说的共识。

综上,共识只是PoW三个作用中的一点,事实上PoW设计的作用有点至少有这么三种。

五、零知识证明

1.默克尔树

默克尔树的概念其实很简单,如图所示

默克尔树

先把Data content中的D0, D1, D2, D3进行hash运算分别得到N0, N1, N2, N3,然后再分治地两两相hash得到父节点,直到最后生成一个根hash节点,这个节点叫做默克尔根
默克尔树有三大特征:
(1)任意一个叶子节点的细微变动都会导致默克尔根发生翻天覆地的变化,这个可以用来判断两个加密后的数据是否完全一样;
(2)默克尔树可以快速定位修改,如果D1的数据被篡改,则会影响到N1, N4和Root。所以当发现默克尔根的hash值发生变化时,沿着Root->N4->N1,最多通过O(log n)的时间即可快速定位到实际发生改变数据的D1。换句话说,如果一个区块中有16笔交易,那么找到这个区块中的任何一笔交易,只需要log 16=4即4步就可以。
(3)零知识证明,它指的是证明者能够在不向验证者提供任何有用信息的情况下,使得验证者相信某个论断是正确的。比如D0的拥有者要想证明他拥有D0这个数据,它不需要对外公布D0的真实数据,只需要根据已经公布的N1和N5,递进地进行hash计算得到Root的hash,将其与公布了的默克尔根进行比对,如果是一致的,就证明它是D0的拥有者。这一过程中你并没有对外透露D0的内容,仅仅是经过一些可知的hash值计算,而使得外界相信你是D0的所有者。
零知识证明

2.生成区块交易的默克尔根

我们将区块中的每一笔交易进行hash,生成默克尔根,如下所示:
默克尔树的引入

这样,我们区块的结构就大致完整了,这里分成了区块头和区块体两部分。

六、区块链的增长

区块链的每个节点,都保存着区块链从创世到现在的每一区块,即每一笔交易都被保存在节点上,现在已经有几百个GB了。
每当比特币系统中有一笔新的交易生成,就会将新交易广播到所有的节点。每个节点都把新交易收集起来,并生成对应的默克尔根,拼接完区块头后,就开始调整区块头里的随机数值,然后就开始算数学题

result=SHA256(SHA256(block_header))

将算出的result和网络中的目标值进行比对,如果是结果是小于的话,就全网广播答案。其他矿工收到了这个信息后,就会立马放下手里的运算,开始下一个区块的计算。
举个例子,当前A节点在挖38936个区块,A挖矿节点一旦完成计算,立刻将这个区块发给它的所有相邻节点。这些节点在接收并验证这个新区块后,也会继续传播此区块。当这个新区块在网络中扩散时,每个节点都会将它作为第38936个区块(前一个区块为38935)加到自身节点的区块链副本中。当挖矿节点收到并验证了这个新区块后,它们会放弃之前对构建这个相同高度区块的计算,并立即开始计算区块链中下一个区块的工作。
整个流程就像下一张图所展示的这样:

区块链的增长流程

这样的过程就形成一条不断增长的区块链
区块链

七、双花问题与比特币

简单来说,双花问题是一笔钱重复花了两次。具体来讲,双花问题可分为两种情况:
1.同一笔钱被多次使用;
2.一笔钱只被使用过一次,但是通过黑客攻击或造假等方式,将这笔钱复制了一份,再次使用。
在我们生活的数字系统中,由于数据的可复制性,使得系统可能存在同一笔数字资产因不当操作被重复使用的情况,为了解决双花问题,日常生活中是依赖于第三方的信任机构的。这类机构对数据进行中心化管理,并通过实时修改账户余额的方法来防止双重支付的出现。而作为去中心化的点对点价值传输系统,比特币通过UTXO、时间戳等技术的整合来解决双花问题。

什么是UTXO

UTXO的英文全称是unspent transaction outputs,意为未使用的交易输出。UTXO是一种有别于传统记账方式的新的记账模型。
银行里传统的记账方式是基于账户的,主要是记录某个用户的账户余额。而UTXO的交易方式,是基于交易本身的,甚至没有账户的概念。在UTXO的记账机制里,除了货币发行外,所有的资金来源都必须来自于前面某一个或几个交易。任何一笔的交易总量必须等于交易输出总量。UTXO的记账机制使得比特币网络中的每一笔转账,都能够追溯到它前面一笔交易。
比特币的挖矿节点获得新区块的挖矿奖励,比如 12.5 个比特币,这时,它的钱包地址得到的就是一个 UTXO,即这个新区块的币基交易(也称创币交易)的输出。币基交易是一个特殊的交易,它没有输入,只有输出。
当甲要把一笔比特币转给乙时,这个过程是把甲的钱包地址中之前的一个 UTXO,用私钥进行签名,发送到乙的地址。这个过程是一个新的交易,而乙得到的是一个新的 UTXO。
这就是为什么有人说在这个世界上根本没有比特币,只有 UTXO,你的地址中的比特币是指没花掉的交易输出。
以Alice向Bob进行转账的过程举例的话:

  1. 假设Alice之前通过挖矿获得了 12.5 个比特币,在她的地址中,这些比特币是某个币基交易的 UTXO。
  2. Alice 发起一个交易,输入是自己的上一个交易,输出是 Bob 的地址,数量是 12.5 个比特币,Alice 用自己的私钥对交易进行签名。
  3. 当交易被区块链确认后,Alice 的 UTXO 就变成了 0。而在Bob的地址中就多了一个 UTXO,数量是 12.5。
    比特币转账的三个阶段

    存在 Bob 的钱包地址中的这些比特币只有用 Bob 的私钥才可以签名转账给其他人。
    如果Bob要将这些比特币转账给其他人,则重复上述过程。

UTXO 与我们熟悉的账户概念的差别很大。我们日常接触最多的是账户,比如,我在银行开设一个账户,账户里的余额就是我的钱。
但在比特币网络中没有账户的概念,你可以有多个钱包地址,每个钱包地址中都有着多个 UTXO,你的钱是所有这些地址中的 UTXO 加起来的总和。
中本聪发明比特币的目标是创建一个点对点的电子现金,UTXO 的设计正可以看成是借鉴了现金的思路:我们可能在这个口袋里装点现金,在那个柜子角落里放点现金,在这种情况下不存在一个账户,你放在各处的现金加起来就是你所有的钱。
采用 UTXO 设计还有一个技术上的理由,这种特别的数据结构可以让双重花费更容易验证。对比一下:

  • 如果采用账户和账户余额设计,Alice 要转账给 Bob,为了确保 Alice 的确有钱,我们需要核查她之前所有的交易。随着时间的推移,比特币的交易越来越多,这个验证的难度会持续上升。
  • 采用 UTXO 设计,我们只要沿着每个交易的输入逐级向上核查,直到查到这笔比特币的创币交易即可。随着时间的推移,这个核查也会变难,但变难的速度要远低于采用账户和账户余额设计。

比特币解决双花问题的措施

  • 1.首先每笔交易都要先确认比特币之前的情况,要检查它是否存在于用户的UTXO中,如果不在,那么该交易就会被系统拒绝。
  • 2.如果用户用同一笔UTXO付给两个人,系统中的节点就会只确认先接收到的那一笔。
  • 3.当两笔时间上很接近的交易被不同节点确认,区块链将会发生分叉,剩余节点选择在它们认为的最长链上构建新的区块。
  • 4.当其中一笔交易被6个节点确认后,它将成为系统最长链,可以认为这笔交易获得了最终的确认。
    根据以上信息,我们可以知道,如果某个人篡改了某条交易数据,就会在比特币系统中产生分叉,而这个人在必须占有全网50%以上的算力的情况下,才有可能在当前的错误区块上增长为最长链。这就是所谓的51%攻击
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,539评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,911评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,337评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,723评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,795评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,762评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,742评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,508评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,954评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,247评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,404评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,104评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,736评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,352评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,557评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,371评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,292评论 2 352

推荐阅读更多精彩内容

  • 什么是比特币: 不同于传统货币,比特币是完全虚拟的。它不但没有实体,本质上也没有一种虚拟物品代表比特币。比特币隐含...
    ironman_阅读 753评论 0 2
  • 在学习区块链技术和投资区块链资产过程中,会遇到很多的专业术语,例如:挖矿、共识、确认、软分叉、硬分叉、钱包等等。 ...
    博学于文约之以礼阅读 1,370评论 0 1
  • 从比特币视角看POW机制 ps:下面的内容需要先了解基本的区块链常识 共识机制的核心只有两条: 谁来构建区块? 如...
    MatrixYe阅读 949评论 0 4
  • 共识机制 什么是共识机制 区块链作为一个去中心化的分布式账本系统,然而在实际运行中,怎么解决因为去中心化后,保证整...
    HeartGo阅读 3,030评论 0 1
  • 什么是机制设计 机制设计其实是博弈论的逆向工程,在博弈论中,是需要在已知市场机制和各方真实偏好,求最佳行动策略。 ...
    杨宁victor阅读 1,781评论 1 0