共识层错觉

以太坊是一个去中心化的平台,可作为智能合约的基础-这些应用程序完全根据其程序代码运行,而不会造成停机,审查,欺诈者或第三方代理商的干扰等可能性。
-以太坊



我们开发人员喜欢相信一个共识级别,该级别致力于解决分布式系统的所有复杂问题,从而使我们能够编写应用程序。 矿工生活在共识水平上,从事矿工事务。 开发人员坐在应用程序级别并编写智能合约-这些程序在以太坊虚拟机(EVM)中运行。 我们的分散式应用程序依靠计算机的完整性和安全性与计算机交互。

我们知道EVM以协商一致的方式工作,并且只要它起作用,我们就无需考虑这种机制。 我们没有考虑矿工,因为最后不需要了解半导体的工作原理或现代计算机微芯片的设计特征。 但是,遗憾的是,这些级别之间的方便且可预测的分离不过是一种幻想。 共识层面的错觉使我们忘记了矿工不是我们的朋友。

在实践中,从合同到共识的过渡是一种不太平滑的现象,并且没有通常认为的那样简单。 块的创建会影响EVM的状态,进而会影响智能合约的挑战,因此会影响去中心化应用程序及其用户的操作。 块越慢,分散的应用程序就越慢。 块越快,应用程序就越快。 空块会导致应用程序停止工作。

共识级别有时会无意间干扰分散的应用程序。 但是在某些情况下,该级别的代表可能会有意干预。 矿工控制共识水平。 他们为钱而工作,因此只有在能够带来利润的情况下,才能维持应用程序级别。 如果他们可以通过干扰应用程序级别来赚钱,那么他们最终将开始这样做。

矿工跑步机


矿工不是您的朋友。 但是,不是敌人。 他们不想伤害您,他们无法避免。 这些是工作量证明的要求。 矿工必须为获得很小的利润而进行激烈的竞争。 它们卡在矿工的跑步机上,最快的跑步者在那里设定步伐。



每当他们设法发明另一种方法来加快或降低计算哈希的成本时,复杂性就会增加。 随着它的增长,每个散列对我来说变得越来越重要。 您的哈希率可能保持不变,但逐渐变得越来越少。 在这方面,工作量证明迫使矿工不断对利润进行再投资。 他们只有通过不断的支出,优化和保持竞争力才能获利。 他们中那些无法竞争的人退出了比赛



如果您的保证金是1%,那么收入减少1%会使您失去利润。 如果该矿工的哈希率至少略低于当前标准,则将落后于其他同事。 另一方面,收入增加1%会使利润增加一倍。 即使是很小的效率利润,采矿者也可以从设备再投资中获得更多收益。 而且,此类参与者之间的距离越来越大,因此,较不成功的竞争者将不再反对他们。 工作量证明促使矿工寻求小利益,改善流程的各个方面,并利用它使竞争对手从跑步机上走下来。

有两种提高采矿利润率的方法-增加利润率或降低成本。 利润由批准的区块的奖励和其中包含的交易的佣金组成。 成本是由于需要支付电费,设备,员工薪水,办公室租金等而产生的。



由于非常明显的重大改进,例如找到较低的电价或改进设备,矿工目前正在竞争。 不幸的是,这种方法导致未来利润的下降幅度更大。 对于公司而言,寻找便宜的电力变得越来越难。 借助图形卡进行挖掘取决于内存带宽的限制,而ASIC又受到其微电路中所用晶体管的最小物理尺寸的限制。 现在,所有这些开发路径仍保持相关性,但在某一时刻它们的潜力将被耗尽,并且矿工将被迫寻找不太明显更复杂的优化选项。

有一些非常有效且不明显的方法。 不幸的是,它们对系统的其他用户有害。 我想重点介绍矿工通过从依赖区块链工作的人员和系统中获取金钱来增加利润和降低成本的方式。 在阅读本资料时,请不要忘记矿工不想拿走您的钱,他们必须这样做。 工作量证明要求他们提高竞争力。

