背景概述
在上篇文章中我们了解了合约中隐藏的恶意代码,本次我们来了解一个非常常见的攻击手法——抢跑。
前置知识
提到抢跑,大家第一时间想到的一定是田径比赛,在田径运动中各个选手的体能素质几乎相同,起步越早的人得到第一名的概率越大。那么在以太坊中是如何抢跑的呢?
想了解抢跑攻击必须先了解以太坊的交易流程,我们通过下面这个发送交易的流程图来了解以太坊上一笔交易发出后经历的流程:
可以看到图中一笔交易从签名到被打包一共会经历7个阶段:
1.使用私钥对交易内容签名;
2.选择GasPrice;
3.发送签名后的交易;
4.交易在各个节点之间广播;
5.交易进入交易池;
6.矿工取出GasPrice高的交易;
7.矿工打包交易并出块。
交易送出之后会被丢进交易池里,等待被矿工打包。矿工从交易池中取出交易进行打包与出块。根据Eherscan?的数据,目前区块的Gas限制在3000万左右这是一个动态调整的值。若以一笔基础交易21,000Gas来计算,则目前一个以太坊区块可以容纳约1428笔交易。因此当交易池里的交易量大时,会有许多交易没办法即时被打包而滞留在池子中等待。这里就衍生出了一个问题,交易池中有那么多笔交易,矿工先打包谁的交易呢?
矿工节点可以自行设置参数,不过大多数矿工都是按照手续费的多少排序。手续费高的会被优先打包出块,手续费低的则需要等前面手续费高的交易全部被打包完才能被打包。当然进入交易池中的交易是源源不断的,不管交易进入交易池时间的先后,手续费高的永远会被优先打包,手续费过低的可能永远都不会被打包。
Optics智能合约V1在Celo、Ethereum、Polygon正式部署:9月14日消息,开源支付网络Celo推出的跨链通信互操作机制Optics智能合约V1在Celo、Ethereum、Polygon正式部署,Optics利用optimistic桥机制来实现链之间更便宜的通信,同时仍然保持去中心化。用户已经可以直接与合约交互以在以上3个链之间发送ERC-20代币。Optics包括一个3小时的争议窗口来检测任何欺诈,因此大约需要3小时 + 主链上的任何确认时间才能看到资金在目标链上结算。
此前消息,开源支付网络Celo推出的跨链通信机制Optics已在一些测试网部署。[2021/9/14 23:23:41]
那么手续费是怎么来的呢?
我们先看以太坊手续费计算公式:
TxFee=GasUsed*?GasPrice
其中GasUsed是由系统计算得出的,GasPrice是可以自定义的,所以最终手续费的多少取决于GasPrice设置的多少。
举个例子:
例如GasPrice设置为10GWEI,GasUsed?为21,000。因此,根据手续费计算公式可以算出手续费为:
10GWEI*21,000=0.00021Ether
在合约中我们常见到Call函数会设置GasLimit,下面我们来看看它是什么东西:
GasLimit可以从字面意思理解,就是Gas限制的意思,设置它是为了表示你愿意花多少数量的Gas在这笔交易上。当交易涉及复杂的合约交互时,不太确定实际的GasUsed,可以设置GasLimit,被打包时只会收取实际GasUsed作为手续费,多给的Gas会退返回来,当然如果实际操作中GasUsed>GasLimit就会发生Outofgas,造成交易回滚。
当然,在实际交易中选择一个合适的GasPrice也是有讲究的,我们可以在ETHGASSTATION上看到实时的GasPrice对应的打包速度:
Armor.Fi CTO与Immunefi合作提供智能合约漏洞赏金:DeFi保险协议Armor.Fi首席技术官Robert Forster正与智能合约漏洞赏金平台Immunefi合作,向任何能在以太坊生态系统项目中找到关键智能合约漏洞的人提供价值32万美元的奖金。R Bounty计划旨在鼓励负责任地披露关键漏洞。Robert将以个人身份发放Armor代币奖励。(The Defiant)[2021/2/21 17:36:50]
由上图可见,当前最快的打包速度对应的GasPrice为2,我们只需要在发送交易时将GasPrice设置为>=2的值就可以被尽快打包。
好了,到这里相信大家已经可以大致猜出抢跑的攻击方式了,就是在发送交易时将GasPrice调高从而被矿工优先打包。下面我们还是通过一个合约代码来带大家了解抢跑是如何完成攻击的。
合约示例
//?SPDX-License-Identifier:?MITpragmasolidity^0.8.17;contractFindThisHash{??bytes32publicconstanthash=????0x564ccaf7594d66b1eaaea24fe01f0585bf52ee70852af4eac0cc4b04711cd0e2;??constructor()payable{}??functionsolve(stringmemorysolution)public{????require(hash==keccak256(abi.encodePacked(solution)),"Incorrectanswer");????(boolsent,)=msg.sender.call{value:10ether}("");????require(sent,"FailedtosendEther");??}}
攻击分析
通过合约代码可以看到?FindThisHash?合约的部署者给出了一个哈希值,任何人都可以通过solve()?提交答案,只要solution的哈希值与部署者的哈希值相同就可以得到10个以太的奖励。我们这里排除部署者自己拿取奖励的可能。
动态 | Everipedia合约全项通过降维安全实验室智能合约安全审计:据降维安全实验室(jonhwick.io)报道,EOS项目Everipedia全项通过降维安全实验室智能合约安全审计。Everipedia(IQ)是世界上第一个点对点百科全书项目,团队基于对技术的严谨以及对用户负责的态度,向全球区块链安全能力服务提供商降维安全实验室提交了其EOS智能合约安全审计申请。目前,降维安全实验室已完成全部的审计工作,此次顺利的通过降维安全实验室的审计,证明了Everipedia合约的安全性以及完整性。[2019/2/12]
我们还是请出老朋友Eve看看他是如何使用抢跑攻击拿走本该属于Bob的奖励的:
1.Alice使用10Ether部署FindThisHash合约;
2.Bob找到哈希值为目标哈希值的正确字符串;
3.Bob调用solve("Ethereum")并将Gas价格设置为15Gwei;
4.Eve正在监控交易池,等待有人提交正确的答案;
5.Eve看到Bob发送的交易,设置比Bob更高的GasPrice,调用solve("Ethereum");
6.Eve的交易先于Bob的交易被矿工打包;
7.Eve赢得了10个以太币的奖励。
这里Eve的一系列操作就是标准的抢跑攻击,我们这里就可以给以太坊中的抢跑下一个定义:抢跑就是通过设置更高的GasPrice来影响交易被打包的顺序,从而完成攻击。
那么这类攻击该如何避免呢?
修复建议
在编写合约时可以使用Commit-Reveal方案:
https://medium.com/swlh/exploring-commit-reveal-schemes-on-ethereum-c4ff5a777db8
SoliditybyExample中提供了下面这段修复代码,我们来看看它是否可以完美地防御抢跑攻击。
//SPDX-License-Identifier:MITpragmasolidity^0.8.17;import"github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v4.5/contracts/utils/Strings.sol";contractSecuredFindThisHash{??//Structisusedtostorethecommitdetails??structCommit{????bytes32solutionHash;????uintcommitTime;????boolrevealed;??}??//Thehashthatisneededtobesolved??bytes32publichash=????0x564ccaf7594d66b1eaaea24fe01f0585bf52ee70852af4eac0cc4b04711cd0e2;??//Addressofthewinner??addresspublicwinner;??//Pricetoberewarded??uintpublicreward;??//Statusofgame??boolpublicended;??//Mappingtostorethecommitdetailswithaddress??mapping(address=>Commit)commits;??//Modifiertocheckifthegameisactive??modifiergameActive(){????require(!ended,"Alreadyended");????_;??}??constructor()payable{????reward=msg.value;??}??/*???Commitfunctiontostorethehashcalculatedusingkeccak256(addressinlowercase+solution+secret).???Userscanonlycommitonceandifthegameisactive.??*/??functioncommitSolution(bytes32_solutionHash)publicgameActive{????Commitstoragecommit=commits;????require(commit.commitTime==0,"Alreadycommitted");????commit.solutionHash=_solutionHash;????commit.commitTime=block.timestamp;????commit.revealed=false;??}??/*????Functiontogetthecommitdetails.Itreturnsatupleof(solutionHash,commitTime,revealStatus);?????UserscangetsolutiononlyifthegameisactiveandtheyhavecommittedasolutionHash??*/??functiongetMySolution()publicviewgameActivereturns(bytes32,uint,bool){????Commitstoragecommit=commits;????require(commit.commitTime!=0,"Notcommittedyet");????return(commit.solutionHash,commit.commitTime,commit.revealed);??}??/*????Functiontorevealthecommitandgetthereward.????UserscangetrevealsolutiononlyifthegameisactiveandtheyhavecommittedasolutionHashbeforethisblockandnotrevealedyet.????Itgeneratesankeccak256(msg.sender+solution+secret)andchecksitwiththepreviouslycommitedhash.?????Frontrunnerswillnotbeabletopassthischecksincethemsg.senderisdifferent.????Thentheactualsolutionischeckedusingkeccak256(solution),ifthesolutionmatches,thewinnerisdeclared,????thegameisendedandtherewardamountissenttothewinner.??*/??functionrevealSolution(????stringmemory_solution,????stringmemory_secret)publicgameActive{????Commitstoragecommit=commits;????require(commit.commitTime!=0,"Notcommittedyet");????require(commit.commitTime<block.timestamp,"Cannotrevealinthesameblock");????require(!commit.revealed,"Alreadycommitedandrevealed");????bytes32solutionHash=keccak256(??????abi.encodePacked(Strings.toHexString(msg.sender),_solution,_secret)????);????require(solutionHash==commit.solutionHash,"Hashdoesn'tmatch");????require(keccak256(abi.encodePacked(_solution))==hash,"Incorrectanswer");????winner=msg.sender;????ended=true;????(boolsent,)=payable(msg.sender).call{value:reward}("");????if(!sent){??????winner=address(0);??????ended=false;??????revert("Failedtosendether.");????}??}}
独家 | 新增翻版Fomo3D智能合约“剪刀石头布”Jan Ken Pon:第三方大数据评级机构RatingToken最新数据显示,2018年8月8日全球共新增757个合约地址,其中177个为代币型智能合约。据RatingToken团队发布的“新增代币型智能合约风险榜”,Jan Ken Pon(JKP)、Opporty(OPP)和bank(BANK)风险最高,检测得分分别为1.97、2.80和2.80,其中Jan Ken Pon在日语中意为“剪刀石头布”,是类Fomo3D游戏,存在14个安全风险。其他登上该风险榜TOP10的还包括Debt Coins(DEBT)、APAY(APAY)、RUBBER(REC)、RIGACOIN(RIGA)、dodgers(DOD)、MudToken(MUD)和SuperstartupX(SSX)。如需查看更多智能合约检测结果,请查看原文链接。[2018/8/9]
首先可以看到修复代码中使用了结构体Commit记录玩家提交的信息,其中:
commit.solutionHash=_solutionHash=keccak256
commit.commitTime=block.timestamp
commit.revealed=false
下面我们看这个合约是如何运作的:
1.Alice使用十个以太部署SecuredFindThisHash合约;
2.Bob找到哈希值为目标哈希值的正确字符串;
3.Bob计算solutionHash=keccak256(Bob’sAddress+“Ethereum”+Bob’ssecret);
4.Bob调用commitSolution(_solutionHash),提交刚刚算出的solutionHash;
5.Bob在下个区块调用revealSolution("Ethereum",Bob'ssecret)函数,传入答案和自己设置的密码,领取奖励。
这里我们看下这个合约是如何避免抢跑的,首先在第四步的时候,Bob提交的是这三个值的哈希,所以没有人知道Bob提交的内容到底是什么。这一步还记录了提交的区块时间并且在第五步的revealSolution()?中就先检查了区块时间,这是为了防止在同一个区块开奖被抢跑,因为调用revealSolution()?时需要传入明文答案。最后使用Bob输入的答案和密码验证与之前提交的solutionHash哈希是否匹配,这一步是为了防止有人不走commitSolution()?直接去调用revealSolution()。验证成功后,检查答案是否正确,最后发放奖励。
动态 | 智能合约拖慢以太坊网络引发担忧:据Cryptovest消息,连续两天,未知活动持续堵塞以太坊网络。对此,有用户分析认为这可能是由于游戏副本相关智能合约消耗费用占据了36.4%的以太坊Gas,并足以造成网络拥堵并全面提高交易费用。现以太坊网络定期交易费用已经超过1美元,相对来说为较高水平。另一假设认为,基于ETH的游戏以用户少而闻名,因此ETH被用于类似彩票的游戏,可能是假冒多个用户参与。与此同时,一份每隔几秒就发出0.1ETH的合约消耗了以太坊超15%的Gas,这持续加重了以太坊网络拥堵。[2018/8/8]
所以这个合约真的完美地防止了Eve抄答案吗?
Ofcoursenot!
咋回事呢?我们看到在revealSolution()?中仅限制了commit.commitTime<block.timestamp?,所以假设Bob在第一个区块提交了答案,在第二个区块立马调用revealSolution("Ethereum",Bob'ssecret)?并设置GasPrice=15Gwei?Eve,通过监控交易池拿到答案,拿到答案后他立即设置GasPrice=100Gwei,在第二个区块中调用commitSolution()?,提交答案并构造多笔高GasPrice的交易,将第二个区块填满,从而将Bob提交的交易挤到第三个区块中。在第三个区块中以100Gwei的GasPrice调用revealSolution("Ethereum",Eve'ssecret)?,得到奖励。
那么问题来了,如何才能有效地防止此类攻击呢?
很简单,只需要设置uint256revealSpan?值并在commitSolution()中检查?require(commit.commitTime+revealSpan>=block.timestamp,"Cannotcommitinthisblock");,这样就可以防止Eve抄答案的情况。但是在开奖的时候,还是无法防止提交过答案的人抢先领奖。
另外还有一点,本着代码严谨性,修复代码中的revealSolution()?函数执行完后并没有将commit.revealed?设为True,虽然这并不会影响什么,但是在编写代码的时候还是建议养成良好的编码习惯,执行完函数逻辑后将开关设置成正确的状态。
作者:NYDIG全球研究主管GregCipolaro?编译:WEEXBlog 阅读提要: 为什么比特币交易积压对矿工有利?更多的比特币被更长期持有,意味着什么?美联储再次加息,加剧银行业危机.
1900/1/1 0:00:00为方便阅读,文字略有删减整理如下:BSN的核心理念,是在互联网上推动建立一个新的公共层,与目前只能有效服务于中心化应用的互联网平行,为各行各业、各种类型的分布式应用提供服务.
1900/1/1 0:00:00文丨荀诗林 编辑丨戚梦颖 校对丨颜京宁 来源:刻度Record 2021年,无人不知元宇宙。在很多人都没弄懂元宇宙到底是什么的情况下,无论是投资精英或是普通人,似乎都不可避免被卷入这一浪潮之中.
1900/1/1 0:00:00DeFi数据 1、DeFi代币总市值:453.68亿美元 DeFi总市值及前十代币数据来源:coingecko2、过去24小时去中心化交易所的交易量18.
1900/1/1 0:00:00原文作者:Polynya原文编辑:南风,Unitimes我从来没有写过一篇关于“OptimisticRollupsvs.ZK-Rollups”的文章。它们都很棒.
1900/1/1 0:00:00DeFi之道讯,2月3日,跨链协议Wormhole遭黑客攻击,经Wormhole官方确认,本次攻击事件中损失达12万枚ETH,目前8万枚ETH已转移至以太坊网络,其余4万枚ETH保留在Solana上.
1900/1/1 0:00:00