区块链节点间的数据验证:哈希值与非对称加密
在前面的内容中,我们一起学习了区块链网络中各个节点之间是如何建立连接和进行协同合作的。了解了这些知识之后,你有没有好奇过两个节点之间是如何保证传输数据的正确性和判断是否未更改呢?
本期就为你剖析一下区块链网络中节点之间是如何进行数据验证,保证数据的完整性和真实性的。其实特别简单,看完你就知道了!
一、先了解一个概念:哈希值
哈希值是一串固定长度的二进制数值,它是哈希算法(Hash算法)计算的出来的。
哈希算法可以将任意长度的二进制值映射为较短的固定长度的二进制值,这个小的二进制值称为哈希值。哈希值是一段数据唯一且极其紧凑的数值表示形式。如果进行哈希运算的数据哪怕只更改该段落的一个字母,随后的哈希都将产生不同的值。
要找到哈希值为同一个值的两个不同的输入,在计算上是不可能的,所以数据的哈希值可以检验数据的完整性;一般用于快速查找和加密算法。
说人话,哈希值就是通过哈希算法将一段数据进行计算,得出的一个数值。这个数值它有两个特性:单向性和唯一性。
单向性
哈希值是无法通过反向运算得出原始数据的。比如一段数字“1234”可以通过哈希算法得出哈希值A,但是通过哈希值A是永远也没有办法解密出原始数字“1234”的。
唯一性
只有完全相同的数据进行哈希计算得到的哈希值才是相同的,也就是说哈希值和原始数据是唯一对应的,不存在两个不一样的数据得出相同哈希值这种情况。
哈希加密的强大之处在于,我不管你的内容是什么, 只要内容一致得出哈希值就是一致的。这样就可以简单粗暴的对比两条信息是否一致,而不需要去关心数据的细节是什么。
正是因为哈希值的这种属性,才使得哈希算法在区块链网络中起到举足轻重的作用。
二、再了解一个概念:非对称加密
非对称加密算法是一种密钥的保密方法。 非对称加密算法需要两个密钥:公钥(公开密钥)和私钥(私有密钥)。 公钥和私钥是一对,如果用公钥对数据进行加密,只有用对应的私钥才能解密;如果用私钥对数据进行加密,那么只有用对应的公钥才能解密。
如果对加密算法和对公钥和密钥还感觉毫无概念,可以就把它们理解成两个密码,若其中一个密码对数据进行了上锁,则只能用另一个密码进行解锁。
因为对数据进行加密和解密使用的是两个不同的密钥,所以这种算法就叫做非对称加密算法。在区块链网络中某个节点的公钥是全网公开的,私钥只有该节点才拥有。
三、第一个记录交易的节点做了什么?
以比特币网络中的一笔交易信息为例来看记录交易节点和验证交易节点是如何配合的。
比如一个交易A在节点001发生,那节点001就负责记录交易A的具体数据,这里其实首先需要验证交易A的合法性(比如购买方是否有足够的余额来支付),这不是本期重点所以暂不展开,我们假设交易A就是合法的。
节点001在拿到交易A之后会先对交易数据进行哈希运算,生成一个交易哈希值001。然后再用自己的私钥对哈希值001进行签名(加密)生成签名信息,签名信息中包含了交易哈希值001。
节点001完成上述的工作之后就会对外广播,广播内容 = 原始交易信息A + 签名信息。
一图胜千言,处理流程见下图。
四、验证数据的节点做了什么?
假设比特币网络中的节点002收到了节点001发送来的广播内容。节点002得到了“原始交易信息A”和签名信息。这个时候会遇到两个问题:
- 签名信息是不是节点001用自己的私钥签名产生的?
- 节点002是无法判断原始交易信息A是否在传输中发生了更改?
如何解决这些问题呢?
节点002如果能通过节点001的公钥对签名信息进行解密(逆运算)则可以证明该签名信息属于节点001 ,并且在解密之后得到了哈希值001。
节点002对接收到的“原始交易信息A”进行一次哈希运算得到哈希值002。判断交易信息是否发生改变只需要对比哈希值001和哈希值002是否一致即可。
如果一致则证明数据传输无误,通过验证。如果不一致则证明交易信息发生了更改,验证无法通过。
这样就完美的解决了两个节点验证交易一致性的问题了。
一图胜千言,处理流程见下图。
五、总结
两个节点之间的数据验证整体流程我整理到了一个图上,方便大家建立一个更宏观的认识。
在数据验证的过程中,我认为哈希算法是起决定性作用的,有了哈希算法我们不再需要通过判断交易信息的内部逻辑来判断是否改变,或者说我们根本不需要关心数据内容多复杂,而只需要对比两个数值就可以达到判断数据是否一致的目的。
哈希算法真是一个伟大的发明!
版权声明:数字签名:Press.one 如需转载,请联系作者微信:w4533001
作者:liheng,区块链探索者、互联网产品经理,超级个体修炼中,只创作对用户有价值的内容
本文由 @liheng 原创发布于人人都是产品经理。未经许可,禁止转载
题图来自Unsplash,基于CC0协议
您好,那么请问节点002是如何获取001的公钥的么,是001广播的时候一起广播出去了么?
是的,公钥会一起给下一个节点
您好,那么如何保证公钥在广播出去后,在网络中未被更改过呢?
牛逼 很清晰明了果断粉
作者好强大,深入浅出
非常感谢你的认可 😳
科普一下广播,一个网络术语:把信息数据发送到所在系统/网络/封闭空间等内所有的有效对象,让所有的对象都接收到这个发送的数据