美文网首页
比特币原理

比特币原理

作者: Baoyl | 来源:发表于2018-07-19 22:12 被阅读0次

    本文内容来自视频 https://www.youtube.com/watch?v=bBC-nXj3Ng4&t=24s

    本文将以比特币是如何一步一步建立的来介绍背后的工作原理。

    1.数字签名

    首先,我们从一个用于记录你与你的好朋友们交易的公共账本(Ledger)开始,然而你与好友及世界上的其他人的互相的信任度开始逐渐降低,但聪明的你引入了密码学中的某些概念如加密(Cryptography )来解决信任危机,这样你就创造了一种新事物,叫做“加密货币”(Cryptocurrency)。即

    Ledger - Trust + Cryptography =Cryptocurrency

    比特币只是第一个被广泛应用的加密货币的例子,而如今有了更多其他的加密货币并与传统货币发生交易。从你发明你自己的加密货币入手,能帮助理解如今几大主流加密货币的理论基础。

    现在我们将加密货币先放在一边,先从更基础的概念入手:账本(Ledger)和电子签名(Digital signatures)。如果你和你朋友有着频繁的金钱往来,用现金总是不方便的,所以可能会用到一个公共账本,它记录了某些未来将会发生的交易信息,比如 A 付给了 B 20元,B 付给了 C 40元等等,这个账本必须是公开的,每个人都能查阅,就像一个网站一样,每个人都能查阅并且添加新的记录,而到了月底大家对交易记录都无异议之后,就会一起合计,如果你入不敷出,你就要向公家交钱,如果仍有结余,就可以从中取钱,所以这个简单体系的设计大概会是如下所述:

    协议:

    1.每个人都能向账本添加新的记录;

    2.月底再统一结算。

    但是公共账本存在一个问题,正因为每个人都能添加记录,那么如何避免 B 在没有 A 的核准下偷偷记下 A 付给了 B 100元,我们又凭什么相信账本中的记录都是准确无误的呢。这里就需要密码学中的电子签名技术。就像手写签名一样,A 可以在交易信息边上留下记录以证明他了解并且允许这笔交易发生,而且这个签名不能被他人获取并伪造。乍一思索电子签名似乎不太可能实现,意思是无论电子签名是如何存储的,计算机读取并复制即可,那究竟该如何防止伪造呢。

    要实现电子签名,每个人都需要生成一对公共密匙(public key)和私人密匙(private key),每一个密匙都是一串比特数字。正如其名,私人密匙是由你自己保存的,现实生活中,你所签署的所有文件中的签名都是一致的,但是电子签名则更进了一步,它会随着签署的内容变化而变化,它看上去是由一串1和0组成的代码,通常长度是256位,而内容的轻微变动都会让这串代码看上去完全不同。

    产生这样的签名需要一个函数,它同时要求所签署的内容以及你的私人密匙,私人密匙确保了只有你本人能产生这个电子签名,这个签名还取决于签署的内容,就意味着其他人不能简单的复制这个签名并且在其他内容上伪造另外一个签名。

    Sign(Message, private key) = Signature

    与此同时,还有一个验证函数用于验证签名是否真实,而这个验证函数需要用到公共密匙,它的作用是告诉我们这个签名是否是由一个私人密匙并有一个与之配对的公共密匙用于验证。

    Verify(Message, private key, public key) =True / False

    这里并不讨论这些函数的实现细节。它保证了如果你不知道私人密匙,你几乎不可能找到一个正确的签名。准确的讲,没有比穷举并反复验证更好的办法去找到一个正确的答案,然后用大家都知道的公共密匙进行验证。但是,256位的签名总共会产生2^256个可能的签名,这是一个远超天文学范畴的数字。所以现在如果你验证了一个签名是真的,那么你就可以认为这个签名只能由他本人持有的私人密匙所产生。

    现在确保了每个人都会在交易信息后面签名,但是任然存在另外一个问题,比如 A 签署了一条 A 付给了 B 100元钱的交易记录,即便 B 不能在 A的新交易记录上伪造签名,他还可以把这条记录随心所欲复制几遍,这些记录以及它对应的签名都是正确的。要解决这个问题,当你在签署新的交易信息时,交易信息还必须包含一个唯一的编号与之对应,这样如果 A 多次支付 B 100元的话,账本上的每条记录都会要求一个新的签名。

    2.账本就是货币

    有了电子签名就完美的解决了原本体系的信任危机。但是要真正实现,任然需要依赖一个类似的信任机构,也就是说你信任每个人到了月底都会出现并且用现金结算,但是如果其中某一个人欠了很多钱,到月底结算的时候不出现该怎么办。而再次使用现金的唯一原因是其中有人欠了钱,所以就想到一个办法就不需要真正再次用现金结算,就是只要能够避免其中有些人的余额不足以支付其支出。所有人在最开始都存 100 块,账本上先记录上每个人的余额,比如最开始A、B、C、D各存了100块,这四个人的余额最开始就都是100块。现在只需要拒绝在账本上记录某些人的入不敷出的交易。那么现在的协议变成:

    协议:

    1.每个人都能向账本添加新的记录;

    2.只有电子签名的交易才是有效的;

    3.拒绝入不敷出。

    这个设计真正去掉了账本与真实货币的联系,理论上如果世界上所有的人都是使用这个账本,你可以在这个账本中完成一生中所有交易,根本不需要真实的货币。我们把账本上的货币单元称之为 Ledger Dollars,简称 LD。你可以自由的将现实中的货币转换为LD,比如 A在现实中给了 B 100元,同时在账本中记录 B 给了 A 100元。但是这样的兑换就和世界上其他的货币类似,但是这就是另外一件事了。

    然后是理解比特币和其他加密货币的最重要的信息了,它实际上就是一个账本,所有的历史交易总和就是当下(current)的货币(currency)。当然就比特币而言,人们只有用现金购买和使用比特币才会在账本上记录,但新的比特币如何产生稍后细说。但在此之前,我们的LD体系和当前的加密货币还有一大不同,就是我们这个账本是存在某个公共地点,比如一个网站,所有人都能登陆并添加记录,那样的话我们就需要信任这个中心机构,那究竟谁来管理这个网站,谁来控制添加记录的规则呢。

    3. 去中心化

    让所有人都能获取这份账本也就不需要信任中心机构了。当发生交易的时候,比如 A 付给了 B 100元,需要将这个信息广播给网络中的所有其他人,他人收到这个信息都在自己的账本上记下这条交易。

    想法虽然简单,但是这样的设计却相当糟糕。如何确保所有人手里都是正确的那份账本呢。当 B 收到了 A 付给 B 100元这条信息之后,他如何确保其他所有人也同样收到了这一消息 ,能让他今后可以用这100元支付给 C 做交易?试想你自己收听着外接的交易信息广播,该如何确保其他人和你一样以相同的顺序接受交易信息,这才是关键所在。能否想出一个办法来决定接受或拒绝收到的交易信息,而且其他所有人确信在这个方法下能以同样的顺序接受交易信息,最终形成同样一份账单。

    这也是比特币原始论文中详述的部分。简单的讲,比特币的解决办法,是选择信任消耗最多计算资源的那份账本。基本思路如下:如果你计算资源的消耗作为你的信任之基,那么伪造交易记录,将会需要不可能达到的计算能力才有可能。

    他的主要工具是一个加密散列函数(通常为SHA256(INPUT)),这些函数的输入可以是任何信息或者文件,他们会输出一个固定长度的比特字符串,如256位,这个输出的值叫做这个信息的散列值,它故意设计成会输出看似相当随机的内容,但并不是随机的,对于给定的信息总是输出相同的结果,但是你讲输入稍作修改,也许仅仅修改其中一个字母,最终的散列值会变得完全不同,毫无规律可言。同时,也就意味着逆向计算是不可能的,如果给了一串0和1的字符串,需要知道是哪一个输入经过SHA256()函数会得到同样的结果,没有比穷举更好的办法了。

    4.工作量证明

    那么现在,我们的关注点会是这样的函数如何证明一个账单它所需要的计算力。试想如果有人给你一份交易记录并对你说“我发现了一个特殊数字,你把这个数字放在这份交易记录后面,整体信息经SHA256函数计算后,前面30个数字会是0”, 可以想一下找到这样的一个数字有多难。对于一个随机信息来说,其散列值前30位都是0的概率是2^30分之一,差不多是十亿分之一,而且因为SHA256是一个加密散列函数,找到这个数的唯一方法就是穷举验证,所以刚才那个人基本上已经尝试了十亿次才找到那个特殊的数字,而你知道了这个数字,很快计算一下散列值发现开头确实是30个0。换言之,你能很快验证他们确实经过了大量的计算,而你不需要亲自付出这么多的重复劳动。这叫做工作量证明 (Proof of Work)。重要的是,整个工作证明和这份交易记录紧密相关,如果你改了其中一条交易信息,即便是轻微的改动,也会完全改变最终的散列值,所以就又需要经过十亿次尝试才能找到新的工作量证明,即找到那个特别的数字,和它对应的交易记录的散列值会以30个0开头。

    现在回过头来考虑我们的分布式账本的情形,每个人都在广播交易信息,我们想到一个方法能让所有人都确认一份正确的账单,而比特币的原始论文的核心观点是每个人都信任需要最多计算的那份账单,要实现这个想法首先需要将账单整理成区块,这些区块包含一系列的交易信息以及工作量证明,也即有一个特殊的数字满足其散列值以一些列0开头,我们这里暂定60个0,现实的比特币体系中这些0的数字规律的变化,以保证平均每10分钟产生一个新的区块。

    类比于交易信息要经过发送方签名才被认定有效,一个区块只有当它有工作量证明的时候才被认定有效,而且为了确保这些区块有一定的顺序,我们规定前一区块的散列值必须加入到当前区块的头部信息中。

    5.区块链

    这样的话,如果你想回头改变某个区块的内容的话,或者只是改变一下顺序,就会影响到后面所有的区块的散列值,这样就需要计算所有这些区块的散列值和重新做工作证明,因为这些区块是链接在一起的,与其叫账本,不如叫区块链。

    在新的体系中,我们现在允许世界上的每个人都能成为区块的建立者,意思就是他们都将收听网络的交易信息,整理这些信息生成区块,然后花大量的计算能力,寻找一个特殊的数字使得区块的散列值以60个0开头,一旦找到这个数字 ,他们就将这个区块广播出去,为了奖励这个区块建立者的工作付出,当他建立一个区块,我们规定她可以把一笔特别的交易信息放在账单开头,即他得到10 LD。这叫做区块奖励,这是我们接受或拒绝一个交易信息规则的例外情况,它并不来自其他人,所以也并不需要签名,也意味着整个区块的 LD会随着新区块的产生而增加,建立区块通常叫做“挖矿”,因为他们会做大量的计算,挖矿会为整个经济中引入新的货币量。

    在旷工的眼中,每个区块就像一个小型的彩票,每个人都想尽可能快的猜数字,直到其中一个幸运儿找到那个特别数字,能让区块的散列值以很多0开头,然后他们就得到奖励,而对于其他只是想利用这个系统做交易的人而言,并不需要收听交易记录,他们只需要收听被旷工广播的区块即可,然后更新自己的那一份区块链。

    现在我们新体系的关键点在于,如果我们收到两份完全不同的区块链,我们倾向于选择最长的那一个,也就是需要最多工作了的那一份。如果暂时难分上下,等待下一个区块的广播,总有一个会形成更长的区块链,所以即便没有中心机构,所有人也都维护自己的那份区块链,但如果每个人都信任最多工作了的那个区块链,我们就达到了一个去中心化的共识,为什么这样能建立一个可信的系统 ,并理解这个系统里的交易到底多可信,我们可以尝试在这个系统中伪造信息欺骗他人到底有多难。

    假如 A 想用一个伪造的区块欺骗 B,也即他给 B 的一个区块中包含他支付 B 100元的信息,但是她没有把这个区块广播给网络的其他人,那样的话,其他人还会认为 A 拥有这100元。要做到这个,他要比其所有都在独立计算的旷工先找到工作量证明才能欺骗所有人,而这的确是有可能发生,可能 A 正好找到特殊的数,但是 B 也还会收到来自其他旷工的区块广播,所以为了让 B 相信 A 伪造的区块,A 后面都要重新计算他那伪造给 B 的区块后面所有的区块,这些区块和 B 收到了来自其他旷工的区块都不同,但系统规定 B 总是信任他所指的最长的那一个区块链,A 在前几个区块可能还会保持领先,如果刚好碰巧他比其他旷工找到那个区块的工作量证明。但是除非他拥有接近所有旷工的计算资源的50%,他才有可能在后面的区块中保持领先。所以通常情况下,更有可能发生的是,其他所有旷工计算的区块会比 A 伪造给 B 的区块形成的区块链更长更快,所以经过足够的时间,B 会放弃他收到的来自 A 的区块链,而选择其他所有人都在计算的那一份区块链。所以当你收到一个区块的时候,你可以不必信任这个区块是完全正确的,但是经过足够的时间后,发现没有区块比它更长,你就可以相信这个区块链和其他所有人保持一致。

    6.奖励问题

    当有越来越多的旷工加入到其中的时候,为了赢得每10分钟开奖的彩票,计算也会变得越来越难,很多新的加密货币有更短的区块时间。比特币体系中的所有比特币都来自生成新区块的奖励,在一开始,是每个区块的50个比特币。但是每经过210000个区块,差不多是4年,区块奖励就会减半,也因为这个奖励随着时间等比减少,也就意味着最终可获取的比特币不会超过21000000,但是这并不意味这旷工最终赚不到钱,除了区块奖励外,旷工还可以获得交易费,每当你支付时,你可以选择一小笔交易费一起支付,这笔交易费最终会给包含这笔记录的区块链建立者,这样做可以激励旷工。

    相关文章

      网友评论

          本文标题:比特币原理

          本文链接:https://www.haomeiwen.com/subject/mugtmftx.html