区块链笔记-(肖臻)(二刷自用笔记)-----三

BTC挖矿难度

H(block header)<=target

SHA-256 这个产生的哈希值是256位。。比如说256位的哈希值,要是合法的区块,要求算出来的哈希,前面至少有70个0。当然这只是通俗的说法,因为这个目标预值,并不是说前面都是0,从某一个位置开始,后面都变成了1。

difficulty=difficulty_ 1_ target / target。上面是指挖矿难度等于1的时候所对应的目标预值,挖矿难度最小就是1,这个时候对应的目标预值是个非常大的数。

为什么要调整挖矿难度呢?如果不调会有什么问题呢?系统里的总算力越来越强,挖矿难度保持不变的话,出块时间是越来越短的。

出块时间越来越短,会有什么问题吗?
比如说不到一秒就出一个区块,区块在网络上传播的时间可能需要几十秒,底层的比特币网络可能需要几十秒才能让其他节点都收到。别的节点没有收到这个区块之前还是继续沿着已有的区块链往下扩展。如果有两个节点同时都发布一个区块,这个时候就会出现分岔。会出现多分叉,算力可能不需要51pers了,10可能都可以。

(以太坊)

那10分钟的出块时间是不是最优的呢?不一定。改成其他值也可以,有间隔只是说应该有个常数范围。以太坊系统出块时间就降低到了15s,所以以太坊的出块速度是比特币的40倍。

出块时间大幅度下降之后,以太坊就要设计新的协议,叫ghost。在该协议中,这些分叉,产生的orphan block(即产生最长合法链后另一个要被丢弃的区块)就不能丢弃掉了,而是也要给它们一些奖励,这叫uncle reward。以太坊也要调整挖矿难度,使出块时间保持在15s。

(BTC)

target =target×(actual time/expected time)。actual time指产生2016个区块实际花费的时间,expected time指产生2016个区块应用的时间,即2016×10min。 两个星期调整一次难度,2016个区块。

如果一个节点不调,将区块发布出去,诚实的节点是不会认的。nBits是target一个编码的版本,在block header里没有直接存储target的域,因为target的域是256位,直接存target的话要32个字节。nBits在header里只有四个字节,所以可以认为是它的一个压缩编码。

如果遇到有恶意的矿工,该调的时候不调,这时检查区块的合法性就通不过。因为每个节点要独立的验证发布的区块的合法性。检查的内容就包括:nBits,目标预值设的对不对。如果投机取巧设计一个过大的目标预值,使得你自己挖矿容易了,但这个区块是不会被接受的。

挖矿

全节点轻节点
一直在线不是一直在线
在本地硬盘上维护完整区块链信息不保存整个区块链,只需要保存每隔区块块头
在内存中维护UTXO集合,以便于快速检验交易合法性不保存全部交易,只保存和自己有关的交易
监听比特币网络中交易内容,验证每个交易合法性无法验证大多数交易合法性,只能检验和自己相关的交易合法性
决定哪些交易会打包到区块中无法检测网上发布的区块正确性
监听其他矿工挖出的区块,验证其合法性可以验证挖矿难度
挖矿: 1. 决定沿着哪条链挖下去。 2. 当出现等长分叉,选择哪一个分叉只能检测哪个是最长链,不知道哪个是最长合法链

在比特币网络中,大多数节点都是轻节点。如果只是想进行转账操作,不需要挖矿,就无需运行一个全节点。在挖矿过程中,如果监听到别人已经挖出区块延申了最长合法链,此时应该立刻放弃当前区块,在本地重新组装一个指向最后这个新合法区块的候选区块,重新开始挖矿

挖矿的过程是无记忆性的memoryless,又称progress free。之前的章节解释过这一个过程,比如抛硬币,我想要抛一个正面向上的硬币,和已经抛过的过程无关系。

每尝试一个nonce,都是在一定概率下满足挖矿条件,和之前尝试了多少次nonce没关系。这种memoryless的特性,使得挖矿成功的概率等于节点占总算力的比例

比特币系统如何安全性?
一是密码学的保证:别人没有自己的私钥,就无法伪造其合法签名,从而无法将其账户上BTC转走。(前提:系统中大多数算力掌握在好人手中)
二是共识机制:保证了恶意交易不被系统承认。

设备

普通CPU -> GPU ->ASIC芯片(挖矿专用矿机)

矿池挖矿

矿池可以将分散的算力集中起来,一个矿池可以管理很多个矿工,矿池负责打包区块,矿工负责接收矿池的任务进行hash运算。

矿池中是否有恶意的矿工?当矿工挖到了符合比特币puzzle的结果,但是不将这个结果发送给矿池,矿池就不会得到出块奖励。矿池之间是竞争关系,可能将自己的节点加入对手的矿池,搞一些破坏,分散对手的算力。

