前言

说起来也有些巧合,在我开始工作之初就有幸接触到区块链,当时那种迷茫中透露着清澈的愚蠢的状态,导致我就没有细入学下去,只知道区块链是个很高大上的东西,具体是什么东西,我也说不上来。在B站百无聊赖的刷视频中,发现了一个评价很高的公开课,北京大学肖臻老师《区块链技术与应用》公开课,整门课主讲比特币和以太币两种加密货币。目前听完了比特币,感觉肖老师讲得很不错。循循善诱,抛出一些问题引发我们的思考。B站有条评论称这是“苏格拉底式的教学”。

想起那段工作的时间,不禁又要感叹一句,我们接触到的人或事,说不定在某个时刻就从脑海里跳出来,影响我们的某个决定。所谓“近朱者赤,近墨者黑”,人,从来不是一座孤岛。

好了,回头再感悟,先聊正经的。

比特币主要用到了密码学中的两个功能:哈希函数和签名。

哈希函数

密码学中用到的哈希函数被称为cryptographic hash function: 它有两个重要的性质:

  • collision(这里指哈希碰撞) resistance: 例如x≠y, H(x)=H(y) 两个不同的输入,输出却是相等的,这就称哈希碰撞。哈希碰撞在理论上是不可避免的,因为输入空间总大于输出空间。但实践过程中,可以认为哈希碰撞无法人为制造。给出x,很难找到另一个x’,使得他们哈希值相同,除非蛮力求解(brute-force)。
    该性质的作用:对一个message求digest。比如message的哈希值是H(message)=digest 如果有人想篡改message,那么他无法保证H(message)不变。
  • hiding 哈希函数的计算过程是单向的,不可逆的。(从H(x)无法推导出x) hiding性质前提是输入空间足够大,分布比较均匀。如果输入空间不够大,一般在输入后面拼接一个随机数,如H(x||nonce)。
    该性质的作用:和collision resistance 结合在一起,用来实现digital commitment(又称为digital equivalent of a sealed envelope)
    把预测结果作为输入x,算出一个哈希值,将哈希值公布。hiding性质保证了人们知道哈希值而无法倒推出预测值。最后再将x公布,因为有collision resistance的性质,预测结果是不可篡改的。

除了密码学中要求的这两个性质外,比特币中用到的哈希函数还有第三个性质:

  • puzzle friendly. 它指哈希值的预算事先是不可预测的。假如哈希值是00…0XX…X,一样事先无法知道哪个值更容易算出这个结果,必须一个一个代入。
    比特币挖矿的过程中实际就是找一个nonce,nonce跟区块的块头里的其他信息合在一起作为输入,得出的哈希值要小于等于某个指定的target,即 H(block header)≤target。block header 指块头,块头里有很多域,其中一个域是我们可以设置的随机数nonce,挖矿的过程是不停地试随机数,使得block header取哈希后落在指定的范围之内。
    puzzle friendly性质保证了挖矿过程中没有捷径 –> 工作量证明(proof of work)

比特币中用的哈希函数叫作SHA-256(secure hash algorithm 256). 以上三个性质它都是满足的。

签名

对称加密中,加密和解密用的是同一个密钥,它的缺点就是密钥的分发不方便,因为在网络上很容易被窃听。非对称加密(asymmetric encryption algorithm) 是用一对密钥,加密用公钥,解密用私钥,加密和解密用的都是接收方的公钥和私钥。公钥是不用保密的,只需要保管私钥。公钥相当于银行账号,别人转账只要知道公钥就行,私钥相当于账户密码,知道私钥可以把账户上钱转走。

任何人都可以在比特币系统中自由开户,只需要在本地创立一个公私钥匙对(public key, private key),这就是一个账户。

假如A想向B转10个比特币,A把交易放在区块链上,别人怎么知道这笔交易是A发起的呢?这就需要A要用自己的私钥给交易签名,其他人收到这笔交易后,要用A的公钥去验证签名。创建账户产生相同公私钥的可能性微乎其微,所以大量创建账户来窃取其他人账户是不可行的。

我们假设产生公私钥时有一个好的随机源(a good source of randomness),产生的公私钥是随机的,如果随机源不好,就有可能产生相同的公私钥。比特币中用的签名算法,不仅要求生成公私钥的时候要有好的随机源,之后每一次签名时也要有好的随机源。只要有一次签名用的随机源不好的话,就有可能泄露私钥。

结语

非对称加密,公钥私钥,搞IT的大佬们都不陌生,因为最基础的git就可以使用公私钥来进行账户和权限的认证,我使用过bigchaindb,这是一个比较简单的区块链数据库,可以用其简单的搭建一个区块链网络,可以参考这个文章,了解一下其中的交易和流程,相信会对区块链有着更深厚的理解。