PEER:以太坊是如何解决日蚀攻击(eclipse attack)的?_EER

什么是日蚀攻击

首先简单介绍一下日蚀攻击

以太坊的节点发现机制基于Kademlia,但其目的却不同,Kademlia旨在成为在分布式对等网络中存储和查找内容的手段,而以太坊仅用于发现新的节点。由于以太坊的节点是由其公钥表示的,并且不受IP限制,因此在一个机器上可以同时存在很多节点。攻击者在很少的服务器上制作出很多的节点,并积极的ping受害者的服务器。通过Kademlia协议,攻击者的节点信息将存储并填充在受害者节点列表中。下一步就是让受害者重启机器,手段包括断电、ddos攻击等等。重启后,攻击者再不停的ping被害者的节点以建立tcp连接,一旦被害者所有的tcp连接都是攻击者制造的,那么就达到了把被害者与正常的网络隔离的目的,当然最大的目的应该还是为了双花。有一篇论文是专门介绍日蚀攻击的,大家可以找来看看。

网上有很多关于日蚀攻击的详细介绍,在这里不做赘述。

报告:2022年以太坊智能合约部署量增长293%,四季度是活动高峰:1月18日消息,据Alchemy的一份新报告,与2021年相比,2022年部署在以太坊上的智能合约数量增长了293%,达到了与去年峰值相似的增长率。

值得注意的是,这一活动高峰出现在2022年第四季度,当时FTX崩盘导致资金大量外流。根据该报告,2022年第四季度部署的智能合约数量环比增长453%,达到460万。此外,在2022年四季度,以太坊Goerli测试网上的智能合约部署增长了187%,同比增长高达721%,达到270万的历史新高。(Decrypt)[2023/1/18 11:18:08]

以太坊是如何防止日蚀攻击的

在刚才提到的论文中,提到了以太坊的geth1.8.0解决了日蚀攻击,于是作者拿1.8.0和1.7.3做对比,理清了以太坊解决这个问题的做法。

彭博社:比特币价格走势并未达到预期 投资者转向传统股票市场:6月16日消息,近日彭博社发表最新分析文章称,在冠状病疫情期间,比特币的价格走势并没有达到人们的预期,并没有成为数字黄金。与此同时,比特币价格与传统股票市场的关联度比许多专家预测的要高得多。不仅如此,近期许多投资者又开始转向传统股票,寻找波动性和资产价格走势。(Decrypt)[2020/6/16]

直接看代码。

以太坊启动时加载p2p网络的流程如下,

cmd/geth/main.goinit方法->geth->startNode()->utils.StartNode()->stack.Start()->running.Start()

这个running.Start()调用的即是p2p/server.go中的Start()方法,看看这个方法做了什么:

以太坊L2网络总锁仓量为37.6亿美元 Arbitrum占比60.61%:金色财经报道,L2BEAT数据显示,截至10月17日,以太坊Layer2上总锁仓量为37.6亿美元。其中锁仓量最高的为扩容方案Arbitrum,约22.8亿美元,占比60.61%。其次是dYdX,锁仓量超8.57亿美元,占比22.78%。[2021/10/17 20:34:58]

//Startstartsrunningtheserver.//Serverscannotbere-usedafterstopping.func(srv*Server)Start()(errerror){......srv.loopWG.Add(1)gosrv.run(dialer)srv.running=truereturnnil}

这篇文章主要关注解决日蚀攻击相关代码,其他的不做介绍。

以太坊官方网站发布第三季度产品路线图:以太坊官方网站ethereum.org开发团队发布第三季度产品路线图,将在第三季度末为L2主网上的ETH2项目启动公共产品新融资机制CLR.fund。CLR.fund是一种无需许可且信任最小化的二次融资协议,使用最小反共谋基础设施 ( MACI ) 来防止各种形式的贿赂和使用 zk-SNARK 的串通,可以使用BrightID或类似的身份系统防止 Sybil 攻击。CLR.fund运行一系列连续的二次融资(Quadratic Financing)轮次,任何人都可以将公共产品项目添加为资助“接收者”,向匹配基金、向个人接收者提供资金。[2021/7/24 1:13:08]

