预共识Avalanche促使零确认交易更安全
水陆草木之花特
发表于 2022-12-18 09:07:54
150
0
0
# q' S- q' m) U8 E' e
为了达成双花,人们可以实施的攻击大致有两大类:
1 w/ T! e. {2 E' J0 w
快速重花:攻击者向商家发送付款,同时向不同节点子集广播双重支付。这会导致矿工在两个交易之间进行竞争。最有可能的是,一些矿工将首先看到合法的付款,而另一些矿工将首先看到双重支付的付款,这使得双花交易被打包的几率大约为50%。这种攻击很容易做到,而且有很好的成功率。幸运的是,这也是最容易防范的,因为我们可以让商家及时发现双重支出,并拒绝付款。稍后将对此将会做更多介绍。; ^' y# Q5 g$ Z7 b6 K
/ ?4 r8 k& O& W M; [
贿赂矿工:矿工贿赂难以抵御。在这种情况下,攻击者不会立即广播双重支出,而是等待商家接受零确认付款,并且很有可能直到他带着商品驾车离开商店之后,创建一个交易,支付更多的矿工费并把它发送给矿工们。
例如,攻击者可能正在购买一台价值4000美元的电视机,他可以创建一个支付2000美元交易费的双重花费。如果任何矿工接受双重花费,他将获得2000美元,攻击者可以在电视上获得2000美元的折扣。人们希望矿工足够诚实,不会接受贿赂,但如果他们中哪怕只有一小部分人接受贿赂,比如10%,那么它就会把零确认交易变成一个即时支付系统,让所有人都无法使用,在这个系统中,进行欺诈的成功率为10%。9 u# P6 l4 M* Y! |" `: U3 I% {
Peter Rizun对此进行了实证研究,他发现,在比特币现金网络上,将贿赂与双重花费捆绑在一起,确实大大增加了双重花费被打包的可能性。这意味着今天网络上的一部分矿工很乐意接受你的贿赂,即使他们在协助欺诈。
( u- D* v4 l3 N6 ?! p1 T
—— 解决方案 ——& R, x6 e. U/ G' y4 b' y
/ \. ?/ H+ t' A% O; M
快速重花
" y5 o* h; K5 d( d: Z7 ?
正如我上面所说,快速重花是最容易抵御的攻击类别。在上次比特币现金开发者大会上,我们关注的焦点主要集中在设计一种双重支出通知方案,该方案将转发加密证据,表明网络上已经发生了双重花费,从而使商家能够接受到这种证据并拒绝接受该付款。- s& z. u5 `$ @, K/ F( {6 d/ u
0 c/ Y9 w/ g9 c# [
工作流程如下:
商家的销售点终端向买方提供BIP70付款请求。
买方的钱包创建一个交易并将其直接发送回商家。商家的节点检查交易并确保它满足零确认支付的所有标准(不可能为所有类型的交易创建双重支出证明,因此我们需要限制零确认交易的可接受交易集)。, j' ^& L: v: U( k( V
商家向网络广播交易。
; T3 J5 K& [1 _$ z
然后商家的钱包在接下来的3-5秒内监听网络上的双重花费通知。
如果在此期间没有接收到双重花费通知,则POS终端接受付款。. W3 c5 H5 k. n5 v
% Q: v7 U7 W) P
如果通过网络接收到双重花费通知,POS终端会拒绝付款,收银员会要求另一种形式的付款。
如果付款被拒绝但仍然确认,钱包将退款发送到BIP70付款提供的买家退款地址。 @8 ^0 n$ Y/ |, R% h! A7 |+ B H
# `9 _# C4 T! i8 T1 f$ @+ U& T
因此,一旦我们实施了双花证明中继并且在商家软件配置它并使用,就不可能实现快速重花攻击。; ^) H5 C3 [" h
Craig Wright对快速重花攻击的解决方案是让商家查询所有矿工的mempool,看看他们的mempool中是否存在交易。虽然这可能与我们的双花通知方案一样有效,但它假设矿工高度集中。
在一个运转良好的去中心化挖矿网络中,将有成千上万名的矿工,而不是两三个矿工。不仅不可能及时查询成千上万名矿工的mempool,而且甚至不可能知道所有矿工的IP地址。矿工的集合不是也绝对不应该是静态的。它是一个动态开放的会员系统,可以自由进入并存在。因此,即使您确实查询了您认为自己知道的所有矿工的mempool,也总会有其他您不认识的矿工加入。+ r: _1 q6 F9 ?$ b
查询矿工的mempool可能对BSV有意义,因为Craig Wright一再表示BSV的目标不是去中心化。他们公开接受并拥抱挖矿中心化,并且认为这是该系统的一个完全正确的方向。然而,对于比特币现金,我们正在寻求相反的方向。我个人可能会在明年的某个时间致力于去中心化矿池的工作,我们已经让该领域的其他人目前正在研究潜在的解决方案。
贿赂矿工
在他的文章中,Wright甚至没有提及贿赂矿工的话题。据推测,他认为如果他们接受贿赂,人们可以起诉矿工。同样,这可能在只有少量矿工的BSV网络中可行,他们正在推动Miner ID?系统。但是对于去中心化货币而言,这不是一个可行的选择。将一个区块上传到网络是非常简单的,但是很难在事后确定是谁创建了这个区块。
1 T* V# g" ]% m4 t8 p( Q) t
理想的情况是,在某种系统中,包含明显的双重花费的区块将被孤立变成孤块。今年3月,Calvin Ayre的Coingeek发布了一份新闻稿,宣布他的矿池将启动孤块,其中包含他们认为是双花交易。该声明遭到了技术界的嘲笑。) n- P) N# i( g
! p, H; I& a5 n2 H9 Y
这里的原因应该是显而易见的,让每个矿工自己决定什么是和不是双重花费,肯定会导致链的分裂和共识的失败。
% r4 g' i4 a9 i# t# C
请参见ABC开发人员Jason Cox的文章“Why orphaning blocks with double-spend transactions is dangerous”。0 ^# k7 C/ Y- y. Q/ E& q! a
如果我们要将拥有双重花费的区块变成孤块,我们不能让每个矿工都做自己的事情。这需要协调。需要有一种方法让矿工达成共识,什么是双重花费,什么不是,以便包含双重花费的区块可以安全地被孤立,而不会有链被分裂的风险。而这就是预共识。
! E/ F+ F8 E' z
引入Avalanche
0 ]+ x. _5 b% I
Avalanche是今年早些时候首次推出一项的新共识协议。它为网络上的节点提供了一种新的方式,可以在两个冲突的交易之间进行选择,并就下一个区块中应该包含哪一个交易达成共识。
在比特币现金中使用Avalanche为矿工协调提供了一种非常优雅,去中心化的协调机制,可以潜在的防止矿工接受双重花费贿赂,并且当与双花通知结合使用时,可以使零确认交易非常安全。接下来我将介绍Avalanche的工作原理,并简要介绍在比特币现金中添加Avalanche会是什么样子。
# I/ K1 e" q6 r0 t: T' A
Avalanche基础知识
假设我们有两个相互冲突的交易——交易A和交易B。我们并不特别关心我们选择哪个交易(技术上是这样的,但是我们稍后会详细讨论)但我们真正关心的是确保所有节点都同意A有效或B有效。我们希望避免某些节点认为A有效而其他节点认为B有效的情况。; x: M* v8 b. A' G0 L8 d
- C7 r6 E) w: \: Z' q
那么Avalanche 怎么做呢?参与共识过程的每个节点将随机选择一些其他节点进行查询,并询问它们在A和B之间的偏好。假设对于该示例,每个节点选择八个随机节点。. F4 V6 k4 N6 W0 @2 ]! O4 L
, N1 @* i0 }5 j# i
如果你的节点以交易A的初始偏好选项(可能是A首次出现),并且你查询的大多数节点都响应并说他们更喜欢A,那么你将你的首选项保留为交易A。如果大多数说他们更喜欢B,然后你将你的偏好翻转到B。网络中的每个节点都做同样的事情。8 S3 @+ P. ]/ V! ~
) h, d M% ?8 r
这是第1轮。我们将按照完全相同的过程进行更多的回合。每一轮我们都随机选择节点,根据其他大多数节点的投票结果进行翻转或不翻转。- q- }0 }1 l7 T" u5 k
希望你能看到将要发生的事情…它将引发一场雪崩!如果节点的初始偏好在A和B之间各占一半(可能是一半先看到A,一半先看到B),那么每个回合的结果可能是这样的:, t- ?+ d" ?% w: F) G: U3 T, T8 W
很快,系统崩溃达成共识。: I4 e3 |3 i% a: s+ b- q
, o0 z4 ^' C$ [7 ?" ?7 H) _) f
你可能遇到的问题是,如果某些节点是恶意的,会发生什么?他们可以攻击这个共识过程吗?答案很有趣。恶意节点可以通过不遵循协议和策略性地翻转投票来试图破坏共识的过程。然而,即使网络上的大多数节点都是恶意的,即使99%是恶意的,如果你愿意延长轮次数,那么遵循该协议的诚实节点仍将达成共识。% d6 _3 S0 J/ a. n; F1 A
7 u6 F" O! R- W9 u
但问题就在这里,我们没有无限数量的回合等待达成共识。我们需要这个快速完成。所以在实践中我们必须严格限制我们执行的轮数。这一限制意味着网络可以承受一定比例的恶意节点,而诚实节点仍然可以达成共识,但是如果恶意节点的比例超过阈值,则会导致诚实节点彼此失去共识。阈值是一个可调参数。执行的轮数越多,可以承受的恶意节点阈值就越高。执行的轮数越少,能够承受的阈值就越低。2 @9 Q4 i4 e/ [7 I5 W1 n6 C5 ^! H
因此,让Avalanche 发挥作用的关键是,需要某种反sybil机制来阻止任何人激活参与共识过程的一堆节点。幸运的是,比特币中已经有了一个非常好的反sybil机制——POW。. H+ R& {6 v: Y e, t
Avalanche在比特币现金中
) k( {/ m: L% W, h
在比特币现金中使用Avalanche可能有多种方法达成预共识,但是在这里我将介绍一种简单而优雅的使用它的方法。( @$ U" Y1 n8 x: Q: ?: E1 Y
_8 N; j+ O- f( P4 T- _, t
POW被用作反sybil机制。最后100个区块的矿工们组成共识小组并参与avalanche。这是一个成员滚动的小组。每个新块都添加一个新的矿工到小组中,并去挖n-100的区块。$ v9 `* _* k, B; \' n) X5 T2 w2 h
如果在网络上没有双重支出,那么比特币现金的功能与目前的功能相同。矿工接收交易到他们的mempool,选择要放入区块的交易,并将打包好的区块广播到网络。矿工之间甚至没有发送avalanche消息。对于外部观察者,你甚至不知道avalanche是活跃的。 Y; x4 E! o5 n, V [7 h
当双重支付进入矿工的mempool时,它会触发avalanche过程。矿工开始向相互发送avalanche查询并执行n轮。最终,所有矿工都会决定交易A是有效的,B是无效的,或者A是无效的,B是有效的。* ~! `1 [. t2 v6 R, M+ |0 E! ?
如果由avalanche确定A为有效,B无效,矿工就可以不打包交易A。就像今天一样,矿工仍然可以决定不打包任何给定交易。然而,它们也不允许打包交易B。如果一个区块中包含交易B,它将会被孤立。那些包含先前未宣布的双重花费的区块在被接受之前仍然必须经历avalanche。1 ~* |" q+ L: d8 j
非挖矿节点不需要了解任何有关avalanche的信息,任何未用于挖矿的完整节点软件都不需要支持它。从非挖矿节点的角度来看,avalanche是一个软分叉。最糟糕的情况是矿工挖了一个区块,其中包含由avalanche确定为双重花费的交易。其他矿工拒绝该区块并继续构建前一个区块,但是完整节点不知道它已被拒绝。最终,其他矿工将链延伸到孤块之外,完整节点将经历一次重组。在实践中,我们不会希望这种情况发生,因为所有矿工都会使用avalanche来避免被孤立和赔钱。 n, Y; X7 V. v2 N
商家仍然需要双重花费检测以防止快速重花,但他们知道,只要他们等待足够长的时间以便交易传播到矿工的mempool(3-5秒)就不会检测到双重花费。因为矿工不会在接下来的挖矿中打包双花的交易,即使他们接受了贿赂。
这是一颗银弹吗?
( Q5 |' E, J+ n' j- ^& F
也许。如果在每次avalanche回合中大多数矿工投票支持首次出现的交易,那么少数人将被迫同意。
目前如果有10%的矿工愿意接受贿赂,那么它会彻底摧毁零确认交易。有avalanche的存在,如果有10%的矿工愿意接受贿赂也不会摧毁零确认交易,因为大多数矿工会孤立他们的区块。+ h6 I( V9 q9 p# ~! I/ S3 |
) T3 T7 N: C, H# s
然而,不利的一面是,如果大多数矿工想要接受贿赂,那么avalanche将在100%的时间内选择双重花费交易,这也会摧毁零确认交易。6 E* x; s" T$ E6 p: W A0 _
大多数矿工有多大可能不诚实并接受贿赂来挖双倍花费的区块?虽然我们在没有看到一些经验数据的情况下无法确定,但我认为这似乎不太可能出现。毕竟我们要求那些从经济上受益的人接受贿赂投票,如果他们想接受,那么至少存在利益冲突。/ I: Z$ S* M1 N
如果矿工开始投票接受贿赂,我们将有最后的追索权,那就是在avalanche共识集团中增加更多的利益相关者。在比特币现金中,除了工作量证明之外,我们还有其他稀缺资源,可以用于反sybil的目的。Utxo和coin age就是两个例子。而且这两者的持有人并不是那些接受贿赂的人,所以他们不太可能投票赞成接受贿赂。
总结
# ~7 x- q+ m9 X4 p& ]) o
零确认交易的解决方案已经研究十年了,我们终于站在了实现这一目标的顶端。这实际上是许多有才能的人进行大量研究,测试和实验的副产品。与Craig Wright随性的“只要查询矿工们的mempool,让矿工们独立地建立孤块,然后在出现问题时起诉矿工”相比,这是一个更为严谨、思路更为缜密的问题解决方案。; k. q. s/ w) f6 \( s( t% [9 T
BCH和BSV之间的研究质量,提案和实施的差异实际上根本无法比较。希望我们能够在2019年开始尝试这些东西。做好准备!
成为第一个吐槽的人