Commit 69076a83 authored by libangzhu's avatar libangzhu Committed by vipwzw

add gossip blacklist

parent 98bd8da2
......@@ -3,7 +3,7 @@ module github.com/33cn/plugin
go 1.14
require (
github.com/33cn/chain33 v1.65.3-0.20210907070424-a73dd61ebd6e
github.com/33cn/chain33 v1.65.3-0.20210907094427-933c4f1b3d02
github.com/BurntSushi/toml v0.3.1
github.com/NebulousLabs/Sia v1.3.7
github.com/NebulousLabs/errors v0.0.0-20181203160057-9f787ce8f69e // indirect
......@@ -16,6 +16,7 @@ require (
github.com/coreos/etcd v3.3.15+incompatible
github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f // indirect
github.com/davecgh/go-spew v1.1.1
github.com/dgraph-io/badger v1.6.2 // indirect
github.com/ethereum/go-ethereum v1.10.0
github.com/golang-collections/collections v0.0.0-20130729185459-604e922904d3
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b
......@@ -24,6 +25,7 @@ require (
github.com/holiman/uint256 v1.1.1
github.com/huin/goupnp v1.0.1-0.20200620063722-49508fba0031
github.com/jackpal/go-nat-pmp v1.0.2
github.com/libp2p/go-libp2p-tls v0.1.3 // indirect
github.com/mr-tron/base58 v1.2.0
github.com/pborman/uuid v1.2.0
github.com/perlin-network/life v0.0.0-20191203030451-05c0e0f7eaea
......@@ -39,7 +41,7 @@ require (
github.com/valyala/fasthttp v1.5.0
golang.org/x/crypto v0.0.0-20210817164053-32db794688a5
golang.org/x/net v0.0.0-20210423184538-5f58ad60dda6
golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf
golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34
golang.org/x/time v0.0.0-20190921001708-c4c64cad1fd0 // indirect
google.golang.org/grpc v1.33.2
google.golang.org/protobuf v1.25.0
......
......@@ -28,6 +28,8 @@ dmitri.shuralyov.com/state v0.0.0-20180228185332-28bcc343414c/go.mod h1:0PRwlb0D
git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg=
github.com/33cn/chain33 v1.65.3-0.20210907070424-a73dd61ebd6e h1:VphQHhOd/QzEl31o6TfeZ2lRxrPm3HpFiiDDn4MdbY4=
github.com/33cn/chain33 v1.65.3-0.20210907070424-a73dd61ebd6e/go.mod h1:Dpr4UhVgIzqB/5RBUa7Qoq39JQ5kKRN+PjTEWfucN3o=
github.com/33cn/chain33 v1.65.3-0.20210907094427-933c4f1b3d02 h1:jA+QhA7oEr2OjKEj8/sZvcle3J0WoAW2WDNrR6JhoF4=
github.com/33cn/chain33 v1.65.3-0.20210907094427-933c4f1b3d02/go.mod h1:31Yet+1aA1mThbStTcrrO84dRqp38LIRVaIynV1pO7c=
github.com/AndreasBriese/bbloom v0.0.0-20180913140656-343706a395b7/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8=
github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8=
github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96 h1:cTp8I5+VIoKjsnZuH8vjyaysT/ses3EvZeaV/1UkF2M=
......@@ -1061,6 +1063,7 @@ github.com/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6/go.mod h1:ce1O1j6Ut
github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA=
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
......@@ -1159,6 +1162,8 @@ golang.org/x/mod v0.1.1-0.20191209134235-331c550502dd/go.mod h1:s0Qsj1ACt9ePp/hM
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.3.0 h1:RM4zey1++hCTbCVQfnWeKs9/IEsaBLA8vTkd0WVtmH4=
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=
golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
......@@ -1194,6 +1199,7 @@ golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81R
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
golang.org/x/net v0.0.0-20210423184538-5f58ad60dda6 h1:0PC75Fz/kyMGhL0e1QnypqK2kQMqKt9csD1GnMJR+Zk=
golang.org/x/net v0.0.0-20210423184538-5f58ad60dda6/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
......@@ -1262,15 +1268,20 @@ golang.org/x/sys v0.0.0-20210105210732-16f7687f5001/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210426080607-c94f62235c83 h1:kHSDPqCtsHZOg0nVylfTo20DDhE9gG4Y0jn7hKQ0QAM=
golang.org/x/sys v0.0.0-20210426080607-c94f62235c83/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf h1:2ucpDCmfkl8Bd/FsLtiD653Wf96cW37s+iGx93zsu4k=
golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34 h1:GkvMjFtXUmahfDtashnc1mnrCtuBVcwse5QV2lUk/tI=
golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
......@@ -1325,6 +1336,7 @@ golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapK
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20210106214847-113979e3529a h1:CB3a9Nez8M13wwlr/E2YtwoU+qYHKfC+JrDa45RXXoQ=
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
......
......@@ -13,6 +13,7 @@ import (
"fmt"
"math/rand"
"net"
"strconv"
"strings"
"time"
......@@ -28,6 +29,34 @@ var P2pComm Comm
// Comm information
type Comm struct{}
//CheckNetAddr check addr or ip format
func (Comm) CheckNetAddr(addr string) error {
//check peerAddr
if !strings.Contains(addr, ":") { //only ip
if net.ParseIP(addr) == nil {
return errors.New("invalid ip")
}
return nil
}
host, port, err := net.SplitHostPort(addr)
if err != nil {
return err
}
iport, err := strconv.ParseInt(port, 10, 32)
if err != nil || iport > 65535 {
return errors.New("invalid port")
}
if net.ParseIP(host) == nil {
return errors.New("invalid ip")
}
return nil
}
// AddrRouteble address router ,return enbale address
func (Comm) AddrRouteble(addrs []string, version int32, creds credentials.TransportCredentials) []string {
var enableAddrs []string
......
......@@ -25,6 +25,12 @@ var (
CheckActivePeersInterVal = 5 * time.Second
CheckBlackListInterVal = 30 * time.Second
CheckCfgSeedsInterVal = 1 * time.Minute
unitTime = map[string]int64{
"hour": 3600,
"min": 60,
"second": 1,
}
)
const (
......
......@@ -120,6 +120,7 @@ func (p *PeerInfos) GetPeerInfo(peerName string) *types.Peer {
type BlackList struct {
mtx sync.Mutex
badPeers map[string]int64
peerstore sync.Map
}
// FetchPeerInfo get peerinfo by node
......@@ -257,10 +258,26 @@ func (nf *NodeInfo) OutSide() bool {
func (bl *BlackList) Add(addr string, deadline int64) {
bl.mtx.Lock()
defer bl.mtx.Unlock()
if deadline == 0 { //默认1年
deadline = 365 * 24 * 3600
}
bl.badPeers[addr] = types.Now().Unix() + deadline
}
func (bl *BlackList) addPeerStore(peerName, remoteAddr string) {
bl.peerstore.Store(peerName, remoteAddr)
}
func (bl *BlackList) getpeerStore(key string) (string, bool) {
v, ok := bl.peerstore.Load(key)
if ok {
return v.(string), ok
}
return "", ok
}
// Delete delete badpeer
func (bl *BlackList) Delete(addr string) {
bl.mtx.Lock()
......@@ -268,6 +285,10 @@ func (bl *BlackList) Delete(addr string) {
delete(bl.badPeers, addr)
}
func (bl *BlackList) deletePeerStore(peerName string) {
bl.peerstore.Delete(peerName)
}
// Has the badpeer true and false
func (bl *BlackList) Has(addr string) bool {
bl.mtx.Lock()
......
......@@ -374,6 +374,7 @@ func (network *P2p) subP2pMsg() {
network.otherFactory <- struct{}{}
}
}
switch msg.Ty {
case types.EventTxBroadcast: //广播tx
......@@ -390,6 +391,13 @@ func (network *P2p) subP2pMsg() {
network.processEvent(msg, taskIndex, network.p2pCli.GetHeaders)
case types.EventGetNetInfo:
network.processEvent(msg, taskIndex, network.p2pCli.GetNetInfo)
case types.EventAddBlacklist:
network.processEvent(msg, taskIndex, network.p2pCli.AddPeerToBlacklist)
case types.EventDelBlacklist:
network.processEvent(msg, taskIndex, network.p2pCli.DelPeerFromBlacklist)
case types.EventShowBlacklist:
network.processEvent(msg, taskIndex, network.p2pCli.ShowBlacklist)
default:
log.Warn("unknown msgtype", "msg", msg)
msg.Reply(network.client.NewMessage("", msg.Ty, types.Reply{Msg: []byte("unknown msgtype")}))
......
......@@ -10,12 +10,13 @@ import (
"io"
"math/rand"
"net"
"github.com/33cn/chain33/p2p/utils"
"sync/atomic"
"time"
"github.com/33cn/chain33/system/p2p/dht/protocol/peer"
"github.com/33cn/chain33/p2p/utils"
"github.com/33cn/chain33/queue"
pb "github.com/33cn/chain33/types"
"golang.org/x/net/context"
......@@ -33,6 +34,9 @@ type EventInterface interface {
GetBlocks(msg *queue.Message, taskindex int64)
BlockBroadcast(msg *queue.Message, taskindex int64)
GetNetInfo(msg *queue.Message, taskindex int64)
AddPeerToBlacklist(msg *queue.Message, taskindex int64)
DelPeerFromBlacklist(msg *queue.Message, taskindex int64)
ShowBlacklist(msg *queue.Message, taskindex int64)
}
// NormalInterface subscribe to the event hander interface
......@@ -652,3 +656,110 @@ func (m *Cli) getLocalPeerInfo() (*pb.P2PPeerInfo, error) {
return &localpeerinfo, nil
}
// AddPeerToBlacklist add peer to blacklist
func (m *Cli) AddPeerToBlacklist(msg *queue.Message, taskindex int64) {
defer func() {
<-m.network.otherFactory
log.Debug("GetNetInfo", "task complete:", taskindex)
}()
blackPeer := msg.GetData().(*pb.BlackPeer)
//parase lifetime,min,hour,seconds
lifetime, err := peer.CaculateLifeTime(blackPeer.GetLifetime())
if err != nil {
log.Error("AddPeerToBlacklist", "CaculateLifeTime", err)
msg.Reply(m.network.client.NewMessage("rpc", pb.EventReply, &pb.Reply{IsOk: false, Msg: []byte("invalid lifetime")}))
return
}
if blackPeer.PeerAddr != "" { //把IP或者IP:PORT加入 黑名单
//check peerAddr
err := P2pComm.CheckNetAddr(blackPeer.GetPeerAddr())
if err != nil {
msg.Reply(m.network.client.NewMessage("rpc", pb.EventReply, &pb.Reply{IsOk: false, Msg: []byte(err.Error())}))
return
}
m.network.node.nodeInfo.blacklist.Add(blackPeer.PeerAddr, int64(lifetime.Seconds()))
peerName, ok := m.network.node.peerStore.Load(blackPeer.PeerAddr)
if ok {
m.network.node.nodeInfo.blacklist.addPeerStore(blackPeer.PeerAddr, peerName.(string))
m.network.node.nodeInfo.blacklist.addPeerStore(peerName.(string), blackPeer.PeerAddr)
m.network.node.remove(peerName.(string)) //close peer
}
} else if blackPeer.PeerName != "" {
peer := m.network.node.GetRegisterPeer(blackPeer.PeerName)
if peer != nil {
m.network.node.nodeInfo.blacklist.Add(peer.Addr(), int64(lifetime.Seconds()))
m.network.node.nodeInfo.blacklist.addPeerStore(peer.Addr(), blackPeer.PeerName)
m.network.node.nodeInfo.blacklist.addPeerStore(blackPeer.PeerName, peer.Addr())
m.network.node.remove(blackPeer.PeerName) //close peer
} else {
msg.Reply(m.network.client.NewMessage("rpc", pb.EventReply, &pb.Reply{IsOk: false, Msg: []byte("no this peer name")}))
return
}
}
msg.Reply(m.network.client.NewMessage("rpc", pb.EventReply, &pb.Reply{IsOk: true, Msg: []byte("success")}))
}
func (m *Cli) DelPeerFromBlacklist(msg *queue.Message, taskindex int64) {
defer func() {
<-m.network.otherFactory
log.Debug("GetNetInfo", "task complete:", taskindex)
}()
blackPeer := msg.GetData().(*pb.BlackPeer)
if blackPeer.PeerAddr != "" {
//check peerAddr
err := P2pComm.CheckNetAddr(blackPeer.GetPeerAddr())
if err != nil {
msg.Reply(m.network.client.NewMessage("rpc", pb.EventReply, &pb.Reply{IsOk: false, Msg: []byte(err.Error())}))
return
}
m.network.node.nodeInfo.blacklist.Delete(blackPeer.PeerAddr)
m.network.node.nodeInfo.blacklist.deletePeerStore(blackPeer.PeerAddr)
} else if blackPeer.PeerName != "" {
//通过pid 获取remoteAddr
remoteAddr, ok := m.network.node.nodeInfo.blacklist.getpeerStore(blackPeer.PeerName)
if ok {
m.network.node.nodeInfo.blacklist.Delete(remoteAddr)
m.network.node.nodeInfo.blacklist.deletePeerStore(remoteAddr)
}
m.network.node.nodeInfo.blacklist.deletePeerStore(blackPeer.PeerName)
}
msg.Reply(m.network.client.NewMessage("rpc", pb.EventReply, &pb.Reply{IsOk: true, Msg: []byte("success")}))
}
func (m *Cli) ShowBlacklist(msg *queue.Message, taskindex int64) {
defer func() {
<-m.network.otherFactory
log.Debug("GetNetInfo", "task complete:", taskindex)
}()
peers := m.network.node.nodeInfo.blacklist.GetBadPeers()
var list pb.Blacklist
now := time.Now().Unix()
for remoteAddr, span := range peers {
lifetime := span - now
if lifetime < 0 {
lifetime = 0
}
info := &pb.BlackInfo{RemoteAddr: remoteAddr, Lifetime: lifetime}
peerName, ok := m.network.node.nodeInfo.blacklist.getpeerStore(remoteAddr)
if ok {
info.PeerName = peerName
}
list.Blackinfo = append(list.Blackinfo, info)
}
msg.Reply(m.network.client.NewMessage("rpc", pb.EventShowBlacklist, &list))
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment