主页 > imtoken冷钱包安全吗 > 比特币容错

比特币容错

imtoken冷钱包安全吗 2023-02-21 05:31:36

区块链P2P分布式架构,分布式统一账本,那么肯定有容错问题。比特币被认为是一种支付交易系统,因此请将其与当前的银行支付系统进行比较。

看一个例子:

A 转账给 B

A发起交易请求,银行系统收到请求。

银行查询A账户余额,判断为余额充足。

A的请求被批准(前提是余额充足),然后转账给B。

整个流程有银行系统做仲裁和交易,所以把支付系统放到分布式架构中需要更多的考虑,比如如何统一分布式系统的一致性以及如何确认消息,如何回复,如何同步副本等,并简要概述分布式系统中的共识容错。

说到分布式系统的共识,肯定会提到CAP定理。

CAP 定理:在分布式系统中,不可能同时实现一致性、可用性和分区容错性。两个可以满足,三个不能满足。

一致性:系统中的所有节点都同意系统的当前状态。

可用性:系统可用并正在处理请求。

分区容错性:网络可能会被分区,即节点之间的通信无法保证。

这个定理是2000年提出的,被认为是分布式系统中的一个重要原理,在设计分布式系统时会参考。

如果对这个定理有疑问,可以这样解释:假设网络中有两个节点A和B,那么A\B在不同的分区,A\B不能通信。假设 A 请求一个请求。更新共享状态并通知 B 执行。节点A能做的就是更新A的本地状态,使得A和B必然不一致。那么A不更新本地状态,则系统无法响应A发起的请求,系统不可用。

一般会出现以下三种设计模式:

发件人:

一致性减弱

对结果一致性不敏感 新版本上线一段时间后应用可以成功更新,期间不保证一致性。

可用性减弱

对结果一致性敏感的应用程序,例如银行柜员机,会在系统出现故障时拒绝服务。 MongoDB、Redis 等就是为此而设计的。 Paxos、Raft等算法主要处理这种情况。

弱化分区容错

现实中,网络分区的概率降低了,但很难避免。一些关系数据库 ZooKeeper 就是为此而设计的。在实践中,网络通过双通道等机制增强可靠性,实现高度稳定的网络通信。

基础理论

BASE 是 Basic Available、Soft state 和 Ultimateconsistent ) 三个短语的缩写。 BASE 理论是 CAP 中一致性和可用性之间权衡的结果。它来自于对大型互联网系统分布式实践的总结,是基于CAP定理逐步演进的。 BASE理论的核心思想是,即使无法实现强一致性,每个应用程序也可以根据自身的业务特点,采用合适的方法实现最终一致性。接下来,我们来看看BASE中的三个元素:

基本可用

基本可用意味着分布式系统在发生不可预知的故障时被允许失去一些可用性。请注意,这绝不与系统不可用相同。例如:

响应时间损失。一般情况下,在线搜索引擎需要在0.5秒内将相应的查询结果返回给用户,但由于故障,查询结果的响应时间增加了1~2秒

系统功能丧失:一般情况下比特币骰子算法,消费者在电商网站上购物时,几乎可以顺利完成每一笔订单,但在一些节假日购物高峰期,由于消费者购物行为激增,为了保障购物系统的稳定性,部分消费者可能会被引导至降级页面。

软状态

软状态是指允许系统中的数据以中间状态存在,相信中间状态的存在不会影响系统的整体可用性,即允许系统在不同的节点上运行。数据副本之间的数据同步过程存在延迟。

最终一致性

最终一致性强调所有数据副本经过一段时间的同步后最终会达到一致状态。因此,最终一致性的本质是系统需要保证最终数据能够一致,而不需要实时保证系统数据的强一致性。

总的来说,BASE 理论是针对大规模、高可用和可扩展的分布式系统,这与传统的 ACID 特性正好相反。它与 ACID 的强一致性模型完全不同。可用性是通过牺牲强一致性,允许数据在一段时间内不一致但最终达到一致状态而获得的。但同时,在实际的分布式场景中,不同的业务单元和组件对数据一致性的要求也不同。因此,在具体的分布式系统架构设计过程中,往往将ACID特性与BASE理论结合起来。

发件人:

文中前面提到的银行转账交易,那么经过网络中某个节点的验证,账户余额充足,即转账,稍后网络节点进行转账。同步。这种模式称为最终一致性。因为不同步的时候,节点之间的账户余额会因为转账而不一致,但算法最终还是会同步的。

最终一致性(Eventual Consistency),结合比特币在区块链中的第一个应用,简单介绍一下。

比特币容错

在P2P网络环境中,每个节点都维护着一个共同的状态。在分区的过程中,不同的节点有不同的更新,而这些更新可能是相互矛盾的(这个不难理解),那么就需要一种冲突解决机制来解决冲突,让网络中的所有节点达到一致的状态。

比特币的网络是一个随机网络。目前有很多节点。每个节点一起工作以维护一个统一的链。所有节点最终都会达成协议并执行相同的操作,不再需要中介来仲裁控制。

比特币中有一对密钥,私钥自己保存,公钥和公钥的派生地址向公众公开,比特币网络跟踪每个节点的比特币余额。合作方式。

