From 1034635ae961a3356e8abad59174378c8402c1f2 Mon Sep 17 00:00:00 2001 From: knull Date: Mon, 18 May 2020 11:49:41 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AF=B9p2p=E8=BF=9E=E6=8E=A5=E7=9A=84addressb?= =?UTF-8?q?ook=E6=B7=BB=E5=8A=A0=E4=B8=80=E4=B8=AAproxy=E5=B1=9E=E6=80=A7?= =?UTF-8?q?=EF=BC=8C=E9=80=82=E5=BA=94=E5=AE=9E=E9=99=85=E7=9A=84=E8=81=94?= =?UTF-8?q?=E7=9B=9F=E9=93=BE=E5=BA=94=E7=94=A8=E5=9C=BA=E6=99=AF=EF=BC=9A?= =?UTF-8?q?=20=E5=85=AC=E5=8F=B8=E5=86=85=E7=BD=91=E6=8C=82n=E4=B8=AA?= =?UTF-8?q?=E8=8A=82=E7=82=B9=EF=BC=8C=E4=BD=86=E6=98=AF=E8=AE=B8=E5=A4=9A?= =?UTF-8?q?=E6=97=B6=E5=80=99=E9=83=BD=E6=9C=89=E5=94=AF=E4=B8=80=E7=9A=84?= =?UTF-8?q?=E5=87=BA=E5=8F=A3=EF=BC=88=E6=AF=94=E5=A6=82SLB)=E3=80=82=20?= =?UTF-8?q?=E5=85=B6=E5=AE=83=E8=8A=82=E7=82=B9=E8=A6=81=E8=AE=BF=E9=97=AE?= =?UTF-8?q?=E8=AF=A5=E5=85=AC=E5=8F=B8=E8=8A=82=E7=82=B9=EF=BC=8C=E5=8F=AA?= =?UTF-8?q?=E8=83=BD=E9=80=9A=E8=BF=87SLB=EF=BC=9B=E5=85=AC=E5=8F=B8?= =?UTF-8?q?=E5=86=85=E9=83=A8=E8=8A=82=E7=82=B9=EF=BC=8C=E4=BA=92=E7=9B=B8?= =?UTF-8?q?=E8=AE=BF=E9=97=AE=EF=BC=8C=E5=8F=AF=E4=BB=A5=E7=9B=B4=E6=8E=A5?= =?UTF-8?q?=E8=AE=BF=E9=97=AE.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gemmill/angine.go | 21 +++++++++++---------- gemmill/p2p/pex_reactor.go | 22 +++++++++++++++++++++- gemmill/p2p/types.go | 17 +++++++++-------- 3 files changed, 41 insertions(+), 19 deletions(-) diff --git a/gemmill/angine.go b/gemmill/angine.go index 33bf603..7b86f18 100644 --- a/gemmill/angine.go +++ b/gemmill/angine.go @@ -150,7 +150,7 @@ func NewAngine(app types.Application, tune *Tunes) (angine *Angine, err error) { logger, err := getLogger(conf) if err != nil { - err = fmt.Errorf("failed to get logger: %v", err) + err = fmt.Errorf("failed to get logger: %v", err) return nil, err } log.SetLog(logger) @@ -163,13 +163,13 @@ func NewAngine(app types.Application, tune *Tunes) (angine *Angine, err error) { crypto.NodeInit(crypto.CryptoType) privValidator, err := types.LoadPrivValidator(conf.GetString("priv_validator_file")) if err != nil { - err = fmt.Errorf("LoadPrivValidator error: %v", err) + err = fmt.Errorf("LoadPrivValidator error: %v", err) return nil, err } refuseList = refuse_list.NewRefuseList(dbBackend, dbDir) p2psw, err := prepareP2P(conf, genesis, privValidator, refuseList) if err != nil { - err = fmt.Errorf("prepare p2p error: %v", err) + err = fmt.Errorf("prepare p2p error: %v", err) return nil, err } @@ -231,7 +231,7 @@ func (a *Angine) OnRecvExchangeData(data *p2p.ExchangeData) error { a.p2pSwitch.GetExchangeData().GenesisJSON = data.GenesisJSON if err = a.buildState(otherGenesis); err != nil { // TODO log err - log.Warn("build state err:", zap.Error(err)) + log.Warn("build state err:", zap.Error(err)) return err } if a.stateMachine == nil { @@ -344,7 +344,7 @@ func (ang *Angine) assembleStateMachine(stateM *state.State) { var addrBook *p2p.AddrBook if conf.GetBool("pex_reactor") { addrBook = p2p.NewAddrBook(conf.GetString("addrbook_file"), conf.GetBool("addrbook_strict")) - pexReactor := p2p.NewPEXReactor(addrBook) + pexReactor := p2p.NewPEXReactor(addrBook, conf.GetString("p2p_proxy_addr")) ang.p2pSwitch.AddReactor("PEX", pexReactor) } @@ -1131,11 +1131,12 @@ func prepareP2P(conf *viper.Viper, genesis *types.GenesisDoc, privValidator *typ return nil, errors.Wrap(err, "prepareP2P") } nodeInfo := &p2p.NodeInfo{ - PubKey: privValidator.GetPubKey(), - SigndPubKey: conf.GetString("signbyCA"), - Moniker: conf.GetString("moniker"), - ListenAddr: defaultListener.ExternalAddress().String(), - Version: version, + PubKey: privValidator.GetPubKey(), + SigndPubKey: conf.GetString("signbyCA"), + Moniker: conf.GetString("moniker"), + ListenAddr: defaultListener.ExternalAddress().String(), + P2pProxyAddr: conf.GetString("p2p_proxy_addr"), + Version: version, } privKey := privValidator.GetPrivKey() p2psw.AddListener(defaultListener) diff --git a/gemmill/p2p/pex_reactor.go b/gemmill/p2p/pex_reactor.go index bd61743..9795773 100644 --- a/gemmill/p2p/pex_reactor.go +++ b/gemmill/p2p/pex_reactor.go @@ -19,6 +19,7 @@ import ( "errors" "fmt" "math/rand" + "strings" "time" "github.com/dappledger/AnnChain/gemmill/go-wire" @@ -45,12 +46,22 @@ type PEXReactor struct { BaseReactor book *AddrBook + // + localP2pProxyAddr *NetAddress } -func NewPEXReactor(book *AddrBook) *PEXReactor { +func NewPEXReactor(book *AddrBook, localProxy string) *PEXReactor { pexR := &PEXReactor{ book: book, } + log.Infof("NewPEXReactor(%s)",localProxy) + pexR.localP2pProxyAddr = &NetAddress{} + if localProxy != "" { + addr, _ := NewNetAddressString(localProxy) + if addr != nil { + pexR.localP2pProxyAddr = addr + } + } pexR.BaseReactor = *NewBaseReactor("PEXReactor", pexR) return pexR } @@ -78,6 +89,15 @@ func (pexR *PEXReactor) GetChannels() []*ChannelDescriptor { // Implements Reactor func (pexR *PEXReactor) AddPeer(peer *Peer) { + if strings.TrimSpace(peer.P2pProxyAddr) != "" { + //如果用相同的代理,那么就是同一套内网系统,可以直接走原来的流程;否则,走proxy流程. + netAddr, _ := NewNetAddressString(peer.P2pProxyAddr) + if !bytes.Equal(pexR.localP2pProxyAddr.IP, netAddr.IP) { + pexR.book.AddAddress(netAddr, netAddr) + log.Debugf("AddPeer(%s)",netAddr.String()) + return + } + } // Add the peer to the address book netAddr, _ := NewNetAddressString(peer.ListenAddr) if peer.IsOutbound() { diff --git a/gemmill/p2p/types.go b/gemmill/p2p/types.go index 3d6d301..b006b48 100644 --- a/gemmill/p2p/types.go +++ b/gemmill/p2p/types.go @@ -26,14 +26,15 @@ import ( const maxNodeInfoSize = 10240 // 10Kb type NodeInfo struct { - PubKey crypto.PubKey `json:"pub_key"` - SigndPubKey string `json:"signd_pub_key"` - Moniker string `json:"moniker"` - Network string `json:"network"` - RemoteAddr string `json:"remote_addr"` - ListenAddr string `json:"listen_addr"` - Version string `json:"version"` // major.minor.revision - Other []string `json:"other"` // other application specific data + PubKey crypto.PubKey `json:"pub_key"` + SigndPubKey string `json:"signd_pub_key"` + Moniker string `json:"moniker"` + Network string `json:"network"` + RemoteAddr string `json:"remote_addr"` + ListenAddr string `json:"listen_addr"` + P2pProxyAddr string `json:"p2p_proxy_addr"` + Version string `json:"version"` // major.minor.revision + Other []string `json:"other"` // other application specific data } type ExchangeData struct {