写在开头
荀子曰:“人之性恶,其善者伪也”,意思就是说人性是恶的,这种恶退换货符合马斯洛需求理论的。当你吃不饱的时候你去追求物质,当你有物质基础后你去追求精神享受等等,并不是这种追求有什么问题,而是在追求的过程中总有那么一些人企图通过不正当的手段去到达自己的目的,所谓的恶即是这种恶。我们不是为了剖析人性本恶,更不是探讨马斯洛需求理论,我们要讨论的仅仅是如何防范这种恶,确切的说是如何通过密码学方法防止这种恶,尤其是在区块链中。
密码学概念
在开始之前,我们总是偏向提出一个问题,然后针对这个问题给出答案,如果在解答过程中,出现了问题,我们再针对问题给出答案,不断的填坑,让最初的答案完美解决,并且不会引入其他的问题。同时我们为了让密码学更加“生活化”和“本土化”,不采用大家熟悉的Alice和Bob作为人设,而是用小明、小花和小黑代替,并且假定小明和小花在谈恋爱,小黑是个腹黑的第三者,并且是一个邮递员。故事开始!
1. 加密算法
小明和小花可以说青梅竹马,两小无猜,最近处于热恋期。小明给小花写了一封肉麻的情书,拜托小黑拿给小花。当小黑拿到情书后,觉得再这么下去肯定会失去小花,所以他打开了情书,研读了每一句情话,然后心想:“我靠,原来小明是个衣冠禽兽,情书的内容如此不可描述”,并且当着全村人的的面宣读了小明写给小花的情书(明文形式),这让小明一度无脸面对乡亲父老,小花也觉得很尴尬。小明痛定思痛,发明了一种方法,通过这种方法对内容进行了处理,即使小黑看了情书内容(密文形式)也不知道说的啥。我们把这个方法就叫加密算法,把处理过程叫加密。
在加密过程中涉及到一个重要概念,就是密钥,它是一个参数,作为加密算法的输入,同一个明文在相同的加密算法和不同的密钥计算下产生不同的密文。目前很多知名的加密算法都是公开的,密钥才是决定密文是否安全的重要参数,通常密钥越长,破解的难度越大。
所以加密算法可以理解为:利用密钥对明文内容进行特殊处理,并生成密文,同时根据密钥也可以将密文转化为明文的一种方法。
2. 对称加密
那小明采用了什么加密算法呢?小明把每个汉字和数字对应起来,1代表我,2代表爱,3代表你,小明在信中写到123,小黑一脸懵逼,完全不知道啥意思,可是当小花收到情书后,按照对应关系读懂了小明的意思,脸上泛起了红圈。我们把这个汉字和数字的对应规则叫做加密算法,而具体的对应关系叫做密钥,比如你也可以用2代表我,3代表爱,4代表你。小明用来加密的密钥和小花用来解密的密钥是一样的,我们把这种加密算法叫做对称加密。
常见的对称加密算法有DES、3DES、AES、RC5、RC6等。对称加密的优点是计算速度快,但是需要通讯两端共享密钥,这样会有三个问题:
密钥在共享过程中存在被盗取风险;
如果所有客户端共享一个密钥,那么这个密钥就是一个万能钥匙,啥都可以解密;
如果每个客户端和服务端单独维护一个密钥,这样会有成千上万的密钥,服务端对密钥的管理将成为灾难。
接着讲故事,小黑也不是吃素的,他参透了其中的奥秘,并在小明和小花共享密钥的过程中盗取了这份具体的映射表(密钥),小明说啥肉麻的情话小黑都知道了。尽管小明和小花不停的更换新的加密方式,小黑都能弄到密钥(趴门缝偷听、读唇语等),同时 ,小明不停的更换密钥让小花也很烦躁,有时候都不知道该用哪一个解密了,这让小明和小花的感情一度出现了危机。
3. 非对称加密
小明感受到了来自小花的压力,又陷入了婶婶的沉思,怎么才能让小黑这个傻X破解不了我们的情书呢?这个时候小花告诉小明,你歇一歇,让我(服务端)来。小花的方法是这样的,她生成了一对密钥(公钥和私钥),公钥可以破解通过私钥加密的内容,私钥可以破解公钥加密的内容,是不是觉得太难理解了?举个栗子:可以把公钥或私钥理解为一个保险箱加一把钥匙,公钥的保险箱可以用私钥的钥匙打开,而公钥的钥匙可以打开私钥的保险箱,反之亦然。过程是这样的:
小花生成了一对密钥(公钥和私钥),并把私钥(打开公钥保险箱的钥匙)保存在自己那边,然后把公钥发送给了小明(客户端)
小明收到小花的公钥后,把情书放进了公钥的保险箱中(用公钥加密),并把公钥保险箱(通过公钥加密的内容)发送给了小花
小花收到小明的内容后,用私钥的钥匙打开了公钥的保险箱,并读取了内容,脸上再一次泛起了红圈
非对称加密的特点很明显:1)需要生成一对不同的密钥(公钥和私钥);2)公钥公开,私钥保留;3)加密和解密的密钥不同。目前常见的非对称加密有RSA,DSA,ECC等。
非对称加密比对称加密更加安全,因为与对称加密相比,非对称加密无需在小明(客户端)和小花(服务端)之间共享密钥,只要私钥不发给任何人,即使公钥在网络上被截获,也无法解密。
tips:非对称加密最重要的就是单向函数,即通过可以通过x可以轻易计算f(x),但知道f(x)不能轻易算出x。目前普遍采用欧拉定理作为单向函数,一个重要的common sense是:两个大质数p和q,和容易求的p*q=N,但是知道N比较难求得p和q。
4. 数字签名
由于小明采用了非对称加密,小黑无法破解小明和小花之间的悄悄话,闷闷不乐了好几天。所谓道高一尺,魔高一丈,小黑还是有几把刷子的。他准备恶搞一把小明和小花。和往常一样,小明给小花写了一封情书,这封情书除过写一些你侬我侬的话之外,还告诉小花七夕节两个人约定去一趟杭州的断桥,在游山转水的同时模仿一下白娘子和许仙,巩固一下两人的感情。可是当小明把装有情书的公钥保险箱(用小花公钥加密的情书内容)交给小黑后,小黑并没有转交给小花,而是自己写了一封情书,情书的内容是清明节一起去给小花的爷爷上坟,并将伪造的情书放进小花的公钥保险箱转交给了小花。后果可想而知,小花把小明劈头盖脸的骂了一顿。
不过小花并没有气馁,她知道是小黑在情书内容上动了手脚。经过一个晚上的思考,她决定让小明每次写好情书之后,按一个手印,而且不同的内容要按照不同的姿势按不同的手印。这个手印就叫数字签名,这个手印有两个目的:1)确保这封情书是小明写的,而不是其他人;2)确保这封情书的内容没有被人改动过。这样小黑就没办法进行情书伪造了。
过程如下:
小明写一份情书,然后对情书内容进行处理(SHA或MD)生成一个和情书内容对应的独一无二的内容(摘要信息),然后对生成的内容(摘要)使用自己的私钥加密生成手印(签名),然后连同情书内容一起发给小花(服务端)
小花收到按了手印的情书后,把签名取出来用小明的公钥解密,如果能解密出来,说明是小明写的情书
然后小花把情书内容取出来并进行同样的处理(SHA或MD),得到一个独一无二的内容(摘要),然后和情书中的通过解密得到的内容(摘要)进行比较,如果相同,说明情书没有被改动,反之被改动。
数字签名的目的有两个:1)验证请求或者数据发送方的身份;2)验证发送的请求报文或数据内容是否被篡改。
5. 数字证书
小黑既不能破解也不能伪造小明写给小花的情书,看啥都不顺眼,打王大妈家的狗,偷李大妈家的猫,这都是小黑发泄的行为。不过,小黑并没有放弃,天天捋思路:保险箱是小花给的,我没有钥匙打不开,情书内容是小明写的,这孙子又套上了自己的手印,也没办法伪造,我拿到这两个人的公钥也没用、没用、用......咦?公钥没用?小黑脑子闪过一道灵光,发出了邪恶的笑声。他并没有对情书内容下手,而是在小花将公钥通过公网发送给小明的时候,把小花的保险箱(公钥)换成了自己的保险箱(公钥),小明还不知情,把按了签名的情书塞到了小黑的保险箱并交给了小黑,这还得了!小明不可描述的情书一次又一次的被大家当成反面教材,写在了村头的耻辱柱上。
小花又一次臭骂了小明,骂小明你眼睛瞎了鼻子都出问题了吗:保险箱(公钥)你分辨不出来?跟我这么长时间,保险箱(公钥)上的体香你还分辨不出来吗?小明心里有苦不知道向谁说,为了避免来自小花的一万点暴击,默默的朝村头走去。就这这个时候,背后有人喊:老乡等等。小明转身一看是村里的张大爷,张大爷是村里的名人,不管什么事情,大家都喜欢喊上张大爷一起,小到母鸡下蛋,大到红白喜事。原因很简单,张大爷在村里声望和信誉很高,大家都很尊重和信任他。张大爷说:小伙子,你让你你女朋友把她的保险箱(公钥)放到我这边做一下认证,我给他颁发一个证书,下次你们用我发的证书就可以了“,真的这么神奇吗?小明决定尝试一下:
小花(服务器)向张大爷(第三方CA机构)提交公钥等信息申请认证
张大爷(第三方CA机构)通过各种方式验明小花”正身“后,给小花签发一个认证文件-证书
证书内容:申请者公钥、申请者的组织信息和个人信息、签发机构 CA 的信息、有效时间、证书序列号等信息的明文,同时包含一个签名
签名算法:首先,使用摘要生成函数(MD或SHA)计算公开的明文信息的信息摘要,然后,采用 CA 的私钥对信息摘要进行加密,密文即签名
小明又开始写情书了,这次不需要小花的保险箱(公钥)了,而是需要小花的证书
小花收到小明的请求后,把证书发给小明,小明采用同样的摘要生成函数计算摘要,并利用对应的CA公钥解密签名数据,对比签名信息摘要,如果一致,则合法
小明发情书给小花:
小明(客户端)把情书放进证书中的保险箱(小花的公钥),然后发送给小花,或者;
小明(客户端)生成一个随机数,把随机数放进证书中的保险箱(小花的公钥)发送给小花,小花解密得到随机数。然后小明和小花使用随机数作为钥匙进行书信往来
所有的加密算法或者加密原则基本上都是基于上述概念,区块链亦如此。
常用加密算法
1. 哈希算法
之所以把哈希算法单独提出来进行说明,是因为哈希算法在区块链中留下了浓重的一笔。密码哈希函数是一类数学函数,可以在优先合理的时间内,将任意长度的消息压缩为固定长度的二进制串,其输出值成为哈希值,也称为散列值。哈希算法常用于实现数据完整性(消息摘要)和实体认证(签名),同时也构成多种密码体系和协议的安全保障。
理解碰撞:所谓碰撞就是两个不同的消息(情书)在同一个哈希函数作用下,具备相同的哈希值。哈希函数的安全性是指在现有的计算资源下,找到一个碰撞是不可行的。
目前流行的 Hash 算法包括 MD5、SHA-1 和 SHA-2。在比特币系统中使用了两个密码学哈希函数,一个是SHA256、两一个是RIPEMD160,其中RIPEMD160主要用于生成比特币地址。
1.1 SHA256原理
SHA256是构造区块链所用到的主要密码哈希函数。对于长度小于2^64位的消息,SHA256会产生一个256位的消息摘要。
SHA256是一个Merkle-Damgard结构的迭代哈希函数,计算过程分为两个阶段:1)消息的预处理;2)主循环。在消息的预处理阶段主要完成消息的填充和扩展填充,将所输入的原始消息转化为n个512比特的消息块,之后对每个消息块利用SHA256压缩函数进行处理,如下图所示,当最后一个消息块处理完毕后,最终的输出值就是所所输入的原始消息的SHA256值。
1.2. 哈希的优秀品质
哈希函数具备的优秀品质如下:
抗碰撞性:所谓碰撞就是两个不同的消息(情书)在不同的加密函数作用下,产生相同的密文。抗碰撞性,是指寻找两个碰撞的消息在计算上不可行。不可行不代表不存在。在区块链中SHA256被用来进行工作量证明,而哈希函数的抗碰撞性也常用来检测区块信息的完整性。
原相不可逆:这个之前也说了,就是通过输入值,可以很容易通过哈希函数计算出哈希值,但是通过哈希值,没有办法计算出原来的输入值
难题友好性:简单的可以理解为划定一个知道输入的哈希值范围,然后通过判断哈希值是否落在该范围内,从而推出输入值。这种方法在哈希算法下是不可行的,即难题友好性。同时,哈希函数满足高小熵分布,即变量均匀分布。
2. 椭圆曲线加密算法
椭圆曲线加密(Elliptic Curve Cryptography,ECC)算法是基于椭圆曲线数学的一种非对称加密算法,其安全性依赖于椭圆曲线离线对数问题的困难性。比特币系统的区块链实现使用的椭圆曲线为secp256k1。
2.1 椭圆曲线的密码学原理
椭圆曲线形如下图所示,在椭圆曲线上,两点相加得到的点依然在原椭圆曲线上,由此,在等式kP = P + P + …+ P = Q中,已知k和点P,求点Q比较容易,反之已知点Q和点P,求k却是相当困难的。在实际应用中,k作为私有密钥,而Q作为公开密钥。
2.2 椭圆曲线密码算法优点
椭圆曲线密码算法有点有两个,如下。同时,secp256k1椭圆曲线由于其构造的特殊性,其优化后的实现比其他曲线性能上可以提升30%。
短的密钥长度,这意味着小的贷款和存储要求;
所有的用户可以选择同一基域上的不同的椭圆曲线,可使所有的用户使用同样的操作完成域运算;
3. 零知识证明
3.1 什么是零知识证明
大多数的证明系统主要聚焦在系统本身的可靠性(Soundness)。原先大家都假设,在任何场景下证明者都可能是恶意的一方,并试图误导验证者。但 Goldwasser 等人(几个MIT的研究人员,牛逼啊)却从另一个角度着眼,提出对于验证者的道德质疑。他们的质疑是:我们如何知道在验证过程中,验证者不会泄露任何知识?以及在一次次验证中,验证者是否会从证明者手中从中获得一定量的知识?(不得不佩服这个思考角度很轻奇)
举个栗子:假设你想要使用密码登录网站,标准化的协议流程是这样的:客户端(你)写下密码并发送给服务器,服务器将你的密码进行哈希运算,然后并对比存储在服务器端的密码哈希值。如果两者相同,你便能登录系统。上述过程中,服务器需要拥有你的密码明文,所以你的隐私能否被保障就全看服务器端(也就是本场景下的验证者)的脸色。如果服务器受到攻击,甚至被入侵,那么你的密码就会暴露给恶意攻击者,导致严重的后果。为了应对这种问题,零知识证明在每个场景都有其创新性及必要性。
零知识证明核心是:证明者可以在不告诉验证者某知识是什么的情况下,使得验证者相信他们的确掌握该知识。
3.2 零知识证明的特性
零知识证明需要满足以下特性:
完整性(Completeness):如果论述(校注:这里的“论述”即“零知识证明”中的“知识”)为真,那么诚实的证明者一定能说服诚实的验证者。
可靠性(Soundness):如果证明者不诚实,他们无法通过造假来说服验证者接受某论述。
零知识性(Zero-Knowledge):如果论述为真,验证者无法得知论述实际内容是什么。
3.3 零知识证明举例
你可能会想,你要向我证明你能解出某道题(拥有某种知识),又不告诉我答案,还要我相信你能解出这道题,这不是扯么?别慌,证明给你看。
我们用“寻找瓦尔多”游戏进行举例说明,如下图所示。这个游戏的玩法非常简单,就是在图中寻找一个瓦尔多这个人(眼睛有没有看瞎?)。我们假设有两个Anna(女)和 Carl(男)。Anna 告诉 Carl,她已经找到瓦尔多,但她不想告诉 Carl 瓦尔多的具体位置。现在,Anna 如何在不指出瓦尔多位置的情况下,向 Carl 证明她的确知道正确位置了?
这里有两种证明方法:
中级证明方法:首先Anna把游戏图片打印出来,然后背对着Carl扣出瓦尔多,然后给Carl展示瓦尔多,这里有一个问题就是如果事先Anna就有瓦尔多的图片,那么Anna不用知道瓦尔多的位置也能骗过Carl,证明自己知道瓦尔多的位置。所以需要证明Anna手中的那个瓦尔多就是刚才从刚才打印出来的游戏图片上扣出来的。很简单,只需要事先在打印出来的图片上做上某种无法篡改和编造的标记,这样Anna扣出的瓦尔多后面的标记就能证明是不是打印图片上的。
简易证明方法:不需要打印,只需要找一张不透明的白纸(比游戏图片大),然后Anna在这张白纸上扣一个小洞,然后用这张白纸覆盖在游戏图片上,并将扣出的小洞移动到瓦尔多的位置,这样Carl可以看到瓦尔多真的被Anna找到了,但是由于整个游戏图片被白纸挡着,所以Carl无法知道瓦尔多在游戏图片中的具体位置。
4. 同态加密
4.1 什么是同态加密
我们都知道,在当下的互联网环境下,数据是一个公司的基石,说是黄金一点不为过。但往往会发现出现一些尴尬的场景。比如,两家公司在合作的过程中,A公司有技术,B公司有数据,A公司需要B公司的数据,B公司需要A公司的技术。但是对于B公司,一旦数据泄露就丧失了核心竞争力。面对这种情况,大部分合作到最后都是不欢而散。如何解决这个问题,同态加密或许能解决。
所谓同态加密(Homomorphic Encryption):允许对密文进行处理得到仍然是加密的结果。即对密文直接进行处理,跟对明文进行处理后再对处理结果加密,得到的结果相同。从抽象代数的角度讲,保持了同态性。同态加密可以保证实现处理者无法访问到数据自身的信息。
4.2 同态加密分类
根据同态加密函数的区别,我们可以将同态加密分成三类:
如果满足f(A)+f(B)=f(A+B), 我们将这种加密函数叫做加法同态
如果满足f(A)×f(B)=f(A×B),我们将这种加密函数叫做乘法同态
如果一个加密函数f只满足加法同态,就只能进行加减法运算;如果一个加密函数f只满足乘法同态,就只能进行乘除法运算;如果一个加密函数同时满足加法同态和乘法同态,称为全同态加密。目前RSA 算法对于乘法操作是同态的;Paillier 算法则是对加法同态的;Gentry算法则是全同态的。
区块链加密机制
1. 比特币加密机制
比特币以密码学为支撑,构建了一个完备、安全、去中心化的数字货币体系,解决了数字资产所有权问题、双重支付问题、现实世界的通货膨胀问题甚至还预留了机制使得构建在资产转移之上的智能合同成为可能,可以说比特币就是一部加密机器,每个毛孔都渗透着密码学的气息。
1.1 比特币地址
比特币是一个交易机器(UTXO),交易依赖UTXO的地址,需要兼顾安全、效率和扩展。在比特币中,地址是对公钥的封装,其生成过程如下图所示:
tips:比特币中采用椭圆曲线加密算法生成密钥对,使用一个口令加密私钥,并使用Base58Check对加密的私钥进行编码,保证了私钥的存储安全和传输安全。
需要注意的是比特币地址对公钥进行双重HASH,为什么不用一重sha256算法?这是因为SHA1在2017年被攻破,采用的方法是birthday collision attack。社区觉得SHA2被攻破也是时间的问题,而抵御birthday collision attack的有效方法为双重哈希算法。
1.2 数据存储
比特币的交易信息被包含在一个公开账簿中,该账簿是由一个个区块连接而成,区块由区块头和区块体组成,区块体中主要存储交易信息(明文),区块头用于连接区块,并形成一条链(区块链)。区块头由三组区块元数据组成。首先是一组引用父区块哈希值的数据,这组元数据用于将该区块与区块链中前一区块相连接;第二组元数据,即难度、时间戳和nonce,与挖矿竞争相关;第三组元数据是merkle树根(一种用来有效地总结区块中所有交易的数据结构),结构如下。在这里主要用到了HASH函数,一个是父区块的HASH,用于连接连接前一个区块,还有一个地方就是Merkle Tree,其中也是通过Hash的方式。
这种数据结构有效的避免了双重支付问题,因为攻击者没有办法对这笔支付之前的所有消息进行检索直至追溯到原始的挖矿区块,实际上比特币世界里的每一枚比特币都是被标记可溯源。
1.3 Merkle Tree
之所以把MT(Merkle Tree)单独拿出来说,是因为这个数据结构实在太重要了,为啥重要呢?1)确保交易的完整性;2)防篡改;3)历史留痕可追溯。尤其是在确保交易的完整性方面,MT大大减少了数据的传输量和计算的复杂度,时间复杂度为O(1)。
MT是一种树、具有树的所有特点,MT的叶子节点存储具体的交易,非叶子节点根据下面的所有节点值,按照逐层HASH的方式求得,结构如下图所示:
1.4 交易过程
比特币中仅仅支持交易的UTXO,可以把一笔交易理解为汇款。如下图所示Owner0给Owner1汇款。汇款过程为:
Owner0 先查到 Owner1 的公钥。用 Owner1 的公钥(Public Key)把汇款详情加密。这样,只有 Owner1 本人用自己的私钥(Private Key),才能打开加了密的汇款详情;
为了方便 Owner1 验证这笔汇款的确来自 Owner0,而不是别人,Owner0 发出的汇款单里,除了有加了密的汇款详情,还有 Owner0 的数字签(Signature)。Owner1 拿到汇款时,为了验证这笔汇款的确来自 Owner0,他可以用 Owner0 的公钥,来验证汇款单中 Owner0 的数字签名;
Owner0 发出汇款单时,汇款单不仅仅投递到 Owner1,而且还要广而告之,任何人只要愿意参与 BitCoin 审计,都可以收到全球所有人发出的所有汇款单;
沿用 1、2、3 的原理,Owner1 给 Owner2 汇款,然后 Owner2 给 Owner3 汇款。BitCoin 通过 Hash 机制,把涉及同一枚 BitCoin 的所有汇款交易(Tranaction)串连起来,目的是为了追查重复付款(double spending)的欺诈行为;
1.5 挖矿原理
挖矿实际上是挖矿节点争夺记账权。主要的过程为通过不断的调整nonce值去计算一个双重SHA256,然后和区块target值比较,如果小于target,则成功。可以知道挖矿的本质实际上是不断的调整nonce值进行双重SHA256计算,如下:
SHA256(SHA256(version , prev_hash , root_hash , time , difficulty, nonce))
其中,version为区块版本号;prev_hash为上一个区块的hash值;root_hash为MT的根哈希;time为时间戳;difficulty为全网当前难度;nonce就是需要调整的随机数。
2. 以太坊加密机制
以太坊和比特币最大的区别在于支持上层的智能合约,使得区块链不仅能完成基于UTXO的转账交易,还可以做任何计算机语言可以做的事情,即具备图灵完备性。以太坊的公私钥和比特币一样采用的是secp256k1椭圆曲线加密算法生成,同时以太坊的共识机制也是POW,即挖矿原理和比特币是一样的。
2.1 以太坊公私钥和地址
以太坊的地址和比特币地址不同的是,以太坊地址代表的是一个以太坊账户。以太坊的账户分为两种,一种是外部账户,存储账户余额,用户进行转账交易;一种是合约账户,用户存储合约数据,用于对合约的操作。每一个账户都有一个私钥和公钥,账户地址由公钥生成,去公钥的最后20个字节。
在以太坊中,采用椭圆曲线加密算法secp256k1生成密钥对。私钥保存在keystore文件中,为了确保私钥没有在文件中明文存储,以太坊采用对称加密算法cipher对私钥进行加密(aes-128-ctr加密模式),同时支持自定义密码保护,不需要记住解密密文。过程如下图所示:
大致过程为,首先你需要输入你自己的密码,然后以太坊用一个密钥生成函数(kdf)计算解密密钥,然后将解密密钥和ciphertext密文链接并进行处理,然后和mac比较确保密码正确,最后通过cpher对称函数用解密密钥对ciphertext密文解密,最后就得到了私钥。
有了公钥和私钥,我们看一下以太坊的账户地址是如何生成的?非常简单。以太坊公钥是一个以04开通的64位的字符串,首先去掉04,然后进行keccak-256哈希,得到长度为64的16进制字符串,去掉开头的24为,并在前面加上“0x”,即为以太坊地址。
2.2 数据存储
以太坊为了能够快速回溯,将每一次交易的数据通过MPT进行组织,并以并以[key, value]的形式持久化在内置的LevelDB中。在以太坊中需要存储的数据包括合约和账户的状态、交易信息及交易回执。以太坊区块不同于比特币区块的地方在于用三个MPT(Merkle Patricia Tree)维护交易和合约状态。其中MPT是一种经过改良的、融合了默克尔树和前缀树两种树结构优点的数据结构。这三个MPT分别为StateDB、Transactions、Receipts。以太坊中MPT的结构如下:
以太坊的MPT是对patricia tree 前缀树的改良,具体表现在:
传统的PT的高度不可控,如果出现一个字符串没有公共前缀,会出现一颗极其不平衡的树,从而拖慢整棵树的性能。以太坊通过设置叶子节点和扩展进店对传统PT的对路径进行了压缩,确保了树的高度平缓。
安全系数不高。原PT的节点value以明文存储内容,而以太坊改良后通过RLP编码存储,并且存储的是[key, value]的形式,其中key是PRL编码的hash值,指针不直接指向内存地址,同样为hash值。
2.3 交易签名
这里不对具体的交易过程进行描述,只说明数字签名过程和校验签名过程。
对于签名,其实就是用私钥对消息的哈希进行加密。当一个以太坊节点向另一个节点发送消息时,会用自己的私钥将消息的哈希做签名,然后吧签名和消息本身发送给对方,如下图所示:
节点收到对方发来的消息和签名后,会先做一个“recover”的动作,用消息和签名推导出对方的公钥。再通过公钥,签名,消息的哈希值计算出一个叫“r”的值,这个r是签名的一部分,校验签名就是拿计算出来的r和签名中携带的r经行对比,如果一致就校验通过,如下图所示:
写在最后
最近针对区块链的加密机制进行了梳理,相关内容没有什么新的东西,而且也不一定比网上的一些资料全面。但对于自身而言,根据自己的理解和自己的语言去总结,是一个不断学习和巩固的过程,而且这种方式的印象更深刻。密码学在区块链中扮演着重要的角色,通过各种巧妙的方式,使得区块链上的数据保持了匿名性、唯一性、完整性和安全性。当然密码学目前还是有不少挑战,基于上述加密方式的区块链解决方案也存在诸多问题,比如MPT树的扩容问题。还是那句话,革命尚未成功,同志仍需努力,密码学也一样。
【参考文献】
领取专属 10元无门槛券
私享最新 技术干货