首页 > 其他分享 >03 BTC-协议

03 BTC-协议

时间:2023-05-02 11:33:25浏览次数:52  
标签:03 公钥 协议 比特 节点 验证 BTC 区块 交易

《区块链技术与应用》课程链接:https://www.bilibili.com/video/BV1Vt411X7JF/?spm_id_from=333.337.search-card.all.click


03 BTC-协议

目录

  • 数字货币的需要解决的两个主要问题
  • 共识机制

如果央行(中心化)发行数字货币,使用央行的私钥进行签名,大家交易的时候使用央行的公钥验证数字货币是否正确,那么这样交易是否可行?

  • 央行随便分发货币,量化宽松,影响市场金融秩序;
  • 双花攻击(double spending attack):数字货币可以被多分复制。【纸币可以避免双花问题】数字货币的主要挑战之一。

那么,我们改进一下,每个数字货币上有一个编号,央行维持一个巨大的数据库,数据库记录了该数字货币的归属,交易时,收款人验证该数字货币的归属,同时修改归属权,这样是否可行?(这样可以防范double spending attack)

  • 是可行的,但这是一个中心化的方案,数字货币的发行是央行控制的,而且交易需要央行确认才能证明合法性。

那么,有没有一种方法,把央行的权利分散,职能由大家承担,这便是比特币数字货币需要解决的问题。


数字货币的两个主要问题:

  1. 谁来发行货币?发行多少?
  2. 如何防止双花攻击?证明交易的有效性?

防止双花攻击

维护一个数据结构,检查币有没有被花过?被谁花过?由所有的用户共同维护数据结构,即为区块链。【为什么是链式结构?主要为防范双花攻击

两种hash指针:

  • 构成链式结构

  • 指明币的来源【实现:每笔交易中,需要指明币的来源(交易ID),详情可看交易的数据结构】【如A—>B,交易还需存放A的签名,B的地址】

    证明币的来源

    防范double spending attack


问题:如果A要给B转账,那么如何知道B的地址?

比特币内部没有提供地址查询功能,需要通过其它的渠道去获取。比如:网站公开。


A需要知道B的地址,B需要知道A的信息吗?

B需要知道A的公钥。一是为了知道谁是转账人,更重要的一点,对交易进行验证。

不仅B需要A的公钥,所有的节点都需要知道A的公钥,用来对交易的合法性进行验证。(所有节点都得验证,因为区块链是分布式的,可能存在恶意节点,不能依赖别人的验证结果)


那么问题来了,其它节点怎么才能知道A的公钥?

A需要说明自己的公钥是什么,附在交易的输入中。


这里面是不是有个安全漏洞,怎么能让节点自己说呢?如果冒名顶替,假使B的同伙B',伪造交易,对外界说是A—>B(但其实用的是B'自己的公钥),然后用B'自己的私钥签名,其余节点收到交易,用假造的公钥验证私钥,是可以通过的。那这样岂不是把A账上的钱给偷走了?

