区块链最近得到了发展。世界各地的初创企业,企业,银行和政府机构都在探索将区块链用于广泛的应用程序,包括公共注册表,供应链,健康记录和投票。可靠性属性(如可用性)对于这些应用程序中的许多至关重要,但是区块链技术提供的保证仍然不清楚,尤其是从应用程序角度来看。在本文中,我们确定了以太坊和比特币这两种主流锁链的可用性限制。我们证明,虽然区块链的读取可用性通常较高,但用于事务管理的写入可用性实际上较低。对于以太坊,我们在97天内收集了600万笔交易。首先,我们测量了事务按应用程序要求提交的时间。其次,由于固有的区块链设计,我们观察到某些交易从未提交。第三,也许甚至更重要的是,我们确定了缺少用于显式中止或重试的内置选项的后果,这些选项可以使应用程序保持不确定状态,在该状态下,事务在未决的持续时间内保持挂起状态(既不中止也不提交)。最后,我们提出减轻现有区块链可用性限制的技术,并通过实验测试这些技术的有效性。
区块链是一种新型的复制数据库(“分布式分类帐”),无需任何一方的控制即可操作。区块链技术应运而生,以支持比特币加密货币[1]。第二代区块链更具通用性:交易可以记录有关任何类型的应用程序域的数据,并可以部署和执行用户定义的脚本(“智能合约”)。这极大地扩展了区块链技术的潜在用途。许多初创企业,企业,银行和政府都在探索其在电子健康记录,投票,能源供应和保护关键民用基础设施等领域的应用[2]。这些应用通常利用区块链提供的中立基础,涉及跨组织的业务流程[3]。其中许多应用程序都具有关键的可靠性要求,甚至超出了基础加密货币交易量(每天数百万美元1)所驱动的要求。
了解区块链支持的可靠性属性已变得至关重要。突出的区块链系统,特别是那些使用Nakamoto共识的系统,只能根据已记录交易的不可变性为其客户提供概率保证。对这些保证的误解或低估了事务变得不可改变所需的时间可能会导致相关应用程序失败。对于依赖于区块链作为组件,数据存储或软件连接器的应用程序,这构成了一个重大问题(如Xu等人[4]所建议)。
为了衡量主流区块链的响应能力,我们必须首先定义在这些区块链之上运行的应用程序所需的事务提交的概念。只要客户连接到区块链的活跃对等方,客户就可以发起交易。尽管有必要,但其中一些对等方的活动不足以保证提交。相反,提交要求某些对等方创建一系列块,第一个块包含事务[5]。所需序列的长度可能有所不同,但是被区块链应用程序用来认为交易已成功执行。这个数字通常在比特币中为6,在以太坊2中为12。
问题在于,尽管期望每3分钟(分别为1小时)在以太坊(分别为比特币)中创建了足够多的区块,但是客户无法期望提交交易的时间。例如,考虑图1,该图绘制了我们观察到已宣布交易的时间与观察到已确认交易的时间之间的时间段的累积分布函数(CDF)(我们在第四节中详细介绍了我们的实验)。在我们的实验中,大多数事务(实际上为61.5%)实际上花费了3分钟以上的时间来提交,而13.8%的事务在4.5分钟后仍未提交,即它们经历了目标提交时间的50%的延迟。提交事务的时间差异可能导致客户端应用程序的可用性故障。
在本文中,我们探索了主流的工作量证明区块链如何影响基于其构建的系统的可靠性。我们专注于此类系统所需功能的可用性,以及它们如何受到许多因素的不利影响。我们的主要贡献如下。
我们调查哪些因素导致交易未提交的时间长于区块链设计承诺和先前的工作。特别是,我们发现网络重新排序比以前假设的要重要得多,并且可能导致严重的延迟。对于以太坊区块链,我们调查了链中交易持久性的真实程度,以及用户定义变量“汽油价格”和“汽油限额”对交易包含性的影响。我们还将调查所谓的“封闭气体限制”的影响。因为我们发现交易可以保持未提交状态,甚至“滞留”在交易池中,所以我们确定需要一种中止交易的机制。由于当前的区块链设计不具有这种机制,因此我们进行实验以模拟相同的效果并确定在何种条件下可以中止交易。
本文的其余部分从第二节中的区块链背景概述开始。交易提交时间的问题在比特币的第三部分和以太坊的第四部分中进行了讨论。第五节分析了网络定义参数的影响。然后,第六节分析了事务丢失中止机制的问题,并探索了模拟事务中止的机制。我们在第七节介绍相关工作,并在第八节总结。
近年来,随着加密货币的引入,区块链已变得日益重要。就市值而言,比特币和以太坊是两个最早的区块链。但是,作为一项技术,它们支持更广泛的用例。可以将区块链系统视为仅附加的公共分类帐,用于跟踪参与者进行的交易。在大多数情况下,这些交易与某些(虚拟)资产有关,并且通常涉及将资产的数量从一个帐户转移到另一个帐户。
区块链系统中的每个参与者都拥有一个分类账的本地副本,并运行一个网络客户端,该客户端将交易中继到整个网络。客户也可以将新交易注入网络。
使用非对称密码术对交易进行签名:只有给定私钥的所有者才能创建和签名其交易,但是所有参与者都可以使用相应的公钥来验证谁签署了某个交易。公钥兼用作拥有者的地址。它可以作为事务的起点和终点自由传播。但是,地址只是一个位串,通常不会透露实际所有者的真实身份。从这个意义上说,地址用作假名。通常,参与者也可以具有任意数量的地址,这些地址可以通过本地运行的软件(钱包)分为多个帐户。
这种设计可以确保所有参与者都知道拥有额外财产的资产的数量与哪个地址相关:公共账本在参与者之间正确同步,即所有参与者都对成功完成哪些交易达成共识。然后可以为每个地址计算余额。如果不能保证这一点,那么“双花”余额是微不足道的,因为攻击者可以策略性地将其交易仅发送给选定的参与者。
为了达成必要的共识,交易被分组为多个块,这些块被加密链接以形成一个链表,即区块链。因此,必须在块的内容和顺序上达成共识。这是通过区块链的区块创建机制来实现的,这种机制通常称为挖掘或求解区块。最古老,使用最广泛的采矿形式是工作量证明。还存在其他形式(例如,股权证明),但本文未对此进行调查。
共识协议中使用的工作量证明机制的工作原理如下。矿工(希望创建一个区块的参与者)将交易分组为一个区块,添加自己选择的随机数,并计算该区块的哈希值。对于要被网络接受的块,此哈希和被解释为整数,该整数必须小于某个目标值。目标值仅取决于前一个块的哈希值和确定性因素;每个参与者都可以独立计算。矿工面临的挑战是找到一个随机数,该随机数将产生具有所需属性的哈希和。区块链系统中使用的哈希函数是加密安全的哈希函数。因此,没有一种比蛮力搜索更好的方法来找到目标值。因此,随着目标值不断降低,矿工必须投入更多的计算能力。一旦矿工找到了这样的目标价值,就可以为自己分配一定数量的资产以用于投资计算资源(确切的数量是确定性的,通常是区块链长度的函数)。这也作为交易包含在该区块中,并作为参与的激励。然后,矿工对区块进行签名并将其传播到网络,网络可以接受它并将其视为区块链的最新状态。除了区块奖励之外,参与者还可以通过增加自选交易费来增加对矿工的激励,该费用包括了将交易包含在开采的区块中的矿工可以要求的费用。
尽管可能性很小,但两个矿工有时可能会同时找到一个新区块并进行传播。这称为分叉,这意味着区块链未达成共识,参与者必须等待下一个区块(从两个候选者中选择一个作为其前身)才能重新建立共识。解决分叉的关键策略(Nakamoto共识[1])是,每个矿工都将始终在当前最长的链中工作。通过统计论证,可以表明,自从将交易包含在一个块中以来发现的块越多,发生会产生更长的被网络接受的区块链的新派生的可能性就越小。对于比特币,通常商定的价值是等待6个区块。对于以太坊,它是12。特定应用程序的合适确认区块数量取决于交易的价值,挖掘区块的成本(计算能力)以及敌对攻击的威胁。足够的确认意味着攻击者很难充分发挥足够的计算能力来找到更长的块序列,以替换当前的共识(并从而对其进行篡改)。当严格控制超过50%的网络组合计算资源时,可能会发生众所周知的“ 51%攻击”,但是最近的研究表明,这种策略使用的资源更少[6]。
在拥有大量参与者的区块链系统中,即使使用专用硬件,单个参与者也无法解决首先解决区块所需的计算能力。 参与区块链的一种常见方式是加入一个矿池,在该矿池中,区块创建被分布在许多个体参与者上。 参与者共享任何块奖励。 比特币的发明者可能没有预料到这些采矿池。 实际上,某些攻击策略利用了它们合并的挖掘能力,从而威胁了可靠性(尤其是完整性和可用性)。 以太坊等现代区块链提供了引人注目的新功能,例如所谓的智能合约。 这些是存储在链上并由所有参与者运行的程序。 定价机制(“汽油价格”)还允许合同作者为执行合同提供不同的价格。 我们在第四节中返回到此。
在本节中,我们探讨了影响比特币提交时间的影响,并表明交易的重新排序起着积极的作用。比特币的独特之处在于交易的链接方式:它们将货币从多个源地址转移到多个目的地址。交易输出成为新交易的输入。如果输出的总和小于输入的总和,则这被解释为额外的输出,向矿工支付费用,该矿工开采包含该交易的区块。这是对矿工的激励。结果,矿工倾向于通过偏爱具有较高费用的交易来优化区块创建。交易费用通常是客户端软件在创建新交易时要求比特币用户自觉选择的唯一变量。但是,由于其他因素,交易也会遇到延迟。一个重要的问题是,必须使事务(大致)按顺序到达,节点(和网络)才能快速处理它们。传入的事务由所谓的内存池处理。如果所引用的输入交易(“父母”)仍未知,那么矿工将延迟新交易的纳入-这就是所谓的孤儿。矿工可以选择将孤儿留在内存池中,等待父级交易的到来,但是他们也可以在超时后清除孤儿。尽管只有经验丰富的用户才能设置,但可能会起作用的第二个因素是所谓的锁定时间:事务可以包含一个参数,声明该参数在挖掘出具有特定序列号的块之前是无效的。这样就可以为交易设置“执行日期”。请注意,乱序到达可能是多种因素导致的:节点的转发行为取决于实现,即使在“官方” Bitcoin Core客户端的版本之间也不同。当然,这也可能取决于矿工的负担(如正在进行的社区讨论3所导致的低吞吐量)。瞬态连接问题和Internet路由星座也可能在起作用4。另请注意,由于某些原因,内存池可能会拒绝交易。当我们遇到它们时,我们在下面解释这些。
我们修改了完全符合比特币标准包含测试5的比特币的btcd实现,并更改了内存池以记录每个传入的交易以及所应用检查的结果。我们收集了传入的比特币交易并确定了将其提交到区块链所需的时间。我们进行了两次实验,以适应变化的网络条件和网络的增长。每个实验持续约25小时;第一次于2016年11月进行,第二次于2017年4月进行。表一提供了详细信息。应该注意的是,在进行第二项实验时,https://blockchain.info/unconfirmed-transactions等网站报告了较高的网络负载,有25,000–30,000笔交易正在等待纳入。根据内存池的收益检查结果分为三类。第一类是通过所有测试的交易(“直接接受”)。第二是拒绝交易。第三类是“孤立的”交易,它引用尚未收到的交易的输出,即乱序到达的情况。
我们的计时测量精确到秒。我们删除了所有重复的日志条目,即重复的交易结果已经到达,并从内存池检查中收到了相同的结果。我们只保留了最早的此类交易。例如,如果一个孤儿事务第二次到达而父母还没有到达,则该事务将被过滤掉(它对提交时间没有影响)。但是,如果事务再次到达,并且由于我们的节点同时也了解了输入事务而不再是孤儿,则将其记录为单独的事件。关于将交易包含在区块链中,我们定义了一个观察窗口,从交易收集之前的第一个区块到收集期结束后24小时的第一个区块。我们计算了在此窗口内提交了哪些事务(即,包含在一个区块中,再加上链中的五个后续区块)。
每个实验中我们收集了大约30万笔交易。 表II总结了内存池中的相关状态。 这两个实验显示出所收集的交易总数的数量非常相似,但是第二个实验中的孤儿比例更高,占交易总数的2.74%(实验1中为0.87%)。
由于已经收到(“已在内存池中”)而被拒绝的交易数量也有惊人的差异。所报告的“积压”似乎也在我们的节点上引起了额外的转发和排队,这似乎是合理的。拒绝的其他原因则很少见。我们观察到了一些使硬币花双倍的尝试(即在两个不同的交易中使用相同的未使用的输出作为输入)6。另一个原因是比较神秘,并在我们的表格中分组在一起(例如,格式错误,某些健全性检查失败等)。
我们总结了表III中确定的提交时间。请注意,在第二个实验中,它们明显更高并且变化更大。图2绘制了我们最关心的两种交易形式的提交时间。蓝色曲线表示“直接接受”的交易,即父交易是已知的,传入交易通过了所有内存池测试。紫色曲线是到达时孤立的交易。
在两个实验中,孤儿似乎比直接接受的交易晚提交。但是,在第二个实验中(网络处于高负载下),额外的延迟要高得多。在我们的第一个实验中,大约60%的孤儿在与正常交易相同的时间范围内被包括在内。实际上,有31%的孤儿花了超过2个小时才被纳入,21%的孤儿花了超过3个小时,还有8%的孩子花了超过5个小时。对于直接接受的交易,这些值略有不同:其中17%的时间超过2小时,9.5%的时间超过3小时,而5%的时间超过5小时。在我们的第二个实验中,大约40%的孤儿的提交时间与直接接受的交易相似。大多数人经历了非常显着的延误:中位数提高了近20%,而第三个分位数则是纯接受者的2.5倍以上。我们还注意到,在实验1的观察期结束时,只有1.2%的孤儿和1.6%的直接接受的交易尚未包括在内。在实验2中,超过20%的孤儿尚未包括在内(但几乎所有-接受交易)
除无序到达之外的其他因素可能仍会对提交时间产生相当大的影响。因此,我们决定研究另外两个因素:交易费用和锁定时间。我们首先确定零费用的交易次数。这始终非常低:对于纯正接受度,实验1和2分别为74和12。这些孤儿从来没有过零交易费。图3显示了过滤掉零值的交易费用的箱形图。我们可以看到,在第二个实验中交易费用要高得多,但是在实验1中,纯熟人和孤儿之间没有区别。在实验2中,孤儿的手续费甚至更高。较低的交易费用极不可能导致孤儿迟交的原因。
我们提取了收集到的交易的锁定时间及其父母的锁定时间。由于我们的记录器没有捕获到达内存池的交易的全部内容(但仅捕获哈希值和时间戳),因此我们仅对已合并到区块链中的交易进行了此分析。绝大多数事务没有设置锁定时间:在实验1中,只有15%的直接接受者和12%的孤儿的值不为零。在实验2中,数字分别为23%和17%。虽然这可能表示使用该功能的情况有所增加,但孤儿的锁定时间从未超过观察窗口。实验1中的孤儿的锁定时间至少在观察窗口结束前3小时结束;在实验2中,这是六个小时。相反,直接接受确实具有锁定时间,该锁定时间大大超出了观察窗口的末尾。在实验1和2中,接近100%的事务在观察窗口即将结束时也具有锁定时间。但是,我们发现一些绝对乐观的锁定时间约为1.5–17亿(块序列号)。由于两个比特币区块之间的平均时间为10分钟,因此无法在30.166年之前包括这些交易。我们这里工作的明显局限性在于,我们不知道在观察期结束时尚未包含在区块链中的那些孤儿的锁定时间。但是,鉴于以上结果,我们仍然有信心说锁定时间不太可能成为孤儿提交延迟的决定性因素。
自然,在我们的研究中可能仍然存在我们无法控制的混淆因素。例如,在我们的观察站澳大利亚之外,我们没有有关节点连接的信息,也无法确定比特币网络所暴露的(不断变化的)Internet路由星座。注意,在[7]之前已经研究了比特币网络中的传播时间。我们的研究表明,值得重新讨论该主题。
在本节中,我们首先解释为什么不保证以太坊交易无论其有效性如何都将被提交,然后我们将天然气价格,天然气限额和网络确定为影响提交时间的因素。
我们首先概述以太坊的有趣交易处理。图4捕获了以太坊区块链中单个交易的生命周期。首先是将交易提交到所有矿工的(虚拟分布式)交易池中。交易寿命可以分为连续的阶段:(i)在系统中宣布交易; (ii)将交易包含在该链的某个分支的新开采的区块中; (iii)将交易包含在主链的主要部分中; (iv)随后挖掘足够多的区块后提交交易。
不能确定某个特定交易最终将被提交还是会过时,因为它将永远被视为无效交易。而且,不可能知道在系统的某些状态下无效的事务在以后的状态下是否永远不会有效。更具体地说,上述步骤(ii)不足以保证将交易T x永久添加到区块链:如果区块链分叉,则可以简单地丢弃包含交易的块,在这种情况下可以重新包括在内。
当一个交易包含在一个区块中时,它已经被预先验证,即,它的数字签名已经被检查,以及参数的有效性,例如随机数(相对于给定源账户的交易序列号),以及源帐户中有足够的资金。如果包含交易的所有区块都比主链短链的一部分(以太坊术语中的所谓叔叔),那么交易将回到交易池中。这可能会发生多次,并且从理论上讲没有上限。当事务在池中时,它也可能被删除。这是矿工的本地决定,网络中的任何节点都不可能确定地知道所有矿工都放弃了交易。只有当交易的现时数变得过时时,即来自同一来源帐户且具有相同的现时数的另一笔交易被提交,节点才能确定该交易是无效的,并且不会包含在任何有效块中。否则,交易可能会在以后重新出现,并包含在链中。
为了极有可能确定交易永久地包含在区块链中,在首次包含之后必须首先等待要开采的几个区块,并将包含感兴趣的交易的区块称为祖先。这些后续块中的每一个都称为确认,当包含交易块后发生足够多的确认时,则认为该交易已提交,即被认为永远以很高的概率保留在区块链中。当前版本的以太坊在包含交易之后需要11个区块才能提交交易,但是其他版本可能需要其他值[8]。
我们通过修改客户端节点以侦听网络并收集所有交易和阻止公告,为以太坊区块链编写了一个观察节点。我们的本地客户端基于版本1.5.3中的以太坊实现geth。我们将最低汽油价格设置为0,否则使用默认设置。我们进行的一项重要更改是允许客户端连接到最多500个节点,而不是默认的25个节点。这使它可以收集最大数量的事务-通常,它可以随时与400多个节点进行通信。
我们修改了geth客户程序,以便在进行任何验证之前拦截所有交易公告,以防止有趣的交易被丢弃。对于每个宣布的交易,由于交易不包含时间戳,因此我们记录了本地观察时间。同样,对于所有传入的块,我们记录了到达时的时间戳。尽管以太坊中的每个块都有时间戳,但时间戳是指开始挖掘该块的时间,而不是生成该块的时间。此外,矿工的时钟可能无法完全同步。
我们收集了3.5个月的数据。由于网络断开和不可预见的软件问题,我们的收藏中有一些中断。我们使用每小时的中位数阻止时间来识别这些值:如果给定小时的中位数mh与整个数据集mo的总中位数偏离一个标准差σ以上,我们将该小时视为离群值-(即,mh > mo +σ或mh 所得过滤数据集的总持续时间为97.38天,在此期间,我们观察到621,865个区块,包括叔叔区块。这些区块包含6,152,030笔交易,其中5,696,471笔交易是唯一的。区块中有455,559笔交易(7.4%)是重复的。在实验过程中,向我们的观察节点宣布的唯一交易数为5885603。有趣的是,这不是区块中包含的交易的超集:我们没有注册24,765项包含的独特交易的公告。此外,对于21,330个交易,我们在交易公告消息之前收到了包含它们的区块。在本文的任何分析中,我们均未考虑此类交易公告。在621,865个区块中,有34,044个后来被称为主链上的叔叔区块,而1731年被称为“无法识别”的伯父区块(未在主链上称为伯父)。此外,我们观察到99条长度为2的叉状链和一条长度为3的叉状链。为进行纵向比较,我们提取了4个时间间隔,每个5天,其中有连续的不间断数据。表IV列出了详细信息。间隔开始日期恰好相差4周,并且所有时间均为UTC午夜。 由于以太坊的交易处理和区块间时间与比特币显着不同,因此总会有链叉的机会。以太坊建议在区块包含之后等待11个确认,然后再假设交易永久性地以高概率提交。在发生分支时,通常无法确定哪个分支将永久保留在区块链中以及哪个分支将被丢弃。特别是,仅包含在叔叔中的事务需要返回到事务池。因此,在研究导致提交延迟的因素之前,一个有趣的问题是,从首次包含到提交的交易有多快,以及由于一个不同的分支成为主要分支,实际上已经丢失了一个区块中的多少个交易科。如果此部分非常小,则可以允许开发可承受罕见交易损失的应用程序,同时又可以从等待较少的确认块中获利。 图5描绘了将以太坊交易包括在一个块中以及多个随后的确认块中所花费的时间的分布。我们测量如下。当我们的观察节点收到公告B1时,我们分析了包含在该公告中的交易,以确定到目前为止包括了哪些公告交易。如果以前宣布了交易Tx 1并现在将其包括在内,则我们将为宣布Tx 1和B1记录的时间戳之间的时间差作为首次包含的延迟。如果B1成为叔叔,则B1中的所有交易都需要包含在后续块中。当将Tx 1包含在某个后续块(例如B2)中时,我们使用B2的时间戳来计算第二个包含,第三个包含等的延迟。对链的更深的分支进行类似的处理。然后从包含Tx 1的最后一个块中计算出Tx 1具有12和36个块的确认延迟。 但是,对于“不包含”的交易,我们发现这些交易确实很少见。我们观察到113,122项首次交易包含(0.021%)不是永久性的;对于2602个第二夹杂物(0.0005%)和41个第三夹杂物(0.000007%)也是如此。 以太坊围绕天然气的概念有两个用户定义的参数,即天然气价格和为包括给定交易而提供的最大天然气。我们着手研究这些因素如何影响提交时间。特别是,我们有兴趣了解是否有可能通过为矿工提供特别高的奖励并例如设置高汽油价格来缩短提交时间。 根据我们收集的数据,我们分析了用户定义的汽油价格对其进行交易所花费的时间的影响。图6中的CDF描述了五个价格带的价格关系(全部在Gwei7中):[0,0],(0,20),[20,25),[25,105),[105,+∞ )。我们选择这五个频段的原因如下。 0本身是一种特殊情况。默认的天然气价格为20 Gwei8,观察期内的市场价格通常在22至24 Gwei8之间,因此区间[20,25)占所有交易的85.57%。一组交易提供了大约100 Gwei,并且要包括这些交易,下一个间隔设置为[25,105)Gwei。最后间隔包括所有剩余的天然气价格。 如图所示,给定频段内的汽油价格越高,我们观察到长时间延误的可能性就越小。但是,从25 Gwei起,我们没有发现任何有意义的差异。最后,0频段与所有其他频段之间存在鲜明的对比:0频段的提交时间明显更长。 用户在交易费用周围定义的第二个变量是最大交易量,即执行交易可能花费多少交易量。我们分析了它对提交延迟的影响。尽管我们发现个别交易因天然气上限过高而被延迟,但我们的分析尚无定论:我们无法在最大天然气和提交延迟之间的任何方向上找到强相关性。目前,这仍然是一个悬而未决的问题,值得我们进一步观察。 正如我们在比特币中观察到的那样,我们还很好奇以太坊网络是否遭受交易重新排序。以太坊并不像比特币那样链接交易,但是每笔交易都有一个序列号(“ nonce”),该序列号对于每个发送者的账户都是不同的。对于从同一帐户发送的每个交易,此序列号从0开始,并以1递增。旨在保证来自同一帐户的交易将以特定的确定顺序执行。但是,这也意味着除非随机数为n的已包含交易(即为“孤立”),否则随机数为n +1的交易就不能包含在区块链中。具有较高随机数的事务将在事务池中等待,直到以n为随机数的事务到达。 因此,我们进行了与我们先前的比特币实验性质相似的实验。我们分析了与我们第二次比特币实验相同的时间间隔内,交易有序和无序到达的提交时间:2017年04月13日13:11 UTC–2017-04-14 14:15 UTC。在此期间还提交的交易公告总数为87,384。随机数为乱序的事务数量为5403(6.18%)。这两种类别的提交时间如图7所示。该图表明,与有序事务相比,无序事务的提交延迟几乎增加了一倍。为了排除天然气价格作为混杂因素,我们绘制了两个类别的天然气价格分布,如图8所示。我们没有发现两个类别之间的天然气价格有显着差异。 与比特币一样,很难排除我们无法控制的其他混杂因素,例如Internet路由或整体网络连接。但是,我们的数据使我们对后者有了部分了解。我们检查了在用nonce n +1进行交易之后宣布的用nonce n进行的交易,并将其与有序交易公告进行了比较。图9绘制了以太坊节点的独特分布,我们看到该节点在包含在区块中之前广播了交易。我们发现延迟的事务为更少的节点所知。尽管不是结论性的,但这提供了网络连接可能对交易传播产生负面影响的初步指示。 以太坊有第二种限制形式,即每块气体限制。与交易中的天然气价格不同,它是由矿工网络定义的,适用于区块中所有交易消耗的天然气总和。如果限额低于给定交易所需的天然气,则该交易可能无法包括在内。随着时间的流逝气体限制的发展是容易获得的,例如在Etherscan9上。 限制的理由是通过限制每个块可以执行的计算量来防止网络上的拒绝服务(DoS)攻击。由于对网络的几次DDoS攻击,以太坊上的大多数矿工都同意将限制降低到大约15,000。根据Etherscan的说法,从2016年10月15日至17日,临时提供500,000天然气。在这三天之前和之后,该网络仍保持较低的限制:从2016年9月23日到2016年11月22日,除了一天以外,该限制约为200万天然气。 12月5日左右,天然气恢复到4M。这种限制可能会对包含大量天然气合同的交易的纳入产生不利影响。这不是一个假设的情况:在早期的工作中,我们自己使用了约150万天然气来部署合同[3]。但是,资产的简单转让不应受到负面影响。 图10显示了用于这些交易类型的天然气的分布。它以竖线突出显示了上述气体限制。没有金融转移交易使用的天然气超过100,000。这是一个预期的发现,因为财务转帐会产生21,000汽油作为任何交易的基本成本,外加少量可能的附加数据:每字节4到68汽油(例如,用于转帐的说明,请参见[ 9]。至于函数调用交易,其中94%的使用量最多为20万个gas,而在500,000个gas限额下,剩余的函数调用交易中只有0.62%是不可能的,这与我们的假设的一部分相矛盾,并着重指出当前使用的功能中的一部分在计算上不是很密集。 但是,在检查合同创建时,我们发现在DDoS攻击之前创建的所有合同中,只有53.79%可以以500,000瓦斯限制创建,而46.21%则需要更多的瓦斯。这证实了我们的假设,即在实行块气限制的情况下,许多合同将无法部署。即使在网络将区块气限制保持在约200万的2个月期间,也无法实现18.78%的合同创建交易。 在本节中,我们提出一种机制,通过以幂等或抵消交易取代以太坊交易,从而人为中止交易。例如,如果系统发现交易未在指定的时间范围内提交(例如,对于孤儿就是这种情况),则此中止机制将非常有用。这样,可以实施中止机制以增加软件客户端或钱包的用户友好性。 有一些选项可以实现类似于显式中止的效果。例如,在以太坊中,系统或用户可以从同一源帐户发出竞争交易,即具有相同随机数的另一笔交易。假设用户Alice通过发出带有随机数i的交易Tx i将1个以太币转移给Bob。在可接受的时间范围(例如10分钟)过去并且尚未提交Tx i之后,Alice想要中止Tx i。然后,她提交新的交易Tx 0 i,具有与Tx i中指定的相同的现时现时i和更高的交易费用,以增加Tx 0 i被包含的机会。对于此交易Tx 0 i,她不想花费比必要更多的以太币。因此,她将交易值设置为0,并将自己的帐户设置为接收者。提交Tx 0 i后,Tx i将被它取代并过时。如果在此期间Tx i成功,则Tx 0 i将过时。这是可以接受的,因为这是最初的意图。 除了中止以外,Alice可以通过提交Tx 00 i来“重试” Tx i,如下所示:Tx 00 i中的字段包含与Tx i中相同的数据,包括现时i-除了Alice会为此支付更高的费用。因此,Tx 00 i的哈希和数字签名将不同于Tx i,因此矿工将其视为单独的交易。如果Alice尝试重新发送Tx i,而没有任何更改,则哈希和签名将是相同的,并且矿工将不会有任何不同,除非他们先前已放弃Tx i。在后一种情况下,丢弃Tx i的原因可能没有改变,因此可能再次发生。如果Tx i或Tx 00 i成功,则各自的其他事务将变得过时且无效,因为它们都具有相同的现时值i。 实验:在以太坊中止交易。我们在以下三种情况下测试了上述方法在公共以太坊区块链上的中止:1)在正常时间内未包含交易; 2)客户改变主意并决定回滚已发行的交易; 3)由于资金不足,交易处于不确定的待处理状态。我们将在下面更详细地描述这些内容。对于所有这三种情况,我们使用web3库v0.17.0-alpha与geth v1.5.4-stable客户端进行交互,并开发了具有相应参数设置和超时的JavaScript实现,这些参数设置和超时在nodejs v4.2.6上运行。 geth客户端运行禁用挖矿的完整区块链节点,并通过发送和接收交易以及新挖出的区块与公共网络进行交互。它仅将新开采的块广播到网络的其余部分。我们将0xd8c96ee029945fe1b4272035b704dc52ebcdf051用作所有这三种情况的发件人帐户地址,并且可以在例如Etherscan10上公开观察包含的交易结果。 中止实验1:为了测试正常时间范围内未包含已发送交易的情况,我们提交了100笔低于市场价格的交易。具体来说,我们将前一天(2016年1月12日)的平均汽油价格作为市场价格(mr),并针对不同的价格分别提交了10笔交易,分别为0、0.1×mr,0.2×mr,... ,0.9×mr。作为截止时间,我们将早期实验(参见图1)的99%百分位数取整到10分钟。如果未包括该交易,则我们如上所述以相同的随机数但以全市价mr,目标0x0和值0提交中止交易Tx中止。 结果如图11所示。令人惊讶的是,大多数交易被网络接受。在10笔交易中,有6笔交易的0或0.2×mr被接受。此外,每10笔0.1×mr的交易中只有2笔被接受。通过上述我们的Tx中止机制,所有16个超时事务均成功中止。 中止实验2:在此实验中,我们假设一个客户承担了市场费用,并且改变了已发行交易的主意。与之前的实验一样,我们发送了100笔交易,每笔交易10笔交易的汽油价格分别为0、0.1×mr,0.2×mr,...,0.9×mr。我们将等待时间设置为以太坊事务提交的目标中值,而不是等待10分钟,即3分钟。 该实验的结果如图12所示。与10分钟超时的图11相比,3分钟后的块中未包含更高百分比的事务。和以前一样,成功完成了100%的Tx中止。有趣的是,所有这些文件在3分钟后都被包含在一个区块中。在100个案例中,有两个案例达到了原始交易的3分钟超时,发送了Tx中止通知,但原始交易Tx orig仍然赢得了比赛,并被纳入并提交到区块链中。因此,Tx中止已过时。如上所述,这是应该为客户做好准备的可能性。造成这种情况的原因包括:(i)准备发送中止时在客户中的处理时间; (ii)广播延迟或其他网络效应,其中获胜的矿工在包含Tx Orig之前未收到Tx中止; (iii)池中交易的非理性安排,其中不优先考虑费用较高的交易。 中止实验3:在最后一个实验中,我们提交了两项交易,创建的情况与用户(或用户程序)的错误输入相对应。我们在现场观察以太坊期间观察到了这种行为。为了复制它,我们提交了两个事务,Tx 1和Tx 2,如下所示。假设发件人地址的最后一个随机数为n,其帐户余额为k。然后,我们创建具有随机数n + 1和值1 1000 k的Tx 1和具有随机数n + 2和值999 1000 k的Tx 2。对于这两次交易,我们将汽油价格设置为0.7×mr。由于随机数,必须在Tx 2之前包含Tx1。但是,由于汽油价格为正,包含Tx(1)导致的帐户余额不足以用于Tx2。最后,我们提交Tx 2,等待5秒,然后提交Tx1。这使Tx 2有机会在任何节点(包括我们自己的节点)知道Tx 1之前进行广播。需要此过程,以便客户端将Tx 2提交到网络。由于geth在提交Tx 2时并不知道Tx 1及其内容,因此会广播Tx2。否则,它可能会检测到余额不足并且不接受Tx 2。 一旦将Tx 1包含在一个块中,由于资金不足,Tx 2无效。但是,这并不总是得到检查,因此Tx 2可能会在事务池中保留很长时间。实际上,如果另一笔交易将资金存入发送者帐户,则Tx 2将变为有效并被执行。同样,这是我们观察到的行为。在这里,我们发送随机数为n + 2的Tx中止,以中止Tx 2。 我们进行了该实验,直到提交了100次Tx中止。所有提交的100次Tx中止均成功。我们测量了将Tx中止包含在一个块中(第一次包含)所花费的时间,并绘制了该图,如图13所示。这些时间的中值是45秒,最大是230秒。 区块链系统的可靠性已在各个方面进行了研究。但是,大多数调查都是以博客文章的形式发布的,在许多情况下,这些方法都没有对方法的正确描述。以太坊的创建者Vitalik Buterin在一篇博文中写道,他将区块时间(即区块之间的预期间隔时间)与安全性相关联。这篇文章解释说,为了容忍拜占庭式错误,更快的阻塞时间可以转化为更精细的粒度,从而可以比更长的阻塞时间更快地收敛。在另一篇文章中,他写了关于以太坊中叔叔阻拦率的文章。与我们的实验和分析相反,本文是从网络的角度撰写的,而我们的重点是像叔叔一样的网络效应对个人交易的影响以及由此产生的基于区块链的系统的可用性。 构建分布式系统时,必须在使其可用或一致之间进行选择。这是众所周知的CAP定理的直接含义,该定理最初由Brewer [10]提出,并由Gilbert和Lynch [11]证明。 CAP定理指出,分布式服务无法提供(i)一致性:对请求返回正确的响应; (ii)可用性:返回每个请求的响应; (iii)分区容忍度:支持消息的延迟和丢失。 考虑到主流区块链通常不能保证一致性,我们的观察结果令人惊讶。其他方法通常会优先考虑一致性而不是可用性[12],[13]。相反,以太坊交易不能保证保持在提交的顺序[8]。看来,这些区块链通常试图确保与某些概率的一致性,这些概率取决于环境假设,例如消息的延迟和挖掘能力[14]。尽管最近的结果通过实验表明网络延迟可能会影响以太坊的一致性[15],但我们尚不清楚对其可用性属性的任何深入评估。 就同行评审的学术出版物而言,几本著作[16] [17]研究了通过受益于领导者来提高将区块附加到链上的速度的可能性。 Sompolinsky和Zohar [16]讨论的一个有趣的改进是通过考虑“解开块”而不是仅考虑链的最长分支,将块之间的预期间隔时间从比特币中的10分钟减少到以太坊中的12-15秒。 Eyal等。 [17]提出通过选择可以频繁添加微区块的领导者来减少区块之间的预期间隔时间。这并不一定会减少达成共识的延迟,因为需要高置信度的节点不一定会比比特币更快地达成共识[1]。 以太坊交易的提交时间之前已经探讨过[8]。结果表明,提交事务所需的时间与系统密码难题的难度成正比。但是,本研究仅在私有链环境下进行实验,在这种情况下,难度大大低于以太坊公共链。这就解释了为什么[8]中报告的提交时间与我们的公共链观察结果大不相同。 我们对可能对无许可工作量证明区块链中的提交时间产生负面影响的问题进行了详细的初步分析,并通过引入显式中止机制来限制这种影响的方法。 特别是,我们警告应用程序开发人员注意可能会严重影响其服务质量的因素。 我们发现,网络重新排序会极大地影响提交时间,甚至抵消交易费用和汽油价格的影响。 此外,我们还可以表明,以太坊社区为抵制DoS攻击而采取的措施对合同创建具有很大的可用性影响。 未来,我们计划研究可用性问题如何影响智能合约的执行,因为这些问题在以太坊区块链中变得越来越重要。C.从最初的包容到承诺
如图5所示,包含时间倾向于遵循相似的曲线。但是,将第一个到第三个包含的曲线的斜率与第十二个和第36个包含的斜率进行比较:后者的陡度较小,表明需要等待更长的时间来提交“提交”的交易比例越来越大。对于“ 12块提交”,中位等待时间约为200秒,甚至第三个分位数也不高。但是,我们提交所需的区块越多(例如24或36个区块),则交易需要(甚至大大)比中位数建议的时间更长的可能性就越大。D.用户定义的天然气价格和限额的影响
E.网络延迟的影响
5 限制以太坊对以太坊的影响
因此,我们选择调查我们是否可以在我们的数据中找到该假设的证据。我们分析了DoS攻击之前发生的所有事务,并使用2,303,121块作为DoS之前的切入块。我们考虑了用于三种不同类型交易的天然气量:财务转账,对合同的常规功能调用和合同创建。6 以太坊交易中止
7 相关工作
8 结论