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-协议的更多相关文章

  1. Windows网络驱动、NDIS驱动(微端口驱动、中间层驱动、协议驱动)、TDI驱动(网络传输层过滤)、WFP(Windows Filtering Platform)

    catalog . 引言 . Windows 2000网络结构和OSI模型 . NDIS驱动 . NDIS微端口驱动编程实例 . NDIS中间层驱动编程实例 . NDIS协议层驱动编程实例 . TDI ...

  2. 区块链基础认识-BTC

    1.什么是区块链 a.定义: 从本质上来说区块链就是一种通过将用户的某种特定信息(比如交易信息),通过很多台计算机记录保存并同步的过程,每个区块都记录了对应的交易信息,将这些交易信息串联起来就形成了所 ...

  3. Bytom BIP-32协议和BIP-44协议

    我们知道HD(分层确定性)钱包,基于 BIP-32:多币种和多帐户钱包,基于 BIP-44:最近比原社区的钱包开发者对比原的BIP-32和BIP-44协议有疑问,所以我今天就专门整理了一下该协议的内容 ...

  4. 挖矿程序的工作原理(BTC为例)

    Mining时代进化:CPU挖矿 -> GPU挖矿 -> FPGA挖矿 -> ASIC挖矿CPU挖矿时代:SENGENERATEGPU挖矿时代:GETWORK Miner:挖矿的程序 ...

  5. BTC、BCH和BSV三者到底有什么区别?

    比特币发展到今天已经有10个年头了,在这十年的发展中,比特币一共经历了两次重要的分裂,现在变成了三种货币,第一种是目前继承了比特币绝大多数遗产的BTC:第二种是BCH:第三种是BSV.那这三种货币到底 ...

  6. 细节讲解并实操下: 去中心化社交协议 ---- Nostr

    作者:林冠宏 / 指尖下的幽灵.转载者,请: 务必标明出处. GitHub : https://github.com/af913337456/ 出版的书籍: <1.0-区块链DApp开发实战&g ...

  7. HTTP协议系列(1)

    一.为什么学习Http协议       首先明白我们为什么学习HTTP协议,也就是说明白HTTP协议的作用.HTTP协议是用于客户端与服务器之间的通讯.明白了HTTP协议的作用也就知道了为什么要学习H ...

  8. 重温Http协议--请求报文和响应报文

    http协议是位于应用层的协议,我们在日常浏览网页比如在导航网站请求百度首页的时候,会先通过http协议把请求做一个类似于编码的工作,发送给百度的服务器,然后在百度服务器响应请求时把相应的内容再通过h ...

  9. 协议森林17 我和你的悄悄话 (SSL/TLS协议)

    作者:Vamei 出处:http://www.cnblogs.com/vamei 转载请先与我联系. TLS名为传输层安全协议(Transport Layer Protocol),这个协议是一套加密的 ...

  10. 协议森林16 小美的桌号(DHCP协议)

    作者:Vamei 出处:http://www.cnblogs.com/vamei 转载请先与我联系. DHCP协议用于动态的配置电脑的网络相关参数,如主机的IP地址,路由器出口地址.DNS域名服务器地 ...

随机推荐

  1. 最好用的AI换脸软件,rope下载介绍

    随着AI技术的广泛运用,市面上的换脸软件也多了起来,今天给各位介绍其中的王者Rope! 先上两个动图,给大伙看看效果 rope是如何实现这种自然的效果呢?这得益于机器学习技术的不断发展,rope经过深 ...

  2. Alpha-Beta剪枝的原理的深入理解(无图预警)

    转载请注明 原文链接 :https://www.cnblogs.com/Multya/p/17929261.html 考虑一个树: 一棵树上只有叶子节点有值,有确定的根节点的位置 根据层数来划分叶子节 ...

  3. ElasticSearch之Clone index API

    使用已有的索引,复制得到一个索引. 关闭testindex_001的写入操作,命令样例如下: curl -X PUT "https://localhost:9200/testindex_00 ...

  4. 编译安装python 3.11

    先处理下opensll的版本,以免编python译环境异常:安装 openssl-1.1.1 yum remove openssl cd /opt wget https://www.openssl.o ...

  5. electron入门之试调工具remote(三)

    electron入门到入土,从渲染线程中创建新窗口.2022-03-21入门版本17.1.2 electron重要概念,只有一个主线程,其他都是渲染进程或者叫子线程,他们不能直接相互操作,可以通过ip ...

  6. Windows10安装WSL2和Ubuntu的过程

      因为在Windows10环境中安装了2个相同的包导致冲突,所以想到了通过WSL2+Docker的方式进行编程开发.因为Docker Desktop直接安装就行了,不做介绍.本文主要介绍WSL2和U ...

  7. 云图说 | 华为云GPU共享型AI容器,让你用得起,用得好,用的放心

    摘要:容器以其独特的技术优势,已经成为业界主流的AI计算框架(如Tensorflow.Caffe)的核心引擎,为了进一步解决企业在AI计算性能与成本上面临的问题,华为云推出了AI容器产品. 容器以其独 ...

  8. 什么是MircoPython?

    摘要:互联网玩家为了让Python这样的容易学,简单易学.社区API丰富的语言可以在嵌入式领域用上,逐渐开始了一轮Python上嵌入式的迁移,这样就有了今天的主角--MircoPython. 本文分享 ...

  9. Linux设置SSH连接时间,解决断开速度快,不停输密码问题: connection reset by

    ssh 登录,没有设置ssh key 登录的情况下(临时登录),断开速度太快.如何解决? 修改:/etc/ssh/ssh_config 文件 #设置连接保持的时间ClientAliveInterval ...

  10. Docker 删除 images

    1 查看本地已用镜像文件 [root@localhost web]# docker images 2.删除镜像 Redis [root@localhost web]# docker rmi 59589 ...