暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

【区块链学习】比特币—协议

申也 2022-10-13
1060

引子:中心化的数字人民币

双花攻击 double spending attack

只依靠密码学进行数字货币的分发。

由于文件本身是可以复制的,数字货币本身就是一个文件,我没办法修改签名,但可以直接复制文件。

改进:中心化处理

中心化的数据库处理数字货币

每次进行交易都去请求中心机构。数字货币的发行和每次交易都需要中心机构去确认。

去中心化的货币

两个主要问题:

  1. 谁来发行货币
  2. 怎么验证交易的有效性

验证交易的有效性

比特币如何交易

假定A获得coinbase(铸币权),新发布了10个比特币(该交易称为铸币交易)。A将10个比特币转给了B(5个)和C(5个),A对该交易进行签名,同时该交易需要说明所花掉10个比特币来源(来自铸币交易)。

之后,B将自己的5个比特币转给C(2个)和D(3个),该交易需要B的签名,该交易需要说明所花掉的5个比特币来自于第二个交易中。

然后,C将自己所拥有的全部7个比特币都转给E,并对该交易签名,可以发现该交易中C的比特币来源于两个交易中。这样,就构成了一个简单的区块链。

两类hash pointer

  1. 指向前一区块:使得各个区块形成链

  1. 指向币的来源的:比特币的来源并非凭空捏造,可以防止double spending attack。


Q:交易中的身份识别

A:

  1. A(支付人)需要知道B(收款人)的地址,这个地址是由B的公钥经过一定计算得到的。

  1. B(收款人)需要知道A(支付人)的公钥,或者说所有节点都需要A的公钥,用于验证交易,同时可以验证签名


Q:如何防范恶意签名

有一个B‘恶意将区块签名,顶替A怎么办


A:币的来源的区块有输出,输出中包括A的公钥,通过看币的来源的输出公钥的哈希,与支付人的哈希是否一致。


Q:如何查看交易是否合法

A:在比特币系统中,通过执行脚本(BitCoin Script)实现验证过程。将当前交易输入脚本与前一个交易输出脚本(说明币的来源的交易)拼接执行,如果可以正确执行,说明交易合法。

区块的组成

每个区块分为block header 和 block body。

block headerblock body
version 比特币协议版本transaction list 交易列表
hash of previous block header
merkle root hash
targer 挖矿难度目标阈值
nonce 随机数


block header的作用

  1. 挖矿相关(block header的作用)

    整个块头的哈希,要小于目标阈值,才可以挖到矿。

    block header中存放的是目标阈值的编码 nBits

  1. 区块的链接

通过头部链接即可,因为merkle root hash已经可以保证body中的transaction list没有被篡改。


  1. 方便轻节点保存

轻节点只保存block header的信息。

如何将交易写到区块中

账本的内容需要取得分布式共识(distributed consensus)

分布式共识

例子:分布式哈希表(distributed hash)

系统中很多机器共同维护一个哈希表,共识为表中存放哪些key-value

  • FLP不可能结论,在一个异步系统中,网络时延无上限,即使只有一个成员是有问题的,也不可能达成共识。

  • CAP Theorem(Consistency一致性、Availability可靠性、Partition tolerance容错性),任何一个分布式系统中,最多只能满足其中两个性质。分布式共识中协议Paxos 可以保证Consistency(若达成共识必然一致),但在某些情况下,可能会一直无法达成共识。

  • Paxos协议详解:https://my.oschina.net/u/150175/blog/2992187

比特币的共识机制

投票,但是是根据工作量证明投票。

  • 传统的按人数投票的弊端

    过半数同意,但是会有问题。

    1. 恶意节点的打包不合法区块,被困在投票中

    1. 网络延迟问题

    1. 无强迫投票手段

    1. Sybil attack (女巫攻击),通俗的说是水军攻击,通过创建大量虚假身份去左右投票。

比特币系统中采用了很巧妙的方案解决这个问题。虽然仍然是投票,但并非简单的根据账户数目,而是依据计算力进行投票。

在比特币系统中,每个节点都可以自行组装一个候选区块,而后,尝试各种nonce值,这就是挖矿。

当某个节点找到符合要求的nonce,便获得了记账权,从而可以将区块发布到系统中。其他节点受到区块后,验证区块合法性,如果系统中绝大多数节点验证通过,则接收该区块为最新的区块并加入到区块链中。

存在的问题

  1. forking attack 分叉攻击

    如图所示,A用户对上面的A转账给B的记录回滚,从而非法获取利益。在两条链上,发现交易都合法。这是一个典型的双花攻击。A给B转账后,用分叉攻击将钱又转回来,覆盖掉原来的记录。

    在比特币系统中,这种情况实际上很难发生。因为大多数矿工认可的是最长的合法链,会沿着上面的链继续挖下去。而A这个攻击者要想回退记录,就必须使得下面的链变得比上面的链还长。理论上来说,攻击者需要达到整个系统中51%的计算力,才能使得这种攻击成功。

  2. 合法链竞争问题

    区块链正常运行场景下,也可能会发生分叉。当两个节点同时获得记账权时,会有两个等长的合法链。在缺省情况下,节点接收最先听到的区块,该节点会沿着该区块继续延续。但随着时间延续,必然有一个链胜出,由此保证了区块链的一致性。(被扔掉的区块称为“孤儿区块”)


比特币激励机制

比特币通过设置出块奖励(block reward)来解决没人出块的问题。

一个获得合法区块的节点,可以在区块中加入一个特殊交易(铸币交易)。事实上,这种方式也是唯一一个产生新比特币的途径。

💡

挖矿就是通过本身的算力计算nonce并获得计算力,从而获得增加区块的能力。而增加区块就会获得block reward也就是拥有了比特币。挖矿挖的是block,收获的是bit coin

点击原文查看笔记原稿

文章转载自申也,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论