比特币和区块链技术

点击量:1166

一、去中心化
在介绍比特币和区块链技术之前,我们先来看两个日常生活中很常见的交易场景。

  • 实物交易
    水果店的老板卖水果给顾客,顾客付了钱之后得到苹果,一手交钱一手交货,交易完成。仔细想想你会发现这笔交易是完全基于老板和顾客之间的,并没有第三方参与。道理很简单,因为双方都是面对面交易的,苹果怎么样,给了多少钱,双方都是亲眼所见的,是否满意当场就可以判断出来,所以不需要第三方监督。
  • 虚拟物品交易
    但是在电子货币时代这一切就没那么简单了,比如用户A要从自己的银行账户转账给用户B,这笔看似只有A和B参与的交易其实并不只有他们两,还有一个隐形的第三方参与者:银行。假如没有银行的监督,我们如何知道A的账户里是否有足够的钱转给B?我们如何知道A在给B转账的同时有没有转给C?这一切都需要第三方的监督,换句话说,这笔交易只有在被银行认可之后才会生效,银行是一切交易的中心。所以从本质上来说,银行对每个人的账户拥有至高无上的权限,只要它想,它就可以对账户做一切它想做的事,而且这一切操作对外都是不透明的。虽然银行有政府做背书一般不会干这种坏事,但是万一突然遇到个兵荒马乱的时代,那一切都说不准了。(比如2015年希腊债务危机,有段时间银行曾规定每天每人ATM机只能取60欧)而且更关键的是个人在银行的监管体系下基本没有隐私了,你所有资金的来龙去脉,包括交易记录,账户余额等信息在银行内部都是公开透明的。所以有这么一群极富黑客精神和追求无政府主义的极客们自然是不满意的,他们想能不能开发出这样一套交易系统,使得交易双方完全不需要第三方监管就可以互相信任,从而完成交易?这样的系统有一个很明显的特征:去中心化。这就是去中心化的由来,而比特币则是最早流行起来的去中心化的交易系统。


  • 二、比特币的设计
    概述
    比特币其实并不是货币,而是一条条交易记录,系统通过对历史交易数据的查询计算得出账户余额,它最大的特色就是系统内所有的交易记录并不是由某一个/几个人/组织控制的,而是由比特币系统里的所有节点共同维护的,整个比特币系统的最终目的就是维护所有的交易记录。每一个参与比特币交易的用户先要下载一个比特币的客户端软件,运行这个软件的电脑被称为一个节点(node),很多节点互相连接,最终会形成一个p2p网络,所以也有人说比特币本质上就是一个p2p网络或者是一个分布式计算系统。

    交易流程

    1. 钱包和交易地址
      比特币钱包是一个特殊的文件,通过它可以访问多个比特币地址,每个地址其实就是一个字符串。交易双方都是基于这个地址进行的,比如“A向B转账20个比特币”,则就表示从地址A转账20个比特币到地址B。这里建议大家每一笔新交易都新建一个地址,这样能很好的保证匿名性。
    2. 交易加密
      交易记录加密采用的是一种非对称加密算法(椭圆曲线签名算法),特点就是用私钥对交易记录进行签名,然后其他节点会用公钥对消息解密,检查这个签名是否是合法。(这一步是验证交易的合法性)其实在生成新地址时就会生成一个“密钥对”,私钥放在钱包里,而公约就是地址。
    3. 交易验证
      节点A(NodeA)要向节点B(NodeB)转账之后,会生成新的交易记录,并且向所有网络节点广播,比特币旷工会定时收集(每10分钟)这些交易记录,待验证通过之后完成交易。那么具体是怎么验证的呢?这就是下文要要说的区块链技术

    三、区块链(block chain)
    比特币的交易验证才是比特币真正的核心,而这套验证算法正是区块链技术,所以说比特币是基于区块链的去中心化交易系统,理解了区块链就理解了比特币。
    基本概念
    区块链其实是由两部分构成的:

  • 区块(block):一个区块用于记录最近10分钟所产生的交易信息,主要信息由以下三个字段记录:
    • transactions 最近十分钟产生的交易记录
    • Blockheader.hashPrevBlock 上一个block的hash值
    • Blockheader.hashMerkleRoot 当前被接受的hash值(Nonce:当前值)
  • 区块链(block chain):区块链就是很多block按照时间顺序串起来的链(chain),第一块被称为创始块(Genesis block),整个比特币系统其实就是在维护这一份区块链,而每一个节点都会保存一份这个区块链的副本。
  • 工作机制
    如果把交易记录比作记账的话,那么去中心化的本质就是把记账人从银行(中心化机构)转为系统内的结点。比特币系统内的每一个结点都会在本地保存一份账本的副本,并且会参与账本的维护。这里的账本就是区块链,而账本的维护就是在当前区块链的末端添加新的区块。交易验证的过程就是:最近10分钟内产生的所有交易都会广播到所有结点,并且会生成一个区块。系统内的所有节点都有权限对这个区块里的交易记录进行验证(但一般都是矿工)也就是前面说的公钥解密验证。当大家一致决定该区块里的交易合法之后则会把该区块加到区块链里。那么此时应该由谁来添加新的区块呢?最简单、最直接的想法是基于IP地址的投票决定大部分人的意志,谁得的票数最多我们就让谁添加区块,对吧?那么问题来了,这样的话只要谁能收集到足够多的IP地址那就可以进行欺诈了,所以这种很简单的投票是很不靠谱的。于是聪明的人想到一个方法:
    工作量证明(Proof of Work)
    简单点说就是如果某个结点的工作量(计算量)最先达到某个数值时,那么他就有权限添加新的区块。与此同时,会把要添加的区块信息广播给其余矿工,这些矿工接受到信息后会立刻停下手头上的工作,对发过来的区块内的交易进行验证,当所有矿工都确认交易合法之后,挖矿成功的那个结点会把这个区块加入到区块链里去。具体地,比特币系统采用的是SHA-256哈希算法来进行工作量度量,要求结点(旷工)找到一个随机数使得通过SHA256(信息+随机数)加密之后得到的值是一个以n个0开头的字符串。由于SHA256是一个单向函数,从计算上讲是不可逆的,也就是说不可能通过结果计算得出参数。所以要得到想要的数值就只能不断尝试不同的随机数,这项工作计算量巨大,平均而言,在一个区块内进行运算时,需要进行72957千亿次尝试才能找到一个满足条件的随机数。这就是传说中的比特币挖矿,这个节点被称为旷工。当旷工挖到之后系统会奖励其一定数量的比特币,奖励规则如下:初始奖金是50个比特币,随后以约每10分钟50个的速度增长,当总量达到1050万时(2100万的50%),奖励减半为25个。当总量达到1575万(新产出525万,即1050的50%)时,赏金再减半为12.5个,以此类推下去,经过计算,比特币的总量为2100万个,所以它并不会存在通货膨胀的问题。这就是比特币的另一个特点:系统会奖励维护区块链的矿工一些比特币,而这些比特币恰恰就是系统比特币的来源。那么全部挖完之后谁还会去做矿工呢?全部挖完之后矿工会收取交易的手续费以获得收益。
    不可逆性(irreversible)
    为什么基于工作量证明的方式能防止欺诈呢?
    我们设想一个场景:有一个攻击者想要篡改区块链中某一个区块中的某一条交易记录,那么他应该怎么做呢?首先找到这个区块,然后修改交易记录。这样就完了吗?看似应该结束了啊,但是这还没完。他还需要计算当前区块的hash值。为什么?因为区块的hash值是由当前区块的信息算出来的,一旦当前区块的交易记录被改了,哪怕只是多了一个空格,最终得到的hash值都会完全不一样,所以攻击者需要动用大量的计算资源重新计算这个区块的hash值。OK,历经千辛万苦终于算出来了,这回应该结束了吧?还没,他还需要计算这个区块后面的所有区块的hash值,因为我们之前说过当前区块的hash值的计算依赖于前一个区块的hash值,所以当区块链变得非常长,想要修改前面的记录几乎是不可能的,因为计算量太大了。这就是区块链的不可逆性,也就说一旦确认了区块的交易记录便不能再更改。工作量证明不可逆性是区块链技术最大的两个创新点!

    四、Double Spending Problem
    不同于物理世界的货币,比特币等电子货币/虚拟货币非常容易被复制,因为他们本质上就是一个文件。这就意味着存在一种可能:如果没有人监督的话,有人可以操纵自己的比特币文件,使得一份钱被花了两次。这就是double spending problem,也被称为一币多付或者多重支付问题。你可能会觉得这个问题对程序员来说不是很容易解决麽?这本质上就是个并发问题嘛,在竞争资源上加个同步锁就行了啊。然而这些方法都是在中心化的模式下才得以生效的,而比特币是一个去中心化的分布式计算系统,这是无法实现的。下面我们会详细介绍多重支付问题在比特币系统里是如何发生的。要理解这个问题,先要理解一个概念:区块链的分支。
    Blcokchain Fork
    我们知道比特币系统的网络上会存在多个矿工同时进行挖矿,如果在某一时刻有两个/多个矿工同时挖到了矿(因为分布式网络里消息广播是需要时间的,所以这里的同时并不是同一时刻,而是两个/多个矿工挖到矿后向网络节点广播消息,各自互相被听到的时间,因为矿工只有在接收到别的矿工已经挖到矿的消息后才会停止挖矿,所以肯定存在一种可能:系统会存在多个矿工都挖到了矿),并且他们各自收集到的区块里的交易信息都是合法的,那么这两个矿工会把各自认为正确的区块加入到区块链当中去,此时系统里的区块链就会有两个分支。那么最终系统会采纳哪一个分支呢?答案是:这两个分支都会被保留,此后两个分支会交替增加,系统会优先选择较长的分支作为主干,而短的分支会被遗弃(短的分支里的区块被成为Orphan Block),里面的交易信息会被重新加入到交易确认队列池(pool of queued transactions)里面等待验证。如图所示:

    理解了区块链的分支概念,双重支付问题就很好理解了。比如说:我们有两笔交易:

  • transaction1:从A地址转1个比特币到B地址;
  • transaction2:从A地址转1个比特币到C地址;
  • 而A地址的账户上总共只有一个比特币,很明显这就是一个Double Spending Problem。我们假设A地址向网络节点同时广播这两条交易信息,并且恰好这两个交易分别被两个矿工加入到了各自的区块链中,并且各自验证都是正确的(因为各自区块之前的区块里都没有这条交易记录 )。B地址在得到了交易transaction1成功的确认后就发货给了A。但是过了几个区块之后,transaction2所在的区块链却是最长的,于是系统采用了transaction2所在的区块链。而transaction1所在的区块变成了Orphan Block,那么此时再把transaction1放到交易队列里验证时发现账余额不足(因为这个块肯定是接在transaction2所在区块的后面),于是交易被取消,也就是说A并没有向B成功转账,而B却给A发了货,这就是比特币里存在的双重支付问题。那么如何避免呢?答案很简单:收到交易确认后不着急发货,而是再等6个区块的确认消息,如果交易不取消的话就发货。

    五、安全性
    上面从系统设计本身介绍了双重支付发生的场景,除此之外,攻击者还会人为构造一些条件来实现双重支付攻击,主要有以下几种攻击方式:

  • Race attack
  • 当攻击者A向B转账时,会同时发送两条交易信息:一份通过P2P直连的方式直接发送给B,而另一份则向剩余的网络节点广播。很明显,第二份交易会被矿工接收作为区块的一部分,而B在没有收到其余结点确认的情况下就发货给了A,于是问题出现了。解决办法就是等待至少一个区块的确认信息或者关闭所有incoming connections,而只选择自己信任的outgoing connections。

  • Alternative history attack
  • 当攻击者向商户发起交易之后,会在那笔交易的区块后面私下再挖一个分支,只要它速度够快,超过商户等待的确认块数n,那么他和商户的这条交易就会被私下挖掘的分支取代,从而导致交易失败。举个例子,如果攻击者掌控了全网算力(hashrate)的10%,而且商户再等待6个区块确认之后再发货,那么这种攻击的成功率是0.1%。

  • Majority attack
  • 这种攻击也被称为51%vs50%攻击,如果攻击者掌控了全网51%的算力(hashrate),这也就意味着它挖矿的速度比其他剩余的矿工都要快,那么整个区块链都可以被它的私有分支所替代,所以攻击的成功率是100%。但很明显这是不现实的,攻击者不可能在现有网络节点中调用那么多的计算资源,如果自己购买则花费巨大。其次,即使有这么多的计算资源,攻击所带来的收益可能还不如挖矿高。

    六、对比特币的一点思考
    完成这篇文章之际,比特币的价格已经涨到2500美金了,价格高的吓人。比特币现在的狂热有点让人想起人类历史上第一个泡沫:荷兰的郁金香。因为比特币并不是货币,它本身没有任何价值,没有政府或者任何机构作背书,只是因为这个世界上有很大一票人非常信任这种去中心化的交易系统,是这批人在支撑着比特币,当然还会加上一些适当的炒作。因为他们相信这个世界越混乱,政府越腐败,比特币就会越值钱。当然我们也要看到比特币脆弱的一面,万一哪一天所有政府联合起来禁止任何比特币在市面上流通,导致所有的商铺都不接受比特币,那么到那个时候比特币可能只是一小部分人在地下偷偷交易使用的货币了,前景就没那么广阔,价值自然是要跌的。况且比特币因为其匿名性的特点,很容易被用来从事洗钱,资产转移等一系列政府相当敏感的活动。其实从本质上说,去中心化的系统设计的目的就是为了对抗政府,所以在不远的将来各国政府对比特币的监管几乎是板上钉钉的事。

    本文只是大致介绍了比特币和区块链的原理,还有很多细节没有说明,具体可以参考以下文章:
    一张图了解比特币是如何运行的
    Bitcoin and the Double-Spending Problem-Cornell-University
    一个故事告诉你比特币的原理及运作机制
    Still Don’t Get Bitcoin? Here’s an Explanation Even a Five-Year-Old Will Understand
    Bitcoin: A Peer-to-Peer Electronic Cash System-Satoshi Nakamoto
    https://en.bitcoin.it
    A Guide to Bitcoin (Part II): A deep dive into the Bitcoin ecosystem
    What is Double Spending

         

    原创不易,如果您觉得本文对您有帮助,可以打赏博主一杯咖啡,鼓励博主持续创作!


  • Ethereum/Polygon/Bsc/Arbitrum: 0xa8c00949fd7dD23b5Ec36A9181966c8C8436A015
  • Bitcoin: bc1qdvf0j0rntarvdal62n35etwmjzwk307w4jtyjz
  •    
  • 支付宝:

  • 比特币和区块链技术》上有1条评论

    1. Pingback引用通告: 我为什么不看好比特币? – Eric Fan

    发表评论

    邮箱地址不会被公开。 必填项已用*标注