初探BlockChain——哈希和电子签名

昨天在B站学习到北京大学肖臻老师的《区块链技术与应用》的公开课,感到豁然开朗。

BlockChain涉及到密码学的两个方面:哈希和电子签名。

1.哈希。有计算机基础的童鞋都比较清楚其机制,这里再简单说一下其基本原理。

哈希的意思就是引入随机数量的输入数据,将其加密,然后得出一个固定输出数据,就叫做哈希。

输入可以是任何数据,只要能代表单个字节,一个MP3文件,整本小说,你的银行账单,甚至是整个互联网。关键在于输入可以无限大。哈希算法可以根据你的需求来进行选择,现在公开的也有很多种算法。关键点在于,这些算法会将无限的输入,转换成固定数量的字节。例如,256字节。

常用的哈希加密算法有:MD5(Message-Digest  Algorithm,MD5消息摘要算法)和SHA(Secure  Hash  Algorithm,安全散列算法),除了这两个之外,还有:DES(Data  Encryption  Standard,数据加密标准)以及AES(Advanced  Encryption  Standard,高级加密标准)。

在BlockChain中涉及到的哈希算法是SHA-256,实际上是双重SHA-256,

即SHA-256(SHA-256(Block_Header))。

哈希的用处很广,比如检查自己上传云的数据重新下载之后是否被篡改过等等,这里不必赘述。

BlockChain是这样使用哈希的:

区块链使用哈希,来表现整个区块链网络现在的状态。输入则是区块链的整个状态,也就是说近期完成的所有转账,输出就是哈希代表的区块链现在的状态。哈希就被用来在区块链网络中让各方相信,整个状态都是相同的。

首个哈希是为第一个区块或者是创世区块(Genesis block)所计算的,通过区块内部的转账数据得出。初始转账的顺序被用来计算创世区块的区块哈希。后来每挖出的新区块,之前的区块哈希也会被使用,同时还有这个区块的转账信息,作为输入值,来确定区块的哈希。这就是区块链的形成方式,每个新区块哈希指向的是之前区块的哈希。

这种哈希系统保证了任何转账记录都不会被改变,因为如果任何部分的转账记录改变,那么归属于这个区块的哈希值也会改变,那么任何接下来的区块哈希也会被改变。那么你可以简单地将哈希对比,就很容易去分辨出哪儿发生了改变。这就非常棒了,因为区块链上的每个人只需要对这256个字节达成共识,就可以代表区块链的状态。以太坊区块链现在是10MB,但是区块链状态只有256字节代表的哈希。

可以在下面链接里看到BlockChain Demo,如下图:

https://anders.com/blockchain/tokens

每一个区块Block包括Block Header和Block Body。Block Body存储交易数据,这些交易数据通过MerkleTree(每个区块所包含的交易组成Markle Tree,具体的会下篇详细介绍)计算出一个哈希。

BlockHeader包括六部分,如图。

人们所说的挖矿用简单的表述是这样的:

H(Block_Header) < Target

在Block_Header中有一个field叫做nonce,这个随机数数就是我们所需要找到的符合条件的数。提到这里就不得不说工作量证明了,及Proof of Work(POW)。因为想要得到nonce,是没有捷径的,需要强大的算力不停地去计算,所有可以被用来当做一种工作的证明。Nonce,Number used once或Number once的缩写,在密码学中Nonce是一个只被使用一次的任意或非重复的随机数值。

举个栗子:

给定的一个基本的字符串"Hello, world!",我们给出的工作量要求是,可以在这个字符串后面添加一个叫做nonce的整数值,对变更后(添加nonce)的字符串进行SHA256哈希运算,如果得到的哈希结果(以16进制的形式表示)是以"0000"开头的,则验证通过。为了达到这个工作量证明的目标。我们需要不停的递增nonce值,对得到的新字符串进行SHA256哈希运算。按照这个规则,我们需要经过4251次计算才能找到恰好前4位为0的哈希散列。

"Hello, world!0" => 1312af178c253f84028d480a6adc1e25e81caa44c749ec81976192e2ec934c64

"Hello, world!1" => e9afc424b79e4f6ab42d99c81156d3a17228d6e1eef4139be78e948a9332a7d8

"Hello, world!2" => ae37343a357a8297591625e7134cbea22f5928be8ca2a32aa475cf05fd4266b7

...

"Hello, world!4248" => 6e110d98b388e77e9c6f042ac6b497cec46660deef75a55ebc7cfdf65cc0b965

"Hello, world!4249" => c004190b822f1669cac8dc37e761cb73652e7832fb814565702245cf26ebb9e6

"Hello, world!4250" => 0000c3af42fc31103f1fdc0151fa747ff87349a4714df7cc52ea464e12dcd4e9

通过这个示例我们对工作量证明机制也有了一个初步的理解。

2.电子签名

电子签名,和真实签名一样,为了证明某人的身份,但是使用加密算法,会使得签名更加安全,不像手写的那种,可以很容易地修改。数字签名可以证明这个信息是从某个特定的人那儿来的,而且不是任何其他人。

在区块链上创造账号是并不需要在任何地方进行注册的。通过非对称加密,可以获得秘钥对——公钥和私钥(对非对称加密和对称加密的童鞋可以再自行查阅一些资料。)私钥意味着隐秘的信息,用来签署电子信息,并发送给别人。签名包含在信息中,以至于接受者可以验证发送者的公钥。这样地话,接收者就可以保证只有发送者可以发送这条消息。也就是说在区块链中的签名是用私钥来加密,公钥是让其他人来验证。

而且区块链上的任何交易都是由发送者使用私钥进行电子签名后才行。这个签名保证了只有账户拥有者可以转移其中的资产。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章