BTC的协议,就是BTC应该怎么去设计,需要讨论的去中心化的货币要解决的问题:
1、货币的发行。(谁有权力决定发行数字货币、货币什么时候发行、该发行多少)--->只是单纯的签名会存在双花问题
2、验证交易的有效性。(如何防范双花攻击)3、怎么决定哪些区块可以入链?--->投票,单纯的投票会有问题,可能会有女巫攻击,需要用算力来投票。谁先算到谁入链--->存在几乎同时算到的区块,即分叉攻击-->就要看谁符合最长合法链原则
就看哪个链在比特币系统中,货币的发行是由挖矿决定的。拥有发行货币的权利叫做铸币权。--->记账权
数字货币的签发
数字货币的签发: 数字货币通过一个名为coinbase的交易(即coinbase transaction)创建,这是每个区块的第一笔交易,也是唯一一笔可以“凭空”创建新币的交易。--->区块成功入链之后会获得对应的比特币--->这也就是块奖励(Block reward):初始每21万个区块减半一次,从50 BTC开始--->+21万个区块 25 BTC --->+21万个区块 12.5BTC--->...
交易的有效性与合法性
Double spending attack双花问题
同一笔资金被多次消费。
为了防止双花问题,需要维护一个数据结构,来检测货币有没有进行过交易,交易方是谁。这个数据结构是由所有的用户维护,也就是区块链。
比特币中设计是每笔交易都需要有一个明确的输入(指向一笔之前未花费的交易输出)和输出(指定新的资金所有权)。即:每个交易包含输入和输出两个部分,输入部分要包含币的来源、交易发起方的公钥 。发起方的公钥要与币的来源的HASH要对得上 --->要追溯到coinbase(交易相关的资金的创币交易) 才能证明当前的转账有效。
BitCoin Script 比特币脚本
对交易的输入输出验证过程,在Bitcoin的具体实现是通过执行脚本来实现的:每个交易的输入是一段脚本(包括公钥的指定),每个交易的输出也是一段脚本,把当前交易的输入脚本与提供币的来源的交易的输出脚本拼在一起(合成一段程序),看是否能够顺利执行。--->BitCoin Script
区块结构:
Block header | Block body |
版本 version | transaction list交易列表 |
指向前一个block的指针hash of previous block header | |
整颗Merkle tree的根哈希值 root hash | |
target目标阈值的编码 nBits | |
nonce随机数 |
整个链的安全性
网络节点
full node: fully validating node全节点
light node:系统中大部分是轻节点,不能独立验证交易的合法性,轻节点没有参与区块链的维护,只是利用区块链的信息进行一些查询。
比特币系统中有很多的网络节点,每个节点都可以提交预选块,但不是每一个合法的预算块都可以入链。
Distributed consensus 分布式的共识
账本的内容要取得分布式的共识 distributed consensus--->distributed hash table--->确保所有参与节点同意账本内容。
分布式共识的一个简单例子:分布式哈希表
系统里有很多机器,共同维护一个哈希表,需要取得共识的内容是哈希表中保存的key和value。
不可能结论:
1.FLP impossibility result
asynchronous的系统,哪怕只有一个成员faulty,也没法达成共识。(全票通过才行)
2.CAP Theorem:三个特性最多可以同时达到两个
C:consistency
A:availabilty
P:partition tolerance
Consensus in BitCoin 比特币中的共识
假设:系统中大部分的节点都是好的,少部分是恶意的
比特币中对于共识协议的设计可以理解为怎么决定哪些候选区块可以加入链?
设置共识形式的方法:
投票形式:比如某个节点提出候选区块,根据交易信息选择哪些信息是合法的,然后把这些交易按照某个顺序打包到区块里,候选区块发布给所有节点,每个节点收到区块后检测交易是否合法,如果都合法就投赞成票,如果有一个交易是非法的就投反对票,最后统计如果赞成票超过半数,这个区块就正式被接受到区块链中。
任何需要投票的方案首先要基于谁有投票权(membership)。如果区块链的投票权是有严格定义的,不是谁都可以随便加入的,比如Hyperledger fabric 联盟链,只有符合条件的才可以加入,在这种情况下,基于投票的方案是可行的。
一个去中心化的系统,常见的决定方案是投票,问题:任何投票的方案都需要确定谁有投票权--->membership--->如果比特币系统网络中的节点都拥有投票权,无法排除会有部分恶意的节点,创建多个账号从而影响到最终的投票结果,这是不公平的,这种安全隐患被称为女巫攻击
Sybil attack 女巫攻击
利用网络中的少数节点控制多个虚假身份,从而利用这些身份控制或影响网络中大量正常节点的攻击方式。
比特币系统的解决女巫攻击的机制:用计算力 (Proof-of-Work)投票。每个节点都可以在本地组装出一个候选区块,把认为合法的交易放在该区块中,然后尝试各种nonce值(4bytes,32bits),看哪一个nonce可以满足H(block header) =<target的要求,求出的哈希在指定范围之内,如果某个节点找到了符合要求的nonce,这个节点就获得了记账权。--->也就是谁先算出来谁入链,而不是谁得到大家(节点或账户)的投票多谁入链。
记账权就是往比特币这个去中心化账本里写入下一个区块的权利,只有找到了正确的nonce,获得了记账的节点才有权利发布下一个区块。其他节点收到这个区块后要验证这个区块的合法性,检查nonce值是否小于等于目标预值和nBits是不是符合比特币协议中规定的域的难度要求等块头中的信息是否符合要求,再检查块体的交易数据列表,验证每个交易都是合法的,一要有合法签名,二要交易的币不是二次或多次交易,如果有任何一个信息不符合要求,那么这个区块是不能被接收的.
Forking attack 分叉攻击
试图通过产生分叉来回滚交易。
要解决分叉攻击,就要符合最长合法链原则:如果有两个候选块同时获得记账权:等长的分叉,就看哪个分叉最先发展为logest valid chain 最长合法链
在分叉解决后未被选中的的块被称为:orphan block(被抛弃的块)。
总结:
比特币的共识机制是靠算力(hash rate)来投票的:
hash rate--->决定了投票的权重--->sybil attack是依靠创建账户,但是创建账户并不会影响 hash rate,不会影响每秒算出nonce的数量。puzzle friendly性质保证了求解nonce值的过程没有捷径。 hash rate越高,获得记账权,得到奖励的概率越高。
Mining挖矿
通过计算力来争取记账权的过程,决定了挖矿的难度和可能的奖励。
Bitcoin--->digital gold 数字黄金
Miner--->中国记账权的节点 被称为旷工