上面的gosrv.run(dialer)连接池管理协程,负责维护TCP连接的列表,监听各种信号,处理peer的增删改

func(srv*Server)run(dialstatedialer){...running:for{scheduleTasks()select{...casec:=<-srv.posthandshake://Aconnectionhaspassedtheencryptionhandshakeso//theremoteidentityisknown(buthasn'tbeenverifiedyet).iftrusted{//EnsurethatthetrustedflagissetbeforecheckingagainstMaxPeers.c.flags|=trustedConn}//TODO:trackin-progressinboundnodeIDs(pre-Peer)toavoiddialingthem.select{casec.cont<-case<-srv.quit:breakrunning}casec:=<-srv.addpeer://Atthispointtheconnectionispasttheprotocolhandshake.//Itscapabilitiesareknownandtheremoteidentityisverified.iferr==nil{//Thehandshakesaredoneanditpassedallchecks.p:=newPeer(c,srv.Protocols)//Ifmessageeventsareenabled,passthepeerFeed//tothepeerifsrv.EnableMsgEvents{p.events=&srv.peerFeed}name:=truncateName(c.name)srv.log.Debug("Addingp2ppeer","name",name,"addr",c.fd.RemoteAddr(),"peers",len(peers)1)gosrv.runPeer(p)peers=pifp.Inbound(){}}...casepd:=<-srv.delpeer://Apeerdisconnected.d:=common.PrettyDuration(mclock.Now()-pd.created)pd.log.Debug("Removingp2ppeer","duration",d,"peers",len(peers)-1,"req",pd.requested,"err",pd.err)delete(peers,pd.ID())ifpd.Inbound(){}}}...}

声音 | MakerDAO创始人:比特币和以太坊市场依赖于中心化基础设施:金色财经报道,MakerDAO创始人Rune Christensen近期接受采访时表示,DeFi目前只存在于加密的泡沫中,尽管它也可以在未来为发展中国家的人们提供小企业贷款,而不是完全切断他们与金融系统的联系。他还谈到,随着MCD的推出,Maker已经成为一个完整的程序包,在此基础上可以不受任何限制地构建DeFi。当被问及为何将代币化的贷款或证券纳入其中,而这些贷款或证券与Maker和DeFi所持的无许可和去中心化的理念背道而驰时,Christensen回答道称,关键是风险多样化。他还解释称,从监管的角度来看,比特币和以太坊市场完全依赖于中心化的基础设施,而比特币的价格是基于中国和美国的少数中心化交易所。[2019/11/21]

注意加粗的代码,有一个针对inboundCount的操作,当有posthandshake、addpeer消息的时候,会先去check,如果add或del了一个peer,则有对应的inboundCount或者inboundCount--。看看到底check了什么:

protoHandshakeChecks最终也是调用encHandshakeChecks:

func(srv*Server)encHandshakeChecks(peersmap*Peer,inboundCountint,c*conn)error{switch{case!c.is(trustedConn|staticDialedConn)&&len(peers)>=srv.MaxPeers:returnDiscTooManyPeerscasepeers!=nil:returnDiscAlreadyConnectedcasec.id==srv.Self().ID:returnDiscSelfdefault:returnnil}}

inboundConn表示连接类型为主动连接过来。

看加粗的这段逻辑:如果该连接是信任的,且是主动连接过来的,且主动连接过来的节点数量大于srv.maxInboundConns()时,则拒绝此连接。

可以看出来,以太坊是通过限制主动连接过来的数量来阻止日蚀攻击的。我们顺便看下这个数量是多少:

func(srv*Server)maxInboundConns()int{returnsrv.MaxPeers-srv.maxDialedConns(。func(srv*Server)maxDialedConns()int{ifsrv.NoDiscovery||srv.NoDial{return0}r:=srv.DialRatioifr==0{r=defaultDialRatio}returnsrv.MaxPeers/r}

MaxPeers默认是25,defaultDialRatio表示能够接受主动连接的比例,默认是3,所以最多允许传入的tcp连接数量就是25/3=8个

郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。

区块博客

[0:15ms0-3:899ms