哈希算法
前两天我的柚子找不到的时候,TP的客服一直让我去查查我的交易哈希值,当时是一脸懵逼,根本就不理解哈希值是干嘛的,有什么用,今天花了3个小时,把币乎众神的关于哈希运算的各种文章都看了一遍,心中总算是有点轮廓了
跟大家一起分享下
首先徐明星的《白话区块链》中关于哈希的定义是这样的
哈希算法是区块链中保证交易信息不被篡改的单向密码机制,哈希算法接受一段明文后,以一种不可逆的方式将其转化为一段长度较短,位数固定的散列数据。
它有两个特点:
1、加密过程不可逆,意味着我们无法通过输出的散列数据倒推原本的明文是什么;
2、输入的明文与输出的散列数据一一对应,任何一个输入信息的变化,都必将导致最终输出的散列数据的变化
在区块链中,通常使用SHA-256(安全散列算法)进行区块加密,这种算法的输入长度无上限,输出的是一串长度固定为一段256位的二进制数字
区块链通过哈希算法对一个交易区块中的交易信息就行加密,并把信息压缩成由一串数字和字母组成的散列字符串。区块链的哈希值能够唯一而准确地标识一个区块,区块链中任意节点通过简单的哈希计算都可以获得这个区块的哈希值,计算出的哈希值没有变化也就意味着区块中的信息没有被篡改。
哈希在区块链中无所不在,你的数字货币每一笔充值、提现和转账都会有一个交易id,而这个id值就是哈希;每一笔交易哈希会存放在区块中,区块和区块之间也就是上一个区块链和下一个区块,也是通过哈希链接的,根据交易哈希和时间点再次生成哈希,进而广播出去被见证后就不能再修改了
那么区块链是如何使用哈希的呢?区块链使用哈希,来表现整个区块链网络现在的状态。输入则是区块链的整个状态,也就是说近期完成的所有转账,输出就是哈希代表的区块链现在的状态。哈希就被用来在区块链网络中让各方相信,整个状态都是相同的。但是这些哈希是怎么算出来的呢?
首个哈希是为第一个区块或者是创世区块所计算的,通过区块内部的转账数据得出。初始转账的顺序被用来计算创世区块的区块哈希。后来每挖出的新区块,之前的区块哈希也会被使用,同时还有这个区块的转账信息,作为输入值,来确定区块的哈希。这就是区块链的形成方式,每个新区块哈希指向地是之前区块的哈希。 这种哈希系统保证了任何转账记录都不会被改变,因为如果任何部分的转账记录改变,那么归属于这个区块的哈希值也会改变,那么任何接下来的区块哈希也会被改变。那么你可以简单地将哈希对比,就很容易去分辨出哪儿发生了改变。
看到一个很好的例子,能够更加有助于我们理解哈希的运用
何大跟李小借了10万元,年利息5%,1年后还本息,用我们的哈希函数就可以这样,Hash(李小借何大10万元,年利息5%,1年后还本息,计息日期2018年10月...) = AD4932D39DEC,李小在账本上就记录了AD4932D39DEC这样一条消息。这时候哈希函数单向性以及高灵敏性的巨大优势就体现出来了,李小是个妻管严,工资基本上交,好不容易存了一点私房钱,记账又怕老婆发现,现在好了,通过哈希函数,李小只需要在日记上记下AD4932D39DEC这串数字就可以了,绝对保证资金隐私和安全。
结果,李小的这个朋友何大也很不靠谱,一年后,翻脸不认账,说自己只借了1万块,这时候,只需要通过哈希函数Hash(李小借何大1万元,年利息5%,1年后还本息,计息日期2018年10月...) ,一验证,发现输出值跟原来的AD4932D39DEC不一致,那么何大也无可狡辩,只能乖乖道歉还钱。这里就运用了哈希函数高灵敏性的特性,只要输入值微小的变化就可以引起哈希值的不同。这也保证了数据的不可篡改,也是区块链技术的重要基础。
挖矿就是打包交易到区块中,然后反复计算区块的哈希值,直到这个区块值满足特定目标值的过程。区块哈希值的计算一般用SHA256哈希算法,这个算法它的参数包括区块的版本号,前一个区块的哈希值,准备打包的交易事务的哈希数的根值,也就是梅克尔根,还有区块的时间戳以及当前难度,还有一个随机数等参数。
在这些参数里,版本号是固定的,前一个区块的哈希值是固定的,当前难度也是固定的,因此,能变的参数只有梅克尔根,区块的时间戳和随机数。挖矿就是重复的计算区块头的哈希值这样一个过程,在计算过程中间要不断的修改参数去进行多次的尝试。
这里面能够修改的参数,就是刚才讲的随机数,还有时间戳和梅克尔根,实际上,主要的能够修的就是随机数。
最终,希望能够计算到一个与这个目标难度值匹配的目标值。用一句话总结,挖矿实际上就是一个反复执行哈希算法的过程。
由于输出的长度是固定的,而输入的长度不受限制,所以从理论上肯定能找到2个数值x≠y,但是hash(x)=hash(y)的,我们把这种情况称为哈希碰撞
比特币的挖矿实际上就是通过哈希碰撞来抢到记账权,从而获得比特币奖励的
在比特币的工作量证明机制下,比特币网络里任何人都可以争取记账权,谁先解决一道与记账相关的数学题谁就先记账。这种数学题有个特点——解起来很难,验证很容易。
再举个栗子:
“假设解题是在扔3个骰子,谁扔出来点数小于5就对了,扔出来比较困难,但是验证却很简单,”孙小小用了一个近似的例子。
但是真实的题目并不是这么简单,其难度相当于1亿个骰子扔出小于1亿零50的数字,谁先扔出来,谁就获得记账权。此时,1亿零50就是个哈希值,扔骰子的过程叫做哈希碰撞,而挖矿算力的单位就是每秒钟多少次哈希碰撞。
目前比特币全网算力达到236万万亿次哈希碰撞每秒,相当于20多万个50米长的标准游泳池里面水滴的数目。但即便是这么大的算力,也需要10分钟左右才能碰撞到一个符合要求的哈希值。
希望看完这些大家能对哈希值,哈希算法有个初步的认识
有兴趣的朋友们可以上下面网站去试试哈希算法的魅力
http://www.fileformat.info/tool/hash.htm
网友评论