以太坊采用了许多信息安全及密码学的相关技术,大致有5个,工作量证明(POW),椭圆曲线密码,哈希函数,Merkle Tree,以及电子时间戳机制。
2.1 工作量证明
工作量证明机制(Proof of Work, POW)为区块链关键技术,简单来说就是用来确认你做过一定的工作量的证明。主要特征是工作者须要做出一定难度的工作才能得出结果,但验证方却可以根据该结果很容易的检查出工作者是否做了相对应的工作。流程如下图所示。
如图所示,左边的矿工需要解答密码学谜题以“挖出”一个区块并加入到区块链上。这一个过程要求大量的电力和运算。在系统中,这些谜题已经被设计成艰难而又繁重。当一个矿工解决一个谜题的时候,他们发布他们的区块到网络上接受验证。右边的人验证区块是否属于一条链是一个非常简单且快速的过程。
在工作量证明机制中也使用了哈希函数,矿工在完成计算之后,对计算结果采用Hashcash算法作为POW,其他节点可以用相关的数学公式,即可容易地验证出该数值(新区块)是否有效。
但是,目前来看,工作量证明存在非常多的问题。首先,也是最重要的,工作量证明是个极端低效的系统,因为它消耗大量的电力和能量。
其次,工作量证明并不是抗ASIC的,也就是说,可以购买更快更强劲的ASIC设备的人们和机构通常可以比其他人拥有更高的概率挖到区块。
针对以上这些缺点,人们提出了权益证明(POS),权益证明将让整个挖矿过程虚拟化,并以验证者取代矿工。首先,验证者必须锁定一些他们拥有的币作为保证金。在此之后,他们将开始验证区块。同时,当他们发现一个他们认为可以被加到链上的区块时,他们会通过下赌注来验证它。如果该区块成功上链,验证者就将得到一个与他们的赌注成比例的奖励。
2.2 椭圆曲线密码
在区块链中使用的公钥密码算法是基于椭圆代数的特性开发的椭圆曲线算法。椭圆曲线算法的安全性依赖于著名的数学难题,离散对数问题。椭圆曲线密码的加解密过程如下图。
如上图所示,用户Alice选定一条椭圆曲线Ep(a,b),并取椭圆曲线上一点,作为基点P;用户A选择一个私有密钥k,并生成公开密钥L=kP;用户A将Ep(a,b)和点L、P传给用户Bob;用户Bob接到信息后,将待传输的明文编码到Ep(a,b)上一点M,并产生一个随机整数x(x小于r);用户Bob计算点C1=M+xL,C2=xP;用户Bob将C1,C2传给用户Alice;用户Alice接到信息后,计算C1-LC2,结果就是点M。
椭圆曲线密码的出现也是受到了RSA算法的启发,RSA方法的优点主要在于原理简单,易于使用。但是,随着分解大整数方法的进步及完善、计算机速度的提高以及计算机网络的发展,作为RSA加解密安全保障的大整数要求越来越大。为了保证RSA使用的安全性,其密钥的位数一直在增加,但是,密钥长度的增加导致了其加解密的速度大为降低,硬件实现也变得越来越难以忍受,这对RSA的应用带来了很重的负担,对进行大量安全交易的电子商务更是如此,从而使得其应用范围越来越受到制约。
椭圆曲线加密方法与RSA方法相比,有以下优点:(1)安全性能更高。加密算法的安全性能一般通过该算法的抗攻击强度来反映。ECC和其他几种公钥系统相比,其抗攻击性具有绝对的优势。如160bitECC与1024bitRSA、有相同的安全强度。(2)处理速度快,在私钥处理上(签名与解密),ECC远比RSA快。(3)存储空间占用小,ECC的密钥尺寸比RSA要小的多。
2.3 Merkle Tree
Merkle Tree多数是用来进行比对和验证处理,用户先从可信的源获得文件的Merkle Tree树根。一旦获得了树根,就可以从其他从不可信的源获取Merkle tree。通过可信的树根来检查接受到的Merkle Tree。如果Merkle Tree是损坏的或者虚假的,就从其他源获得另一个Merkle Tree,直到获得一个与可信树根匹配的Merkle Tree。
Merkle Tree可以看作是哈希表的泛化,因此它的主要特征也就是哈希函数的主要特征即,输入数据的稍微改变就会引起Hash运算结果的面目全非,而且根据Hash值反推原始输入数据的特征是困难的,因此可以用来进行验证处理。
Merkle Tree协议对以太坊的长期持续性可以说是至关重要的。区块链网络中存储所有区块的全部数据的节点所需的内存空间急速增长。Merkle Tree协议使以太坊在运行过程中,只需下载区块头,使用区块头确认工作量证明,然后只下载与其交易相关的默克尔树“分支”。这使得节点只要下载整个区块链的一小部分就可以安全地确定任何一笔比特币交易的状态和账户的当前余额。
2.4 时间戳机制
在以太坊中,要求参与交易各方不能否认其行为。这其中需要在经过数字签名的交易上打上一个可信赖的时间戳,从而解决一系列的实际和法律问题。时间戳服务工作流程大致如下:首先用户对文件数据进行Hash摘要处理;用户提出时间戳的请求,Hash值被传递给时间戳服务器;时间戳服务器对哈希值和一个日期/时间记录进行签名,生成时间戳;时间戳数据和文件信息绑定后返还,用户进行下一步电子交易操作。
2.5哈希函数
首先简单介绍一下哈希函数,一个可靠的单向哈希函数必须具备以下特性:(1)输入任意长度数据必须输出固定长度的散列值;(2)能够快速计算出散列值;(3)输入数据有细小差别也要导致散列值差别很大;(4)具备单向性,无法根据散列值反推出原始数据。常见的单向散列函数包括MD4/MD5、SHA-1/SHA-256/SHA-384/SHA-512、RIPEMD/RIPEMD-160、以及以Keccak算法作为标准的SHA-3系列函数。其中MD4/MD5、SHA-1、RIPEMD已经存在攻破的算法,不推荐在极其敏感环境下使用。以太坊中常用的哈希函数有SHA-256,Keccak-256等。
如上图,每一个打包好的区块中都有一个prehash值,这个值是指前一个区块(通常是区块头)的哈希值,在以太坊中此处使用的是SHA-256算法。在需要遍历验证所有区块时,便是通过preHash值索引到上一个区块直至创始区块。同时,在上图中还有一个值得关注的成员:MRH(Merkle Root Hash)即默克尔树根节点哈希值。在区块链的每个Block中都存放了一定数量被矿工打包的交易,区块链的交易记录是不容篡改的。而检测区块中的交易是否被篡改便是根据默克尔树根哈希的值前后是否一致来判断。
2.3中已经介绍过默克尔树,默克尔树的本质就是一个泛化的哈希表,当需要验证区块中的一笔交易是否被篡改过时,我们只需要验证这笔交易的哈希值,同时默克尔树还有一个优点,针对大块数据我们可以只对其中的一部分进行验证,这大大减小了工作量。
以太坊还有很多地方用到了散列函数,例如:区块链上的地址,是由散列法运算公钥而得到的。一个以太坊的账户地址,是以Keccak-256散列法运算一个公钥而得出的。以太坊上的签名是由私钥和需要被签名的数据散列而生成的。