区块链学习笔记(一)
作者:互联网
比特币是一种加密虚拟货币,但是比特币本身不加密,利用hash进行加密。是一个分布式的支付系统。每个节点都维护一个账本,每次交易需要半数以上的节点通过,从而防止某个节点篡改账本。
一、比特币中的密码学
比特币中用到的密码学方法有两个——hash和签名
1.hash
hash是整个区块链的基础。在比特币中利用hash的hash resistance、hiding和puzzle friendly特性来实现加密
hash resistance就是指不存在高效的方法制造hash碰撞。hash resistance是理论上的。并不能证明,只是实践上,对于一个hash函数,没有人找到一种高效构造hash碰撞的方法,那么就说这个hash函数是hash resistance的。
hiding简而言之就是说hash函数不存在逆函数,知道一个hash值不能够构造出被加密的值。如果输入空间非常小,那就可以通过暴力求解的方式来找到输入。在实践中常常在前面加一串随机数扩大输入空间。
puzzle frendly就是没有高效的办法找到一种输入来构造出所需特征的hash值。这个特性可以用于工作量证明。挖矿的过程就是在寻找一个nonce,这个nonce和区块链中区块头里的其他元素合在一起取hash值,使hash值小于一个指定的阈值(target)。想要找到这个nonce就只能暴力枚举。
difficult to solve,but essay to verify性质。就是讲一个nonce是非常难寻找的,但是找到之后将其发布出去,其他节点非常容易验证。
比特币中使用的hash函数是 SHA-256
2.签名
比特币使用非对称加密体系来实现签名。每个节点有一个发布出去的公钥和一个不发布的私钥。公钥用于加密,私钥用于解密。如果节点A要给节点B发送信息,那么就用B的公钥进行加密,B拿到加密后的信息后,再用私钥进行解密。
在数字签名技术中,对交易签名(加密)用的是私钥,验证(解密)用的是公钥。比如A发布了一次交易,那么A用自己的私钥对这次交易进行签名,然后把签名和交易信息都发布出去,其他节点利用A的公钥、签名、交易信息来进行验证,就可以确定这笔交易确实是由A发布的。
二、比特币的数据结构
比特币的每个节点都要维护一个共同的账本,这个账本就是区块链的形式。
1.hash 指针
hash指针不仅保存了一个区块的地址,也保存了前一区块的hash值。区块链通过hash指针将一堆区块连接起来。 每个hash指针保存了前一个区块(包含前一个区块的hash指针在内所有信息)的hash值。因为hash指针的这种计算方法,所以一旦修改了某一个block中的内容,那么这个block后面所有区块的hash指针都会改变。想要验证整个区块链是不是被篡改该,只要比对一下最后一个hash指针就可以了。这样就只需要保存最后一个hash指针
2.merkle tree
merkle tree就是一个二叉树的形式,用hash指针来代替普通的边。tx表示每个交易,对每个tx进行一次hash之后得到底层的hash值,然后每层都将下面两层的hash值拼接起来取hash值得到父节点的hash值,最后得到一个root hash。
3.轻节点中的验证
在比特币系统中,大部分节点都是轻节点,轻节点只保存最近几次交易的hash值。全节点保存区块链中的所有信息。那么如果A与B进行交易,A对B进行了一次转账交易,在图中表示为黄色tx,然后A将这个交易带上自己的签名发布了出去,那么B如果是一个轻节点,如何验证A确实进行了这次交易呢?B从附近全节点中获取到所有红色hash值。然后B计算出黄色的hash值,就可以得到绿色hash值,然后与A给的红色hash值合并得到上方hash值,最终得到了根hash值,与全节点中保存的根hash值进行比对,如果没有问题说明确实进行了这次交易。
标签:hash,比特,笔记,学习,加密,区块,节点,指针 来源: https://www.cnblogs.com/wxyww/p/16340263.html