比特币有输出、输入和交易的概念,所以通过一个简单的过程来比较之前的银行转账交易:

节点接收交易信息

根据输入比特币骰子算法,验证输出是否在本地UTXO,或者验证签名,无效则删除,有效则继续

根据所有输入,验证金额大小,不匹配则删除,匹配则继续

更新本地 UTXO 库

广播到其他节点

总金额小于之前所有相关输入总金额的交易输出。

交易有两个环节:未确认和确认

容错采用pow机制:

POW机制介绍

POW(工作量证明),一种工作量证明机制。我们最直观的理解是,一个证书就是确认你做了一定的工作,类似于现代生活中的一些测试,你通过了测试就可以拿到证书,但是这个证明是工作量证明。

工作量证明最初是作为工作量证明系统提出的。这个概念来自 Cynthia Dwork 和 Moni Naor 在他们 1993 年的学术论文中。它是针对拒绝服务攻击和滥用服务的一种对策,要求发起者需要消耗一定的计算机资源来执行计算。然后,战俘一词在 Markus Jakobsson 和 Ari Juels 1999 年的一篇文章中正式提出。

谈到工作量证明时,通常指的是哈希现金,它由 Adam Back 在 1997 年发明,用于抵御电子邮件拒绝服务攻击和垃圾邮件网关滥用。在比特币之前,HashCash 被用于垃圾邮件过滤。 Hal Finney 还以可重用工作证明 (RPOW) 的形式在比特币前的加密货币实验中使用了 Hash Cash。另外,戴维的B-money,Nick Sabo的Bit-Gold,比特币的先驱,都是在Hash Cash的框架下挖矿的。

工作量证明原理

首先,工作量证明需要客户完成一项艰巨的工作并得到一个结果。结果公布后,验证方需要尽快验证。这不相等。比如我们在一个字符串后面加上一个随机数(nonce),对这个字符串进行SHA256计算,然后将结果用16进制表示。我们要求计算得到的十六进制的首位数为:0000,则验证通过。这种规则需要电脑不断尝试,你当然可以记住一些,但概率毕竟很小。在正常情况下,需要不断的输出计算尝试,直到出现正确的所需结果。

数学期望,在计算过程中会统计实际的计算次数,取平均值后得到的计算次数,这个数学期望就是需要的“工作量”,当然这是一个符合数理统计的概率事件。

比特币中的POW共识机制

比特币的出现让人们了解了POW共识机制。在比特币中,通过挖矿产生一个新的区块并写入交易数据进入一个区块被视为一个工作量证明的数学问题,所以这个问题有四个关键点: 算法是一个哈希函数,输出256位(本文不具体介绍哈希函数和SHA265函数)。目前还没有针对SHA256算法的有效攻击方法。当然,这里不讨论算法漏洞攻击。

2.块头:比特币中的块由块头和块中包含的交易列表组成(大小为1M)。下面简单介绍一下区块头的组成:

p>

块头大小为 80 字节。

4 字节版本号。

前一个区块的 32 字节哈希。

32字节的Merkle Root Hash,反映了区块头与区块内交易的关系,以及区块中包含的交易列表。 Merkle Root Hash 由 Merkle Tree 算法生成。

当前难度值的 4 个字节。

4 字节随机数(nonce)。

3.难度值:难度,这是一个指标,不是常数。它最关键的作用是确定矿工在比特币网络中需要经过多少次哈希运算才能获得生成区块的记账权,进而获得区块奖励(12.5bitcoin)。比特币的平均出块率是每 10 分钟一个。每2016个区块后,节点根据公式调整难度值:新难度值=旧难度值*(过去2016个区块花费的时间/20160分钟)。控制块的平均生成时间。如果出块速度快于 10 分钟,则增加难度值,如果慢于 10 分钟,则降低难度。

4.目标值:目标,目标值公式:目标值=最大目标值/难度值

最大目标值是一个常数值:

0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF。目标值的大小与难度值之间存在反比关系。在比特币中,矿工计算的区块哈希值必须小于这个目标值。换句话说,很容易理解:在工作量证明的过程中,你不断尝试改变用于SHA256计算的nonce,那么尝试的目的就是找一个前面有一定数量000的值更大。

(为什么更多的0更难?你尝试一个游戏,你不断掷一对骰子得到小于某个数字。在第一轮,目标是12。只要你不掷两个6 ,你就赢了。那么下一轮的目标是11。玩家只有投掷10分以下才能获胜。如果目标降低到2,那么难度可想而知。)

工作流程的工作证明

整个Proof of Work流程其实并不复杂。

生成coinbase交易coinbase。

将交易打包形成交易列表。

通过 Merkle Tree 算法生成 Merkle Root Hash。

组装区块头。

区块头作为工作量证明的输入,nonce值不断变化,计算公式为:SHA256(SHA256(Block_Header)) double SHA256。结果不断与当前网络的目标值进行比较。一旦发现小于目标值(target),工作量证明就完成了。

将区块广播到网络,网络中的节点对其进行验证。

验证后,等待后续出块确认(一般为6个)。

附上比特币挖矿电子分布图: