一个关于区块链概念的简单介绍

说到区块链就不得不提到比特币。

2008 年爆发全球经济危机,当年 11 月 1 日,一个化名为中本聪的人发表了比特币白皮书,《比特币:一个点对点的电子现金系统》。次年 1 月,比特币创世区块诞生。

比特币是一种数字货币,在白皮书中,比特币被设计为一种去中心化的电子记账系统。去中心化和记账是比特币的重点。

对于传统货币来说,记账行为是由银行来完成的。比如说当我们向别人转账时,银行会首先检查我们的账户余额是否足够支付这笔转账,然后记录转账结束后我们的账户中各自还有多少余额,这个过程就是记账。在生活中我们无论是使用银行卡、信用卡进行交易,还是使用支付宝、微信进行转账,记账行为始终是由银行来完成的,这是因为我们信任银行背后的国家的信用,所以将记账交给银行完成。

而在白皮书中,比特币被设计为一种去中心化的货币,记账行为不再经由第三方来完成,我们所有人都是参与记账的对象,并且账本是透明的,每个人随时都可以查看目前为止的所有交易记录。一笔交易从传统的第三方公证的模式转变成点对点模式,不再需要第三方进行公证,因为所有人都可以帮你证明这笔交易的有效性。

举例来说,有甲、乙、丙、丁四个人,现在甲要支付给乙 1 个比特币,那么甲要做的就是向乙支付 1 个比特币,并且将这条信息广播出去。

甲 --- 1 BTC ---> 乙
甲 --- 广播 ---> 丙
甲 --- 广播 ---> 丁

过了一会,乙又向丙支付 2 个比特币,同时也将信息广播出去。

乙 --- 2 BTC ---> 丙
乙 --- 广播 ---> 甲
乙 --- 广播 ---> 丁

再接着丙向丁支付来 5 个比特币,同时也进行广播。

丙 --- 5 BTC ---> 丁
丙 --- 广播 ---> 甲
丙 --- 广播 ---> 乙

现在甲乙丙丁的账本是下面这样的。

甲 --- 1 BTC ---> 乙
乙 --- 2 BTC ---> 丙
丙 --- 5 BTC ---> 丁

这个账本会被打包成一个块,打包出来的这个块就是我们所说的区块(Block)。一个区块的大小是 1MB,里面储存的记录根据每条记录的大小不同,大概在 4000 条左右浮动。这个区块打包完成之后,我们就把它链接到以前的交易记录上,过一段时间之后后续的区块也会被连接到这个区块上,这样就形成了一条链,就是所谓的区块链(Block Chain)。

不过要实现这样一个去中心化的电子记账系统,要解决非常多的问题,比如:

  • 为什么我要帮你记账/打包区块?
    打包会消耗系统资源,而我为什么要消耗系统资源给与己无关的交易记录打包成区块?
  • 该相信谁?
    每个人都可以有自己的账本,那么以谁的账本为准呢?
  • 如何认证和防伪?
    假如有人想要伪装成另一个人进行支付,需要如何证伪呢?
  • 如何防止双重支付?
    比如一个人只有 10 个比特币,但是他同时向两个人支付 10 比特币,结果会怎么样?
  • 如何防止篡改?
    区块链上的交易记录如何防止别人篡改?

其他还有很多问题,但是现在我们就对这些问题进行说明。

为什么我要帮你记账/打包区块?

因为记账是有奖励的,奖励分为两方面。

  • 记账获得手续费;
  • 打包区块获得奖励。

记账可以获得手续费,这个手续费由交易的发起者支付,比如甲要支付给乙 10 个比特币,那么甲需要多出一点作为手续费奖励给记账的人。

成功打包区块还会获得奖励,根据中本聪的比特币白皮书提出的方案,比特币将在每个十分钟里出现一个新的区块,每个区块奖励打包者 50 个比特币,这样持续四年时间。四年后,奖励减半,每个区块奖励打包者 25 个比特币。以此类推,再四年后每个区块奖励 12.5 比特币。这样计算到最后可以计算出比特币的最终发行量在 2100 万左右。

由此可以看出来比特币主要是靠打包奖励的形式扩散。这样奖励多了,竞争打包区块的人也就多了,每个人又因为网络不同,收集的交易记录也可能是不一样的,那么到底以谁的账本为准就成为了下一个问题。

该相信谁?

打包区块奖励丰厚,竞争者也越来越多,每个人所处的区域不同,收集到的交易记录可能也不尽相同,但是每个区块只能由某一个幸运儿打包成功,这个幸运儿将获得奖励,并且他的账本也将被其他人接受,成为公认的账本。但是到底如何决定谁能获得打包的权利?

为了解决这个问题,中本聪提出了一个方法——工作量证明。

简单来说,就是让每个参与打包区块的人都去做一道很复杂的数学题,第一个完成这个数学题的人将有权利进行打包,获得手续费和奖励。

这道数学题是非常复杂的,其复杂到根本无法通过常规的计算方式得到答案,只能通过计算机一次次尝试、碰撞出结果,运气好几次就尝试出答案,运气不好算了无数次都可能无法得出答案。这个过程其实就是我们所谓的“挖矿”——矿工消耗系统资源无数次的去尝试计算这道数学题,如果某一次刚好碰撞出了答案,获得奖励,这就是挖到矿了。

接下来我们说说这个数学题具体是什么。首先我们要来从什么是哈希函数说起。哈希函数,或者说数字摘要,其实指的是一种算法。这种算法根据特定的运算方式将数据转化成一份摘要的形式,并且这份摘要具有唯一性,这意味着如果你想要计算出完全一样的摘要,你必须保证输入数据也是完全一致的,从这个角度来看,哈希函数其实就是计算出某个数据的唯一身份码的算法。

这份摘要还有另外一个很重要的特性,那就是正向计算容易,反向计算几乎是不可能做到的。这意味着源数据将是安全的,你可以快速的计算出它的摘要,但是如果想要从一份摘要里还原出原本的数据?对不起做不到。

比特币的数学题其实就是利用了哈希函数的这个特性。

比特币使用了哈希函数中著名的 SHA256 算法。这是一个由美国国家安全局发明的一个算法,它的功能是将任何数据计算为一个长度为 256 位的二进制数字。无论你输入一段文字、输入一个视频还是输入一张图片,SHA256 的结果都将是一个 256 位的 0 或者 1 的数字。并且 SHA256 还有一个特点,如果你对源数据做出了一点改动,哪怕是加一个标点,删除一个空格这样微小的改动,都将导致 SHA256 的结果发生大幅度的变化,结果无规律可寻。

了解了 SHA256 算法,我们再来说比特币的数学题到底是什么。

首先我们知道区块链上面的每一个区块都储存了一份账本,但是除了账本之外每个区块还有一个头部信息。现在有很多打包者在参与打包,每个打包者会收集周围的交易记录作为自己的账本,拿着这份账本准备接块,首先打包者要做的是准备一个字符串,这个字符串包含很多信息,其中主要包括下面这些:

  • 前面区块的头部信息;
  • 自己的账本信息;
  • 时间戳;
  • 其他信息;
  • 随机数。

准备好字符串之后,比特币要求打包者对其进行两次 SHA256 运算。

sha256(sha256("字符串"));

第一次对字符串计算摘要获得一个 256 位的二进制数字,第二次对这个数字计算摘要,获得另外一份 256 位的二进制数字。比特币要求这个数字的前 n 位必须为 0 才能获得打包的权利,也就是说,如果比特币要求前 9 位为 0 才能获得打包权利的话,你计算两次 SHA256 的结果要像下面这样才行。

000000000101010101010...

如果计算出的结果不满足怎么办?上面说了 SHA256 反向推导是不可能实现的,源数据又大部分都是固定信息,能改的地方不多,所以我们只能在随机数上面动动手脚了。如果计算的结果不满足要求,那么就修改一个随机数继续计算,一直到计算出满足条件的结果为止。

如果这个过程中别人计算出了结果怎么办?那么这个幸运儿就接块成功获得奖励,他的账本将被链接在区块链的末尾,他计算出来的摘要将作为这个区块的头部信息保存。而其他人一看有新的块出现了,只能放弃手里的数据重新计算新的账本,拿到最新的区块的头部信息重新拼出一个字符串,继续挖矿。

解答这到数学题虽然有一定的运气成分在里面,但是随着计算次数增加,成功率是趋于概率的。由于结果是一份二进制数字,每一位数字除了 0 就是 1,结果中到底出现哪一个是 1/2 的概率。如果比特币要求前两位是 0,那就是 1/2 * 1/2 = 1/4 的概率,这意味着计算四次里面可能有一次能成功。在多要求一位为 0 就是 1/8 的概率,计算 8 次可能有一次会成功。由此可知每多增加一位要求为 0,平均计算的次数就要乘以 2,最终要求位数和计算次数的关系将是 2 的 n 次方,即如果要求前 n 位为 0,那么平均计算 2 的 n 次方词就能得到一次满足条件的结果。所以对于矿工来说,越短的时间内能计算越多的次数,挖到矿的概率就越大。这比拼的是 CPU 的计算能力。

