比特币侧链共识的权益证明协议
1 引言
最近,像比特币这样的加密货币[26]通过确保在大量共谋的攻击者存在的情况下,相互不信任的节点之间进行可靠的交互,推动了去中心化的概念。这些加密货币依赖于一种称为区块链的公共数据结构,在其中永久存储节点间交换的所有交易。向区块链添加新区块(称为挖矿)需要解决一个中等难度的密码学难题。第一个解决该难题的矿工将获得一些虚拟货币(为所挖区块获得的一些新币,以及其中包含的每笔交易的小额手续费)。在比特币中,矿工必须反转一个哈希函数,其复杂度会动态调整,以使解题的平均时间达到 ∼10分钟。相反,移除或修改现有区块在计算上是不可行的:粗略地说,这需要一个对手拥有比其余所有其他节点总和更多的哈希算力。如果修改或删除区块在计算上是容易的,攻击者就可以发起一次双花攻击,即他先向商家支付一定数量的币 (通过在区块链中发布一笔适当的交易),然后在他收到已付款的商品后,再移除包含该交易的区块。据传言,除非攻击者控制了比特币网络总算力的大多数,否则比特币能够抵御此类攻击。
总计算能力的多数,比特币才能抵抗攻击。尽管文献中已经报告了一些漏洞 (见第4节),但在实践中,比特币到目前为止表现得惊人地良好:事实上,已知对比特币成功的攻击都是与比特币协议无关的标准黑客行为或欺诈[19],行为。
利用比特币区块链及其共识协议作为智能合约(即超越数字货币的去中心化应用[29])基础的想法已被近期多项研究探索。例如,[3,5,7,9,22–24]提出了用于安全多方计算和公平抽奖的协议;[13]在比特币上实现了去中心化授权系统;[28,30]允许用户在区块链上记录声明;[10]是一个支持 get/set 操作的键值数据库;[14]通过在比特币交易中嵌入自身消息,为比特币扩展了高级金融操作(例如虚拟资产创建、分红支付等)。
尽管比特币区块链主要用于货币交易,但其协议允许客户端在交易中嵌入少量额外字节作为元数据。许多智能合约平台利用这些元数据来存储持久化、带时间戳且防篡改的所有消息历史记录[1,6]。通常,元数据被存储在OPRETURN交易[2],中,使其对比特币网络无意义且不可花费。通过这种方法,平台相关消息的序列形成了一条子链,其内容只能由执行该平台的节点解释(我们将这些节点称为元节点,以区别于比特币节点)。然而,由于平台逻辑与比特币逻辑分离,元节点可以在子链上追加包含对平台无意义的元数据的交易,甚至与智能合约预期执行不一致。据我们所知,现有平台均未使用安全的协议来判断其子链是否一致。这是一个严重的问题,因为它要么限制了这些平台支持的智能合约的表达能力(必须将所有消息视为一致,从而基本丧失状态的概念),要么降低了合约的安全性(因为攻击者可能成功发布不一致消息,从而篡改智能合约的执行)。
贡献。 我们提出了一种协议,使元节点能够在比特币区块链上维护一条一致的子链。我们的协议基于权益证明[8,21],,因为扩展子链必须通过资金抵押来支持。直观来说,当一个元节点发布了一条一致的消息,并且该消息被网络其余部分确认后,其抵押的资金将被返还。特别是,我们的协议为诚实元节点提供了经济激励,同时抑制了恶意参与者的行为。我们通过在多种攻击场景下对协议进行模拟,实证验证了其安全性。值得注意的是,我们的协议仅使用所谓的标准交易1即可在比特币中实现。
1这一点很重要,因为运行官方比特币客户端的节点会丢弃非标准交易。
2 比特币和区块链
比特币是一种加密货币和数字开源支付基础设施,最近市值已接近300亿美元2。比特币网络是点对点的,不受任何中央机构控制[26]。每个比特币用户拥有一个或多个个人钱包,这些钱包由非对称加密密钥对组成:公钥唯一标识用户地址,而私钥用于授权支付。交易描述了比特币(B)的转移,所有交易历史记录在一个称为区块链的公开、不可篡改且去中心化的数据结构中,该历史记录决定了每个地址包含多少比特币。
为了说明比特币的工作原理,我们考虑两笔交易 t0和t1,,我们用以下图形表示:3
| in: ··· 输入脚本: ··· |
| 输出脚本(t σ): verk(t σ) 值: v0 |
| in: t0 输入脚本:签名 k(•) |
| 输出脚本(···): ··· 值: v1 |
交易 t0 包含 v0B,可通过在区块链上发布一笔交易(例如 t1)来赎回,该交易的输入字段是整个 t0 的加密哈希(为简便起见,在图中仅显示为 t0 )。要赎回 t0,,t1 的输入脚本必须包含使 t0 的输出脚本(一个布尔可编程函数)求值为真的值。当这种情况发生时,t0 的值将转移至新交易 t1,,而 t0 将不再可被赎回。类似地,后续的新交易可以通过满足其输出脚本来赎回 t1。
在上面显示的示例中,输出脚本的 t0在接收到对赎回交易 σ的数字签名时求值为真t,使用给定的密钥对 k。我们用 verk(t σ) 表示签名验证,用 sigk(•) 表示包含交易的签名( t1在我们的示例中),包括所有交易的各个部分除了其输入脚本。
现在,假设区块链包含 t0,尚未被赎回,当有人尝试追加t1时。为了验证此操作,比特币网络的节点检查 v1 ≤ v0,然后通过将其形式参数输出脚本实例化为 t0,和 σ,即分别为 t1和签名 签名k(•),来评估 verk验证签名是否正确:因此,输出脚本 执行成功,且 t1赎回了 t0。
比特币交易可能比前面示例中所示的更为通用:其一般形式如图1所示。首先,可以有多个输入和输出(图中用数组表示法表示)。每个输出都有一个关联的输出脚本 和值,并且可以独立于其他输出被赎回。因此,输入 字段必须指明它们引用的是哪一个输出
2来源:加密货币市值 http://coinmarketcap.com。 3输入脚本 和 输出脚本 在比特币文档中分别称为 scriptPubKey 和 scriptSig
| in[0]:t0[out0] 输入脚本[0] W0 … |
| 输出脚本 0 :S0 值[0]: v0 … |
| lockTime: n |
图1. 交易的通用形式。
赎回(t0[out0]在图中)。类似地,具有多个输入的交易会为每个输入关联一个输入脚本。要使交易有效,所有输入的值之和必须大于或等于所有输出的值之和。在其一般形式中,输出脚本是某种(非图灵完备)脚本语言中的程序,包含有限的逻辑、算术和加密运算符。最后,lockTime字段指定了该交易最早可以出现在区块链上的时间(区块号或 Unix时间戳)。
比特币网络由大量被称为矿工的节点组成,这些矿工从客户端收集交易,并负责将有效的交易追加到区块链上。为此,每个矿工都维护一份区块链的本地副本,以及一组从客户端接收到的未确认交易,并将这些交易分组为区块。
矿工的目标是将这些区块添加到区块链中,以获得收益。向区块链追加一个新的区块 Bi需要矿工解决一个密码学难题,该难题涉及区块 Bi−1的哈希 h(Bi−1)、一组未确认交易 〈Ti〉i以及一些随机值 R。更具体地说,矿工必须找到一个 R的值,使得 h(h(Bi−1)‖〈Ti〉i‖R) < μ,其中 μ的值会根据当前网络的哈希算力动态调整,以确保平均出块速率为每10分钟一个区块。矿工的目标是赢得发布下一个区块的“彩票”,即在其他矿工之前解决该密码难题;当这种情况发生时,该矿工将获得新生成的比特币作为奖励,并且对所挖区块中包含的每笔交易收取少量手续费。如果某个矿工声称解决了当前的密码难题,其他矿工就会放弃当前的尝试,用新区块 Bi更新其区块链的本地副本,并开始在 Bi之上挖掘新的区块。此外,矿工还需要通过执行相关脚本来验证 Bi中交易的有效性。尽管验证交易不是强制性的,但矿工会受到激励去执行此操作,因为一旦发现某笔交易无效,他们将失去该交易被写入区块链时所获得的手续费。
如果两个或多个矿工同时解决一个密码难题,他们会在区块链中创建一个 fork(即,两条或多条并行的有效分支)。当出现分叉时,矿工必须选择一个分支继续挖矿过程;大致上,一旦其中一条分支变得更长,此分歧便会得到解决。比其他分支更长。当这种情况发生时,其他分支将被丢弃,其中包含的所有孤立交易也将被总作体废。总体而言,该协议实质上实现了一个 “工作量证明” 系统[15]。
3 比特币侧链共识协议
3.1 子链和一致性
我们假设有一组参与者 A、B⋯⋯,他们希望将消息 a、b⋯⋯追加到子链上。一个标签是包含参与者 A 和消息 a 的二元组,记作 A : a。子链是标签的有限序列,记作 A1: a1 ···An: an,这些子链嵌入在比特币区块链中。其含义是:A1已在比特币区块链的某个比特币区块 t1中嵌入了消息 a1,然后 A2追加了一个包含 a2,的比特币区块 t2,依此类推。对于一个子链η,我们将追加 A : a 后得到的子链记作 ηA : a。
通常情况下,标签也可能对比特币区块链产生副作用:我们用A:a(v → B) 表示一个同时将 vB 从 A转移至 B的标签。当该消息位于子链上时,它也会作为比特币区块链上的标准货币转账,使得在A的交易中 v可由 B兑付。当值 v 为零或无关紧要时,我们直接写作a而非a(v →B)。
一个关键的认识是,并非所有可能的标签序列都是有效的子链:为了定义一致的子链,我们将子链解释为标记迁移系统(LTS)的轨迹。形式上,LTS 是一个元组 (Q, L, q0,→),其中: – Q是一组状态(由 q、 q′等表示); – L是一组 标签(在本例中,形式为A:a); – q0 ∈ Q是初始 状态; – → ⊆ Q× L× Q是转移关系。
通常,当(q, A: a q ′) ∈ →时,我们写作 q A:a −−→ q ′,且对于给定的子链η= A1:a1 ··· An:an,只要存在 q1,…, qn使得以下成立,我们就写作 q η →− q ′
q A1:a1 −−−→ q1 A2:a2 −−−→ ··· A :a n ′
我们要求关系 → 是 确定性的,即如果 q A:a −−→ q ′ 且 q A:a −−→ q ′′,则必须有 q ′= q ′′。
直观来说,子链具有一个状态(初始时为 q0),每条消息根据转移关系更新该状态。更准确地说,如果子链处于状态 q,那么由a发送的消息A将使状态演变为 q ′,只要 q A:a −−→ q ′是LTS中的一个转移。
对于某些状态 q 和标签 A : a,可能不存在状态 q′ 使得 q −A−:→a q′成立。在这种情况下,如果 q 是子链的当前状态,我们希望使得参与者(可能是试图篡改子链的对手)难以追加此类消息。非正式地说,一个子链 A1:a1 ···An:an 是一致的,如果从初始状态 q0 出发,能够找到状态 q1, . . . , qn,使得从每个 qi都存在一个标有 Ai+1:ai+1 的转移至 qi+1。
定义1 (子链一致性)。 我们说一个子链 η是一致的,只要存在 q使得q0 −η→ q。
注意,如果一个子链是一致的,则根据确定性,状态 qn 存在且唯一。换句话说,一致的消息序列唯一地确定了侧链状态。
示例1。 为了说明一致性,考虑一个智能合约 FACTORSn该合约向每位通过提供新的质因数来扩展子链的参与者奖励 1B n。该合约接受两种类型的消息: – sendp,其中 p为自然数; – payp(1 → A),表示 A获得因子 p 的奖励; 合约的状态可以表示为三元组(A p, b)的集合,其中 b是一个布尔值,用于指示 A是否已因因子 p获得奖励。初始状态为 ∅。我们定义FACTORSn的转移关系如下: – S A: sendp −−−−−→ S′,当且仅当 p是 n的质因数时,(B p, b) ∈ S对任意B和 b成立,且S′= S ∪{(A p, 0)}; – S F:payp(1→A )−−−−−−−−→ S′,当且仅当(A p, 0) ∈ S成立,并且 S′=(S{(A p, 0)}) ∪{(A p, 1)}。
现在考虑以下子链,其中因子330,,F是发布合约的参与者,而M是对手: 1. η1=A:发送11B:发送2F:支付11(1 →A) F:支付2(1 →B) 2. η2=A:发送11 F:支付11(1 →A) M:发送11 3. η3=M:发送229 F:支付229(1 →M) 4. η4=A:发送11 F:支付11(1 →M)
子链 η1是一致的,因为 A和 B都发送了新因子并获得了它们的奖励。子链 η2和 η3是不一致的,因为由 M发送的11不是新鲜的,且229不是330的因子。最后,子链 η4是不一致的,因为 M获得了本应属于A的奖励。
与比特币类似,我们并不旨在保证子链始终一致的。实际上,在比特币中,矿工也可能成功追加包含无效交易的区块:在这种情况下,如第2节所述,比特币区块链会发生分叉,其他矿工必须选择跟随哪个分支。然而,诚实矿工会忽略包含无效交易的分支,因此最终(由于
诚实矿工掌握大部分计算能力时,该分支将被所有矿工放弃。
对于子链一致性,我们采用类似的概念:我们假设对手可以追加一个标签 A: a使得 qn −A−:→a,从而导致子链不一致。然而,诚实节点在收到此类标签后将丢弃它。为了形式化它们的行为,我们在下方定义一个函数 Γ,该函数对于给定的子链 η(可能不一致)过滤所有无效消息。因此, Γ(η) 是一个一致的子链。
定义2(分支剪枝)。 我们对子链上的自同态函数 Γ 进行如下归纳定义,其中 ε 表示空子链: Γ(ε)= ε Γ(η A: a)={Γ(η) A: a if∃q, q′: q0 −Γ−(−η→) q −A−:→a q′ otherwise
为了建模哪些标签可以在不破坏子链一致性的情况下被追加到子链上,我们引入辅助关系 | =。非正式地,给定一个一致的子链 η,当子链η A:a仍然保持一致时,该辅助关系 η | = A:a成立。
定义3(一致更新)。 我们说A:a是子链 η的一致更新,记作 η | = A:a,当且仅当子链 Γ(η)A: a是一致的。
例2。 回顾子链 η2= A:发送11 F:支付11(1 → A) M:发送11(来自示例1)。我们称 B:发送2是 η2的一致更新,因为Γ(η2) B:发送2=A:发送11 F:支付11(1 →A) B:发送2是一致的。
3.2 协议描述
假设存在一个由相互不信任的节点 N, N′,…组成的网络,我们称之为元节点,以区别于比特币网络中的节点。元节点接收来自参与者(同样彼此互不信任)的消息,这些参与者希望扩展子链。我们的目标是允许诚实参与者(即遵循协议的参与者)对子链进行一致更新,同时抑制攻击者试图使子链变得不一致的行为。
为此,我们提出了一种基于权益证明 (PoS) 的协议。具体而言,我们依赖于以下假设:诚实参与者持有的总权益大于恶意参与者的权益4。元节点需要使用权益,对参与者发送的消息进行投票。这些消息被嵌入到比特币交易中,我们称之为 更新请求。我们用 UR[A:a]表示参与者 A 发起的、用于将消息 a 追加到子链的更新请求。为了对一个更新请求进行投票,元节点必须在其上投入 κ B,其中 κ是由协议指定的一个常数。一个更新
4需要注意的是,一个类似的假设在比特币中成立,但该假设涉及计算能力而非权益, 即诚实矿工控制的计算能力应超过恶意参与者。
图2. 协议阶段 i 的概要。
请求需要单个元节点的投票。该协议要求元节点仅在UR[A:a]是当前子链的一致更新时,才对请求A:a进行投票,即当 η成立时。为了激励元节点对其更新请求进行投票,参与者会向其支付一笔手续费(小于 κ),当更新请求被追加到子链后,元节点可将该手续费赎回。
我们在图2中定义了我们的协议。它被组织为多个阶段。该协议确保每个阶段 恰好一个标签A:a被追加到子链上,对应阶段为 i。这是通过将相应的交易URi[A: a]追加到比特币区块链上来实现的。为了保证其唯一性,协议利用了一个仲裁者T, 即网络中的一个特定节点,假设其行为诚实(我们在第3.3节中讨论此假设)。下面我们描述协议的主要步骤。
在协议阶段 i 的步骤1中,一个元节点(例如 N)投票支持一个更新请求 (如第3.4节所述)。为此,N 必须通过向已将 URj 追加到子链的元节点 N′ 支付 κ B(加上参与者的费用),来确认子链中的前一次更新 URj。为了避免第3.3节中讨论的自补偿攻击,协议仅允许确认过去 C 次更新之一,其中 C ≥ 2 是由协议固定的常数(称为检查点偏移)。综上所述,值 j 需满足以下条件:(i) j< i;(ii) |i −j| <C;(iii) URj[A : a] 是一致的。通过这种方式,协议激励元节点仅投票支持一致的更新,因为不一致的更新不太可能被确认。
如果子链中最近的 C 次更新全部不一致,则 N 选择其中最后一次。然后, N 将 UR[A : a] 添加到请求池中,即当前阶段所有已投票请求的集合(在每个阶段开始时清空)。此投票步骤具有协议规定的固定持续时间 Δ(Δ 的选择在第5节中讨论)。
在步骤2,当 Δ过期时开始,仲裁者T会对所有格式正确的请求交易进行签名,即那些符合第3.4节定义的格式的交易。
在步骤3,元节点将由T签名的请求发送到比特币网络。第3.4节中描述的机制确保,在每个阶段 i,恰好有一笔交易,记为URi[A:a],被写入比特币区块链。当这种情况发生时,标签A:a被追加到子链上。
我们假设所有元节点都认同比特币区块链;由于 η是该区块链的投影,因此它们也认同 η。
3.3 协议的基本性质
我们现在建立该协议的一些基本属性。此后,我们假设诚实节点控制着网络总权益的大多数6,此后表示为 S。此外,我们假设对挂起的更新请求进行投票所需的总权益大于诚实元节点的总权益。
对手实力。 一个诚实元节点根据其权益数量进行投票,最多可投允许数量的请求。因此,如果其权益为 h,则每个阶段投票 h/κ 个请求。相应地,网络中其余部分—— 可能包含不遵守协议的不诚实元节点——最多可投票 (S − h)/κ 个请求。那么:
命题1。 一个拥有权益 h的诚实元节点在每个阶段更新子链的概率至少为 h/S。
由于我们假设诚实元节点控制了大部分权益,因此命题1也限制了对手的能力:
命题2。 如果诚实元节点的全局权益为SH,那么在每个阶段,恶意参与者更新子链的概率至多为(S − SH)/S。
尽管不一致的更新会被诚实元节点忽略,但其作为标准比特币交易的副作用(即在标签 A到 B中将 vB 从 A :(v → B) 转移)一旦被包含在比特币区块链中便无法撤销。现在我们说明协议中的激励系统如何降低此类不一致更新的可行性。
假设一个对手M成功向子链追加了两次更新:一次在索引 j处的不一致更新,以及一次在索引 i> j处的一致更新。由于M未遵循协议,她可以利用URi来赎回她放在URj上的 κB。之后,该对手将能够赎回她放在URi上的B:事实上,诚实元节点会对URi进行投票,因为它是 一致的。我们将M 的上述行为称为自补偿攻击。
现在,根据命题2,如果 M拥有权益 m,且其他元节点是诚实的,则在协议的给定阶段中,M 扩展子链的概率至多为 m/S。由于各个阶段可视为相互独立的事件,且 M 必须在最近的检查点上发布至少 2 次更新才能执行攻击,因此我们得到以下结论:
命题3。 对手以权益 m进行自补偿攻击成功的概率至多为: (C2) · μ2 (1 − μ) C−2 其中 C 是检查点偏移,且 μ= m/S。
在此假设下,元节点可以确保仲裁者是诚实的。
由于在不丢失的情况下发布不一致更新的概率 κB 随着 C的增大而增加,因此保持该值较小至关重要。例如,如果 μ= 0.1对手执行攻击的概率受限于:(i)当 C= 2 时为 0.01;(ii)当 C= 3 时为 0.027;(iii)当 C= 4 时为 0.0486。
请注意,如果攻击成功一次,则攻击概率会略微增加,因为权益 m 会因已发布更新的客户端费用而增加。如果手续费相对于 S 较小,则这不是问题。
仲裁者的可信度。 我们的协议使用仲裁者T来确保每个阶段恰好有一笔交易被追加到区块链上,并且该选择是随机的。为了简化协议的描述,我们假设仲裁者T行为诚实。然而,我们的仲裁者并不充当受信任的权威角色:实际上,需要投票的更新请求由元节点选择,一旦它们被添加到请求池中,仲裁者只需对所有请求进行签名,而不参与验证或投票过程。由于任何人都可以检查请求池,因此仲裁者的任何不当行为都可以被元节点检测到,并可进一步将其替换。
3.4 在比特币中的实现
在本节中,我们展示如何在比特币中实现我们的协议。子链位置 i处的标签 A:a(v → B) 通过图 3a 中的比特币交易 URi[A:a(v → B)] 实现,其输出如下: – 索引为0的输出嵌入标签 A:a。这通过一个不可花费的OP RETURN脚本 [6]7实现。 – 索引为1的输出将该交易链接到子链中的前一个元素,由in[2]指向。此链接需要仲裁者签名。请注意,由于同一阶段中的所有更新请求都赎回相同的输出,因此其中恰好只有一个可以被挖出。 – 索引为2的输出实现了激励机制。该脚本奖励在子链中对先前的UR′进行投票的元节点 N′。元节点 N κ可通过提供其签名从此输出赎回B以及参与者的费用。 – 索引为3的输出仅适用于消息 a(v →B) 的情况,其中 v> 0。参与者 B可通过提供其签名从此输出赎回 v B。
所有交易都指定一个 lockTime n+ k,其中 n 为当前比特币区块高度, k 为一个正数常量。这确保了交易只能在 k 个区块之后才能被挖出。通过这种方式,即使某笔交易由仲裁者签名并早于其他交易发送给矿工,其被追加到区块链的概率仍与其他交易相同。
为了初始化子链,仲裁者将创世 交易发布到比特币区块链上。该交易锁定了少量的比特币,这些比特币
7该 OP RETURN指令允许在交易中保存80字节元数据;包含 OP RETURN的 OP RETURN 始终评估为假,因此是不可花费的。
| in: ··· 输入脚本: ··· |
| 输出脚本(t σ): verT(t σ) 值: 0.0001 |
URi[A:a(v → B)]
| 输入[0]:手续费i 输入脚本[0]: sigC(•) 输入[1]:权益i 输入脚本[0]: sigN(•) 输入[2]:确认i−1(索引为1) 输入脚本[0]: sigT(•) |
| 输出脚本 0 : OP_RETURN A:a 值[0]:0 输出脚本 1 : verT(t σ) 值[1]:0.0001 输出脚本 2 : verN′(t σ) 值[2]: κ+手续费 输出脚本 3 : verB(t σ) 值[3]: v |
| lockTime: n+ k |
(a) (b)
图3。 在(a)中,用于实现我们协议的比特币交易格式。在(b)中,通过我们的协议维护的子链。由于 URi+2包含一个不一致更新,对该更新进行投票的元节点不会获得奖励。
可由 UR1通过仲裁者签名赎回。该值随后会转移至子链的每一次后续更新中 (见图3b)。在每个协议阶段,参与者向网络发送不完整的 UR交易。这些交易仅包含in[0]和 out[0],,用于指定子链的手续费和消息(包括要转移的值)。
为了投票,元节点在这些交易中添加in[1],in[2]和 out[2],分别用于放入所需的 κ(来自某个交易 Stakei),声明他们希望扩展上一次发布的更新Confirmi−1, 并指定要获得奖励的前一次更新。在协议的每个阶段中,所有in[1]字段必须不同,以防止攻击者使用相同的资金对多个UR进行投票。
4 协议评估
在本节中,我们评估了协议的安全性,并提供了一些实验结果。我们还研究了对比特币的可能攻击如何影响构建在其区块链之上的子链。
攻击场景。 我们假设存在一个对手,该对手可以构造任何更新(一致或不一致),并控制一个具有权益 μS的元节点M,其中 μ ∈[0; 1]且 S是网络的总权益8。我们假设每个元节点可以对其所有权益进行投票,以处理尽可能多的更新请求,并且网络始终充斥着待处理的更新,这些更新在全球范围内相当于诚实元节点的全部权益9。我们还假设 M对于每次不一致更新都能获得额外收益 r,这模拟了她成功诱导受害者发布了一笔不一致支付的情况 a( r →M)。 M的目标是每发布C次更新,就在区块链上追加至少2次更新(其中 一次为不一致更新)。她可以采用任何可能的策略来实现这一目标。
我们在上述攻击场景下对该协议进行模拟。每次模拟运行该协议以生成包含10,000条消息的子链,将客户端费用设置为 0.1κ,检查点偏移设置为3。为此,我们使用Desmo-J[18],一个用于Java的离散事件模拟器。
实验结果 图4b 衡量了攻击者收益随 μ增加的变化情况。特别是,它表明如果权益阈值 κ是 r的十倍,M只有在拥有至少 ∼40% 的全局权益(即 μ ≥ 0.4)时才能获利。因此,在关于攻击者权益的这一假设下,我们协议的安全性可与比特币工作量证明协议[17]的安全性相媲美。相反,如果κ= r,攻击者只需拥有 ∼15% 的全局权益即可从攻击中获利。图4a 显示,在没有攻击者的情况下(μ= 0),
(a) (b)
图4. 诚实节点的收益(a)以及攻击者M的收益(b),随着攻击者权益比例增加的变化情况。 μ曲线代表了不同的 r/κ值(即由不一致的a(r → M)更新所带来的攻击收益与投票成本之间的比率)。
假设单个对手的情况并不比多个不共谋且各自发起攻击的元节点更缺乏普遍性。事实上,在这种情况下,元节点不会合并其资金以提高权益比例 μ。需要注意的是,称更新队列并非始终饱和,等价于对具有更强 μ的对手进行建模:这是因为诚实元节点无法在单个协议阶段中耗尽其全部权益,即降低了其实际的 power。因此,研究这一特定情况不会为分析带来任何额外贡献。
诚实节点的收益基本上等于客户端费用乘以发布的更新次数,符合预期。此外, μ低于执行有利可图攻击所需的阈值时,诚实节点的收益会增加:这是因为由 M投票的不一致更新会奖励诚实节点,而相反情况不会发生。综上所述,仅当对于形式为a(r →A) 的更新,满足 r ≤ κ时,我们的协议才是安全的。因此, 如果 r接近于 0,则恶意行为不具有经济优势。
底层比特币区块链的安全性。 到目前为止,我们仅考虑了对我们协议的直接攻击,假设底层的比特币区块链是安全的。然而,尽管比特币在实践中至今是安全的,但一些研究已经指出了其协议的一些潜在漏洞。这些漏洞可能被利用来执行女巫攻击 [4]和 自私挖矿攻击 [16], ,这些攻击也可能影响构建在比特币区块链之上的子链。
在比特币上的女巫攻击中,诚实节点被诱导相信网络中存在许多不同的参与者,而实际上这些参与者都由单个恶意实体控制。这种攻击通常被用来在网络中快速传播恶意信息,并在共识/信誉协议中伪装诚实参与者,例如通过大量对手的投票淹没网络。在自私挖矿攻击 [16],中,小群体的勾结矿工设法获得比诚实矿工更高的收益。更具体地说,当一个自私挖矿池发现一个新区块时,它会将其对网络的其余部分隐藏起来。这样,自私矿工在挖掘下一个区块时就比诚实矿工具有优势。这相当于维护一条仅自私挖矿池知晓的区块链私有分叉。
需要注意的是,诚实矿工仍在区块链的公共分支上进行挖矿,且他们的哈希速率大于自私矿工的哈希速率。由于在出现分叉时,比特币协议要求继续在最长链上挖矿,因此自私矿工会在即将被诚实矿工超越之前,将他们的私有分叉向网络公开。埃亚尔和西尔在 [16]中表明,在某些假设下,该策略比诚实挖矿带来更高的收益:在最坏情况(对于对手而言)下,当自私挖矿池控制至少三分之一的总哈希算力时,攻击即告成功。因此,理性矿工会受到激励加入自私挖矿池。一旦该池控制了大部分哈希算力,系统就会失去其去中心化特性。加拉伊、基亚亚斯和莱昂纳多在 [17]中基本证实了这些结果:在考虑核心比特币协议的情况下,他们证明,如果诚实矿工的哈希算力 γ超过对手矿池的哈希算力 β一个因子 λ,那么区块链中对手区块的比例上限为 1/λ(严格大于 β)。因此,当 β(对手矿池规模)趋近于1/2时,他们便控制了区块链。
尽管这些攻击主要与比特币收益相关,但它们可能会影响构建在其区块链之上的任何子链的一致性。特别是,经过适当调整的这些攻击版本可使攻击者欺骗元节点关于当前子链状态的信息,迫使它们将其比特币区块链的本地副本与网络将丢弃的无效分叉进行同步
将来。为了防范此类攻击,元节点应仅考虑l-确认的 交易。也就是说,如果最后一个发布的区块链区块是 Bn,它们只考虑出现在满足 Bj且 j ≤ n − l 的区块中的交易。这意味着攻击者必须至少挖出 l个区块,才能强制撤销一笔l-确认的 交易。罗森菲尔德 [27]指出,如果攻击者控制的网络哈希算力不超过 10%, l= 6就足以将交易被撤销的风险降低到0.1%以下。.1%。
5 讨论
我们提出了一种在子链(即嵌入比特币区块链中的平台相关消息链)上达成共识的协议。我们的协议激励节点在将消息追加到子链之前进行验证,从而使对手追加不一致消息在经济上处于不利地位。为了验证这一直觉,我们在不同的攻击场景下测量了该协议的安全性。模拟结果显示,在保守假设下,其安全性可与比特币相媲美。
协议性能。 如第3.2节所述,该协议以持续时间为 Δ的周期运行。由于从请求池中选择要追加到子链的消息的机制,该协议每个比特币区块最多只能发布一笔交易。这意味着 Δ的下限为比特币区块间隔(∼10分钟)。为了在协议阶段全程监控仲裁者行为,所有元节点必须对请求池保持一致视图。因此, Δ需要足够大,以便每个节点能够与网络其余部分同步请求池。解决此问题的一种可行方法是让元节点广播其投票更新,并维护其他元节点的列表(仅考虑符合交易格式的元节点,如第3.4节所述)。更高效的方法可以利用分布式共享内存 [12,20]。
克服元数据大小限制。 如第3.4节所述,我们使用OP RETURN不可花费脚本来在比特币交易中嵌入元数据。由于比特币将此类元数据的大小限制为80字节,这可能不足以存储平台所需的数据。为解决此问题,可以使用由元节点维护的分布式哈希表[25]。通过这种方式,无需在区块链中存储完整消息数据, OPRETURN 脚本只需包含相应的消息摘要。比特币交易的唯一标识符可用作键,以从哈希表中检索完整消息数据。
侧链上的智能合约。 第3.1节中基于LTSs定义的子链模型,可以轻松扩展以对在比特币区块链上的智能合约计算进行建模。一个智能合约平台可以利用我们的模型,将合约的状态表示为子链的状态,并通过转移关系来建模其可能的状态更新。
实现一个智能合约平台需要一种用于表达智能合约的语言。为了将该语言与我们的抽象模型连接起来,可以为该语言提供操作语义,从而生成描述其计算过程的 LTS。请注意,我们将计算建模为单个LTS的假设并不会降低系统的通用性,因为一组分别对每个合约建模的LTSs可以通过并行组合的方式编码为一个LTS。如果该语言是图灵完备的,我们将不得不面对的一个额外问题是潜在的非终止性问题。不同平台已采用不同的方法来处理这一问题。例如,以太坊所采用的方法是为虚拟机执行的每条指令设置手续费。如果手续费不足以支付整个计算的成本,则执行将终止。[11]是为虚拟机执行的每条指令设置手续费。如果手续费不足以支付整个计算的成本,则执行将终止。
一个可用的平台还必须允许在运行时创建新合约。由于在我们的模型中,表示可能计算的LTS是固定的,因此我们需要一种“扩展”它的机制。为了处理新合约的发布,我们可以修改协议,使得UR可以包含其代码,且交易的唯一标识符也用于标识该合约。在这种扩展模型中,更新请求还将包含待更新合约的标识符,以便元节点能够执行相应的代码。

