《区块链技术与应用》北大肖臻老师——课程笔记【4-5】


提示:以下内容只是个人在学习过程中记录的笔记,图片均是肖老师课程的截图,可供参考。如有错误或不足之处,请大家指正。

一、比特币协议

双花攻击是指一笔钱被交易了两次或两次以上。数字货币所面临的一个 主要挑战就是如何防范双花攻击。

一个去中心化的货币要解决两个问题:
1、货币的发行。(谁有权力决定发行数字货币、货币什么时候发行、该发行多少)
2、验证交易的有效性。(如何防范双花攻击)
在比特币系统中,货币的发行是由挖矿决定的。拥有发行货币的权利叫做铸币权。

在比特币系统中,如何防范双花攻击:
需要维护一个数据结构,来检测货币有没有进行过交易,交易方是谁。这个数据结构是由所有的用户维护,也就是区块链。
比特币系统中每个交易都包含了输入和输出两个部分,输入部分要说明币的来源,输出部分要给出收款人的公钥的哈希。
在区块链中有两种哈希指针,一种哈希指针是连接各个区块之间,构成链表,另一种是指向前面某个交易,为了说明币的来源,目的是为了证明交易的来源、币的合法性和防范双花攻击。

检测双花攻击的过程:
假设B只有5个比特币,转给C 2个、D 3个比特币,并且已经进行了签名,然后B又转给了F5个比特币,也进行了签名,如果只验证签名,两个交易都合法,其他节点收到交易后追溯币的来源,发现B与F的交易是不合法的,就不会将B、F的交易接收到区块链中,这样就检测了双花攻击。

在比特币中交易收款地址是通过公钥推算出来的。 比特币系统没有功能可以查询某个指定账户的比特币地址,需要其他渠道来获得,例如某个用户公开自己的比特币地址。

交易要写入区块链的前提条件:
币的来源是正确的。(铸币交易A中会输出转账交易的发送方A的公钥,转账交易输入的A的公钥和铸币交易中的一致就能证明币的来源是正确的。)
发送方的公钥是公开的,可以验证交易签名是否合法
(某个账户b假冒A,用自己的公钥假冒A的公钥发起交易,用自己的私钥签名,但是b的公钥和铸币交易A的公钥不一致,可以证明b是假冒的。)

非对称加密体系,发送方用接收方的公钥加密,接收方收到后用自己的私钥解密,如果接收方需要回复发送方就用发送方的公钥加密,发送方收到回复后用自己的私钥解密。


比特币脚本(BitCoin Script)

在比特币系统中,验证的过程是通过执行脚本来实现的,每个交易的输入也是一个脚本,包括给出公钥等是在脚本里指定的,每个交易的输出也是一个脚本。验证交易是否合法,就要将当前交易的输入脚本和铸币交易的脚本拼在一起,然后看看能否顺利执行,如果可以执行,说明交易是合法的,则反之。
比特币系统中,每个区块实际不止一个交易,可以包括很多交易,这些交易就组织成Merkel tree。每个区块分成块头和块体两部分,块头包括的是一些宏观的信息,比如说使用的比特币的版本协议,区块链中指向前一个区块的指针(hash of previous block header),整颗Merkel tree 的根哈希值,挖矿的难度目标预值(target),随机数(nonce)。整个块头的哈希要小于等于目标预值的哈希。块头里存的就目标预值的编码(nBits)。

块体包括交易列表。
只有块头才有哈希指针的串联性。
系统中的节点包括全节点和轻节点。
全节点(full node):保存所有的节点信息,验证每一个交易,全节点也叫做fully validating node
轻节点(light node):只保存块头的信息。
一般来说,轻节点无法独立验证交易的合法性。系统中大多数节点是轻节点,全节点的数目不多。轻节点没有参与区块链的构造和维护,只是利用了区块链中的一些信息做一些查询等。


区块链是区中心化的账本。
账本的内容要取得分布式的共识。
分布式共识的一个简单例子:分布式哈希表
系统里有很多机器,共同维护一个哈希表,需要取得共识的内容是哈希表中保存的key和value。

FLP impossibility result
FLP:在一个异步的系统里,网络传输时延没有上限就是异步系统(asynchronous),即使系统中只有一个成员是有问题的(faulty),也不可能取得共识。
CAP Theorem 指分布式系统的三个性质
C:consistency 一致性
A:availability 可用性
P:partition tolerance 分区容错性
CAP指任何一个分布式系统,以上三个性质中最多只能满足两个,不可能同时满足三个性质。


Paxos协议

这个协议可以保证一致性,就是如果协议达成了共识,那么这个共识就一定是一致的。但是某些情况下paxos协议有可能一直达不成共识,这种可能性在实际系统中较小,但是客观存在。

比特币 中的共识协议 (consensus in BitCoin)

比特币中共识要解决的一个问题是,有些节点可能是有恶意的。假设系统中大多数节点是好的,少数节点是恶意节点,设置共识形式的方法:
投票形式:比如某个节点提出候选区块,根据交易信息选择哪些信息是合法的,然后把这些交易按照某个顺序打包到区块里,候选区块发布给所有节点,每个节点收到区块后检测交易是否合法,如果都合法就投赞成票,如果有一个交易是非法的就投反对票,最后统计如果赞成票超过半数,这个区块就正式被接受到区块链中。

任何需要投票的方案首先要基于谁有投票权(membership)。如果区块链的投票权是有严格定义的,不是谁都可以随便加入的,比如Hyperledger fabric 联盟链,只有符合条件的才可以加入,在这种情况下,基于投票的方案是可行的。

女巫攻击 (sybil attack)

利用网络中的少数节点控制多个虚假身份,从而利用这些身份控制或影响网络中大量正常节点的攻击方式。

比特币系统的解决女巫攻击的机制:用计算力投票。每个节点都可以在本地组装出一个候选区块,把认为合法的交易放在该区块中,然后尝试各种nonce值(4bytes),看哪一个nonce可以满足H(block header) =<target的要求,求出的哈希在指定范围之内,如果某个节点找到了符合要求的nonce,这个节点就获得了记账权。

记账权就是往比特币这个去中心化账本里写入下一个区块的权利,只有找到了正确的nonce,获得了记账的节点才有权利发布下一个区块。其他节点收到这个区块后要验证这个区块的合法性,检查nonce值是否小于等于目标预值和nBits是不是符合比特币协议中规定的域的难度要求等块头中的信息是否符合要求,再检查块体的交易数据列表,验证每个交易都是合法的,一要有合法签名,二要交易的币不是二次或多次交易,如果有任何一个信息不符合要求,那么这个区块是不能被接收的。

分叉攻击(forking attack)

区块根据前一个区块的哈希指针知道插入的位置。
判断交易是不是双花攻击,是根据交易所在的分支判断,在这个分支上交易的币有没有已经被交易过,即当前交易区块到铸币交易的区块中交易的币有没有被交易过。

如果币在两个不同分支交易过,虽然两个区块交易的内容是合法的,但是不在最长合法链(longest valid chain)上。

比特币协议中规定,接受的区块是在扩展最长的合法链上。


通过往区块链中央的一个位置插入区块,来回滚某个已经发生的交易,在正常情况下,如果有两个节点同时获得记账权,在差不多同一时间发布区块,会出现两个等长的分叉,如果按照最长合法链原则,两个都是最长合法链,这种等长的临时性分叉会维持一段时间,直到其中有某一个分叉继续扩展,这个分叉就成为了最长合法链,另一个分叉就被丢弃了,叫做orphar block。

比特币协议中缺省情况下,每个节点接受最早收到的区块。不同节点根据在网络中的位置不同,其他节点接收到的区块不同。
如何区分其他节点是否接收区块:如果沿着区块继续扩展,说明其他节点认可这个区块。

为什么要消耗很多资源去竞争记账权?
1、获得记账权的节点本身有一定权利,可以决定哪些交易被写入区块中,但这个不是竞争的主要动力。
解决权利驱使竞争的问题的机制:出块奖励(block reword)

比特币协议中规定,获得记账权的节点在发布的区块里可以有一个特殊的交易——铸币交易(coinbase transaction),在这个交易中可以发布一定数量的比特币。
铸币交易是比特币系统中发行新的比特币的唯一方法。

发币数量:(BTC 比特币的符号,每一种加密货币都有货币符号)
一开始时,每一个交易可以发50个BTC,即出块奖励。21万个区块以后,这个奖励要减半,再过21万个区块以后,奖励减半。
在orphar block这个分支上获得的奖励是没有作用的,因为不被大多数节点承认。

