比特币其实是一种加密货币(Encryption currency),加密部分内部是利用密码学原理,主要用到密码学中的2个功能:哈希和签名。本篇先来讲第一个功能,也就是哈希。
1.0 哈希算法
定义:哈希(Hash)算法是一种将任意长度的数据压缩到某一固定长度的数据摘要的算法(运用哈希函数),得到的结果称为 哈希值 或 散列值。
特性:
1、输出的长度是固定的(无论输入什么,都会有固定长度的输出值)。
2、确定性:对于相同的输入,哈希函数总是生成相同的哈希值。→ 可以用于验证数据完整性。
3、不可逆性(单向性)(也叫隐蔽性hiding):哈希函数是不可逆的,即从哈希值很难推导出原始输入数据(已知输出值H(x),很难推出输入值x)。除非暴力破解,也就是一个个去试。所以这个隐蔽性的前提是输入的空间要足够大且输入的取值要分布均匀,若输入的空间已经足够大了,但所有取值只在一小块区间中,这样也是不行的。
4、抗哈希碰撞(抗碰撞性Collision Resistance):抗哈希碰撞是指不同的输入产生相同的哈希值的概率非常低(比特币中SHA-256的哈希算法使其有2^256种输出,但有无数个输入,所以可能会存在不同的输入,一样的输出的情况,即x≠y,H(x)=H(y)。目前只能遍历所有的输入x,无法在数学中证明能人为制造碰撞,而有一种哈希算法MD5已经知道怎么人为制造碰撞)。
5、雪崩效应:即使输入数据有微小的变化,哈希值也会发生显著变化。→ 可以用于验证数据完整性。
比特币中还有个谜题友好型(puzzle friendly)的性质,意思是哈希值的计算,事先是不可预测的,想要得到落在某一个范围的H(x),只能遍历x带入计算,这过程中是没有捷径的。
这个性质在区块链中重要的就是挖矿,也是比特币挖矿的本质:
在比特币中,加入了随机数n(nonce),使得x范围足够大且分布均匀(比特币的区块链中,每个区块有一个区块头,区块头中其中的2个域,分别为随机数nonce和目标值target):
矿工们要做的事情就是不断地尝试这个nonce值,并将这个nonce值结合区块头信息一起作为输入,然后计算哈希值。若哈希值小于或等于这个target值,说明挖矿成功,否则不成功,继续尝试其他nonce值。
其实这也是矿工挖矿的过程(即PoW工作量证明,只要矿工计算出n使得H(x)落在某一个范围内就能得到奖励),运用了第3点不可逆性的性质,但是这个性质的前提是输入值x范围足够大且分布均匀。
H(区块头哈希值x+n)< target(指定的目标域值)
要想取得某个nonce值满足上面公式,没有什么捷径可走,只能一个个去尝试,所以只能做大量的工作来验证,这就是所谓的工作量证明POW(proof of work),也就是所谓的比特币挖矿。
值得注意的是,找到随机数n使得哈希值落在某个范围很困难,但是一但找到n,验证哈希值非常容易,这种difficult to sovle, but easy to verify的不对称特点使得篡改变得难以可行。
常见应用:
1、

全网新项目分享交流群
扫码进群,获取最新项目资讯