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

什么是日蚀攻击

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

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

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

OKEx将于9月23日14:00上线AVAX杠杆交易、余币宝及永续合约:OKEx官方刚刚发布公告称,OKEx将于9月23日14:00在网页端、APP端及API正式上线AVAX杠杆交易、余币宝及AVAXUSDT永续合约。[2020/9/23]

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

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

直接看代码。

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

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

BTC合约多空持仓人数比为1.90 市场做多人数稍有増加:截至3月6日10:30,根据OKEx交易大数据显示,BTC合约多空持仓人数比为1.90,季度合约基差83.99美元,永续合约基差5.4美元,永续合约资金费率0.020%;BTC合约持仓总量8,480,569张,24h交易量20,657,382张;主动买入量363,019张,主动卖出量331,768张;精英账户做多账户比48%,多头持仓比22.97%,做空账户比50%,空头持仓比17.23%。BTC现货数据方面,杠杆多空比为4.30,币币主动买入量375.06 BTC,币币主动卖出量383.32 BTC,USDT场外溢价率为100.09%。

分析师表示,BTC合约多空持仓人数比为1.90,市场做多人数稍微有所增加,季度合约基差小幅扩大,不过仍在100美元下方,显示市场信心已经从巅峰回落;持仓总量比较稳定在800多万张水平,市场潜力仍然较大;市场主动交易较活跃,存在异动可能;BTC合约精英持仓方面,多空双方势力相对均衡,注意短线风险。[2020/3/6]

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

美国曼哈顿地区检察官办公室成立特别工作组调查FTX事件:金色财经报道,美国曼哈顿地区检察官办公室成立特别工作组调查FTX事件。此外,美国纽约州检察官丹妮尔·沙逊表示,SBF与外国监管机构合作,转移了美国FTX破产程序中的资产。美国法官刘易斯·卡普兰对SBF施加了新的限制,禁止他染指FTX或Alameda的资产。

美国白宫回应去年数次与SBF进行的会谈:与之讨论的内容是关于疫情的。[2023/1/4 9:51:12]

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

动态 | 以太坊对BTC汇率创年内低点 链上DApp交易量持续上升:据TokenGazer数据分析显示,截止至7月10日11时,以太坊价格为$313.03,总市值为$33,615.71M,主流交易所交易量约为$384.83M,环比昨日增长11.21%;以太坊对比特币汇率持续下滑,创年内低点;基本面方面,以太坊链上交易量和活跃地址数有一定下滑趋势,算力保持相对平稳波动;ETH 链上DApp交易量持续上升,表现优于EOS和TRON;以太坊30天开发者指数约为2.35;在BTC市值占比不断上行的情况下,ETH的市值占比保持相对平稳波动,未被明显压缩;ERC20代币总市值约为以太坊总市值的54.28%,占比持续下滑;ERC20活跃地址数方面,排名前五的代币为USDC、LINK、DAI、TUSD、PAX。[2019/7/10]

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

动态 | WAN加入企业以太坊联盟:据Ethereumworldnews报道,Wanchain(WAN)今天发表声明宣布加入了企业以太坊联盟(EEA),这是世界上最大的开源区块链计划。随着加入该联盟,WAN将能够与全球行业领导者合作,为企业技术、开放标准和开源参考架构带来最佳实践。[2018/8/31]

上面的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(){}}}...}

注意加粗的代码,有一个针对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:0ms0-3:552ms