BTC脚本

https://blog.csdn.net/Mu_Xiaoye/article/details/104364191

比特币系统在网络中广播交易,数据结构如下图。

img

其中vin被称作输入脚本,vout被称为输出脚本。交易是否合法,首先要检查比特币的来源,输入脚本中要包含交易中比特币来源的证明,要素是签名。输出脚本中要包含接收方的地址。比特币系统中,不会校验输出脚本的合法性。

比特币被称作可编程的加密货币,交易过程中需要执行输入输出脚本。在比特币系统,全部币都来至挖矿,即铸币交易。在铸币交易中,没有输入脚本,输出脚本指明了矿工的地址。可以直接用公钥地址作目的地址[ws1] ,也可以用矿工公钥地址hash作为目的地址。

img

  1. 矿工挖矿成功,获得记账权,得到铸币奖励并写入区块链。
  2. 当其他节点收到广播的新区块,就会修改本地的UTXO,增加一条PK1账户转入25BTC的记录。
  3. 当PK1要花掉这个25BTC时,要构造一条交易,在交易中指明交易id(txid),并指明将钱转给PK2,并对交易用PK2对应的私钥签名。
  4. 当其他节点收到这个交易的时候,会校验是否与待上链交易冲突。
  5. 全节点还要验证UTXO中存在txid交易,再用PK1公钥验证签名,验签通过说明是PK1发起的交易,最终证明交易合法。

分叉

https://blog.csdn.net/Mu_Xiaoye/article/details/104394078

state fork(状态)

forking attack

deliberate attack

protocal fork(协议分叉)

hard fork:

什么情况会出现硬分叉?
对比特币协议增加新协议,扩展新功能,未升级软件的旧节点会不认可这些修改,会认为这些特性是非法的。这也就是对比特币协议内容产生分歧,从而导致分叉。硬分叉的一个典型例子,就是对比特币区块大小的修改(之前有提到过,BTC区块大小限制1MB,但是否合适存在争议)。+chain ID;

可能会造成永久性分叉,老协议不承认新的,新的承认老的(只有全部更新才不会造成分叉)

soft fork :如果对BTC协议添加限制,使得原本合法交易在新交易中不合法,便会形成软分叉。老节点承认新节点,新节点不承认节点,不会造成永久性分叉(一半以上节点)

UTXO 写成Merkle tree 放在coinbase 软分叉

P2SH

问答

https://blog.csdn.net/Mu_Xiaoye/article/details/104396033

  1. 交易费是交易者为了自己交易可以上链而给出的“小费”,那么如何得知哪个矿工可以挖到矿?
    事先无需知道谁会挖到矿,交易中总输入和总输出差额就是交易费。哪个矿工挖到矿,在打包交易时,可以将这些交易费收集起来作为自己获得的交易费

匿名性

https://blog.csdn.net/Mu_Xiaoye/article/details/104439918

一般来说,匿名性多与隐私保护相关。但实际上,比特币中的匿名并非真正的匿名,而是假的匿名。实际上,比特币与纸币相比,纸币的匿名性更好,因为其并没有对个人信息的标记。也正是因为其匿名性,很多非法交易采用现金交易(银行风控系统了解一下?)。但现金存在保管、运输等各个方面的不便。

实际上,比特币中的数据是完全公开的,而网上的交易是要与实体世界进行交易的,所以大大破坏了其匿名性。假如银行允许用假名(以前的存折时代),由于银行数据并非公开,所以银行系统的匿名性是要比比特币更好的。

network layer /application layer 实现匿名性 coin mixing

零知识证明

https://blog.csdn.net/Mu_Xiaoye/article/details/104440024

一方(证明者)向另一方(验证者)证明某一个陈述是正确的,但不需要透露除该陈述是正确的之外的任何信息。
例如:A想要向B证明某一账户属于A,这说明A知道该账户的私钥。但不可能通过A公布私钥的方法来证明,该账户确实属于A。因此,A可以产生一个账户签名,B通过公钥对签名进行验证。(实际上该证明是否属于零知识证明存在争议,因为泄露了用私钥产生的签名)

同态隐藏

在这里插入图片描述
零知识证明的数学基础便是同态隐藏。上图为同态隐藏的三个性质。
第一个性质,说明如果有E(X)=E(y),则必然有x=y。(无碰撞)
第二个性质,说明加密函数不可逆。知道加密值,无法反推出密码值。
第三个性质,最为重要,称为同态运算。说明对加密后的函数值进行某些代数运算,等价于对输入直接进行代数运算再加密。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值