交易的输入中必须说明币的来源,在A的币的来源的输出中,有A的公钥的哈希,也就是上一笔交易的输出,需要上一笔交易的输出的A的hash值等于A的公钥的hash(这里B'的公钥不等于A中上一笔交易的输出中A的公钥的hash),才可行。


BitCoin Script

比特币中交易的输入和输出都是使用脚本来实现的,就是使用上一笔交易的输出脚本和这一个交易的输入脚本拼在一起,看看能不能顺利执行。


比特币中区块的结构:


全节点和轻节点:

全节点进行交易的验证,轻节点没有办法做独立验证。


那么,谁来决定哪些交易应该被写入下一个区块中?按照什么样的顺序写进去?

如果每个节点自己决定行不行,比如,单个节点收到交易(合法的、非法的),进行交易验证之后,将交易打包,构建一个本地的区块链行不行?

这样,一致性得不到保证,不是一条链。【区块链,去中心化的账本,记录的数据必须一致。】

用分布式术语,账本的内容要取得分布式的共识。(distributed consensus)


分布式中有很多impossibility result,其中最著名的是FLP impossibility result。

在一个异步的系统中(asynchronous system)【网络传输时延没有上限】,即使一个成员是有问题的(faulty),那么也不可能取得共识。

还有一个比较著名的结论,叫做CAP Theorem。

  • Consistency
  • Availability
  • Partition tolerance

任何一个分布式系统中,上述三个性质中,最多只能满足两个。

分布式共识中,一个比较著名的协议,叫做Paxos。

可以达成Consistency,但是有可能一直不能共识(虽然可能性小,但是客观存在)。


比特币中的共识协议

我们假设系统中的绝大多数节点都是好的,只有一小部分是有恶意的,那么我们该如何设置共识协议?

一个简单的方法,投票的方法行不行,一个节点将交易按照顺序打包之后,发给其他节点,如果超过半数的节点投赞成票,那就把这个交易加入到区块链中,这样是否可行?

存在一个很大的问题:任何基于投票的方案,首先要确定谁有投票权。【也就是membership问题,如在联盟链hyperledger fabric中采用投票是可行的,因为其中大多数节点是好的】

投票权在比特币中行不通,因为Sybil attack存在,如果一个恶意组织,通过计算机产生超过50%的账户,那就可以控制比特币网络。

投票还有的一些小问题:

  • 有些节点可能不投票;
  • 有些节点可能恶意投票;
  • 时间复杂度过高,通讯次数过多。所以必须设置预设的规则,来达成共识,恶意节点可以不遵循,但是诚实节点都会做;

比特币中block header中有一个nBits,是target目标阈值的编码,验证区块时检查nBits设置的是不是符合比特币中规定的难度要求。

检查区块合法性,先检查区块头,后检查区块体。

区块体中的交易

  • 是不是有合法的签名
  • 以前有没有被花过

有没有一种可能,就是区块头和区块体都是合法的,但是我们仍然不愿意接收?

这个区块有什么问题?虽然下面区块中的交易都是合法的(判断有没有double spending,依据是从但当前区块出发,所在的链上有没有被双花)

这叫做forking attack,分叉攻击。通过往区块链中插入区块,来回滚某个在区块链上已经发生的交易。


如果比特币网络中,两个节点同时获得记账权,在缺省情况下(由于网络延迟),矿工会沿着最先收到的区块下往后挖(表明该矿工认可该区块)。


为什么要争夺记账权?

首先,记账节点可以决定那些交易可以被打包到下一个区块中,但是,并非主要动力。

出块奖励(block reward)

一个去中心化的数字货币需要解决两个问题

  • 谁有权发行货币
  • 怎么验证交易的合法性

谁有权发行货币

coinbase transaction:

一开始50BTC,21万个区块奖励减半。


可以通过计算hash来防止Sybil Attack。

标签:03,公钥,协议,比特,节点,验证,BTC,区块,交易
From: https://www.cnblogs.com/yangyi215/p/17367485.html

相关文章

  • 03 Docker高级实践
    第三章Docker高级实践目录第三章Docker高级实践一、Dockerfile1Dockerfile简介2Dockerfile快速入门3基础指令详解4运行时指令详解一、Dockerfile在这一部分我们来介绍一些Docker的高级内容:Dockerfile和Dockercompose。1Dockerfile简介什么是Dockerfile?类似于我......
  • Socks5协议与IP代理在网络安全中的应用
      在网络安全中,IP代理是一种重要的安全工具,它可以为用户提供匿名性和隐私保护,同时也可以保护用户免受网络攻击。而Socks5是IP代理中常用的一种协议,它具有高度的安全性和灵活性。在本文中,我们将介绍Socks5协议和IP代理的作用及其在网络安全中的应用。什么是IP代理?  IP代理是......
  • CSP2023-03
    第一题 直接满分了:#include<iostream>usingnamespacestd;constintN=1e6;intn,a,b;intpanduan(intx1,inty1,intx2,inty2,inta,intb){intc,k;if(x2<0||y2<0||x1>a||y1>b)return0;//在外侧else{......
  • 当前标识(IIS APPPOOL\XX)没有对“C:\Windows\Microsoft.NET\Framework64\4.0.30
    当前标识(IISAPPPOOL\WMS.APP)没有对“C:\Windows\Microsoft.NET\Framework64\v4.0.30319\TemporaryASP.NETFiles”的写访问权限。解决此问题为在使用Windows的IIS搭建服务器时,遇到的问题。在网上尝试了各种解决方法后,终于找到了一个可以解决问题的方法,以管理员身份运行命令......
  • Elasticsearch专题精讲——What's new in 8.7?
    What'snewin8.7?https://www.elastic.co/guide/en/elasticsearch/reference/8.7/release-highlights.html,ortherversions:8.6 | 8.5 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0Timeseries(TSDS)GA(时间序列)TimeSeriesDataStream(TSDS)isafeatureforoptimi......
  • 7-003-(LeetCode- 62) 不同路径
    1.题目读题 考查点 2.解法思路 代码逻辑 具体实现113.总结......
  • Codeforces Gym 103439D - LIS Counting(猜结论+状压)
    一道需要一些猜结论技巧的中档题。首先突破口在于排列长度恰好等于不是额外输入的某个数\(k\)而是LDS与LIS的乘积,这显然启示我们去找一些性质。根据dilworth定理,最长反链等于最小链覆盖,故LIS的长度,就是最少需要的递减数列的个数使得每个元素被覆盖至少一次,而每个递减数......
  • mapreduce测试时出现INFO client.RMProxy: Connecting to ResourceManager at 0.0.0.0
    如运行wordcount后出现INFOclient.RMProxy:ConnectingtoResourceManagerat0.0.0.0:8032长时间不动,我尝试修改我的yarn-site.xml配置后可以成功运行  <property>    <name>yarn.nodemanager.aux-services</name>    <value>mapreduce_shuffle</value>  </pr......
  • 路由协议管理距离
    一、思科设备管理距离思科OPSF协议管理距离默认都是110,*如果管理距离是255,则路由器不相信该路由的源,并且不会将该路由安装到路由表中。 小结:iBGP的管理距离为200,EBGP的管理距离为20,BGP的本地(Local)AD默认等同于IBGP,本地路由指通过network命令得到。二、华为设备管理距离华为OSPF的......
  • 【python】if __name__=='__main__'
    当我们想一个python文件作为脚本直接执行时才执行某段代码,而被其他python文件调用时不执行那段代码,就可以通过if__name__=='__main__'实现。if__name__=='__main__'只有在python文件作为脚本执行时才为True。python文件直接执行时__name__值为'__main__',被别的文件调用......