漫谈区块链(1) -- 开天辟地比特币

秦言夏语 2021-06-16 19:34:16 阅读数:332

本文一共[544]字,预计阅读时长:1分钟~
区块 比特 漫谈 开天辟地 辟地

从这篇开始,起一个新的系列,聊聊区块链。和其他几个漫谈系列一样,我列了大致的大纲,谈天说地,希望能和大家探讨区块链这个非常特别的东西。

需要特别强调的是,区块链不等于炒币,不要因为一时的投机心理,给自己和家庭带来不可承受的后果!




图片


比特币,即使没玩过,但或多或少在热搜里,从同事或朋友的嘴里也听说过。(再次强调,不要做超出自己承受范围的事,指望暴富的大都是待割的韭菜。)


碰到新事物,我们首先应该思考的是为什么会有这个东西,它解决了什么问题。


和层出不穷的编程语言、前端框架一样,诞生新东西的重要初衷,往往是觉得已有的不够好。


对比特币而言,这个「已有的」竞争者就是法币,以及支撑法币流通的银行。


(免责/保命声明:国家法币受法律保护,这里只以美元为例做模型探讨。)


法币和银行这个体系,虽然整体上运行良好,也早已深入人心,但天然存在几个问题。


首当其冲的就是信用问题。为什么一美元钞票就能买到等值的东西,一张白纸就不行?因为有美国政府给美元做信用背书,大家都愿意相信美元的价值。


所以,一个货币的价值,是由一个国家的实力做后盾的。作为对比,美元价值坚挺,而津巴布韦币上的 0 都快印不下了。


如果说法币有国家信用背书,还能认为可信。那作为流通媒介的银行就没那么让人放心了。央行印的新钱,是需要各级银行通过各种方式注入到市场的;存款和贷款作为货币流通的重要途径,也离不开银行。


但远的不说,2008 年金融危机,美国可是好多银行都破产了。这就让人不能不担心自己的钱存在银行是否足够安全。除了破产,银行系统如果遭到攻击,系统数据库里标识的钱有没有可能会不翼而飞呢?


从存款-借款这个简单的交易流程来看这个问题,本质上是因为作为交易中转机构的银行,这个中心化的第三方机构,并不足够可靠


上面这句话的重点在于「中心化」。


只要有这么个居中协调的角色在,一旦这个角色出现信任危机或遭到破坏,整个交易链条就得不到保障了。


抛开电子货币和实物货币的转换,对于转账这个流程来说,中心化角色存在的核心意义,是校验和存储交易流水。校验是为了确保转账人真的有足够的钱;存储流水是为了查验明细,为校验提供依据。


考虑到校验(余额>转账金额)这个操作中,关键的余额可以从所有交易流水中算出,所以其实只需要保存完整的流水即可。





所以,看起来,只需要一个非中心化存储的账本就可以了,里面保存着所有人的所有转账记录。这个账本是公开的,每个人都能查看,每条新的转账记录也会广播给所有人。


于是,我们有了一个公开的分布式账本。


图片


别高兴的太早,分布式账本虽然解决了中心化角色的问题,但又带来了新的问题 -- 公开就意味着所有人都能查看所有账本,也能算出每个账号的余额。那大家还有什么隐私可言?


但这个问题好解决,可以不用提供任何标识现实身份的东西,简单创建一个新钱包,没有人能知道这个钱包在现实生活中属于谁。


紧接着,很容易想到分布式账本带来的第二个问题 -- 身份确认问题。每个人都能往这个账本里写交易流水,那怎么确定谁是谁,怎么防止身份冒充?


中心化机构是通过自身信用和用户身份证等证件来解决这个问题的。但我们现在这个账本一方面缺少这样的信用仲裁机构,另一方面又出于保护隐私而无法和现实身份对应起来,就只能另谋蹊径了。


身处互联网时代,很自然想到了依靠数学。在密码学里已经有了现成的实践 -- 非对称加密


对于非对称加密,这里不做展开。我们只要知道这么用,数学会保证不会出错也无法破解:

  1. 创建一对(公钥,私钥)作为秘钥

  2. 妥善保管自己的私钥,而将公钥公开出去

  3. 用私钥给自己要发送的信息签名,将原信息和签名发送出去

  4. 接收方用发送方的公钥校验签名的正确性,如果无误,就认可这条消息


图片


所以在转账过程中,发送方只需要在账本上写一条转账记录,再用自己的私钥签名,而接收方只需要用转账记录中携带的发送方公钥(比如就用公钥作为钱包地址)做校验,就能知道这条转账记录是否是钱包主人发出的了。


不过,虽然能确定这个转账者的身份,但他钱包里是否有足够的余额支付,接受者只能从自己手上的账本来计算。但分布式账本的原理就决定了,由于网络延时、硬件故障等原因,接收方拿到的账本很难保证无时无刻都是完整的。


于是存在这样一种称为「双花」(double-spend)的情况:钱包 A 先有余额 10 美元,先向 B 支付了 10 美元,B 验证身份通过并给了 A 对等的货物;然后 A 又向 C 支付了 10 美元,C 也验证通过并给了 A 对等的货物。于是 A 的 10 美元花出了 20 美元的效果。


想要解决双花问题也不麻烦,只要确保 C 在接收到 A 的转账之前,一定先接收到 A -> B 这条转账,就能知道这家伙已经余额不足了。


换句话讲,需要保证交易的顺序性


最先想到的是用时间来标识顺序,但我在另一个系列《漫谈分布式系统》的 这篇文章 中,已经提到过,计算机时间是不可靠的(unreliable clocks)。这篇文章里也提过,可以用 vector clock 来解决,但这个办法对一个分布式账本来说显得略重了。


而全局递增 ID 等方式,显然又会回到中心化的路子上去。


递增 ID 类似数组,数组元素通过下标来区分顺序。而经常和数组拿来对比的链表,则通过记录前序和后序地址的方式就能标识顺序。


参考链表的思路,我们也可以在每条转账记录中加上前一条转账记录的标识,来作为对前一条转账记录的认可。这样,就形成了一条链式的转账记录。


这样,A 在尝试双花时,整个链条就会产生分叉,类似 git 里的代码分支一样。链式结构的好处这时就体现了,两条分支不可能都合法,于是不存在双花的可能。


图片


但是,在较短的时间窗口内,是无法判断分支 1 和 2 究竟该采用哪个,也就无法判断 A 到底先转账给了谁,于是只好都先保存下来。


而由于新的交易记录还会继续产生,两条分支都会继续变长。得到越多认可的分支自然会增长地更快而变得更长。这里的认可也就是常说的所谓共识(Consensus)。


既然是分布式账本,那这里的选择策略就比较明朗了,应该选择更广泛的共识,也就是更长的分支。相对短的分支仍然需要保留,以免后面成长为长分支。但把时间拉长了看,没有得到足够共识的短分支会逐渐被淹没丢弃掉。


但是,A 完全可以快速生成很多新的合法转账记录,让分支 2 挤掉分支 1 成为合法分支。这样依然能达到双花的目的。


所以,需要给创建合法记录加点难度,让 A 没办法以一己之力推动更广泛的共识。


前面提到每条转账记录以指针指向前一条记录。这里的指针当然没法用内存地址,只能用和转账记录一一对应的标识,很容易想到哈希的办法。而哈希算法的特性决定了这个标识的唯一性和不可逆性。因此,只要对哈希结果做出限制,就能加大生成合法标识的难度。


比如,可以考虑引入一个幸运数字,并要求转账记录+签名+幸运数字算出的哈希值的前 10 位都是 0。这样一来,只有不停地重复「改变幸运数字-计算哈希值」这个步骤,才有可能「碰巧」得到一个合法的标识。而通过调整 0 的个数,就能调节计算难度和耗时。


计算哈希是个纯考验计算性能(或者叫算力)的东西,没有捷径可走。于是,A 想要推动自己的新共识,就必须拥有比其他所有人更多的算力。在分布式账本网络足够庞大的时候,这个是很难实现的,至少实现成本会非常高。


甚至可以再进一步,不要在当前记录被确认后就立刻完成交易,而是等待后续若干个交易完成后,再做确认操作。


这样,双花的问题就基本解决了。


但增加难度虽然阻止了作弊,却带来了成本。计算机不停计算哈希值,是需要占用 CPU 资源的,并且还会消耗电费,这个开销会劝退很多人。


所以需要给些补偿。每成功计算出一个合法标识后,都由系统发放一定数量的虚拟货币给算出标识的人。系统发放的虚拟货币和大家钱包里的虚拟货币一样,可以自由流通。


这些计算标识的人,就像煤矿里挖矿的工人一样,挖到煤之后会得到奖励,因此也被称为矿工。这个计算标识的动作,也被称为 PoW(Proof of Work)。


于是,这里出现了两条转账记录,一条是用户间的转账记录,一条是系统发放给矿工的奖励记录。这两条记录需要打包在一起后广播出去。另一方面,考虑到性能问题,逐条转账记录计算哈希值性价比不高,优化为以账本页为单位批量计算哈希值,每页账本中都包含了若干条转账记录,其中第一条就是系统发放给矿工的奖励。

我们把一页账本称为一个区块(block),很多区块链接在一起,就组成了一个区块链(block chain)。


图片


而源源不断的矿工奖励,再加上控制全网 50% 以上算力本身的成本,就使得通过双花来作弊,还不如老老实实当矿工。经济学和心理学就能搞定,不再需要额外的技术保障。


但矿工奖励也不是百利而无一害,无偿发送奖励的形式,和各国央行开通印钞机印法币一样,会带来通货膨胀


为了解决这个问题,参考灵活调节挖矿难度的办法,对挖矿奖励也做出调节,每当生成一定数量的账本页后,奖励减半,直至最终不再发放奖励。这样,虚拟货币的发行速度就是递减的,最终货币总量是固定的。


而当系统不再发放矿工奖励后,为了保证系统继续运行,就需要转账发起者为每笔交易支付手续费,作为矿工的奖励,矿工有权选择手续费更高的交易优先确认。


以上,就是比特币的大概设计思路,也自此开辟了区块链的一片新天地。



原创不易

关注/分享/赞赏

给我坚持的动力

图片

版权声明:本文为[秦言夏语]所创,转载请带上原文链接,感谢。 https://toutiao.io/k/yqfg4da