From 004c903fb417483c492ab4febc921ba83bdd1c30 Mon Sep 17 00:00:00 2001 From: Wei Tang Date: Sat, 22 Jul 2017 04:06:12 +0800 Subject: [PATCH 1/3] p2p: good will assumption for the DAO fork Discussion at #309. After sending a request to check for a particular hash of a hard fork block, allow the peer to claim that it does not know about this block, and then assume the peer is valid, unless it shows it's not so. --- eth/handler.go | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/eth/handler.go b/eth/handler.go index e7e86fd18..cb6e51f9e 100644 --- a/eth/handler.go +++ b/eth/handler.go @@ -405,19 +405,21 @@ func (pm *ProtocolManager) handleMsg(p *peer) error { return errResp(ErrDecode, "msg %v: %v", msg, err) } // Filter out any explicitly requested headers, deliver the rest to the downloader - isForkCheck := len(headers) == 1 + isForkCheck := len(headers) == 1 || len(headers) == 0 if isForkCheck { if p.timeout != nil { // Disable the fork drop timeout p.timeout.Stop() p.timeout = nil } - if err := pm.chainConfig.HeaderCheck(headers[0]); err != nil { - pm.removePeer(p.id) - return err + if len(headers) > 0 { + if err := pm.chainConfig.HeaderCheck(headers[0]); err != nil { + pm.removePeer(p.id) + return err + } + // Irrelevant of the fork checks, send the header to the fetcher just in case + headers = pm.fetcher.FilterHeaders(headers, time.Now()) } - // Irrelevant of the fork checks, send the header to the fetcher just in case - headers = pm.fetcher.FilterHeaders(headers, time.Now()) } if len(headers) > 0 || !isForkCheck { err := pm.downloader.DeliverHeaders(p.id, headers) From 3f09b1f5304914ba6910075aaf2f5831875818ee Mon Sep 17 00:00:00 2001 From: Wei Tang Date: Sun, 23 Jul 2017 03:37:57 +0800 Subject: [PATCH 2/3] Fix the test failure for the good-will change --- eth/handler.go | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/eth/handler.go b/eth/handler.go index cb6e51f9e..77f8b839f 100644 --- a/eth/handler.go +++ b/eth/handler.go @@ -405,23 +405,21 @@ func (pm *ProtocolManager) handleMsg(p *peer) error { return errResp(ErrDecode, "msg %v: %v", msg, err) } // Filter out any explicitly requested headers, deliver the rest to the downloader - isForkCheck := len(headers) == 1 || len(headers) == 0 - if isForkCheck { + if len(headers) == 0 || len(headers) == 1 { if p.timeout != nil { // Disable the fork drop timeout p.timeout.Stop() p.timeout = nil } - if len(headers) > 0 { - if err := pm.chainConfig.HeaderCheck(headers[0]); err != nil { - pm.removePeer(p.id) - return err - } - // Irrelevant of the fork checks, send the header to the fetcher just in case - headers = pm.fetcher.FilterHeaders(headers, time.Now()) - } } - if len(headers) > 0 || !isForkCheck { + if len(headers) == 1 { + if err := pm.chainConfig.HeaderCheck(headers[0]); err != nil { + pm.removePeer(p.id) + return err + } + // Irrelevant of the fork checks, send the header to the fetcher just in case + headers = pm.fetcher.FilterHeaders(headers, time.Now()) + } else if len(headers) > 0 { err := pm.downloader.DeliverHeaders(p.id, headers) if err != nil { glog.V(logger.Debug).Infoln(err) From f33d7ade3099162f1c66280cf16d4300af960ba1 Mon Sep 17 00:00:00 2001 From: Wei Tang Date: Sun, 23 Jul 2017 03:53:35 +0800 Subject: [PATCH 3/3] Problem: wrong logic translation in good-will fix len(headers) > 0 || !isForkCheck is equivalent to len(headers) > 0 || !(len(headers) == 1), and this is true for len == 0 (!(len(headers) == 1) is true), len == 1 (len(headers > 0) is true, and so on. --- eth/handler.go | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/eth/handler.go b/eth/handler.go index 77f8b839f..8a5887be4 100644 --- a/eth/handler.go +++ b/eth/handler.go @@ -419,11 +419,10 @@ func (pm *ProtocolManager) handleMsg(p *peer) error { } // Irrelevant of the fork checks, send the header to the fetcher just in case headers = pm.fetcher.FilterHeaders(headers, time.Now()) - } else if len(headers) > 0 { - err := pm.downloader.DeliverHeaders(p.id, headers) - if err != nil { - glog.V(logger.Debug).Infoln(err) - } + } + err := pm.downloader.DeliverHeaders(p.id, headers) + if err != nil { + glog.V(logger.Debug).Infoln(err) } case p.version >= eth62 && msg.Code == GetBlockBodiesMsg: