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 {