写给宝宝看的区块链与比特币

08年经典论文《Bitcoin: A Peer-to-Peer Electronic Cash System》

我一直在研究一种完全对等的,没有可信赖的第三方的新型电子现金系统… —— 中本聪

关键词:点对点,去中心化,防篡改,无可信第三方,多方互不信任,数据存证

平时用微信/支付宝给朋友转钱,或者银行转账,是怎么保证钱真的转过去了?答:有银行/支付宝这些大公司记录着呢。

银行、支付宝这些就是中间人,我们信任它们来帮我们记账、保管钱。但是,如果世界上没有银行、没有支付宝、没有微信支付,我们怎么在网上安全地把钱转给别人,并且保证对方收到了,钱不会被乱花(比如‘双花’问题,同一笔钱花两次)?怎么保证记账的人不作弊?

区块链就是一个能制约参与者的公共记账本。注意关键词:链,公共,制约。

链,约等于链表,顺着链,要能找到普天之下所有的历史交易。这是设计区块链的根本目的。(解决双花问题,要能知道这笔钱以前有没有花过)。

公共,所有人都能访问链且有机会新增一个链节(叫区块)。记账操作是,从内存池(里面都是待确认(待上链)的交易条目)中选择一些个条目,把这些作为新区块,寻找一个nonce值,寻找的过程是机械的、消耗巨大算力的,这个过程被称为工作量证明(Proof-of-Work)。当将这个nonce与当前区块所有数据结合并进行整体哈希运算后,生成的哈希值必须满足特定条件(如以若干个零位开头)。找到产生这种哈希的nonce需要大量计算资源,闷头算就好了。但nonce的验证非常简单。一旦某个矿机算好了,就把nonce值和区块头告诉其他矿机。大多数矿机验证无误后,新区块创建成功,成为公共的。算出nonce的矿机得到一些奖励(比特币),其他矿机放弃掉原先没算完的数,在新链的基础上,重新挑选一些待确认的交易条目进行计算。

不可篡改: 一旦一个区块被大家确认并加到链上,想改它就非常非常难!为什么?因为每个区块都像连环锁,包含了前一个区块的特殊哈希值。如果你想偷偷改掉很早以前的一个交易,你就必须把从那以后的所有区块都重新算一遍,而且要在所有矿机都还没更新到新账本之前,让超过一半的矿机都认可你改过的账本。这几乎是不可能的任务。

分叉问题:节点始终以最长链为正确版本。如果两个有效区块几乎同时到达形成临时分叉,节点通常会先处理最先收到的区块,但保留另一个分支。任何节点发现工作量证明后,会扩展其中一个分支,哪个分支被延长就会变得更长,而处理较短分支的节点只需切换,放弃较短的分支,转而处理更长的获胜链。

节省磁盘空间:使用默克尔树这种高效的数据结构,将交易成对哈希,构建类似树状结构,直到顶部得到单一哈希(默克尔根)。只有默克尔根哈希被包含在区块头中并与工作量证明链接,允许从后续区块中丢弃大部分旧交易数据,只需保留根部的区块头,节省磁盘空间。

简化支付验证(SPV):SPV客户端只需下载最长工作量证明链的区块头,通过获取将交易链接到区块的默克尔分支,从全节点获取时间戳,并使用区块头和该分支,可确认交易包含在被接受的链中,无需整个区块链。

总之,在比特币网络中,作弊在计算上不可行,实现点对点的直接交易,且交易难以被计算逆转,保护卖家免受欺诈,也方便买家实施托管服务。

Q & A

区块的粒度

一次交易就是一个区块吗?

答:不是。有三个层次:1)交易是最小单位(比如单笔转账)2)区块是容器,里面包含了多个交易。3)区块链是区块串成的链条。把一段时间内(比如10分钟)发生的很多笔交易(几十笔、几百笔甚至更多)收集起来,像打包一样,计算出nonce后,就形成了一个新的 ‘区块’。

矿工之间的竞争

所有矿工算同一个数据包吗?

答:不是。矿工的选择权是区块链去中心化特性的体现。 允许矿工自由选择高手续费交易,激励他们优先处理用户愿意多付钱的交易,提高了网络处理交易的效率(用户可以通过提高手续费让交易更快被确认)

假如一串交易的发生顺序是1,2,3,4,5,6,那么矿工可以选择4,5,6而跳过1,2,3。此时交易1、2、3只是暂时留在全网共享的“待确认池”(内存池/Mempool)里,后续的矿工在打包下一个区块时,依然能看到这些交易,并可能选择打包它们。区块链不记录交易的“自然发生时间”,只记录它们被打包进哪个区块。如果交易4、5、6先被打包进区块N,而交易1、2、3被打包进区块N+1,那么在账本上:交易4、5、6 的确认时间早于 交易1、2、3

矿工之间的竞争2

有没有矿工为了每次都抢在所有人前面算出nonce值,而选择每次只挑出一个交易进行区块的创建?这是否算作弊?

答:技术上矿工可以这样做(只打包1笔交易甚至空区块),但这通常不是作弊,而是极不划算的愚蠢策略。因为很多人以为打包交易越多,计算nonce越慢。但实际计算nonce的速度与区块中的交易数量几乎无关。矿工在解题时,实际反复计算的是区块头的哈希值。

关于什么是区块头,约等于整个区块的校验值。包含了这个区块:前一区块哈希值,本区块打包了哪些交易(叫Merkle根)、区块创建时间(时间戳)、nonce等。矿工反复、疯狂的做一件事:改变Nonce → 计算区块头哈希值 → 是否等于某个特殊值,比如前18位都是0

所以无论打包1笔或4000笔交易,矿工要计算的哈希值都是80字节区块头,所以没人打空包创建空区块。

经济模型问题

奖励与货币必须一致吗?

答:是。在比特币系统中,矿工创建新区块获得的奖励必须是比特币本身,不能是别的钱。这是精心设计的:新比特币只能这样产生、矿工需要被激励、系统完全自循环

补充:代码规定:区块奖励每4年减半(如2009年奖励50 BTC → 现在6.25 BTC → 2024年后3.125 BTC)2140年左右全部挖完,之后矿工只赚交易手续费。

论文翻译:https://zhuanlan.zhihu.com/p/180315198

mempool.space