回顾上文说到比特币要求前 n 位为 0 才能获得打包的权利,这个 n 其实是一个变量,用来把控计算难度。前面我们说到白皮书设计全球每 10 分钟出一个新的区块,要保证这个机制,比特币会计算出当前全球矿机的计算能力,然后根据这个数据决定到底要求前多少位为 0 可以保证平均每十分钟才出现一个新的区块。

所以,如果你想要获得更多的比特币,你可以做的就是去购买更多的矿机,拼命的去挖矿,这样你才可能获得更多的比特币。

如何保证交易真实?如何认证和防伪?

传统认证方式中第三方银行来对交易双方的身份进行认证和防伪。比特币作为一个去中心化的虚拟货币,在没有第三方公证的情况下如何完成认证和防伪呢?

答案是使用电子签名。比特币账户在注册时会生成一个随机数,这个随机数用来产生一个私钥,私钥可以产生一个公钥,公钥最终产生一个地址。

私钥需要保持私有,它是账户持有者身份认证所需要的,遗失私钥就等于损失了账户上所有比特币,有些人为了保护私钥,会准备一台不联网的计算机,将其保存在上面,或者强行记在脑子里。

公钥和地址是公开的,如果别人要给你转账,只需要提供地址给对方就可以收到转账;如果你要给别人转账,你需要提供公钥和地址才行。

你的私钥可以生成公钥,但是别人通过公钥是无法还原你的私钥的。私钥的功能是对信息进行加密,而公钥则对加密的信息进行解密,这种不对称的加密方式被称作非对称加密。比特币也是使用非对称加密方式进行加密,只有持有私钥的你自己可以以你的身份加密信息,别人无法伪装成你,而所有人都可以通过公钥解密你的信息。

所以如果甲要想向乙支付 1 个比特币,那么甲要做的就是写一条交易记录,然后对这条记录进行 SHA256 运算得出一份数字摘要,使用自己的私钥对摘要进行加密,然后将交易记录、自己的公钥和加密后的密码广播出去。

别人收到甲的广播之后,首先对交易记录进行 SHA256 运算得到一份数字摘要,然后使用甲的公钥对加密后的密码进行解密也得到一份数字摘要,最后对两份摘要进行比对,如果一致则认可这个交易确实是 A 的广播。而如果两份摘要不一致,则表明交易记录是伪造的,所有用户都会拒绝这份交易记录,来保证交易记录的有效性。

到此为止解决了第一个问题,那就是证明甲的交易记录是甲自己发出来的而不是被伪造的。现在我们可以识别甲发出的广播确实是甲发出来的了,但是接下来我们还要确认甲广播的交易是否有效,比如甲交易给乙 10 个比特币,但是甲的余额只有 5 个,显然这样的交易是无效的,那么我们如何甄别呢?

比特币通过追溯账本来做余额检查。每个人在使用比特币时都会下载区块链上从创世区块到当前区块的所有信息,然后做账本追溯,计算到当前区块甲还有多少余额,是否能够支付广播的数额。如果甲的余额足够,那么这条交易有效,会被记入接受广播者的账本中。反之,接收广播的人就会拒绝这条交易记录,这条信息就不会被打包到区块链上。

如何防止双重支付?

假如甲只有 10 个比特币,但是甲几乎同时发出两个广播,一个广播内容是甲支付给乙 10 个比特币,第二个广播内容是甲支付给丙 10 个比特币,那么结果会如何?

甲 --- 10 BTC ---> 乙
甲 --- 10 BTC ---> 丙

由于网络的关系,可能会有两拨人以不同的顺序收到甲的广播。第一波人先收到甲支付给乙 10 个比特币这条广播,然后从区块链上追溯得知甲的余额是 10 个比特币,这条广播会被接受并写入他们的账本中,然后当接收到第二天甲支付给丙 10 个比特币的广播时,由于检查到甲余额不足,这条广播会被拒绝。

另外一波人则相反,由于网络延迟它们可能先收到甲支付给丙 10 个比特币的广播,然后同样追溯余额发现甲的余额足够,所以接受了这条广播,然后接收到甲支付给乙 10 个比特币的广播时检查到余额不足就会拒绝。

