全文摘抄自知乎区块链九尾大神https://zhuanlan.zhihu.com/p/34517415,
仅是为了个人记忆。并后续加入自己的补充理解
哈希运算
哈希运算就是接受一个不限长度的输入(input)返回一个固定长度的输出(output)。
哈希运算有很多种算法,比特币用了其中的一种,SHA256(Secure Hashing Algorithm 256)。
从上图可以看出,无论输入的是什么,哈希值永远是一个256bit的字符串。输入的值不仅仅局限于是词,甚至可以输入一整本小说,或者一首mp3格式的音乐,你也可以输入整个互联网,但他们的哈希值永远是256bit的字符串。
哈希算法要达到公认的安全,需要有以下特征
- 确定性。无论你对同一个输入尝试多少次哈希运算,返回的哈希值是恒定不变的。这个特征十分关键因为如果每次得到的哈希值不一样,输入值就没办法找到,哈希运算就没有应用场景了。
- 快速计算能力。保证运用的流畅性。
- 原像抗力(Pre-image Resistance)。根据输出几乎不可能反溯出输入,因为虽然输入有无数种,万一你可以枚举出正确的输入呢(人品大爆发)。
- 输入微小的改动,哈希值会完全不同。虽然改动很微小,但是哈希值并不会只改变其中的一部分,而是全部更换。
- 碰撞抗力。当有两个不同的输入时,一个是A,一个是B,H(A)是A的哈希值,H(B)是B的哈希值,则H(A) =! H(B),如果A和B不相等,则H(A) = H(B)的可能性几乎为零。
- 解谜性。对应每一个输出值Y, 如果k取值于一个high min-entropy(恕在下实在翻译不出)分布,几乎不可能找到一个输入值X,使得 H(k | x)= Y
什么是high min-entropy?如果从1-5中任意选一个值k,那就是low min-entropy分布;
如果从1-10000000000000000中任意选一个值k,那就是high min-entropy分布。
区块链基于链表的格式,区块包含了数据,并且通过哈希指针连接了前一个区块,如此形成了区块链。
一般的指针只存储了前一个区块的地址,哈希指针就多做了一件事,它还存储了一个区块的哈希值:区块链防篡改的关键。
如果有某个黑客想要篡改其中某一数据块A的数据,那么如果A发生变化,则H(A)也会完全改变,那么下一个数据区块也还会发生改变。因为整个网络中只承认最长的链子,所以他必须不停的修改区块,知道假链变成最长的链。在这个过程中,他面对的是整个网络的其他算力,想要成功的概率几乎为零。