密码学原理
密码学中的哈希原理有两个重要的性质
1 collision resistance 碰撞防御
亦或者称为collision free,主要是为了保密性。由于人为难以制造hash碰撞,因此hash可以用作与验证
2 hiding
hash值可以从x -> f(x),但是难以通过f(x)去反推出x。
验证信息的准确性使用例子:
预测为了不干扰现实世界,无法直接将明文进行公布,可以提前公布某个hash函数,然后公布hash值,由于hash函数具有collision resistance的性质,预测结果无法被反推出来,在预测的事件发生之后,发布这个明文,可以通过hash函数和提前公布的hash值进行验证。
hash函数往往会面临输入空间不够大的问题,因此可以对原本的输入进行拼接来拓展这个输出空间。
比特币中的hash值具有第三个性质:
3.puzzle friendly:hash值的计算事先不可预测,但是又希望这个hash函数可以让结果落在某个范围内。
挖矿就和这个性质相关
寻找一个随机数nonce和区块的其他值合并在一起,通过hash落在某个范围内[-target,target]内就成功挖矿。
挖矿的工作量就等价了虚拟货币的价值,btc由于难以获取这个nonce,大量的显卡作为成本,因此虚拟货币的价格也一度水涨船高。
虚拟货币的价格增长也带来的显卡的价格增长。
虚拟货币的开户是一个简单的事情:
创建一对公私钥,这个概念来源于非对称加密。可以公开自己的公钥而保存好自己的私钥。解决了对称加密中的密钥分发问题。
交易的过程就是用自己的私钥对交易进行签名,然后链上可以通过公钥对这笔交易进行验证。
生成公私钥的过程也是随机的,且需要好的随机源,防止生成类似或者相同的公私钥,导致资产被窃取。
比特币中的数据结构
hash pointers 哈希指针
指针里存放的往往是地址,一个指针的大小大约是一个字节也就是8位。指针本身存放的就是一块地址。间接去访问某个数据
hash指针不仅仅存放了地址,同时对数据的内容进行了hash
rust
struct hashpoint{
node:*p
hash:string
}
可以认为hash指针是类似于这样的一个结构体
hash chain
哈希链表和普通的链表的区别
:用hash指针代替了普通的指针。
第一个区块被称为创世纪块 genesis block,每个区块都包含着指向前一个区块的hash指针,且每个hash值都是由前面全部区块集体取hash获得的。
因此我们只需要保存一个hash值就可以对前面所有的节点进行验证。
merkle tree
如果不知道这个merkle tree但是一定知道binary tree,树的底层是一系列的区块,每两个块的hash值组成一个新的块,再取hash向上保存,最终形成一颗树,保存祖先节点的hash值就可以验证数据的正确性。
这棵树的节点是一系列的交易。
这棵树有什么用途?
首先链上的节点存储着block header和block body是非常笨重的,但是我们希望有轻量级的验证,因此产生了merkle tree,可以找到叶子的一笔交易,沿着路径找到树根。
可以向全节点获取三个红色hash,然后自底向上计算hash,最终和merkle root 的hash值进行比对,以完成验证。
BTC-协议
思考一个问题,银行是否能够发行数字货币?
由于数字货币的本质是一个文件,存在可以复制的问题,因此不可以。
比特币系统中的转账,需要交易的双方公开地址,就如同银行转账需要银行卡号一样。同时还需要知道A的公钥,公钥本身是一种身份,用来验证这个信息是否是正确的,但是公钥和地址是有区别的,公钥是全公开的,需要所有的人知道,
协议主要是为了区分一些"坏节点"。
添加节点的节点,有权利发布区块取决于计算力,在最新计算出nonce值的区块可以进行发布区块。
比特币系统的实现
比特币是采用基于记账本的交易模式,但是系统并没有记录某个账户有多少币,而是通过记录来计算本账户的余额。
全节点需要维护一个数据结构叫做:UTXO unspend transferd output
还未被花出去的交易的输出,一个交易可能有多个输出
交易的过程
A进行交易的时候 需要把这个交易记录到UTXO中,负责记录的这个区块
相较于btc这种模式,以太坊更加贴近于生活中的模式,即会显示的表明账户中的余额,
发布区块需要获取记账权,获取记账权的节点可以获取一部分的手续费,但是如果这个获取记账权的节点是恶意节点,发布的区块就不会被广大节点接受,那么由于最长链的原则,这个发布的区块会被丢弃。那么这个出块的人就会损失出块奖励。
为了防止交易人对一个货币进行重用,确认时需要等待多个区块被发布之后才能被完全确认。
比特币网络
比特币工作在应用层,引用层表现为一层比特币的区块链,网络层时一个p2p的网络,。
比特币分叉
原来十几条链最后只有一条链,比如在挖矿的时候两个节点都挖到了区块,都可以发布区块,这个时候就会出现分叉
state fork
如果比特币希望更新协议,但是人们又希望不更新,这个时候就会出现
protocol fork
协议分叉又分为硬分叉和软分叉
hard fork
block size limit 区块的大小太小,会限制交易的次数,因此可能需要修改区块的大小。
但是有的节点可能希望大,有的希望小,就会导致双方的认可不一致
新的节点在进来之后会不被少数的区块认可,因此旧结点即使受到最长链的限制,也不会认可最长链,因此就会存在两条合法的链。也就是分叉eth这种货币就是从硬分叉出现的,最初的币种叫做ETC,分叉之后出现了ETH。由于分叉会导致重放攻击,将一笔交易在两条链上重现,因此添加了chain id来辨别分叉的交易。
soft fork
主要出现在缩小块的时候,平时不怎么会出现就不深入探讨了。
看到这里感觉这个课程后续的技术细节似乎无法带给我相关的技术提升,但是还是感谢肖老师对区块链技术的讲解让我认识到了一个具体的区块链世界,在后续学习完相关的应用技术之后,一定回来补完余下的课程,后续会继续更新这个博客。