BTC-协议
BTC-协议
一个去中心化的数字货币要解决两个问题
1、谁有权发行货币
比特币的发行是由挖矿决定的(coinbase transaction 唯一一个产生新币的途径)比特币通过挖矿来决定货币的发行权,发行量
2、怎样验证交易的合法性,防止双花攻击(doule spending attack)
依靠区块链的数据结构
每个交易都包含了输入和输出部分,输入部分要说明币的来源和公钥;输出部分要给出收款人的公钥的哈希,说明币的来源是为了证明币不是凭空捏造的是有记录的,同时也是防范double spending attack
在比特币系统当中,前面这些验证过程,是通过执行脚本来实现的。每个交易的输入提一段脚本,包括给出公钥的过程,公钥也是在输入的脚本里指定的。每个交易的输出也是一段脚本,验证其的合法性,就需要把当前交易的输入脚本跟前面交易(提供币来源的交易)的输出脚本拼在一起,然后看看能不能顺利执行,如果能执行说明是合法的。BitCoin Script(脚本执行)
双花攻击
判断一个交易是不是double spending ,是看这个区块所在的分支上币有没有被花掉
简单的区块链交易模型
Coinbase tx(铸币权)
在该模型中,A获得了铸币权,发行了十个币,在第一个交易中,A转给了B五个币,转给了C五个币,A对该交易签名,同时,通过一个指针指出了这十个币的来源,后面的两个交易类似。
在进行交易时,需要付款人的签名和收款人的地址,在比特币系统中,该地址即为收款人的公钥的哈希。可以将其视为银行账户,根据此进行转账交易。(虽然公钥可以公开,但实际中更多公开的是公钥的哈希)
在交易中,收款方需要知道付款方的公钥,从而验证A签名是否有效。即A需要提供自己的公钥(实际上其他节点都需要知道付款方公钥,验证交易合法性)实际中A转账时候提供的公钥需要和铸币交易中公钥对的上,这样就防止了恶意节点伪造A的公钥来“偷”走A的比特币。
在比特币系统中,通过执行脚本实现上述验证过程。将当前交易输入脚本与前一个交易输出脚本(说明币的来源的交易)拼接执行,如果可以正确执行,说明交易合法。
在该图中,一个区块仅含有一个交易,实际中一个区块中包含多个交易,交易通过Markle Tree组织起来,在区块中存储。
区块信息
Block Header | 区块头 |
---|---|
version | 比特币的协议版本号 |
hash of previousblock header | 区块链中指向前一个区块的哈希指针 |
merkle root hash | 整颗merkle tree的根哈希值 |
target | 难度目标阈值 |
nonce | 随机数 |
merkle root hash保证了block body内容不被篡改,所以只需要计算block header即可保证整个区块内容不会被篡改。取哈希只针对Block Header。
Block Body | 区块身 |
---|---|
transaction list | 交易列表 |
full node(少):全节点保存了区块链的所有信息,验证每一个交易
light node(多):轻节点只保存了block header,不参与区块链的构造维护
分布式的共识协议
distributed hash table(共识哈希表)
多台电脑共同维护一个全局的哈希表
distributed consensus(分布式的内容要取得分布式的共识)
Paxos协议(能保证协议一致性)
分布式共识一个著名的协议是Paxos,该协议能够保证一致性,即第一个性质。如果该协议打成了共识,那么这个共识一定是一致的,即每个成员所认为的共识都是相同的。但是,某些情况下,该协议可能永远无法达成共识,这种可能性比较小但是客观存在的
BTC-共识协议(Consensus in BitCoin)
存在的问题:系统中存在恶意节点
membership(确定谁有投票权)
Hyperledger fabric(联盟链)
女巫攻击(Sybil attack)
女巫攻击(Sybil attack)
比特币系统创建账户是很容易的,甚至一个人产生了公私钥对别人都无法得知,只有转账时别人才知道。所以有些人可以不停的创建账户,当超过账户总数的一半时就有了控制权
怎样防范女巫攻击(Sybil attack)
即使创建再多的账户,也无法使算力增强
算力投票
算力投票是比特币使用的共识协议,即通常所说的“挖矿”,每个结点都可以自行组装区块,尝试各种nonce值,当找到某个符合条件的nonce时便获得了记账权,从而将区块发布到系统中,其中节点收到区块后可以验证其合法性,如果系统中大多数结点验证通过(51%),则接受该区块。
impossibility result(不可能的实现结论)
FLP结论
在一个异步的(asynchronous)系统里,(网络传输时延没有上限就叫异步系统),即使只有一个成员是有问题的(faulty),也不可能取得共识。
CAP结论
分布式系统的三个性质
Consistency(一致性) 即更新操作成功并返回客户端后,所有节点在同一时间的数据完全一致
Availability(可用性) 即服务一直可用,而且是正常响应时间
Partition tolerance(分区容错)即分布式系统在遇到某节点或网络分区故障的时候,仍然能够对外提供满足一致性和可用性的服务。
以上最多只能满足两个
Partition tolerance(分区容错)
大多数分布式系统都分布在多个子网络。每个子网络就叫做一个区(partition)。分区容错的意思是,区间通信可能失败。比如,一台服务器放在中国,另一台服务器放在美国,这就是两个区,它们之间可能无法通信
注意事项
Longest valid chain(最长链机制)比特币中只承认最长链的有效性
forking attack(分叉攻击) 依靠全网节点的认可度,不符合Longest valid chain会被抛弃,客观存在,实现条件不充分
- 如上图所示,在区块链正常的工作中,也可能会发生分叉,当连个节点同时获得记账权时,会有两个区块同时上链,此时会有两个等长的合法链。在缺省情况下,节点接受最先听到的区块,该节点会沿着该区块继续延续,但随着时间延续,必然有一个链胜出,由此保证了区块链的一致性。
block reward(出块奖励)它是比特币中的激励机制,获得记账权的结点在发布的区块中可以加一个特殊的交易(铸币交易),这是发布比特币的唯一方法,不需要指明币的来源。最开始每个区块可以发布50个比特币,每过21万个区块比特币会减半,现在只有12.5个比特币了
block header和block body的内容
比特币中的共识具体:
- 比特币系统中去中心化的账本要取得共识
- 只有获得记账权的节点才能写东西
- 获得记账权就是pow(挖矿)。按照算力计票,算力可以用每秒能试多少nonce(随机数)数值表示
记账权
记账权就是往比特币账本里写入下一个区块的权利。只有找到这个nonce(随机数),获得记账权的节点才有权利发布下一个区块。其他节点收到这个区块之后,要验证这个区块的合法性,比如block header的内容填的对不对,block header里面有一个域,叫nBits域,实际上它是目标预值的一个编码检查一下nBits域设置的是不是符合比特币协议中规定的难度要求;该不等式是否成立。假设都符合要求,然后检查block body 里面的交易列表,验证一下每个交易都是合法的:①要有合法的签名②以前没有被花过。如果有一项不符合要求,这个区块就是不能被接受的。如果所有条件都符合,也不一定接受。
比特币争夺记账权的过程叫作挖矿(mining)
比特币被称为数字黄金(digital gold)
争夺记账权的节点被称为矿工(miner)
BTC-协议的更多相关文章
- Windows网络驱动、NDIS驱动(微端口驱动、中间层驱动、协议驱动)、TDI驱动(网络传输层过滤)、WFP(Windows Filtering Platform)
catalog . 引言 . Windows 2000网络结构和OSI模型 . NDIS驱动 . NDIS微端口驱动编程实例 . NDIS中间层驱动编程实例 . NDIS协议层驱动编程实例 . TDI ...
- 区块链基础认识-BTC
1.什么是区块链 a.定义: 从本质上来说区块链就是一种通过将用户的某种特定信息(比如交易信息),通过很多台计算机记录保存并同步的过程,每个区块都记录了对应的交易信息,将这些交易信息串联起来就形成了所 ...
- Bytom BIP-32协议和BIP-44协议
我们知道HD(分层确定性)钱包,基于 BIP-32:多币种和多帐户钱包,基于 BIP-44:最近比原社区的钱包开发者对比原的BIP-32和BIP-44协议有疑问,所以我今天就专门整理了一下该协议的内容 ...
- 挖矿程序的工作原理(BTC为例)
Mining时代进化:CPU挖矿 -> GPU挖矿 -> FPGA挖矿 -> ASIC挖矿CPU挖矿时代:SENGENERATEGPU挖矿时代:GETWORK Miner:挖矿的程序 ...
- BTC、BCH和BSV三者到底有什么区别?
比特币发展到今天已经有10个年头了,在这十年的发展中,比特币一共经历了两次重要的分裂,现在变成了三种货币,第一种是目前继承了比特币绝大多数遗产的BTC:第二种是BCH:第三种是BSV.那这三种货币到底 ...
- 细节讲解并实操下: 去中心化社交协议 ---- Nostr
作者:林冠宏 / 指尖下的幽灵.转载者,请: 务必标明出处. GitHub : https://github.com/af913337456/ 出版的书籍: <1.0-区块链DApp开发实战&g ...
- HTTP协议系列(1)
一.为什么学习Http协议 首先明白我们为什么学习HTTP协议,也就是说明白HTTP协议的作用.HTTP协议是用于客户端与服务器之间的通讯.明白了HTTP协议的作用也就知道了为什么要学习H ...
- 重温Http协议--请求报文和响应报文
http协议是位于应用层的协议,我们在日常浏览网页比如在导航网站请求百度首页的时候,会先通过http协议把请求做一个类似于编码的工作,发送给百度的服务器,然后在百度服务器响应请求时把相应的内容再通过h ...
- 协议森林17 我和你的悄悄话 (SSL/TLS协议)
作者:Vamei 出处:http://www.cnblogs.com/vamei 转载请先与我联系. TLS名为传输层安全协议(Transport Layer Protocol),这个协议是一套加密的 ...
- 协议森林16 小美的桌号(DHCP协议)
作者:Vamei 出处:http://www.cnblogs.com/vamei 转载请先与我联系. DHCP协议用于动态的配置电脑的网络相关参数,如主机的IP地址,路由器出口地址.DNS域名服务器地 ...
随机推荐
- [ABC246B] Get Closer
section> Problem Statement From the point $(0,0)$ in a two-dimensional plane, let us move the dis ...
- Cocos2d-js 游戏切后台和返回游戏,系统监听事件
在日常游戏开发中,我们会发现,实时类操作的游戏,在模拟器中切后台,然后切回游戏,会出现很多异常. 很幸运,Cocos官方已经为我们预留了接口 1 LogicGame.addSystemListener ...
- Kernel Memory 入门系列: Embedding 简介
Kernel Memory 入门系列: Embedding 简介 在 RAG模式 其实留了一个问题. 我们对于的用户问题的理解和文档的检索并没有提供合适的方法. 当然我们可以通过相对比较传统的方法. ...
- 关于eclipse中找不到recyclerview的问题
在eclipse中直接引入v7包之后,还是找不到recyclerview的问题,我们可以通过 sdk\extras\android\support\v7\recyclerview\libs这个目录找到 ...
- Python——第五章:模块(Module)、自定义模块、第3方开源模块、包(Package)
什么是模块(Module)? 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多代码按功能分组,分别放到不同的文件里,这 ...
- grafana添加组件
###安装grafana插件需联网安装[root@zabbix grafana]# grafana-cli plugins list-remote #查询可用的插件id: abhisant-druid ...
- .NET MAUI (微软 .Net 6 跨多平台应用 UI)框架的研究学习
针对 .NET MAUI (微软 .Net 6 跨多平台应用 UI)框架的研究学习,使用VS2022 C# 和 XAML 创建本机移动和桌面应用,开发一套代码可以发布在 Android . iOS ...
- thymeleaf自定义标签
前言 使用thymeleaf自定义标签,环境:springboot 2.3.7 + thymeleaf 3.0.11(2021-01-14最新版) 由于使用shiro,我们需要与thymeleaf整合 ...
- MySQL优化:12种提升SQL执行效率的有效方法
在数据库管理和优化的世界里,MySQL作为一个流行的关系型数据库管理系统,其性能优化是任何数据密集型应用成功的关键.优化MySQL数据库不仅可以显著提高SQL查询的效率,还能确保数据的稳定性和可靠性. ...
- CVE-2023-36025 Windows SmartScreen 安全功能绕过漏洞
CVE-2023-36025是微软于11月补丁日发布的安全更新中修复Windows SmartScreen安全功能绕过漏洞.攻击者可以通过诱导用户单击特制的URL来利用该漏洞,对目标系统进行攻击.成功 ...