矿工如何干预


矿工可以通过多种方式来干扰EVM及其中运行的应用程序的运行。 由于每个矿工都有控制自己生成的块的能力,因此它也可以控制该块中的状态变化。 让我们研究一些最简单的方法,而不必太深入细节。 对于他们每个人,我们将尝试确定一种干预策略,谁将遭受痛苦以及矿工如何从中获利。

重新交易

交易按块进行处理。 每个块都有处理交易状态更改的规范顺序。 矿工将每个事务按顺序应用于EVM状态,并确定位于块标题中的最终状态的根哈希。 生成区块的矿工可以控制区块中的交易顺序。 控制块中事务顺序的能力实际上使您可以控制状态更改的顺序。



假设我想将付款发送给朋友。 我将创建一个具有以下三个功能的简单合同: depositunlockretrievedeposit通知将资金转移到存储中。 每当我想寄钱给他时,我都会unlock 5以太币。 我的朋友调用了retrieve功能,该功能向他发送了所有未被deposit冻结的资金。 如果矿工在一个区块中看到unlockretrieve交易,则他可以交换它们, retrieve将更早被调用。 调用retrieve将使您获得所有免费的资金,而不必支付存储资金。 之后,将调用unlock 。 结果,我的朋友将被迫再次发送retrieve交易,并再次支付了佣金。



通过更改出口合同的顺序,矿工可以影响合同执行的结果。 这意味着它们可以在一定范围内监视EVM的状态。 管理大量用户之间的交互的大型公共合同尤其使这种情况更加恶化。 矿工可用的交易池越广,它对最终状态的控制就越多。

合同开发者应提供此类尝试以块为单位任意更改交易顺序。 否则,矿工可能会招致额外的佣金支付或对应用程序用户造成其他意外伤害。

交易插入


当在一个区块中形成交易顺序时,矿工不仅限于操纵他人交易的能力。 他们可以创建自己的交易。 他们有一个ETH。 和我们所有人一样,他们可以在区块链赌场与他一起玩并在区块链市场上买卖。 但是,在某些情况下确定事务处理顺序的能力可能使它们成为处理队列中的第一个事务。

让我们提出另一个简单的智能合约。 这次,爱丽丝想玩猜谜游戏。 她在合同中放了5个醚。 此金额将发送给命名最接近猜测数字的人。 Alice调用使用数字的哈希值commit ,从而保证其不变性。 每个人都可以打电话给guess并参与猜测。 2个区块后,Alice的电话会reveal ,让所有人知道哪个号码是由谁组成的。



爱丽丝不能作弊,因为这是合同规定的。 但是矿工有这样的机会。 看到提示电话后,他可以等待并拨打电话。 他甚至会在块形成之前就知道结果! 即使David也打4,矿工也可以更改订单,从而击败他。

普通用户创建交易时,会将其发送给矿工以包含在区块中。 用户必须先获得交易的不可撤消同意,然后才能看到其执行结果。 相反,矿工可以在创建区块的过程中等待,然后才可以决定是否应包括特定交易。 这意味着他们比普通用户拥有更多的信息访问权限,并且可以更改交易顺序。 这使它们在任何基于区块链的系统中都具有重要优势。

每当用户和矿工通过智能合约在区块链上进行交互时,矿工就有可能为了自己的利益插入交易并更改订单。 通常,这意味着他们将收到钱,否则这些钱应该已经进入普通用户的口袋。 智能合约开发人员应设计他们的系统以解决这种不平等问题。

强迫失误

矿工可以利用重新排序和插入的优势来干预智能合约的挑战。 有时他们甚至可以完全破坏挑战。 我们称这种情况为强制错误。 当矿工将状态更改为某种意外呼叫时,它们就会发生,结果是失败。 他们可以通过插入一个会影响状态的事务来做到这一点。

