一.密码学基础
1.哈希计算
性质
1.1 抗碰撞性:不同的内容被映射成了一样的哈希值,但是高效的人为制造碰撞是很难的!当然使用蛮力是可以的(输出空间的有限性导致这是不可避免的)主要用于数据的防篡改(可信任)存在例外:md5 可以被人为制造碰撞
1.2 hiding 单向不可逆性:哈希值不会泄露原始数据 但是能够代表原始数据
1.3 puzzle friendly 谜题友好型: 看输入是很难预测哈希结果的,计算的哈希值结果是不可预测的,比如某个输入x,想要哈希值H(x)在某个范围内,没有什么捷径可走,只能一个个去尝试这个x
[很难计算出结果但是很容易验证] 这也是计算量共识机制的设计原理
2.签名
用于账户管理:开户就是创立一对公钥和私钥
asymmetric encryotion algorithm:非对称加密
私钥private key解密,公钥pbkey加密
私钥签名;公钥验签
ps:暴力生成公私钥对来匹配别人的公私钥,以此来破解别人的账户是非常非常难的(前提是你有一个很好的随机源)
3.使用方法
区块链使用的是:公钥加密 私钥解密 ;这个过程反过来叫做签名:私钥加密的数据只有公钥能解密,这样持有公钥的人就能知道收到的数据肯定是私钥拥有者签发的(因为别人没有这个私钥)
二.区块链数据结构:哈希指针+数据组成的区块
1.哈希指针:
不同于普通指针,在指向前一个快的同时还保存了前一个区块的hash值。
这就导致如果我们想篡改其中一个块就必须修改后面所有的块,成本巨大
因此,本地节点一般不需要保存所有的数据块,而是最新的几个,需要前面的快的时候只需要找系统中其他节点拿就可以了,然后使用本地的哈希指针依次验证是否正确即可
2.merkle tree 默克尔树
只要记住根哈希,就能检测出链表中任何部位的修改,相当于保护了整棵树!
二. 分布式xx 协议
1.区块链组成
第一个块:A铸币10个
第二个块:A给B和C转账5个
第三个块:B给C和D转账
一次交易分成输入和输出两部分:输入是收款方的地址和转账方的公钥以及铸币块里的公钥输出(原因下面有解释)
币的来源哈希指 针:每个币的来源都是可追踪溯源的,避免出现 double spending
2.协议内容:
A给B转账,需要的前提条件是(公钥加密--私钥解密)
2.1.输入部分:A要知道B的收款地址:收款地址就是收款方公钥转hash得到的 可以直接对外公开
2.2.输出部分:所有节点都要知道A的公钥来验证A这笔转账的合法性(A的钱是真实存在的 来源合法)
但是存在的可能是A的公钥是假的(安全漏洞),因此A的公钥不能单纯由A自己给出,A给出的公钥应该铸币交易里的输出对得上才可以(A确实有10个币)
2.3.区块结构
_______________________________________________________________________________________________
2.4. 全节点full node 和 轻节点light node
轻节点因为没有以前的交易信息,因此是无法验证交易合法性的
2.5. distributed consensus (账本内容要取得分布式共识distributed consensus,谁来记账?)
2.5.1 每个节点都可以发布交易 参与交易,但是谁来打包区块?
2.5.2 学术上的不可能结论:
①在一个异步系统(asynchronous)里,但凡有一个节点不同步,都是无法达成共识的!
②CAP Theorem:三个性质只能满足两个
Consistency 一致性
Avalibility 网络获得性
Partition torlarance 分区容错性
2.5.3 共识协议要解决的是系统中少数的恶意节点(分区容错)
H(block header) <= target
比特币利用block header中设计好的规则,要求节点进行大量计算才能获得块的记账权
这就是工作量证明,对于恶意节点,如果要执行恶意记账,他就需要比其他节点更强的计算能力,成本会很高
本质上是通过提高犯罪成本来制止犯罪!
2.5.4 激励机制 (mining ”挖矿“)
为了激励节点来记账,规定获得记账权的节点能够在”初块“中获得一定数量的奖励,也就是铸币权利。