区块链入门
李永乐老师的两个视频可以快速帮助入门区块链
1.比特币和区块链啥原理?矿机挖矿咋回事?
2.比特币交易如何防伪?私钥公钥地址啥意思?
比特币发展历史
在2008年之前,主要研究是比特币的基础例如数据加密、分布式系统等等。
1.中本聪在2008年11月的时候发表了著名的论文《比特币:点对点的电子现金系统》,2009年1月紧接着用他第一版的软件挖掘出了创始区块,价值为50btc;
2.以太坊的设计的目标就是区块链2.0,是一个全球范围内的分布式计算机,有着堪称完美的路线图和系统结构。
3.区块链3.0是指可以将区块链应用于其他场景,绝不仅仅是比特币系统中。
4.比特币4.0
*Hyperledger是一个旨在推动区块链跨行业应用的开源项目;
*多链Multichain是一个区块链软件平台,任何人都可以在上面创建和部署私链(permission chain);
*R3-Corda是一个独特的区块链平台,它允许在法律上可识别的交易对手之间进行私人交易,以易于使用的方式保持传统区块链的优势。
去中心化思想
传统银行和比特币系统的差别
主要区别就是去中心化,银行的背后有可信任第三方(国家信用)来支持交易、保存所有交易数据等等;而比特币系统大家采用共识机制(工作量证明PoW)来确认交易,打包区块链。
加密散列–Hash函数
利用hush函数,把一个字符串通过一定的运算转化为一个摘要的形式,比特币系统中常常提到的便是SHA256,例如输入一个字符串sha256(“Bitcoin”)=1101001101…(一共256位)。hash函数的三大特性:
- collision free,两个输入x≠y,而用哈希函数算出的哈希值相等H(x)=H(y),即“不同输入映射到哈希的同一位置”
哈希碰撞是不可避免的,因为输入空间总是远大于输出空间。按鸽笼原理来看,当实际输入超过输出空间大小时就必然发生哈希碰撞了。
*鸽笼原理:10鸽9笼,必有一笼两个
collision resistance的意思就是没有什么高效的方法去人为的制造哈希碰撞,即知道一个y,没有特定的找到x的方法使得H(x)=H(y)。如果一定要找的话只能用brute-force的方式,即遍历输入空间不断计算哈希值,直到找到恰好碰撞的那个x。 - Hiding,是指哈希函数的计算过程是单向,不可逆的。即可以x→H(x),但无法x←H(x)x。这表示哈希值H(x)没有泄露有关输入x的任何信息。因为总可以蛮力求解,所以hiding成立的前提是输入空间足够大,使得蛮力求解在当下计算力条件下不可行。而且输入的分布要比较均匀,各种取值的可能性都差不多,不然只需要在分布的峰值部分做蛮力求解就很可能能找到输入值了。
- 防篡改+隐藏 以上两个性质可以实现digital commitment,即digital equivalent of a sealed envelop数字信封,例如我们预测某事情,先将结果写入信封,提交给可信任第三方,等结果出来后,比对预测结果。
- Puzzle friendly,这个性质是说哈希值的计算结果是不可预测的,也就是光是去看这个输入没法知道计算出来的哈希值可能是什么样的(具有什么特征)。即例如,想要计算出的哈希值前面有k个连续的0,也没有特定的办法去构造输入。甚至无法知道什么样的输入更有可能得到具有特定特征的哈希值,要想得到这种输入就只能一个一个去试,没有捷径。
比特币挖矿的过程就是去找一个随机数nonce,这个nonce和区块的块头里的其它信息合并在一起作为输入,取哈希值,所得哈希值要小于等于某个指定的阈值:
nonce不是区块块头以外的东西,它是其中的一个域,但是可以人为设置。挖矿的过程就是不停的去试nonce,使得整个块头部分取哈希小于等于target
有了puzzle friendly这个性质,使得比特币挖矿的过程没有捷径可言,只能不停的去试大量的nonce才能找到符合要求的解,所以才能用来用作工作量证明(proof of work)。
区块链结构
哈希指针及链式结构
在区块链中,区块N-1的区块头包含“前置区块头哈希值”字段,而区块N-1的当前区块头哈希值会受到该字段的影响。一旦区块N-1的身份标识发生变化,其后续区块的身份标识均会随之发生变化。
普通链表可以修改里面任何一个结点,对整个链表其它结点没有影响,但在区块链里修改一个区块就会影响到所有比它后产生的区块。
Merkle根
区块头的核心Merkle根:底层(叶子节点)数据的任何变动,都会逐级向上传递到其父节点,一直到Merkle树的根节点使得根节点的哈希值发生变化。根哈希代表了对底层所有数据的“数据摘要”。
整棵树由下往上生成,当某交易信息被篡改,上面的merkle根就会变化,其中Merkel树根值被保存在区块头中,用于总结并快速校验区块中所有交易数据。
共识协议 – 工作量证明
每个结点都可以在本地组装出一个候选区块,把它认为合法的区块放在这个区块里,然后就开始尝试各种nonce值(4 byte),使得H(blockheader)≤target。如果某个结点找到了符合要求的nonce,也就获得了记账权——往比特币去中心化的账本(区块链)里写入下一个区块的权力,其它结点收到这个区块之后,要验证这个区块的合法性(如检查target的编码nBits域设置的是不是符合比特币协议规定的难度要求、检查带nonce的块头哈希值是不是小于target、检查块身中的每个交易是否都有合法的签名、检查每个交易都没有双花等)。
共识协议
创建账户:在本地生成公私钥对就可以
存在问题:有恶意的人就可以进行女巫攻击(sybil attack)只要不断产生账户,然后获取大量的投票权就能控制整个区块链了。
因此比特币系统中不是用账户来投票,而是用计算力来投票,每个结点都可以在本地组装出一个候选区块,把它认为合法的区块放在这个区块里,然后就开始尝试各种nonce值(4 byte),使得
如果某个结点找到了符合要求的nonce,也就获得了记账权——往区块链里写入下一个区块的权力,其它结点收到这个区块之后,要验证这个区块的合法性(如检查target的编码nBits域设置的是不是符合比特币协议规定的难度要求、检查带nonce的块头哈希值是不是小于target、检查块身中的每个交易是否都有合法的签名、检查每个交易都没有双花等)。
在普通的分布式系统中,如分布式哈希表里,取得的共识就是哈希表中的内容。比特币系统中,共识协议取得的共识是去中心化的账本里的交易。
挖矿
挖矿的好处
为什么要挖矿?
1.出块奖励 coinbase tx是唯一一个产生新币的途径,在发布的区块里可以有一个特殊的交易——铸币交易,在这个交易中可以发布一定数量的比特币,这是发行比特币(产生新的比特币)的唯一方法,不必指定币的来源。
2.交易费有些交易的总输入可能略微大于总输出,如可能总输入是1个BTC,总输出是0.99个BTC,这之中的差额就作为记账费给了获得记账权的那个结点。
目前来讲矿工挖矿,主要激励机制还是出块奖励。因为出块奖励是要逐渐减少的,每隔21万个区块就要减半,比特币系统的平均出块时间是10分钟,大约每隔4年出块奖励就会减半。到很多年之后,出块奖励变得很小,这时候交易费就成为主要动机了。
分叉攻击
挖矿难度
调整挖矿难度就是在调整target,以调整目标空间在整个输出空间中所占的比例。比特币中使用的哈希函数是SHA-256,产生的哈希值是256位的,所以整个输出空间是2^256,调整目标空间所占的比例,在这个问题里直观的来看就是最后得到的哈希值前面有多少位0,这个0越多显然值就越小,也就是挖矿难度越大了。
为什么要调整挖矿难度?
系统中的总算力越来越强,如果挖矿难度保持不变,那么平均出块时间会越来越短,这会造成一些问题。容易出现分叉,分叉过度危害系统的安全性、影响共识协议
数据模型
UTXO集合中的每个元素要给出产生这个输出的交易的哈希值,以及它在这个交易中是第几个输出。用这两个信息就可以定位到一个确定的交易中确定的输出。
UTXO可以用来快速检测双花攻击,想知道新发布的交易是不是合法的,要查一下全结点存在内存中的UTXO。要花掉的币只有在这个UTXO这个集合里才是合法的,否则要么是不存在的,要么是已经花过了的。
区块例子
更多应用
案例
区块链分类
区块链数据管理值得研究的问题
块上结点分类
解决方案
研究展望
本文中资料来源NDBC2019会议徐建良老师的ppt,按照老师的ppt思路来了解区块链,补充了自己在北京大学肖臻老师《区块链技术与应用》公开课学习的内容