区块链: 技术驱动金融 - 第1章 密码学及加密货币概述
来源:《区块链:技术驱动金融》[美]阿尔文德-纳拉亚南 纳什-贝努 爱德华-费尔顿 安德鲁-米勒 史蒂文-戈徳费德 著 林华 王勇 师初 蔡凯龙 许余洁 李耀光 高晓婧 洪浩 译
后续章节笔记将省略该说明。
1.1 密码学哈希函数
一般性的哈希函数(hash function)具有以下三个特性:
- 输入为任意大小的字符串。
- 输出为固定大小的字符串。
- 可进行有效计算,即输入n位字符串,哈希计算的时间复杂度为O(n)。
加密哈希函数除了具备上述基本特性之外,还需要具备以下三个密码学特性:
- 碰撞阻力(collision-resistence)。对于不同的输入,几乎不可能得到相同的输出,换句话说,要想找到两个不同的输入使得映射后的输出相同,在计算上是不可能的。
- 隐秘性(hiding)。给定哈希函数的输出,通过简单的随机选择来确定输入是不可行的。
- 谜题友好(puzzle-friendliness)。给定哈希函数的输出,要找正确的输入,没有比穷举法更好的办法。
在比特币及其他领域中,最常用的一个哈希函数是安全哈希算法(Secure Hash Algorithm 256,简称SHA-256)。
1.2 哈希指针及数据结构
哈希指针是一个指向数据存储位置及其位置数据的哈希值的指针,如下图所示:
图1.2.1 哈希指针
可以利用哈希指针来构建两个重要的数据结构:区块链(Block Chain)和默克尔树(Merkle Tree)。这两个数据结构是区块链技术的基础。
区块链
通过哈希指针构建的链表称为区块链,如图1.2.2。在区块链中,每一个区块包含两个基本部分:区块头(Block Header)和区块主体(Block)。
- 区块头包含一些基本的元数据,其中一个就是上一个区块的哈希值(即哈希指针)。
- 区块主体包含交易(transactions)数据。
图1.2.2 区块链示意图
区块链的一个应用就是“防篡改日志”。要理解区块链如何防篡改,我们可以看一下攻击者要怎么进行篡改才能不被发现。
假设攻击者修改区块k的数据,那么根据哈希函数的特性,区块k的新哈希值将和区块k+1中保存的哈希值不匹配。为了使区块k的新哈希值和区块k+1中保存的哈希值匹配,只好通过继续修改区块k-1,k-2,……的数据。值得注意的是,继续重复修改区块k的数据是无法使得新哈希值与k+1中保存的哈希值匹配,因为哈希函数具有碰撞阻力。
这样,有两个方面阻碍攻击者进行数据篡改:1. 只要妥善锁定区块链头部的数据,即第一个区块,也叫创世区块,那么攻击者就无法使得区块k的新哈希值与k+1中的匹配;2. 修改k-1,k-2,……的数据使得区块k的新哈希值与k+1中的匹配,在计算上将是困难的。基于这两点,没有人会愿意进行数据修改。
默克尔树
使用哈希指针构造的二叉树称为默克尔树,如图1.2.3。
图1.2.3 默克尔树示意图
在默克尔树中,所有数据块都被两两分组,指向这些数据的哈希指针被保存在上一层的父节点中,而父节点再次被两两分组,指向这些父节点的哈希指针将继续往上保存,直到到达树根节点,这个树根节点被称为默克尔树根。
默克尔树在防篡改上表现很好。假设攻击者想要修改默克尔树中某个区块的数据,那么就会导致这个区块的父节点哈希值不匹配,为了使之匹配,攻击者就必须修改这个区块的子节点数据,以此类推。和前述的区块链结构一样,继续修改本区块数据是难以做到哈希值匹配的,因为哈希函数具有碰撞阻力,所以,无论攻击者再怎么修改本区块的数据,也难以得到一个和父节点哈希值匹配的新区块。本质上来说,攻击者需要找一颗以这个区块为根、高度相等的子树,来替换原默克尔树中的子树。而要寻找这样的子树,在计算上是困难的。因此,没有人愿意花费这样的计算力进行数据修改并保证不被发现。
1.3 数字签名
数字签名(digital signatures)应该具备两个基本特性:
- 只有你可以制作你自己的签名,但任何看到它的人都可以验证其有效性。
- 签名只与某一特定文件关联,因此该签名不能用于表明你同意或支持另一份不同的文件。即一份文件一个签名,一一对应。直观地说,就如同别人不能从你的手写签名文件上把签名剪下来,然后贴到另一份文件的末尾,这样的签名是无效的。
下面是通用的签名方案,由三个算法构成:
- (sk, pk) := generateKeys(keysize) generateKeys方法输入keysize,生成一对私钥和公钥。私钥用于签名,公钥用于验证。
- sig := sign(sk, message) sign方法输入sk、message,生成签名。
- isValid := verify(pk, message, sig) verify方法输入公钥、消息、签名,输出为真,表明签名有效;输出为假,表明签名无效。
对于上述签名方案,要求以下两个特性有效:
- 有效签名可以通过验证,即verify(pk, message, sign(sk, message)) == true。
- 签名不可伪造。
显然,第一个特性是对签名有效的最基本要求。
对于签名不可伪造,说的是,尽管对手知道你的公钥,并且看到过一些你已经签名的消息,但是对手仍然无法伪造你在新消息上的签名,因为对手还没有看到你在新消息上的签名。也就是说,对手不能根据过去已知的签名,“学习”出一种“万能”的签名,能够对你未来的消息进行有效签名。
1.4 公钥即身份
把公钥pk认为是参与者或系统的一方,他可以用这个公钥对应的私钥来进行签名,发布声明。
将公钥视为身份的一个结果就是,你可以随时定制任意数量的新身份,即通过数字签名方案中的generateKeys方法来生成不同的公钥和私钥对,然后用公钥代表你的身份,用私钥对消息进行签名。
去中心化身份管理
公钥和私钥体系,帮助我们引入去中心化的身份管理。具体而言,你无需到中央机构进行用户注册,你只需要生成一对公钥和私钥,然后用公钥代表你的身份即可。在比特币语言中,这个身份表示地址,稍有不同的是,比特币或其他加密货币中,不是直接用公钥作为地址,而是用公钥的哈希值,因为公钥有可能太长了。
去中心化身份管理具有很好的匿名性,因为你所创建的身份(公钥)具有足够的随机性。当然,如果你长期用一个身份与其他人进行交流,那这个身份的行为可能会成为别人推断你真实身份的依据,比如“天,这个人的行为很像Joe,可能这个人就是Joe”。
1.5 两种简单的加密货币
略(参看原书)。