文章目录
- 如何设计一个数字货币? 《区块链技术与应用》Lesson4
- 1. BTC协议
- 1.1 解决方法1
- 1.2 解决方法2
- 2. 如何验证交易的正确性?
- 3. 区块链中的信息
- 4. 如何写入区块链?
- 4.1 不可能言论 impossible result :
- 4.2 比特币中的共识协议
- 4.3 冲突区块
- 4.4 出块奖励
- 写在最后
如何设计一个数字货币? 《区块链技术与应用》Lesson4
注:本文为北京大学肖臻老师《区块链技术与应用》公开课
学习笔记,不构成任何投资建议,特此告知
1. BTC协议
数字货币与纸质货币的不同:
- 纸质货币花出去了是一个实体,只存在一张
- 数字货币虽然不能修改面值(没有私钥签名),但是能够复制
- 所以造成了我可以用多次的问题
这种情况称为double spending attack
1.1 解决方法1
中心化方法:维护一个大型数据库,每一笔交易都要在里面更改记录
1.2 解决方法2
去中心化方法:区块链
- 铸币交易
- 输入部分:币的来源
- 输出部分:给出公钥证明是B认可的
一个区中心化的货币系统,需要考虑以下两个问题:
- 谁有权发行货币?
- 怎么验证交易的合法性?
有两个Hash指针
- 连接各个区块之间的
- 指向前面的某个交易的(说明币从哪里来)
证明这个钱不是凭空捏造的,防止Double Spending
在比特币中,地址是通过公钥得到的(Hash映射)
注意:
- 比特币系统中没有提供所有用户的账户信息
- 如果两个人要交易,必须知道公钥
在交易中,主要有两个部分:
- 输入部分:说明币的来源
- 输出部分:说明收款人的Hash
2. 如何验证交易的正确性?
交易及验证的比特币系统截图如下所示(默克尔树Merkle Tree)
在挖币初始阶段,会产生一个公钥,说明挖出来的币是谁的,随着交易记录溯源,能够说明这个币是否属于A
在比特币系统中我们通常使用脚本来进行检测,我们使用一个脚本来验证
将当前交易的输入脚本,拼接前面交易的输出脚本,合在一起运行,如果没有错误,就证明这个交易是合法的
3. 区块链中的信息
- Block Header
- version(使用哪个版本的协议)
- hash of previous block header(指向前一个区块的指针)
- Merkel root hash(根哈希值)
- target(挖矿的难度目标值)
- nBits
- 目标阈值的编码
- H(block header) <= target
- nonce(随机数)
只有block header 才有串起来的区块指针
取hash的时候,只会对header取,因为header中的阈值已经保证了block body中的数据是没有被串改的了
- Block body
- transaction list(交易链表)
full node:节点全部信息
- fully validating node
light node: 轻节点(系统中大多数)
4. 如何写入区块链?
每个节点都可以发布交易,哪谁来决定哪些交易能被写道区块中呢?
(我记的账本和你记的账本不太一样?)
为此,我们提出了分布式的共识(distribution consensus)
- distributed hash table
4.1 不可能言论 impossible result :
在分布式系统中,通常有以下几个言论:
-
(FLP):在一个异步系统中,假设网络传输时延没有上限,那么即使只有一个成员是有问题的,那么这个系统也不可能取得共识
-
CAP Theorem:
其中CAP指:
C
:Consistency
(一致性)A
:Availability
(可用性)P
:Partition tolerance
( 分区容忍性)
是指在分布式系统中,这三个性质,只能满足其中的两个,不可能三个都满足
在分布式协议(distributed consensus)中,有这样一个协议:
- Paxos:能够保证一致性
- 只要达成一致性,就一定是共识的
- 但是也有可能达不成一致性
4.2 比特币中的共识协议
Q:在比特币系统中,绝大多数的节点都是好的,只有少部分节点是有恶意的,那么我们应该怎么去设计这个系统呢?
Answer1:投票决定区块是否合法
- 但是出现了投票的Membership的问题(谁有投票权)
- 但是比特币系统中产生一个公私是很容易的
- 那就可以有一个超算,不断产生账户,使得总人数超过其他账户的总和(sybil attack(女巫攻击))
Answer2:使用算力投票
- 每个节点都可以在本地组装一个可选区快
- 然后放到大区块里面
- 如果某个节点找到了符合的随机数(获得记账权),看哪一个满足不等式的要求,求hash
- 只有获得记账权的节点才能够发布block
但是如果仍然发一个block,往前验证,这是正确的
那应该怎么规定去避免的情况?
应该发在区块的最长合法链上
所以区块链只区块的最长合法链上的区块才会被接收
4.3 冲突区块
即使是这样还是会出现一种情况两个矿工同时找到了一个合法的区块,就会在链子上出现分叉的情况
相当于带领了两班人,互相用算力(也有可能是运气)竞争,最后接的长的那个区块会被命名为最终的正确区块
但是不应该只有记账权作为奖励,我们是希望凡是合法的交易都应该写入到区块链中
4.4 出块奖励
比特币规定,获得记账权的那个节点在发布区块的时候会有铸币的权利,可以发送一定数量的比特币
(block reward)
coinbase transaction(发行比特币的唯一方法)
哪能造多少呢?(21w个区块以后就要减半):
- 刚上线的时候 每一个block
50BTC
- 210 000区块以后,数量减半
25BTC
- 再过210 000区块以后,数量再减半
12.5BTC
puzzle friendly:保证了只能通过算力来求解这个问题 (不停地去试随机数)
算力可以折射为(hash rate),这就解决了之前的sybil attack的问题,因为创建多个账户并不会使你拥有更多的算力
写在最后
各位看官,都看到这里了,麻烦动动手指头给博主来个点赞8,您的支持作者最大的创作动力哟!
注: 文中图片以及知识点主要参考了北京大学肖臻老师《区块链技术与应用》的公开课
视频链接《区块链技术与应用》
<(^-^)>
才疏学浅,若有纰漏,恳请斧正
本文章仅用于各位同志作为学习交流之用,不作任何商业用途,若涉及版权问题请速与作者联系,望悉知