区块链中的密码 – 作者:DigApis

区块链的出现,让密码学这门非常晦涩而且理论化的学科,应用到实际工作中,使密码学换发了新的生机。在区块链的工作流程中充斥着大量密码算法,从智能合同,共识机制,钱包地址,方方面面都会看到密码学的影子。

区块链是建立与密码学算法之上的一种分布式记账本。从区块链挖矿或者说区块链交易开始,密码学算法就开始发挥它的重要作用。区块链挖矿其实是计算HASH值得过程,通过大量计算,生成符合特定规范的HASH值,就完成挖矿这个过程。

区块链之所以称为链,是由于前后两个区块之间是有联系的,后一个区块中,包含了前一个区块的hash值,所以区块链可以由后向前追溯,但是不能根据前一区块找到它下一区块。

区块链挖矿:

区块链中,并不会说区块链的长度,而是叫区块高度,即区块链主链上的区块数。创世区块高度为0。区块链以区块为单位存储数据,区块本身就是一个用于记录交易的数据结构。全部交易记录会以交易单的形式存储在区块中。

区块链挖矿是解决数学难题的过程,挖矿相当于通过遍历找出一个数值,这个值带入挖矿算法可以产生具有特定特征的hash值。不同的区块链,工作量证明算法会有差别。

在区块链中生成的交易,不会立即打包成块,而是先要进行交易的验证,通过验证才会有矿工对该交易进行打包。

区块链中交易的认证,由密钥,钱包地址,数字签名三个内容决定。

数字密钥由用户生成,并存储在钱包中。用户通过随机数生成器,生成长度为256位的随机数作为私钥。私钥经过Secp256k1椭圆曲线算法生成长度65字节的公钥。公钥经过SHA256以及RIPEMD160两个算法顺序处理得到长度为20字节的摘要。该摘要在此经过sha256和base58check转换成33字节长度的钱包地址。其中私钥在比特币交易时的用于签名,公钥由私钥生成,用于接收货币。比特币钱包地址由公钥生成。

其实区块链中大部分用户可见的数据,在计算得出之后都要在进行一次Base58Check进行编码。Base58check会在数据尾部夹校验码,用来检测数据是否有误,校验码通过对数据和前缀进行两次sha256得到长32字节的hash值。

 签名与验证:

区块链中公钥算法主要用于对交易进行签名和验证,利用公钥算法,矿工或者说节点,可以证明自己的身份。同时也可以保证数据在整个系统中不被篡改。

当用户进行一次交易之后,区块链将交易信息进行全网广播时,用户需要利用私钥对该消息进行签名,区块链中的其他节点则利用公钥验证该广播信息的真伪。

签名本质是用户利用私钥对交易消息内容进行加密,由于交易本身可能比较大,对消息本身进行签名的计算量比较大,所以通常是对交易信息的hash值进行签名,由于hash算法具有抗碰撞性,所以对hash值进行签名也是一样的。全网广播的内容包括对交易信息的数字签名以及验证所需的公钥。

接收交易信息的节点需要验证消息的有效性和真伪,验证签名的过程,就是利用公钥对签名后的hash进行解密,对比解密得到的hash和原始消息的hash是否一致。验证过程主要目的在于用于检测消息是否是该矿工发出,其次就是检测该消息有没有在传输过程中被篡改。

挖矿算法:

挖矿算法有很多种,其中较知名的包括:比特币挖矿算法-SHA256,以太坊挖矿算法-ethash,Zcash挖矿算法-equihash,等等。

区块链挖矿,以共识机制作为基础。共识机制可以分为:工作量证明机制,权益证明机制,股份授权证明机制,POOL验证池,实用拜占庭PBFT五类。

区块链挖矿其实就是矿工争夺记账权的过程。获得记账权的矿工可以将交易池中的交易打包成一个新的区块。

以比特币为例,过程如下:

生成区块的过程中,矿工首先利用交易池中的交易构造Merkle tree。Merkle tree也被称为hash tree是区块链中一个非常重要的部分,是一棵存储hash值的一棵树,叶子节点用于存储每笔交易的hash值,非叶子节点是对应两个子节点串联字符串的hash值。

挖矿过程就是对区块头进行两次SHA256运算。区块头长80字节,包括版本号,前一区块的hash值,打包区块Merkle tree的根节点hash值,时间戳,难度以及随机数。经计算会得到一个长度32字节的hash值。在计算区块头的hash时,需要不断修改区块头中随机数,直到产生符合要求的hash值。同时交易池中的部分交易也就打包成一个新的区块。当新打包的区块经过6次确认,也就是在后面连接6个新的区块时,该区块就会成为永久区块。

以太坊中涉及的密码算法会更复杂一点,下次再聊。

来源:freebuf.com 2018-11-08 18:57:04 by: DigApis

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论