让我们为市场创建一个简单的智能合约。 我出口sell ,以给定价格放出一些代币出售。 任何人都可以打电话buy以购买我的一些代币。



在这种情况下,矿工可以检查Bob的来电以buy并考虑购买其令牌的选项。 他可以购买必要数量的商品,以使Bob可以完成交易并出错。 如果鲍勃想要购买2.5 GNT,则矿工可以解决这一短缺问题。 鲍勃的交易将以错误结束,但矿工将为此收取佣金。 因此,鲍勃违背他的意愿,将支付矿工购买GNT代币的费用,而不会得到任何回报。

在较旧版本的Solidity中,这种攻击特别危险。 旧版本的assertthrow关键字会将所有附带的气体转移到矿工,这将导致他们因缺乏工作而获得很高的佣金。 较新的关键字requirerevert根据实际完成的工作限制使用天然气。

强迫错误使矿工因拒绝执行工作而获得佣金。 如果事务以错误结束,则状态将返回其原始状态。 如果矿工找到了引发错误呼叫的可靠方法,他甚至将不需要处理状态更改。 根据矿工的版本,理想的区块是被错误交易和支付失败的交易所阻塞,而交易的佣金却没有任何其他状态变化。

智能合约开发人员可以通过仔细检查他们的revertrequire表达来部分防止这种行为。 如果矿工设法找到使合同出错的正确方法,他们将能够向您的用户收取额外的佣金。 在这种情况下的第一条规则:如果呼叫依赖于其他用户可以更改的状态,则它很容易出现强制错误。

审查制度

在决定区块中的交易顺序时,矿工还可以有选择地忽略某些交易。 他们出于政治或经济原因可以这样做。 用户通常不能保证矿工将在某个区块中包含特定交易。

假设爱丽丝想为自己存钱罐。 她可以发起一份简单的合同,允许她提早提款一万块。 爱丽丝是个好人,因此,她想确保在她突然死亡的情况下,钱至少能寄给其他人。 因此,她确保合同允许矿工在5万个区块之后提取资金。



每个个体矿工都有强烈的动机不将其提款交易包括在其区块中。 他们没有什么可失去的:如果她永远不能拿走这笔钱,他们可以尝试自己的运气,并在将来得到它。 此外,只有矿工允许她这样做,她才能提款。 即使他们不共谋和无视她的交易,也不进行51%的攻击,他们仍然可以拒绝集体接受她的交易进行处理。

这意味着根本没有合同可以保证100%及时交付交易! 鉴于矿工可能无法预测的审查,您将不得不设计应用程序。 而且由于合同无法预见其干预的愿望,因此应规定可能的任意时间延迟。

问题升级


进入系统的资金越多,矿工就越有可能以一种或另一种方式干预其工作。 随着交易所的发展,赌场变得越来越复杂,区块链价值也随之增加,矿工的干预动机也随之增加。

共识不只是我们分散应用程序的持有水平。 实际上,它们与应用程序层紧密相连。 在编写程序时,我们不会考虑硅的物理特性,因为我们知道硅不会积极尝试夺取我们的金钱。 不幸的是,在EVM和硅之间存在矿工形式的一层,如果不能信任它们,那么就不能信任EVM。

实体开发人员必须对与之兼容的计算机进行编程。 这样的EVM是“拜占庭式系统”。 任何可能导致失败结果的部分都会在最糟糕的时刻出现。 时至今日,我们仍处于了解加密货币,采矿和智能合约的初期。 现在,矿工们并没有表现出以牺牲用户为代价来优化其活动的积极愿望,但这只是目前。 以太坊将会增长,总有一天,我们仍然会记得分散式应用程序的黄金时代。

矿工不是朋友,也不是敌人。 在我们的共识系统中,它们是一种无法控制的自然灾害。 那些不学会管理这一要素的人最终将成为高级矿工的受害者。

图片

Source: https://habr.com/ru/post/zh-CN409735/


All Articles