比特币的共识机制是靠算力来投票(hash rate)的原因:puzzle friendly性质保证了求解nonce值的过程没有捷径。 hash rate越高,获得记账权,得到奖励的概率越高。

比特币争夺记账权的过程:挖矿(mining)
比特币——“数字黄金”digital gold
争夺记账权的节点——矿工(miner)

二、BTC-实现

1.UTXO

比特币的激励机制
1、出块奖励(竞争主要目的)
2、交易费

比特币是基于交易的账本模式。(Transaction-based ledger)
比特币系统中的全节点要在内存中维护UTXO(unsoent transaction output)数据结构。
UTXO:还没有被花出去的交易输出组成的集合。

注:一个交易可能有多个输出。

UTXO集合当中的每个元素要给出产生这个输出的交易的哈希值以及它在交易中是第几个输出,这两个信息可以定位到UTXO中第几个输出。

UTXO集合的作用:
为了检测新发布的交易是否合法,检测是否有双花攻击

每个交易会消耗一些输出,同时也会产生一些新的输出。
Total inputs = total outputs:
每个交易可以有多个输入和输出,所有输入的金额加起来要等于输出的金额。一个交易可能需要多个签名。
有些交易输入略微大于输出,这个差额就作为交易费给获得记账权发布区块的节点。
发布区块的节点打包区块交易的原因:交易费 (transaction fee)

比特币系统中设置的平均出块时间是每隔十分钟出一个块。

21万区块需要出块平均时间大约是四年。
当出块奖励变得很小时,交易费将成为主要奖励。

基于账户的记账模式(account-based ledger) 如:以太坊
系统需要显式的记录每个账户有多少币。

比特币基于交易的模式隐私保护性较好,但是也需要一些代价,如说明币的来源。
下图是区块例子
区块例子(图片来源于肖老师课程截图)

区块哈希值和上一个区块的哈希值前面都有一串0不是偶然的,目标预值表示成十六进制就是前面有一串0。
凡是符合难度要求的区块头的哈希值前面都有一串0。

图片来源于肖老师课程截图
Block header 的信息
Version :当前比特币协议使用的版本号
Previous block header hash:前一个区块的哈希值
Merkle root hash:Merkel tree根哈希值
Time:区块产生时间,可以在一定范围内进行调整
nBits:挖矿的目标预值,只能按照协议要求定期调整
Nonce:随机数

下图是块头各个域的描述:
图片来源于肖老师课程截图

挖矿:不断尝试nonce来求解puzzles
Bernoulli trial: a random experiment with binary outcome
Bernoulli trial进行大量尝试构成了Bernoulli process:a seqnence of independent Bernoulli trials
Bernoulli process的一个性质:无记忆性memoryless
做大量的尝试实验结果对后面的尝试实验的结果没有影响和关系。

Poisson process:(progress free)
实验的次数很多,成功的次数很少。系统可以推导出来出块时间是符合指数分布。(指数图如下)
图片来源于肖老师课程截图

产生出来的比特币数量构成了一个几何数列。
比特币总量:2100万 (计算过程如下图所示)
图片来源于肖老师课程截图

比特币求解puzzles是在比拼算力之外,没有其他实际意义。比特币越来越难被挖到,是因为出块奖励被人为减少。比特币的稀缺性是人为造成的。

挖矿的过程对于维护比特币系统的安全性是至关重要的。
Bitcoin is secured by mining.对于一个去中心化的没有membership控制的系统来说,挖矿提供了一种凭借算力投票的有效手段。只要大部分算力是掌握在诚实的节点手里,系统的安全性就可以得到保证。挖矿只是概率上的保证,只能说有比较大的概率下一个区块是由一个诚实的区块发布的,而不能一定保证恶意节点得到记账权。

比特币价格上涨,挖矿也越来越激烈,竞争越来越大。


不可篡改性只是一种概率上的保证,多个交易确认后,被篡改的概率会大大降低。
比特币协议缺省的设置是节点最先接收最先听到的交易;交易完成有一定的处理时间。

比特币协议中规定,每个区块的大小是有限制的,不能超过一兆字节,如果交易数目太多,有些交易只能等到下一个区块发布。

Selfish mining自私挖矿
挖的区块先不发布,等待一定区块挖出后再发布。
前提:恶意节点占据网络较大部分有更大概率能成功
好处:减少竞争


猜你喜欢

转载自blog.csdn.net/weixin_45671901/article/details/123794130