什么是日蚀攻击
首先简单介绍一下日蚀攻击
以太坊的节点发现机制基于Kademlia,但其目的却不同,Kademlia旨在成为在分布式对等网络中存储和查找内容的手段,而以太坊仅用于发现新的节点。由于以太坊的节点是由其公钥表示的,并且不受IP限制,因此在一个机器上可以同时存在很多节点。攻击者在很少的服务器上制作出很多的节点,并积极的ping受害者的服务器。通过Kademlia协议,攻击者的节点信息将存储并填充在受害者节点列表中。下一步就是让受害者重启机器,手段包括断电、ddos攻击等等。重启后,攻击者再不停的ping被害者的节点以建立tcp连接,一旦被害者所有的tcp连接都是攻击者制造的,那么就达到了把被害者与正常的网络隔离的目的,当然最大的目的应该还是为了双花。有一篇论文是专门介绍日蚀攻击的,大家可以找来看看。
网上有很多关于日蚀攻击的详细介绍,在这里不做赘述。
数据:以太坊L2网络总锁仓量为50.6亿美元:金色财经报道,据L2BEAT最新数据显示,截至3月11日,以太坊Layer2(L2)上总锁仓量为50.6亿美元。其中锁仓量最高的为扩容方案Arbitrum,锁仓量20.9亿美元,占比52.4%。其次是dYdX,锁仓量9.73亿美元,占比17.6%。[2022/3/11 13:50:05]
以太坊是如何防止日蚀攻击的
在刚才提到的论文中,提到了以太坊的geth1.8.0解决了日蚀攻击,于是作者拿1.8.0和1.7.3做对比,理清了以太坊解决这个问题的做法。
直接看代码。
以太坊启动时加载p2p网络的流程如下,
cmd/geth/main.goinit方法->geth->startNode()->utils.StartNode()->stack.Start()->running.Start()
Livepeer宣布将所有功能由以太坊主网迁移至Arbitrum:2月15日消息,去中心化流媒体传输协议Livepeer宣布完成网络升级,禁用以太坊主网上的协议操作,将所有功能迁移至Arbitrum网络。Livepeer表示,随着以太坊主网Gas费上涨,高费用环境使网络参与者难以有效运营并盈利。
据悉,以太坊主网上的任何 LPT 代币都需要桥接到 L2网络才能与协议交互。此外,自今日起,Livepeer编排者将不会在以太坊主网上获得收益或通胀奖励,后者都将在 Arbitrum 上支付。所有协调者需在2月21日前将其权益迁移到 Arbitrum。LPT代币质押者(委托者)2月21日后可在 Arbitrum 网络上认领其 LPT 代币和收益。[2022/2/15 9:52:25]
这个running.Start()调用的即是p2p/server.go中的Start()方法,看看这个方法做了什么:
数据:以太坊全网算力约680,454.84 GH/s:9月20日消息,据以太坊链上数据显示,当前以太坊全网算力约680,454.84 GH/s,挖矿难度约9,048.99T。
ETH当前价格 :$ 3,319.40
交易费Gas均价:127.00Gwei
未确认交易数 :132357[2021/9/20 23:38:06]
//Startstartsrunningtheserver.//Serverscannotbere-usedafterstopping.func(srv*Server)Start()(errerror){......srv.loopWG.Add(1)gosrv.run(dialer)srv.running=truereturnnil}
这篇文章主要关注解决日蚀攻击相关代码,其他的不做介绍。
声音 | 赵长鹏:以太坊的唯一问题是开发社区不够专注:据Today's Gazette报道,币安首席执行官赵长鹏最近表示,以太坊具有比BNB做得更好的能力,以太坊的唯一问题的是其开发社区不够专注。[2019/4/23]
上面的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(){}}}...}
动态 | 以太坊未确认交易1088笔:Etherscan.io数据显示,当前以太坊未确认交易数为1088笔,以太坊未确认笔数相较此前大幅下降,网络拥堵程度得到缓解。[2019/4/13]
注意加粗的代码,有一个针对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个
郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。