欢迎光临
我们一直在努力

北京大学肖臻老师《区块链技术与应用》公开课:05-BTC-实现

文章目录

  • 1. 记账模式
  • 2. 挖矿
  • 3. 攻击

1. 记账模式

比特币采用的是基于交易的账本模式,系统中没有显示的记录账户余额,需要通过交易记录来推算。比如推算A的账户余额,一共有多少交易往A账户上转账,转入了多少币,根据哪些被花了哪些没被花,可以推算出A账户的余额。 与基于交易的模式对应的另一种模式是基于账户的模式。以太坊用的是基于账户的模式,这种模式系统要显示的记录账户余额。基于交易的模式隐私保护性更好。 UTXO是未花费交易输出,UTXO的作用是快速检验双花攻击(Double spending)。花出的币只有在UTXO中才是合法的。如果不在UTXO中这个币要么不存在,要么之前被花过。每个交易会消耗掉一些输出同时会产生新的输出。UTXO集合也是在逐渐增大。 每个交易可以有多个输入也可以有多个输出,输入可以来自多个地址,这也是为什么一个交易要有多个签名。每个输入地址都要提供对应的签名。所有输入金额(total inputs)=所有输出金额(total outputs)。如果输入金额略大于输出金额,那么差额是交易费给矿工的。 比特币中的奖励机制:出块奖励、交易费。

2. 挖矿

block header中的nBits域中存储挖矿的目标域值,这里是目标域值的一个编码后的版本。随着竞争的激烈挖矿越来越难,单纯调整Nonce的值比较大的概率是找不到符合要求的。搜索空间不够大,block header中还有两个区域的值可以调整来增大搜索空间:time和Merkle root。 time:区块产生的时间(4个字节)有一定的调整余地,因为比特币系统不要求精确的时间,可以对time在一定范围内的调整,只要不是太离谱就行。 Merkle root:每个发布的区块里有个特殊的铸币交易,铸币交易的输入中有个Coin base域可以写入任何内容,我们可以把Coin base域当做 Extra Nonce。 真正挖矿时有两层循环:外层循环调整Coin base域的Extra Nonce算出block header中的Merkle root的哈希值后,内层循环调整header中的Nonce。 比特币交易中输入和输出都是用脚本指定,比特币系统中验证交易的合法性就是把输入脚本和输出脚本配对后执行来完成的。不是把同一个交易中的输入脚本和输出脚本配对,而是把这个交易中的输入脚本和前面那个提供币来源的输出脚本配对,如果输入脚本和输出脚本拼接在一起可以顺利执行不出现错误,那么这个交易是合法的。 挖矿提供了一种凭借算力投票的有效手段,只要大部分算力掌握在诚实矿工节点手里,系统的安全性就能够得到保证。

3. 攻击

假如90%算力的诚实矿工,10%算力恶意矿工,那么10%比例恶意矿工获取记账权。 1.那么恶意矿工可以偷币吗? 答:不能,因为恶意矿工无法伪造别人的签名,假如恶意矿工就是把非法交易硬写到区块链中,那么诚实的矿工节点验证区块合法性时通不过,故不会接受这个区块,诚实节点的矿工会接着上一个区块挖矿,因为比特币要求扩展最长合法链,所以大部分算力都不会接着这个不合法的区块挖慢慢这个区块就会被作废,所以偷币不会成功。 2.能把已经花过的币重新花一次(双花攻击)吗? 在这里插入图片描述 (1)交易重放攻击:第四个区块中有交易账户M(余额3BTC)给账户A转了3BTC,如果接着第四个区块往后挖区块五中包含交易账户M给账户A转了3BTC,这时验证交易的合法性,UTXO未花费交易输出中不存在,所以不是合法交易。不合法交易的区块不会被诚实节点的矿工接受,慢慢会被作废。攻击不成功。 (2)分叉攻击:第四个区块中有交易账户M(余额3BTC)给账户A转了3BTC,同时接在第三个区块上的第四个区块交易账户M(余额3BTC)给账户M1转了3BTC,这个交易也是合法的。这时出现了临时性分叉。针对这种情况我们一般的做法是多等几个确认区块再确认这个账户M(余额3BTC)给账户A转了3BTC交易是有效的,缺省情况下是等6个确认区块,才认为前面那个交易是不可篡改的。不可篡改是概率的保证。 3.恶意节点会不会故意不包含某些交易? 总有诚实的矿工节点把这些交易记录到区块链中。 4.slefish mining(自私挖矿)攻击:自私矿工与诚实矿工同时挖矿,但与诚实矿工所采取的策略不同,当自私矿池产生区块时,自私池会有策略地公布区块,而不是立即公布。自私挖矿的策略可以如下图所示: 在这里插入图片描述 那么这种策略有什么好处呢? (1)可以利用这种策略进行双花攻击(double spending) (2)可以消耗其他矿工的算力,让别人做无用功,减少自己的竞争 但与此同时,自私挖矿策略也会有风险。考虑到比特币协议中H(block header)<target的挖矿策略,而block header中须包括前一个区块的hash,所以一旦区块不及时发布,自私矿工采用自私挖矿策略等待下一个连续区块的产生,而在这段时间内诚实矿工在共识块后面又产生了新的区块,则很有可能导致私块的作废,损失将会十分惨重。考虑到双花攻击本身的收益不一定很高,所以发动自私攻击对区块链系统造成损害的案例很少。

赞(0)
未经允许不得转载:171主机测评 » 北京大学肖臻老师《区块链技术与应用》公开课:05-BTC-实现
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址