不过目前这笔交易还仅在每个人的本地账本中存在,最终只有被链接到区块链上才会最终被承认。这意味着所有参与打包的人中赢得打包权利的人可以决定甲到底是给乙支付了 10 个比特币,还是给丙支付了 10 个比特币。而一旦区块链上生成了记录这笔交易的一个区块,那么所有参与打包的人就会放弃自己本地的账本,转而重新收集交易记录,并参与打包的竞争。

所以在比特币交易中,交易并不是立刻完成的,发生交易后我们需要等待交易记录最终被记录到区块链上才能证明我们最终收到了这笔转账。这也防止了双重支付的出现。

如何防止他人篡改?

到目前我们知道,只有被链接到区块上的交易记录才是被认可的,而且每个人使用私钥和公钥进行不对称加密来广播交易记录,这个交易记录是几乎不可能被伪造的。这样如果有人想要篡改区块链上的交易记录,其实能做的事情很少,他只能删除某个交易记录。那么如何防止他人篡改删除记录呢?

我们先回到上面的例子,甲同时广播两条交易,然后两拨人以不同顺序收到了广播,这两拨人里面有两个幸运儿几乎同时算出了数学题的解,那么区块链上可能就出现了分歧,末尾有两个不同分支的区块存在!

比特币通过最长链原则解决这个问题。如果区块链上出现了分支存在,没关系,后续参与打包者会随机拿到其中一个区块,然后继续打包,等到下面一个区块出现时,两个分支的长度就发生了变化,比特币会自动选择最长的链作为主链,并且所有打包者会重新在主链后面继续打包,因为这条链最有希望成为公认最长链的。

你可能看出来了,实际上如果一个人想要篡改某一个区块的交易记录的话,还是有可能做到的。比如说下面这个情况。

A   B   C   D   E
□ → □ → □ → □ → □

这里有区块链上从 A 到 E 五个区块,最后一个区块是 E,无数打包者都在 E 后面拼命的想要拿到打包权利赢得奖励。此时有一个人想要删除 C 块上的一个交易记录,他可以做到吗?答案是可能的。

他需要做的是删除指定的交易记录后重新打包 C 的账本,然后从 B 块开始重新做数学题,然后打包新的区块链接到 B 的后面,也就是新的 C 块,新的 D 块,新的 E 块。

但是要注意,比特币自动调整难度控制每十分钟出一个区块,在这个人打包新的 C 块、D 块、E 块的时候,全球的矿工都在 E 块后面拼命打包新的区块。要保证他打包的区块最终能成为主链然后被接受,他必须在全球矿工打包出更多新的区块之前把这条分支打包的更长,这样比特币根据最长链原则就会选择他的链作为主链,其他打包者也会自动选择他的链打包新的块,这样他删除某条记录的目的就打到链。不过要做到这一点,他必须掌握足够的计算力,至少他要掌控全球矿工计算力的 50% 以上才有可能达成目的。但是这里就有一个悖论出现了。

这个悖论就是要达到删除某一个交易记录的目的,需要消耗无数倍的成本来推动这件事情。如果这个人掌握了全球矿机的 50% 以上的计算力,那么他也没有必要为了删除某一个记录来对区块重新打包,他用自己掌握的计算力在主链后面继续打包不是赚的更多吗?所以,篡改记录是非常不划算的。比特币通过这样的机制来防止篡改的发生,也由于篡改记录的成本非常之高,所以发生篡改的可能性是非常非常低的。

发生篡改的可能性低也并不是没有可能发生,但是由于篡改的代价随着新的区块增加是指数增长的,所以对大型的交易来说,一般等 6 个区块左右才能最终确定交易成功,基本没有可能被篡改了。

总结

比特币作为一种技术手段实现的去中心化的虚拟货币,十分新颖。它发行量固定,没有滥发风险;它去中心化,交易成本低,手续费低;它安全,可追溯,且匿名,透明。

但是另一方面由于比特币是匿名货币,它给犯罪、贩毒、洗钱等违法行为也带来了同等便利。每个地区的政府对其态度不一,有支持也有打压。也有投机者参与导致比特币价格暴涨暴跌,有人一夜暴富也有人倾家荡产。

技术本身并没有错,区块链作为支撑比特币的技术手段,还是非常有前景的。比如区块链在物流、食品安全方面的应用,也比如智能合约等。