diff --git a/beacon/goclient/ekm/signer_storage.go b/beacon/goclient/ekm/signer_storage.go index 72fcd554d3..41d531897b 100644 --- a/beacon/goclient/ekm/signer_storage.go +++ b/beacon/goclient/ekm/signer_storage.go @@ -96,22 +96,18 @@ func (s *signerStorage) ListAccounts() ([]core.ValidatorAccount, error) { s.lock.RLock() defer s.lock.RUnlock() - objs, err := s.db.GetAllByCollection(s.objPrefix(accountsPrefix)) - if err != nil { - return nil, errors.Wrap(err, "Failed to get val share") - } - ret := make([]core.ValidatorAccount, 0) - for _, obj := range objs { + + err := s.db.GetAll(s.objPrefix(accountsPrefix), func(i int, obj basedb.Obj) error { acc, err := s.decodeAccount(obj.Value) if err != nil { - return nil, errors.Wrap(err, "failed to list accounts") + return errors.Wrap(err, "failed to list accounts") } - ret = append(ret, acc) - } + return nil + }) - return ret, nil + return ret, err } // SaveAccount saves the given account diff --git a/config/config.yaml b/config/config.yaml index ed0d9ceffa..2469c5a02a 100644 --- a/config/config.yaml +++ b/config/config.yaml @@ -18,7 +18,7 @@ p2p: # TcpPort: # UdpPort: # mdns for local network setup -# DiscoveryType: mdns + DiscoveryType: mdns ssv: GenesisEpoch: diff --git a/eth1/goeth/goETH.go b/eth1/goeth/goETH.go index ff211a1936..3a676f64c6 100644 --- a/eth1/goeth/goETH.go +++ b/eth1/goeth/goETH.go @@ -256,8 +256,7 @@ func (ec *eth1Client) listenToSubscription(logs chan types.Log, sub ethereum.Sub // syncSmartContractsEvents sync events history of the given contract func (ec *eth1Client) syncSmartContractsEvents(fromBlock *big.Int) error { - ec.logger.Debug("syncing smart contract events", - zap.Uint64("fromBlock", fromBlock.Uint64())) + ec.logger.Debug("syncing smart contract events", zap.Uint64("fromBlock", fromBlock.Uint64())) contractAbi, err := abi.JSON(strings.NewReader(ec.contractABI)) if err != nil { diff --git a/exporter/api/broadcaster_test.go b/exporter/api/broadcaster_test.go index 9e5cb8c757..231a8aebaa 100644 --- a/exporter/api/broadcaster_test.go +++ b/exporter/api/broadcaster_test.go @@ -1,6 +1,7 @@ package api import ( + "context" "fmt" "github.com/prysmaticlabs/prysm/async/event" "github.com/stretchr/testify/require" @@ -10,6 +11,15 @@ import ( "time" ) +func TestConn_Send_FullQueue(t *testing.T) { + logger := zaptest.NewLogger(t) + c := newConn(context.Background(), logger, nil, "test", 0) + + for i := 0; i < chanSize+2; i++ { + c.Send([]byte(fmt.Sprintf("test-%d", i))) + } +} + func TestBroadcaster(t *testing.T) { logger := zaptest.NewLogger(t) b := newBroadcaster(logger) diff --git a/exporter/api/conn.go b/exporter/api/conn.go index b7dbbd5ef4..76be3fb8c1 100644 --- a/exporter/api/conn.go +++ b/exporter/api/conn.go @@ -92,6 +92,10 @@ func (c *conn) ReadNext() []byte { // Send sends the given message func (c *conn) Send(msg []byte) { + if len(c.send) >= chanSize { + // don't send on full channel + return + } c.send <- msg } @@ -149,11 +153,23 @@ func (c *conn) ReadLoop() { _ = c.ws.Close() }() c.ws.SetReadLimit(maxMessageSize) - _ = c.ws.SetReadDeadline(time.Now().Add(pongWait)) + err := c.ws.SetReadDeadline(time.Now().Add(pongWait)) + if err != nil { + c.logger.Error("read loop stopped by set read deadline", zap.Error(err)) + return + } c.ws.SetPongHandler(func(string) error { // extend read limit on every pong message // this will keep the connection alive from our POV - _ = c.ws.SetReadDeadline(time.Now().Add(pongWait)) + c.logger.Debug("pong received") + err := c.ws.SetReadDeadline(time.Now().Add(pongWait)) + if err != nil { + c.logger.Error("pong handler - readDeadline", zap.Error(err)) + } + return err + }) + c.ws.SetPingHandler(func(string) error { + c.logger.Debug("ping received") return nil }) for { diff --git a/exporter/ibft/decided_reader.go b/exporter/ibft/decided_reader.go index 7fe3f1a127..0a9f7e8fe6 100644 --- a/exporter/ibft/decided_reader.go +++ b/exporter/ibft/decided_reader.go @@ -2,6 +2,7 @@ package ibft import ( "context" + "fmt" "github.com/bloxapp/ssv/beacon" "github.com/bloxapp/ssv/exporter/api" "github.com/bloxapp/ssv/ibft" @@ -104,9 +105,6 @@ func (r *decidedReader) Start() error { if err := r.waitForMinPeers(ctx, r.validatorShare.PublicKey, 1); err != nil { return errors.Wrap(err, "could not wait for min peers") } - cn, done := r.network.ReceivedDecidedChan() - defer done() - r.listenToNetwork(cn) return nil } @@ -122,27 +120,35 @@ func (r *decidedReader) sync() error { return err } -func (r *decidedReader) listenToNetwork(cn <-chan *proto.SignedMessage) { - r.logger.Debug("listening to decided messages") - for msg := range cn { - if err := validateMsg(msg, string(r.identifier)); err != nil { - continue - } - logger := r.logger.With(messageFields(msg)...) - if err := validateDecidedMsg(msg, r.validatorShare); err != nil { - logger.Debug("received invalid decided message") - continue - } - go func(msg *proto.SignedMessage) { - defer logger.Debug("done with decided msg") - if saved, err := r.handleNewDecidedMessage(msg); err != nil { - if !saved { - logger.Error("could not handle decided message", zap.Error(err)) - } - logger.Error("could not check highest decided", zap.Error(err)) - } - }(msg) +// GetMsgResolver returns proper handler for msg based on msg type +func (r *decidedReader) GetMsgResolver(networkMsg network.NetworkMsg) func(msg *proto.SignedMessage) { + switch networkMsg { + case network.NetworkMsg_DecidedType: + return r.onMessage } + return func(msg *proto.SignedMessage) { + r.logger.Warn(fmt.Sprintf("handler type (%s) is not supported", networkMsg)) + } +} + +func (r *decidedReader) onMessage(msg *proto.SignedMessage) { + if err := validateMsg(msg, r.identifier); err != nil { + return + } + logger := r.logger.With(messageFields(msg)...) + if err := validateDecidedMsg(msg, r.validatorShare); err != nil { + logger.Debug("received invalid decided message") + return + } + go func(msg *proto.SignedMessage) { + defer logger.Debug("done with decided msg") + if saved, err := r.handleNewDecidedMessage(msg); err != nil { + if !saved { + logger.Error("could not handle decided message", zap.Error(err)) + } + logger.Error("could not check highest decided", zap.Error(err)) + } + }(msg) } // handleNewDecidedMessage saves an incoming (valid) decided message @@ -236,10 +242,10 @@ func validateDecidedMsg(msg *proto.SignedMessage, share *storage.Share) error { return p.Run(msg) } -func validateMsg(msg *proto.SignedMessage, identifier string) error { +func validateMsg(msg *proto.SignedMessage, identifier []byte) error { p := pipeline.Combine( auth.BasicMsgValidation(), - auth.ValidateLambdas([]byte(identifier)), + auth.ValidateLambdas(identifier), ) return p.Run(msg) } diff --git a/exporter/ibft/incoming_msgs.go b/exporter/ibft/incoming_msgs.go index 70f8a7d186..15341ef866 100644 --- a/exporter/ibft/incoming_msgs.go +++ b/exporter/ibft/incoming_msgs.go @@ -2,6 +2,7 @@ package ibft import ( "context" + "fmt" "github.com/bloxapp/ssv/beacon" "github.com/bloxapp/ssv/ibft/proto" "github.com/bloxapp/ssv/network" @@ -50,40 +51,44 @@ func (i *incomingMsgsReader) Start() error { if err := i.waitForMinPeers(ctx, i.publicKey, 1); err != nil { return errors.Wrap(err, "could not wait for min peers") } - cn, done := i.network.ReceivedMsgChan() - defer done() - i.listenToNetwork(cn) return nil } -func (i *incomingMsgsReader) listenToNetwork(cn <-chan *proto.SignedMessage) { +func (i *incomingMsgsReader) GetMsgResolver(networkMsg network.NetworkMsg) func(msg *proto.SignedMessage) { + switch networkMsg { + case network.NetworkMsg_IBFTType: + return i.onMessage + } + return func(msg *proto.SignedMessage) { + i.logger.Warn(fmt.Sprintf("handler type (%s) is not supported", networkMsg)) + } +} + +func (i *incomingMsgsReader) onMessage(msg *proto.SignedMessage) { identifier := format.IdentifierFormat(i.publicKey.Serialize(), beacon.RoleTypeAttester.String()) - i.logger.Debug("listening to network messages") - for msg := range cn { - if msg == nil || msg.Message == nil { - i.logger.Info("received invalid msg") - continue - } - // filtering irrelevant messages - // TODO: handle other types of roles - if identifier != string(msg.Message.Lambda) { - continue - } + if msg == nil || msg.Message == nil { + i.logger.Info("received invalid msg") + return + } + // filtering irrelevant messages + // TODO: handle other types of roles + if identifier != string(msg.Message.Lambda) { + return + } - fields := messageFields(msg) + fields := messageFields(msg) - switch msg.Message.Type { - case proto.RoundState_PrePrepare: - i.logger.Info("pre-prepare msg", fields...) - case proto.RoundState_Prepare: - i.logger.Info("prepare msg", fields...) - case proto.RoundState_Commit: - i.logger.Info("commit msg", fields...) - case proto.RoundState_ChangeRound: - i.logger.Info("change round msg", fields...) - default: - i.logger.Warn("undefined message type", zap.Any("msg", msg)) - } + switch msg.Message.Type { + case proto.RoundState_PrePrepare: + i.logger.Info("pre-prepare msg", fields...) + case proto.RoundState_Prepare: + i.logger.Info("prepare msg", fields...) + case proto.RoundState_Commit: + i.logger.Info("commit msg", fields...) + case proto.RoundState_ChangeRound: + i.logger.Info("change round msg", fields...) + default: + i.logger.Warn("undefined message type", zap.Any("msg", msg)) } } diff --git a/exporter/node.go b/exporter/node.go index a1ae2613b0..ba9d341011 100644 --- a/exporter/node.go +++ b/exporter/node.go @@ -9,6 +9,7 @@ import ( "github.com/bloxapp/ssv/exporter/api" "github.com/bloxapp/ssv/exporter/ibft" "github.com/bloxapp/ssv/exporter/storage" + ibftController "github.com/bloxapp/ssv/ibft/controller" "github.com/bloxapp/ssv/ibft/proto" "github.com/bloxapp/ssv/monitoring/metrics" "github.com/bloxapp/ssv/network" @@ -86,6 +87,8 @@ type exporter struct { decidedReadersQueue tasks.Queue networkReadersQueue tasks.Queue metaDataReadersQueue tasks.Queue + + networkMsgMediator ibftController.Mediator } // New creates a new Exporter instance @@ -109,10 +112,13 @@ func New(opts Options) Exporter { decidedReadersQueue: tasks.NewExecutionQueue(readerQueuesInterval), networkReadersQueue: tasks.NewExecutionQueue(readerQueuesInterval), metaDataReadersQueue: tasks.NewExecutionQueue(metaDataReaderQueuesInterval), - ws: opts.WS, - readersMut: sync.RWMutex{}, - decidedReaders: map[string]ibft.Reader{}, - netReaders: map[string]ibft.Reader{}, + + networkMsgMediator: ibftController.NewMediator(opts.Logger), + + ws: opts.WS, + readersMut: sync.RWMutex{}, + decidedReaders: map[string]ibft.Reader{}, + netReaders: map[string]ibft.Reader{}, commitReader: ibft.NewCommitReader(ibft.CommitReaderOptions{ Logger: opts.Logger, Network: opts.Network, @@ -174,6 +180,8 @@ func (exp *exporter) Start() error { go exp.startMainTopic() + exp.startNetworkMediators() + go exp.reportOperators() return exp.ws.Start(fmt.Sprintf(":%d", exp.wsAPIPort)) @@ -367,3 +375,25 @@ func (exp *exporter) reportOperators() { reportOperatorIndex(exp.logger, &operators[i]) } } + +func (exp *exporter) startNetworkMediators() { + msgChan, msgDone := exp.network.ReceivedMsgChan() + decidedChan, decidedDone := exp.network.ReceivedDecidedChan() + + exp.networkMsgMediator.AddListener(network.NetworkMsg_IBFTType, msgChan, msgDone, func(publicKey string) (ibftController.MediatorReader, bool) { + exp.readersMut.Lock() + defer exp.readersMut.Unlock() + if reader, ok := exp.netReaders[publicKey]; ok { + return reader.(ibftController.MediatorReader), ok + } + return nil, false + }) + exp.networkMsgMediator.AddListener(network.NetworkMsg_DecidedType, decidedChan, decidedDone, func(publicKey string) (ibftController.MediatorReader, bool) { + exp.readersMut.Lock() + defer exp.readersMut.Unlock() + if reader, ok := exp.decidedReaders[publicKey]; ok { + return reader.(ibftController.MediatorReader), ok + } + return nil, false + }) +} diff --git a/exporter/storage/operators.go b/exporter/storage/operators.go index 150b6cd039..c0715f500d 100644 --- a/exporter/storage/operators.go +++ b/exporter/storage/operators.go @@ -3,6 +3,7 @@ package storage import ( "bytes" "encoding/json" + "github.com/bloxapp/ssv/storage/basedb" "github.com/ethereum/go-ethereum/common" "github.com/pkg/errors" "go.uber.org/zap" @@ -33,19 +34,19 @@ func (es *exporterStorage) ListOperators(from int64, to int64) ([]OperatorInform es.operatorsLock.RLock() defer es.operatorsLock.RUnlock() - objs, err := es.db.GetAllByCollection(append(storagePrefix(), operatorsPrefix...)) - if err != nil { - return nil, err - } - to = normalTo(to) var operators []OperatorInformation - for _, obj := range objs { + to = normalTo(to) + err := es.db.GetAll(append(storagePrefix(), operatorsPrefix...), func(i int, obj basedb.Obj) error { var oi OperatorInformation - err = json.Unmarshal(obj.Value, &oi) + if err := json.Unmarshal(obj.Value, &oi); err != nil { + return err + } if oi.Index >= from && oi.Index <= to { operators = append(operators, oi) } - } + return nil + }) + return operators, err } diff --git a/exporter/storage/validators.go b/exporter/storage/validators.go index 412d1c4c30..8accfbb752 100644 --- a/exporter/storage/validators.go +++ b/exporter/storage/validators.go @@ -3,6 +3,7 @@ package storage import ( "bytes" "encoding/json" + "github.com/bloxapp/ssv/storage/basedb" "github.com/pkg/errors" "go.uber.org/zap" ) @@ -37,19 +38,18 @@ func (es *exporterStorage) ListValidators(from int64, to int64) ([]ValidatorInfo es.validatorsLock.RLock() defer es.validatorsLock.RUnlock() - objs, err := es.db.GetAllByCollection(append(storagePrefix(), validatorsPrefix()...)) - if err != nil { - return nil, err - } to = normalTo(to) var validators []ValidatorInformation - for _, obj := range objs { + err := es.db.GetAll(append(storagePrefix(), validatorsPrefix()...), func(i int, obj basedb.Obj) error { var vi ValidatorInformation - err = json.Unmarshal(obj.Value, &vi) + if err := json.Unmarshal(obj.Value, &vi); err != nil { + return err + } if vi.Index >= from && vi.Index <= to { validators = append(validators, vi) } - } + return nil + }) return validators, err } diff --git a/go.mod b/go.mod index fa8c2933e6..b4a1f81d6e 100644 --- a/go.mod +++ b/go.mod @@ -10,18 +10,18 @@ require ( github.com/ferranbt/fastssz v0.0.0-20210905181407-59cf6761a7d5 github.com/gogo/protobuf v1.3.2 github.com/golang/protobuf v1.5.2 - github.com/google/uuid v1.2.0 + github.com/google/uuid v1.3.0 github.com/gorilla/websocket v1.4.2 github.com/grpc-ecosystem/go-grpc-middleware v1.2.2 github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 github.com/herumi/bls-eth-go-binary v0.0.0-20210917013441-d37c07cfda4e github.com/ilyakaznacheev/cleanenv v1.2.5 - github.com/libp2p/go-libp2p v0.14.4 - github.com/libp2p/go-libp2p-core v0.8.6 - github.com/libp2p/go-libp2p-noise v0.2.0 - github.com/libp2p/go-libp2p-pubsub v0.5.0 + github.com/libp2p/go-libp2p v0.15.1 + github.com/libp2p/go-libp2p-core v0.9.0 + github.com/libp2p/go-libp2p-noise v0.2.2 + github.com/libp2p/go-libp2p-pubsub v0.5.6 github.com/libp2p/go-tcp-transport v0.2.8 - github.com/multiformats/go-multiaddr v0.3.3 + github.com/multiformats/go-multiaddr v0.4.0 github.com/patrickmn/go-cache v2.1.0+incompatible github.com/pkg/errors v0.9.1 github.com/prometheus/client_golang v1.11.0 @@ -35,9 +35,9 @@ require ( github.com/stretchr/testify v1.7.0 github.com/wealdtech/go-eth2-util v1.6.3 go.opencensus.io v0.23.0 - go.uber.org/zap v1.18.1 + go.uber.org/zap v1.19.0 golang.org/x/sync v0.0.0-20210220032951-036812b2e83c - google.golang.org/grpc v1.37.0 + google.golang.org/grpc v1.40.0 olympos.io/encoding/edn v0.0.0-20201019073823-d3554ca0b0a3 // indirect ) diff --git a/go.sum b/go.sum index d9f470791c..c4c2d1aa37 100644 --- a/go.sum +++ b/go.sum @@ -48,6 +48,7 @@ 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/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/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= github.com/Azure/azure-pipeline-go v0.2.1/go.mod h1:UGSo8XybXnIGZ3epmeBw7Jdz+HiUVpqIlpz/HKHylF4= github.com/Azure/azure-pipeline-go v0.2.2/go.mod h1:4rQ/NZncSvGqNkkOsNpOU1tgoNuIlp9AfUH5G1tvCHc= github.com/Azure/azure-storage-blob-go v0.7.0/go.mod h1:f9YQKtsG1nMisotuTPpO0tjNuEjKRYAcJU8/ydDI++4= @@ -182,6 +183,7 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk github.com/cloudflare/cloudflare-go v0.14.0/go.mod h1:EnwdgGMaFOruiPZRFSgn+TsQ3hQ7C/YWzIGLeu5c304= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/consensys/bavard v0.1.8-0.20210406032232-f3452dc9b572/go.mod h1:Bpd0/3mZuaj6Sj+PqrmIquiOKy397AKGThQPaGzNXAQ= @@ -229,6 +231,8 @@ github.com/dgraph-io/badger v1.6.0-rc1/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhY github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= github.com/dgraph-io/badger v1.6.1 h1:w9pSFNSdq/JPM1N12Fz/F/bzo993Is1W+Q7HjPzi7yg= github.com/dgraph-io/badger v1.6.1/go.mod h1:FRmFw3uxvcpa8zG3Rxs0th+hCLIuaQg8HlNV5bjgnuU= +github.com/dgraph-io/badger v1.6.2 h1:mNw0qs90GVgGGWylh0umH5iag1j6n/PeJtNvL6KY/x8= +github.com/dgraph-io/badger v1.6.2/go.mod h1:JW2yswe3V058sS0kZ2h/AXeDSqFjxnZcRrVH//y2UQE= github.com/dgraph-io/badger/v3 v3.2103.2 h1:dpyM5eCJAtQCBcMCZcT4UBZchuTJgCywerHHgmxfxM8= github.com/dgraph-io/badger/v3 v3.2103.2/go.mod h1:RHo4/GmYcKKh5Lxu63wLEMHJ70Pac2JqZRYGhlyAo2M= github.com/dgraph-io/ristretto v0.0.2/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= @@ -266,6 +270,7 @@ github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.m github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/ethereum/go-ethereum v1.10.10 h1:Ft2GcLQrr2M89l49g9NoqgNtJZ9AahzMb7N6VXKZy5U= github.com/ethereum/go-ethereum v1.10.10/go.mod h1:W3yfrFyL9C1pHcwY5hmRHVDaorTiQxhYBkKyu5mEDHw= @@ -349,6 +354,8 @@ github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG github.com/go-stack/stack v1.6.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 h1:p104kn46Q8WdvHunIJ9dAyjPVtrBPhSr3KT2yUst43I= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/go-yaml/yaml v2.1.0+incompatible h1:RYi2hDdss1u4YE7GwixGzWwVo47T8UQwnTLB6vQiq+o= github.com/go-yaml/yaml v2.1.0+incompatible/go.mod h1:w2MrLa16VYP0jy6N7M5kHaCkaLENm+P+Tv+MfurjSw0= github.com/goccy/go-yaml v1.8.9 h1:4AEXg2qx+/w29jXnXpMY6mTckmYu1TMoHteKuMf0HFg= @@ -456,6 +463,8 @@ github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ github.com/google/uuid v1.1.5/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.2.0 h1:qJYtXnJRWmpe7m/3XlyhrsLrEURqHRM2kxzoxXqyUDs= github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= github.com/googleapis/gax-go/v2 v2.0.3/go.mod h1:LLvjysVCY1JZeum8Z6l8qUty8fiNwE08qbEPm1M08qg= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= @@ -487,6 +496,8 @@ github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.13.0 h1:sBDQoHXrOlfPobnKw69FIKa1wg9qsLLvvQ/Y19WtFgI= github.com/grpc-ecosystem/grpc-gateway v1.13.0/go.mod h1:8XEsbTttt/W+VvjtQhLACqCisSPWTxCZ7sBRjU6iH9c= +github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/grpc-ecosystem/grpc-gateway/v2 v2.0.1 h1:X2vfSnm1WC8HEo0MBHZg2TcuDUHJj6kd1TmEAQncnSA= github.com/grpc-ecosystem/grpc-gateway/v2 v2.0.1/go.mod h1:oVMjMN64nzEcepv1kdZKgx1qNYt4Ro0Gqefiq2JWdis= github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfmKFJ6tItnhQ67kU= @@ -569,12 +580,14 @@ github.com/ipfs/go-datastore v0.4.0/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13X github.com/ipfs/go-datastore v0.4.1/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= github.com/ipfs/go-datastore v0.4.4/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= github.com/ipfs/go-datastore v0.4.5/go.mod h1:eXTcaaiN6uOlVCLS9GjJUJtlvJfM3xk23w3fyfrmmJs= +github.com/ipfs/go-datastore v0.4.6/go.mod h1:XSipLSc64rFKSFRFGo1ecQl+WhYce3K7frtpHkyPFUc= github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk= github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps= github.com/ipfs/go-ds-badger v0.0.2/go.mod h1:Y3QpeSFWQf6MopLTiZD+VT6IC1yZqaGmjvRcKeSGij8= github.com/ipfs/go-ds-badger v0.0.5/go.mod h1:g5AuuCGmr7efyzQhLL8MzwqcauPojGPUaHzfGTzuE3s= github.com/ipfs/go-ds-badger v0.2.1/go.mod h1:Tx7l3aTph3FMFrRS838dcSJh+jjA7cX9DrGVwx/NOwE= github.com/ipfs/go-ds-badger v0.2.3/go.mod h1:pEYw0rgg3FIrywKKnL+Snr+w/LjJZVMTBRn4FS6UHUk= +github.com/ipfs/go-ds-badger v0.2.7/go.mod h1:02rnztVKA4aZwDuaRPTf8mpqcKmXP7mLl6JPxd14JHA= github.com/ipfs/go-ds-leveldb v0.0.1/go.mod h1:feO8V3kubwsEF22n0YRQCffeb79OOYIykR4L04tMOYc= github.com/ipfs/go-ds-leveldb v0.4.1/go.mod h1:jpbku/YqBSsBc1qgME8BkWS4AxzF2cEu1Ii2r79Hh9s= github.com/ipfs/go-ds-leveldb v0.4.2/go.mod h1:jpbku/YqBSsBc1qgME8BkWS4AxzF2cEu1Ii2r79Hh9s= @@ -654,6 +667,7 @@ github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6 github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.9.8/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.10.1/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.12.3 h1:G5AfA94pHPysR56qqrkO2pxEexdDzrpFJ6yt/VqWxVU= github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= @@ -663,6 +677,8 @@ github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa02 github.com/klauspost/cpuid/v2 v2.0.6/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.0.8 h1:bhR2mgIlno/Sfk4oUbH4sPlc83z1yGrN9bvqiq3C33I= github.com/klauspost/cpuid/v2 v2.0.8/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.0.9 h1:lgaqFMSdTdQYdZ04uHyN2d/eKdOMyi2YLSvlQIBFYa4= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/crc32 v0.0.0-20161016154125-cb6bfca970f6/go.mod h1:+ZoRqAPRLkC4NPOvfYeR5KNOrY6TD+/sAC3HXPZgDYg= github.com/klauspost/pgzip v1.0.2-0.20170402124221-0bf5dcad4ada/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/klauspost/reedsolomon v1.9.3/go.mod h1:CwCi+NUr9pqSVktrkN+Ondf06rkhYZ/pcNv7fu+8Un4= @@ -693,6 +709,8 @@ github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/libp2p/go-addr-util v0.0.1/go.mod h1:4ac6O7n9rIAKB1dnd+s8IbbMXkt+oBpzX4/+RACcnlQ= github.com/libp2p/go-addr-util v0.0.2 h1:7cWK5cdA5x72jX0g8iLrQWm5TRJZ6CzGdPEhWj7plWU= github.com/libp2p/go-addr-util v0.0.2/go.mod h1:Ecd6Fb3yIuLzq4bD7VcywcVSBtefcAwnUISBM3WG15E= +github.com/libp2p/go-addr-util v0.1.0 h1:acKsntI33w2bTU7tC9a0SaPimJGfSI0bFKC18ChxeVI= +github.com/libp2p/go-addr-util v0.1.0/go.mod h1:6I3ZYuFr2O/9D+SoyM0zEw0EF3YkldtTX406BpdQMqw= github.com/libp2p/go-buffer-pool v0.0.1/go.mod h1:xtyIz9PMobb13WaxR6Zo1Pd1zXJKYg0a8KiIvDp3TzQ= github.com/libp2p/go-buffer-pool v0.0.2 h1:QNK2iAFa8gjAe1SPz6mHSMuCcjs+X1wlHzeOSqcmlfs= github.com/libp2p/go-buffer-pool v0.0.2/go.mod h1:MvaB6xw5vOrDl8rYZGLFdKAuk/hRoRZd1Vi32+RXyFM= @@ -712,6 +730,8 @@ github.com/libp2p/go-libp2p v0.7.4/go.mod h1:oXsBlTLF1q7pxr+9w6lqzS1ILpyHsaBPniV github.com/libp2p/go-libp2p v0.8.1/go.mod h1:QRNH9pwdbEBpx5DTJYg+qxcVaDMAz3Ee/qDKwXujH5o= github.com/libp2p/go-libp2p v0.14.4 h1:QCJE+jGyqxWdrSPuS4jByXCzosgaIg4SJTLCRplJ53w= github.com/libp2p/go-libp2p v0.14.4/go.mod h1:EIRU0Of4J5S8rkockZM7eJp2S0UrCyi55m2kJVru3rM= +github.com/libp2p/go-libp2p v0.15.1 h1:wSC//fziln3aMTwgF2vOl0v+hTSFfsdr686Fl0uD3ug= +github.com/libp2p/go-libp2p v0.15.1/go.mod h1:93vekOmNoLAcHXUYYEBot0Df/Z6tm46xu9NeCaiKdnM= github.com/libp2p/go-libp2p-autonat v0.1.1/go.mod h1:OXqkeGOY2xJVWKAGV2inNF5aKN/djNA3fdpCWloIudE= github.com/libp2p/go-libp2p-autonat v0.2.0/go.mod h1:DX+9teU4pEEoZUqR1PiMlqliONQdNbfzE1C718tcViI= github.com/libp2p/go-libp2p-autonat v0.2.1/go.mod h1:MWtAhV5Ko1l6QBsHQNSuM6b1sRkXrpk0/LqCr+vCVxI= @@ -751,6 +771,8 @@ github.com/libp2p/go-libp2p-core v0.8.3/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJB github.com/libp2p/go-libp2p-core v0.8.5/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= github.com/libp2p/go-libp2p-core v0.8.6 h1:3S8g006qG6Tjpj1JdRK2S+TWc2DJQKX/RG9fdLeiLSU= github.com/libp2p/go-libp2p-core v0.8.6/go.mod h1:dgHr0l0hIKfWpGpqAMbpo19pen9wJfdCGv51mTmdpmM= +github.com/libp2p/go-libp2p-core v0.9.0 h1:t97Mv0LIBZlP2FXVRNKKVzHJCIjbIWGxYptGId4+htU= +github.com/libp2p/go-libp2p-core v0.9.0/go.mod h1:ESsbz31oC3C1AvMJoGx26RTuCkNhmkSRCqZ0kQtJ2/8= github.com/libp2p/go-libp2p-crypto v0.0.1/go.mod h1:yJkNyDmO341d5wwXxDUGO0LykUVT72ImHNUqh5D/dBE= github.com/libp2p/go-libp2p-crypto v0.1.0 h1:k9MFy+o2zGDNGsaoZl0MA3iZ75qXxr9OOoAZF+sD5OQ= github.com/libp2p/go-libp2p-crypto v0.1.0/go.mod h1:sPUokVISZiy+nNuTTH/TY+leRSxnFj/2GLjtOTW90hI= @@ -774,6 +796,8 @@ github.com/libp2p/go-libp2p-netutil v0.1.0 h1:zscYDNVEcGxyUpMd0JReUZTrpMfia8PmLK github.com/libp2p/go-libp2p-netutil v0.1.0/go.mod h1:3Qv/aDqtMLTUyQeundkKsA+YCThNdbQD54k3TqjpbFU= github.com/libp2p/go-libp2p-noise v0.2.0 h1:wmk5nhB9a2w2RxMOyvsoKjizgJOEaJdfAakr0jN8gds= github.com/libp2p/go-libp2p-noise v0.2.0/go.mod h1:IEbYhBBzGyvdLBoxxULL/SGbJARhUeqlO8lVSREYu2Q= +github.com/libp2p/go-libp2p-noise v0.2.2 h1:MRt5XGfYziDXIUy2udtMWfPmzZqUDYoC1FZoKnqPzwk= +github.com/libp2p/go-libp2p-noise v0.2.2/go.mod h1:IEbYhBBzGyvdLBoxxULL/SGbJARhUeqlO8lVSREYu2Q= github.com/libp2p/go-libp2p-peer v0.0.1/go.mod h1:nXQvOBbwVqoP+T5Y5nCjeH4sP9IX/J0AMzcDUVruVoo= github.com/libp2p/go-libp2p-peer v0.2.0 h1:EQ8kMjaCUwt/Y5uLgjT8iY2qg0mGUT0N1zUjer50DsY= github.com/libp2p/go-libp2p-peer v0.2.0/go.mod h1:RCffaCvUyW2CJmG2gAWVqwePwW7JMgxjsHm7+J5kjWY= @@ -785,12 +809,18 @@ github.com/libp2p/go-libp2p-peerstore v0.2.2/go.mod h1:NQxhNjWxf1d4w6PihR8btWIRj github.com/libp2p/go-libp2p-peerstore v0.2.6/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuDHItOpf2W8RxAi50P2s= github.com/libp2p/go-libp2p-peerstore v0.2.7 h1:83JoLxyR9OYTnNfB5vvFqvMUv/xDNa6NoPHnENhBsGw= github.com/libp2p/go-libp2p-peerstore v0.2.7/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuDHItOpf2W8RxAi50P2s= +github.com/libp2p/go-libp2p-peerstore v0.2.8 h1:nJghUlUkFVvyk7ccsM67oFA6kqUkwyCM1G4WPVMCWYA= +github.com/libp2p/go-libp2p-peerstore v0.2.8/go.mod h1:gGiPlXdz7mIHd2vfAsHzBNAMqSDkt2UBFwgcITgw1lA= github.com/libp2p/go-libp2p-pnet v0.2.0 h1:J6htxttBipJujEjz1y0a5+eYoiPcFHhSYHH6na5f0/k= github.com/libp2p/go-libp2p-pnet v0.2.0/go.mod h1:Qqvq6JH/oMZGwqs3N1Fqhv8NVhrdYcO0BW4wssv21LA= github.com/libp2p/go-libp2p-pubsub v0.5.0 h1:OzcIuCWyJpOrWH0PTOfvxTzqFur4tiXpY5jXC8OxjyE= github.com/libp2p/go-libp2p-pubsub v0.5.0/go.mod h1:MKnrsQkFgPcrQs1KVmOXy6Uz2RDQ1xO7dQo/P0Ba+ig= +github.com/libp2p/go-libp2p-pubsub v0.5.6 h1:YkO3gG9J1mQBEMRrM5obiG3JD0L8RcrzIpoeLeiYqH8= +github.com/libp2p/go-libp2p-pubsub v0.5.6/go.mod h1:gVOzwebXVdSMDQBTfH8ACO5EJ4SQrvsHqCmYsCZpD0E= github.com/libp2p/go-libp2p-quic-transport v0.10.0 h1:koDCbWD9CCHwcHZL3/WEvP2A+e/o5/W5L3QS/2SPMA0= github.com/libp2p/go-libp2p-quic-transport v0.10.0/go.mod h1:RfJbZ8IqXIhxBRm5hqUEJqjiiY8xmEuq3HUDS993MkA= +github.com/libp2p/go-libp2p-quic-transport v0.11.2 h1:p1YQDZRHH4Cv2LPtHubqlQ9ggz4CKng/REZuXZbZMhM= +github.com/libp2p/go-libp2p-quic-transport v0.11.2/go.mod h1:wlanzKtIh6pHrq+0U3p3DY9PJfGqxMgPaGKaK5LifwQ= github.com/libp2p/go-libp2p-secio v0.1.0/go.mod h1:tMJo2w7h3+wN4pgU2LSYeiKPrfqBgkOsdiKK77hE7c8= github.com/libp2p/go-libp2p-secio v0.2.0/go.mod h1:2JdZepB8J5V9mBp79BmwsaPQhRPNN2NrnB2lKQcdy6g= github.com/libp2p/go-libp2p-secio v0.2.1/go.mod h1:cWtZpILJqkqrSkiYcDBh5lA3wbT2Q+hz3rJQq3iftD8= @@ -803,6 +833,8 @@ github.com/libp2p/go-libp2p-swarm v0.3.0/go.mod h1:hdv95GWCTmzkgeJpP+GK/9D9puJeg github.com/libp2p/go-libp2p-swarm v0.4.3/go.mod h1:mmxP1pGBSc1Arw4F5DIjcpjFAmsRzA1KADuMtMuCT4g= github.com/libp2p/go-libp2p-swarm v0.5.0 h1:HIK0z3Eqoo8ugmN8YqWAhD2RORgR+3iNXYG4U2PFd1E= github.com/libp2p/go-libp2p-swarm v0.5.0/go.mod h1:sU9i6BoHE0Ve5SKz3y9WfKrh8dUat6JknzUehFx8xW4= +github.com/libp2p/go-libp2p-swarm v0.5.3 h1:hsYaD/y6+kZff1o1Mc56NcuwSg80lIphTS/zDk3mO4M= +github.com/libp2p/go-libp2p-swarm v0.5.3/go.mod h1:NBn7eNW2lu568L7Ns9wdFrOhgRlkRnIDg0FLKbuu3i8= github.com/libp2p/go-libp2p-testing v0.0.2/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= github.com/libp2p/go-libp2p-testing v0.0.3/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= github.com/libp2p/go-libp2p-testing v0.0.4/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= @@ -816,10 +848,13 @@ github.com/libp2p/go-libp2p-testing v0.4.2/go.mod h1:Q+PFXYoiYFN5CAEG2w3gLPEzotl github.com/libp2p/go-libp2p-tls v0.1.3/go.mod h1:wZfuewxOndz5RTnCAxFliGjvYSDA40sKitV4c50uI1M= github.com/libp2p/go-libp2p-tls v0.1.4-0.20200421131144-8a8ad624a291 h1:Ge/2CYttU7XdkPPqQ7e3TiuMFneLie1rM/UjRxPPGsI= github.com/libp2p/go-libp2p-tls v0.1.4-0.20200421131144-8a8ad624a291/go.mod h1:j1RjQWh/Ek3CRkHIn9sbVzW++n+yK2AnWtM4kZqlTFY= +github.com/libp2p/go-libp2p-tls v0.2.0 h1:N8i5wPiHudA+02sfW85R2nUbybPm7agjAywZc6pd3xA= +github.com/libp2p/go-libp2p-tls v0.2.0/go.mod h1:twrp2Ci4lE2GYspA1AnlYm+boYjqVruxDKJJj7s6xrc= github.com/libp2p/go-libp2p-transport-upgrader v0.1.1/go.mod h1:IEtA6or8JUbsV07qPW4r01GnTenLW4oi3lOPbUMGJJA= github.com/libp2p/go-libp2p-transport-upgrader v0.2.0/go.mod h1:mQcrHj4asu6ArfSoMuyojOdjx73Q47cYD7s5+gZOlns= github.com/libp2p/go-libp2p-transport-upgrader v0.3.0/go.mod h1:i+SKzbRnvXdVbU3D1dwydnTmKRPXiAR/fyvi1dXuL4o= github.com/libp2p/go-libp2p-transport-upgrader v0.4.2/go.mod h1:NR8ne1VwfreD5VIWIU62Agt/J18ekORFU/j1i2y8zvk= +github.com/libp2p/go-libp2p-transport-upgrader v0.4.3/go.mod h1:bpkldbOWXMrXhpZbSV1mQxTrefOg2Fi+k1ClDSA4ppw= github.com/libp2p/go-libp2p-transport-upgrader v0.4.6 h1:SHt3g0FslnqIkEWF25YOB8UCOCTpGAVvHRWQYJ+veiI= github.com/libp2p/go-libp2p-transport-upgrader v0.4.6/go.mod h1:JE0WQuQdy+uLZ5zOaI3Nw9dWGYJIA7mywEtP2lMvnyk= github.com/libp2p/go-libp2p-yamux v0.2.0/go.mod h1:Db2gU+XfLpm6E4rG5uGCFX6uXA8MEXOxFcRoXUODaK8= @@ -880,12 +915,15 @@ github.com/libp2p/go-tcp-transport v0.1.0/go.mod h1:oJ8I5VXryj493DEJ7OsBieu8fcg2 github.com/libp2p/go-tcp-transport v0.1.1/go.mod h1:3HzGvLbx6etZjnFlERyakbaYPdfjg2pWP97dFZworkY= github.com/libp2p/go-tcp-transport v0.2.0/go.mod h1:vX2U0CnWimU4h0SGSEsg++AzvBcroCGYw28kh94oLe0= github.com/libp2p/go-tcp-transport v0.2.4/go.mod h1:9dvr03yqrPyYGIEN6Dy5UvdJZjyPFvl1S/igQ5QD1SU= +github.com/libp2p/go-tcp-transport v0.2.7/go.mod h1:lue9p1b3VmZj1MhhEGB/etmvF/nBQ0X9CW2DutBT3MM= github.com/libp2p/go-tcp-transport v0.2.8 h1:aLjX+Nkz+kIz3uA56WtlGKRSAnKDvnqKmv1qF4EyyE4= github.com/libp2p/go-tcp-transport v0.2.8/go.mod h1:64rSfVidkYPLqbzpcN2IwHY4pmgirp67h++hZ/rcndQ= github.com/libp2p/go-ws-transport v0.2.0/go.mod h1:9BHJz/4Q5A9ludYWKoGCFC5gUElzlHoKzu0yY9p/klM= github.com/libp2p/go-ws-transport v0.3.0/go.mod h1:bpgTJmRZAvVHrgHybCVyqoBmyLQ1fiZuEaBYusP5zsk= github.com/libp2p/go-ws-transport v0.4.0 h1:9tvtQ9xbws6cA5LvqdE6Ne3vcmGB4f1z9SByggk4s0k= github.com/libp2p/go-ws-transport v0.4.0/go.mod h1:EcIEKqf/7GDjth6ksuS/6p7R49V4CBY6/E7R/iyhYUA= +github.com/libp2p/go-ws-transport v0.5.0 h1:cO6x4P0v6PfxbKnxmf5cY2Ny4OPDGYkUqNvZzp/zdlo= +github.com/libp2p/go-ws-transport v0.5.0/go.mod h1:I2juo1dNTbl8BKSBYo98XY85kU2xds1iamArLvl8kNg= github.com/libp2p/go-yamux v1.2.2/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= github.com/libp2p/go-yamux v1.3.0/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= github.com/libp2p/go-yamux v1.3.3/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= @@ -896,11 +934,15 @@ github.com/libp2p/go-yamux v1.4.1 h1:P1Fe9vF4th5JOxxgQvfbOHkrGqIZniTLf+ddhZp8YTI github.com/libp2p/go-yamux v1.4.1/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE= github.com/libp2p/go-yamux/v2 v2.2.0 h1:RwtpYZ2/wVviZ5+3pjC8qdQ4TKnrak0/E01N1UWoAFU= github.com/libp2p/go-yamux/v2 v2.2.0/go.mod h1:3So6P6TV6r75R9jiBpiIKgU/66lOarCZjqROGxzPpPQ= +github.com/libp2p/zeroconf/v2 v2.1.0 h1:9aZt2jwaBjkAJ/1cZnRTvzfN0eCDYaJWTjHST5tZIlk= +github.com/libp2p/zeroconf/v2 v2.1.0/go.mod h1:vtRu3WOBoLRiQ3BhDvIJwvvrRakbTevCVLSr9/Ljess= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= github.com/logrusorgru/aurora v2.0.3+incompatible/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= github.com/lucas-clemente/quic-go v0.19.3 h1:eCDQqvGBB+kCTkA0XrAFtNe81FMa0/fn4QSoeAbmiF4= github.com/lucas-clemente/quic-go v0.19.3/go.mod h1:ADXpNbTQjq1hIzCpB+y/k5iz4n4z4IwqoLb94Kh5Hu8= +github.com/lucas-clemente/quic-go v0.21.2 h1:8LqqL7nBQFDUINadW0fHV/xSaCQJgmJC0Gv+qUnjd78= +github.com/lucas-clemente/quic-go v0.21.2/go.mod h1:vF5M1XqhBAHgbjKcJOXY3JZz3GP0T3FQhz/uyOUS38Q= github.com/lunixbochs/vtclean v0.0.0-20180621232353-2d01aacdc34a/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= @@ -918,6 +960,13 @@ github.com/marten-seemann/qtls v0.10.0 h1:ECsuYUKalRL240rRD4Ri33ISb7kAQ3qGDlrrl5 github.com/marten-seemann/qtls v0.10.0/go.mod h1:UvMd1oaYDACI99/oZUYLzMCkBXQVT0aGm99sJhbT8hs= github.com/marten-seemann/qtls-go1-15 v0.1.1 h1:LIH6K34bPVttyXnUWixk0bzH6/N07VxbSabxn5A5gZQ= github.com/marten-seemann/qtls-go1-15 v0.1.1/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I= +github.com/marten-seemann/qtls-go1-15 v0.1.4/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I= +github.com/marten-seemann/qtls-go1-15 v0.1.5 h1:Ci4EIUN6Rlb+D6GmLdej/bCQ4nPYNtVXQB+xjiXE1nk= +github.com/marten-seemann/qtls-go1-15 v0.1.5/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I= +github.com/marten-seemann/qtls-go1-16 v0.1.4 h1:xbHbOGGhrenVtII6Co8akhLEdrawwB2iHl5yhJRpnco= +github.com/marten-seemann/qtls-go1-16 v0.1.4/go.mod h1:gNpI2Ol+lRS3WwSOtIUUtRwZEQMXjYK+dQSBFbethAk= +github.com/marten-seemann/qtls-go1-17 v0.1.0-rc.1 h1:/rpmWuGvceLwwWuaKPdjpR4JJEUH0tq64/I3hvzaNLM= +github.com/marten-seemann/qtls-go1-17 v0.1.0-rc.1/go.mod h1:fz4HIxByo+LlWcreM4CZOYNuz3taBQ8rN2X6FqvaWo8= github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd h1:br0buuQ854V8u83wA0rVZ8ttrq5CpaPZdvrK0LP2lOk= github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd/go.mod h1:QuCEs1Nt24+FYQEqAAncTDPJIuGs+LxK1MCiFL25pMU= github.com/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd/go.mod h1:9ELz6aaclSIGnZBoaSLZ3NAl1VTufbOrXBPvtcy6WiQ= @@ -1020,6 +1069,8 @@ github.com/multiformats/go-multiaddr v0.3.0/go.mod h1:dF9kph9wfJ+3VLAaeBqo9Of8x4 github.com/multiformats/go-multiaddr v0.3.1/go.mod h1:uPbspcUPd5AfaP6ql3ujFY+QWzmBD8uLLL4bXW0XfGc= github.com/multiformats/go-multiaddr v0.3.3 h1:vo2OTSAqnENB2rLk79pLtr+uhj+VAzSe3uef5q0lRSs= github.com/multiformats/go-multiaddr v0.3.3/go.mod h1:lCKNGP1EQ1eZ35Za2wlqnabm9xQkib3fyB+nZXHLag0= +github.com/multiformats/go-multiaddr v0.4.0 h1:hL/K4ZJhJ5PTw3nwylq9lGU5yArzcAroZmex1ghSEkQ= +github.com/multiformats/go-multiaddr v0.4.0/go.mod h1:YcpyLH8ZPudLxQlemYBPhSm0/oCXAT8Z4mzFpyoPyRc= github.com/multiformats/go-multiaddr-dns v0.0.1/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= github.com/multiformats/go-multiaddr-dns v0.0.2/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= github.com/multiformats/go-multiaddr-dns v0.2.0/go.mod h1:TJ5pr5bBO7Y1B18djPuRsVkduhQH2YqYSbxWJzYGdK0= @@ -1075,6 +1126,8 @@ github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJE github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= @@ -1091,6 +1144,9 @@ github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0 github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.14.0 h1:2mOpI4JVVPBN+WQRa0WKH2eXR+Ey+uK4n7Zj0aYpIQA= github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= +github.com/onsi/ginkgo v1.16.2/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E= +github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= +github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= @@ -1100,6 +1156,8 @@ github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7J github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/onsi/gomega v1.10.1 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.13.0 h1:7lLHu94wT9Ij0o6EWWclhu0aOh32VxhkwEJvzuWPeak= +github.com/onsi/gomega v1.13.0/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je41yGY= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/openconfig/gnmi v0.0.0-20190823184014-89b2bf29312c/go.mod h1:t+O9It+LKzfOAhKTT5O0ehDix+MTqbtT0T9t+7zzOvc= github.com/openconfig/reference v0.0.0-20190727015836-8dfd928c9696/go.mod h1:ym2A+zigScwkSEb/cVQB0/ZMpU3rqiH6X7WRRsxgOGw= @@ -1176,6 +1234,8 @@ github.com/prometheus/common v0.18.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16 github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= github.com/prometheus/common v0.29.0 h1:3jqPBvKT4OHAbje2Ql7KeaaSicDBCxMYwEJU1zRJceE= github.com/prometheus/common v0.29.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= +github.com/prometheus/common v0.30.0 h1:JEkYlQnpzrzQFxi6gnukFPdQ+ac82oRhzMcIduJu/Ug= +github.com/prometheus/common v0.30.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= @@ -1188,6 +1248,8 @@ github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4O github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.7.0 h1:OQZ41sZU9XkRpzrz8/TD0EldH/Rwbddkdu5wDyUwzfE= github.com/prometheus/procfs v0.7.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= +github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/prom2json v1.3.0/go.mod h1:rMN7m0ApCowcoDlypBHlkNbp5eJQf/+1isKykIP5ZnM= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/prometheus/tsdb v0.10.0 h1:If5rVCMTp6W2SiRAQFlbpJNgVlgMEd+U2GZckwK38ic= @@ -1409,6 +1471,7 @@ go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= @@ -1435,6 +1498,8 @@ go.uber.org/zap v1.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= go.uber.org/zap v1.18.1 h1:CSUJ2mjFszzEWt4CdKISEuChVIXGBn3lAPwkRGyVrc4= go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= +go.uber.org/zap v1.19.0 h1:mZQZefskPPCMIBCSEH0v2/iUqqLrYtaeqwD6FUGUnFE= +go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= golang.org/x/build v0.0.0-20190111050920-041ab4dc3f9d/go.mod h1:OWs+y06UdEOHN4y+MfF/py+xQ/tYqIWW03b70/CG9Rw= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -1467,6 +1532,8 @@ golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= +golang.org/x/crypto v0.0.0-20210813211128-0a44fdfbc16e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 h1:7I4JAnoQBe7ZtJcBaYHi5UtiO8tQHbUSXxL+pnGRANg= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1569,9 +1636,12 @@ golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLd golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= golang.org/x/net v0.0.0-20210423184538-5f58ad60dda6/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= +golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d h1:20cMwl2fHAzkJMEA+8J4JgqBQcQGzbisXo31MIeenXI= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d h1:LO7XpTYMwTqxjLcGWPijK3vRXg1aWdlNOVOHRq45d7c= +golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/oauth2 v0.0.0-20170912212905-13449ad91cb2/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -1668,6 +1738,7 @@ golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201214210602-f9fddec55a1e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 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= @@ -1683,6 +1754,7 @@ golang.org/x/sys v0.0.0-20210420205809-ac73e9fd8988/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 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-20210511113859-b0526f3d8744/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/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-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1701,6 +1773,8 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/time v0.0.0-20170424234030-8be79e1e0910/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1769,6 +1843,7 @@ golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1 h1:wGiQel/hW0NnEkJUk8lbzkX2gFJU6PFxf1v5OlCfuOs= @@ -1852,6 +1927,7 @@ google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20200528191852-705c0b31589b/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= @@ -1889,9 +1965,12 @@ google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.37.0 h1:uSZWeQJX5j11bIQ4AJoj+McDBo29cY1MCoC1wO3ts+c= google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.40.0 h1:AGJ0Ih4mHjSeibYkFGh1dD9KJ/eOtZ93I6hoHhukQ5Q= +google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.0.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= diff --git a/ibft/controller/controller.go b/ibft/controller/controller.go index f95e968a6d..298be47efa 100644 --- a/ibft/controller/controller.go +++ b/ibft/controller/controller.go @@ -97,8 +97,6 @@ func (i *Controller) Init() error { i.processDecidedQueueMessages() i.processSyncQueueMessages() i.listenToSyncMessages() - i.listenToNetworkMessages() - i.listenToNetworkDecidedMessages() i.initHandlers.Set(true) i.logger.Debug("managed to setup iBFT handlers") } diff --git a/ibft/controller/controller_network.go b/ibft/controller/controller_network.go index 69c5c04c41..4d543f3607 100644 --- a/ibft/controller/controller_network.go +++ b/ibft/controller/controller_network.go @@ -50,21 +50,6 @@ func (i *Controller) listenToNetworkMessages() { }() } -func (i *Controller) listenToNetworkDecidedMessages() { - decidedChan, done := i.network.ReceivedDecidedChan() - go func() { - defer done() - for msg := range decidedChan { - if msg.Message != nil && i.equalIdentifier(msg.Message.Lambda) { - i.msgQueue.AddMessage(&network.Message{ - SignedMessage: msg, - Type: network.NetworkMsg_DecidedType, - }) - } - } - }() -} - func (i *Controller) listenToSyncMessages() { syncChan, done := i.network.ReceivedSyncMsgChan() go func() { diff --git a/ibft/controller/mediator.go b/ibft/controller/mediator.go new file mode 100644 index 0000000000..54b5bebe3d --- /dev/null +++ b/ibft/controller/mediator.go @@ -0,0 +1,52 @@ +package controller + +import ( + "github.com/bloxapp/ssv/ibft/pipeline/auth" + "github.com/bloxapp/ssv/ibft/proto" + "github.com/bloxapp/ssv/network" + "github.com/bloxapp/ssv/utils/format" + "go.uber.org/zap" +) + +// MediatorReader is an interface for components that resolving network msg's +type MediatorReader interface { + GetMsgResolver(networkMsg network.NetworkMsg) func(msg *proto.SignedMessage) +} + +// Mediator between network and redirect the proper msg to the proper MediatorReader +type Mediator struct { + logger *zap.Logger +} + +// NewMediator returns new Mediator +func NewMediator(logger *zap.Logger) Mediator { + return Mediator{ + logger: logger, + } +} + +// AddListener listen to channel and use redirect func to push to the right place +func (m *Mediator) AddListener(ibftType network.NetworkMsg, ch <-chan *proto.SignedMessage, done func(), handler func(publicKey string) (MediatorReader, bool)) { + go func() { + defer done() + for msg := range ch { + m.redirect(ibftType, handler, msg) + } + + m.logger.Debug("mediator stopped listening to network", zap.String("type", ibftType.String())) + }() +} + +// redirect network msg to proper MediatorReader. Also validate the msg itself +func (m *Mediator) redirect(ibftType network.NetworkMsg, readerHandler func(publicKey string) (MediatorReader, bool), msg *proto.SignedMessage) { + if err := auth.BasicMsgValidation().Run(msg); err != nil { + return + } + publicKey, role := format.IdentifierUnformat(string(msg.Message.Lambda)) // TODO need to support multi role types + logger := m.logger.With(zap.String("publicKey", publicKey), zap.String("role", role), zap.String("type", ibftType.String())) + if reader, ok := readerHandler(publicKey); ok { + reader.GetMsgResolver(ibftType)(msg) + } else { + logger.Warn("failed to find validator reader") + } +} diff --git a/ibft/controller/mediator_test.go b/ibft/controller/mediator_test.go new file mode 100644 index 0000000000..c818ab53f0 --- /dev/null +++ b/ibft/controller/mediator_test.go @@ -0,0 +1,75 @@ +package controller + +import ( + "encoding/binary" + "fmt" + "github.com/bloxapp/ssv/ibft/proto" + "github.com/bloxapp/ssv/network" + "github.com/bloxapp/ssv/storage/basedb" + "github.com/bloxapp/ssv/storage/kv" + "github.com/bloxapp/ssv/utils/logex" + "github.com/stretchr/testify/require" + "go.uber.org/zap/zapcore" + "testing" + "time" +) + +type reader struct { + db basedb.IDb +} + +func init() { + logex.Build("", zapcore.DebugLevel, nil) +} + +func (r reader) GetMsgResolver(networkMsg network.NetworkMsg) func(msg *proto.SignedMessage) { + return func(msg *proto.SignedMessage) { + seq := make([]byte, 8) + binary.LittleEndian.PutUint64(seq, msg.Message.SeqNumber) + if err := r.db.Set([]byte("test"), seq, []byte("val")); err != nil { + panic(fmt.Errorf("faild to set value - %s", err)) + } + } +} + +func TestMediator_AddListener(t *testing.T) { + db, err := kv.New(basedb.Options{ + Type: "badger-memory", + Path: "", + Logger: logex.GetLogger(), + }) + require.NoError(t, err) + + mediator := NewMediator(logex.GetLogger()) + reader := &reader{db: db} + + cn := make(chan *proto.SignedMessage) + mediator.AddListener(network.NetworkMsg_DecidedType, cn, func() { + close(cn) + }, func(publicKey string) (MediatorReader, bool) { + return reader, true + }) + + for i := 1; i < 5; i++ { + cn <- &proto.SignedMessage{ + Message: &proto.Message{ + Type: 0, + Round: 0, + Lambda: nil, + SeqNumber: uint64(i), + Value: nil, + }, + Signature: nil, + SignerIds: nil, + } + } + + time.Sleep(time.Millisecond * 100) + var objs []basedb.Obj + require.NoError(t, db.GetAll([]byte("test"), func(i int, obj basedb.Obj) error { + objs = append(objs, obj) + require.Equal(t, uint64(i+1), binary.LittleEndian.Uint64(obj.Key)) + return nil + })) + require.Equal(t, 4, len(objs)) +} diff --git a/network/commons/peers.go b/network/commons/min_peers.go similarity index 100% rename from network/commons/peers.go rename to network/commons/min_peers.go diff --git a/network/p2p/config.go b/network/p2p/config.go index c912524968..433bb6caac 100644 --- a/network/p2p/config.go +++ b/network/p2p/config.go @@ -20,6 +20,7 @@ type Config struct { HostDNS string `yaml:"HostDNS" env:"HOST_DNS" env-description:"External DNS node is exposed for discovery"` RequestTimeout time.Duration `yaml:"RequestTimeout" env:"P2P_REQUEST_TIMEOUT" env-default:"5s"` MaxBatchResponse uint64 `yaml:"MaxBatchResponse" env:"P2P_MAX_BATCH_RESPONSE" env-default:"50" env-description:"maximum number of returned objects in a batch"` + MaxPeers int `yaml:"MaxPeers" env:"P2P_MAX_PEERS" env-default:"750" env-description:"maximum number of connected peers"` PubSubTraceOut string `yaml:"PubSubTraceOut" env:"PUBSUB_TRACE_OUT" env-description:"File path to hold collected pubsub traces"` //PubSubTracer string `yaml:"PubSubTracer" env:"PUBSUB_TRACER" env-description:"A remote tracer that collects pubsub traces"` diff --git a/network/p2p/discovery.go b/network/p2p/discovery.go index d535087be3..4427364861 100644 --- a/network/p2p/discovery.go +++ b/network/p2p/discovery.go @@ -14,10 +14,9 @@ import ( ) const ( - maxPeers = 1000 - udp4 = "udp4" - udp6 = "udp6" - tcp = "tcp" + udp4 = "udp4" + udp6 = "udp6" + tcp = "tcp" discoveryTypeMdns = "mdns" discoveryTypeDiscv5 = "discv5" @@ -113,3 +112,9 @@ func (n *p2pNetwork) connectWithPeer(ctx context.Context, info peer.AddrInfo) er return nil } + +// getUserAgentOfPeer returns user agent of the given peer +func (n *p2pNetwork) getUserAgentOfPeer(p peer.ID) (UserAgent, bool) { + uaRaw := n.peersIndex.GetPeerData(p.String(), UserAgentKey) + return NewUserAgent(uaRaw), len(uaRaw) > 0 +} diff --git a/network/p2p/discovery_discv5.go b/network/p2p/discovery_discv5.go index 820e247d4a..10dbc7402e 100644 --- a/network/p2p/discovery_discv5.go +++ b/network/p2p/discovery_discv5.go @@ -31,7 +31,7 @@ type discv5Listener interface { // setupDiscV5 creates all the required objects for discv5 func (n *p2pNetwork) setupDiscV5() (*discover.UDPv5, error) { n.peers = peers.NewStatus(n.ctx, &peers.StatusConfig{ - PeerLimit: maxPeers, + PeerLimit: n.maxPeers, ScorerParams: &scorers.Config{ BadResponsesScorerConfig: &scorers.BadResponsesScorerConfig{ Threshold: 5, @@ -226,7 +226,7 @@ func (n *p2pNetwork) listenForNewNodes() { func (n *p2pNetwork) isPeerAtLimit() bool { numOfConns := len(n.host.Network().Peers()) activePeers := len(n.peers.Active()) - return activePeers >= maxPeers || numOfConns >= maxPeers + return activePeers >= n.maxPeers || numOfConns >= n.maxPeers } // dv5Logger implements log.Handler to track logs of discv5 diff --git a/network/p2p/discovery_mdns.go b/network/p2p/discovery_mdns.go index 3782819507..04e37f8c37 100644 --- a/network/p2p/discovery_mdns.go +++ b/network/p2p/discovery_mdns.go @@ -4,7 +4,7 @@ import ( "context" "github.com/libp2p/go-libp2p-core/host" "github.com/libp2p/go-libp2p-core/peer" - mdnsDiscover "github.com/libp2p/go-libp2p/p2p/discovery" + mdnsDiscover "github.com/libp2p/go-libp2p/p2p/discovery/mdns_legacy" "github.com/pkg/errors" "go.uber.org/zap" ) diff --git a/network/p2p/metrics.go b/network/p2p/metrics.go index 8147bdabdf..76e6da4b90 100644 --- a/network/p2p/metrics.go +++ b/network/p2p/metrics.go @@ -7,7 +7,6 @@ import ( "github.com/prometheus/client_golang/prometheus/promauto" "go.uber.org/zap" "log" - "strings" "time" ) @@ -51,7 +50,7 @@ func reportAllConnections(n *p2pNetwork) { for _, conn := range conns { pid := conn.RemotePeer().String() ids = append(ids, pid) - reportPeerIdentity(n, pid) + reportPeerIdentity(n, conn.RemotePeer()) } var peersActiveDisv5 []peer.ID if n.peers != nil { @@ -71,16 +70,10 @@ func reportTopicPeers(n *p2pNetwork, name string, topic *pubsub.Topic) { metricsConnectedPeers.WithLabelValues(name).Set(float64(len(peers))) } -func reportPeerIdentity(n *p2pNetwork, pid string) { - ua := n.peersIndex.GetPeerData(pid, UserAgentKey) - n.logger.Debug("peer identity", zap.String("peer", pid), zap.String("ua", ua)) - uaParts := strings.Split(ua, ":") - if len(uaParts) > 2 { - if len(uaParts) > 3 { // In order to support backwards compatibility. where older version have only 2 fields - metricsPeersIdentity.WithLabelValues(uaParts[3], uaParts[1], pid, uaParts[2]).Set(1) - return - } - metricsPeersIdentity.WithLabelValues(uaParts[2], uaParts[1], pid, Unknown.String()).Set(1) +func reportPeerIdentity(n *p2pNetwork, pid peer.ID) { + if ua, ok := n.getUserAgentOfPeer(pid); ok { + n.logger.Debug("peer identity", zap.String("peer", pid.String()), zap.String("ua", string(ua))) + metricsPeersIdentity.WithLabelValues(ua.NodePubKeyHash(), ua.NodeVersion(), pid.String(), ua.NodeType()).Set(1) } } diff --git a/network/p2p/p2p.go b/network/p2p/p2p.go index f1af65646a..3da7f40d68 100644 --- a/network/p2p/p2p.go +++ b/network/p2p/p2p.go @@ -4,7 +4,6 @@ import ( "context" "crypto/ecdsa" "crypto/rsa" - "fmt" "github.com/bloxapp/ssv/network/commons/listeners" "github.com/bloxapp/ssv/network/forks" "github.com/bloxapp/ssv/utils/commons" @@ -32,9 +31,6 @@ const ( // DiscoveryServiceTag is used in our mDNS advertisements to discover other chat peers. DiscoveryServiceTag = "bloxstaking.ssv" - // MsgChanSize is the buffer size of the message channel - MsgChanSize = 128 - topicPrefix = "bloxstaking.ssv" ) @@ -66,6 +62,8 @@ type p2pNetwork struct { reportLastMsg bool nodeType NodeType + + maxPeers int } // New is the constructor of p2pNetworker @@ -87,6 +85,7 @@ func New(ctx context.Context, logger *zap.Logger, cfg *Config) (network.Network, reportLastMsg: cfg.ReportLastMsg, fork: cfg.Fork, nodeType: cfg.NodeType, + maxPeers: cfg.MaxPeers, } n.cfg.BootnodesENRs = filterInvalidENRs(n.logger, TransformEnr(n.cfg.Enr)) @@ -113,7 +112,7 @@ func New(ctx context.Context, logger *zap.Logger, cfg *Config) (network.Network, ua := n.getUserAgent() ids, err = identify.NewIDService(host, identify.UserAgent(ua)) if err != nil { - return nil, errors.Wrap(err, "Failed to create ID service") + return nil, errors.Wrap(err, "failed to create ID service") } n.logger.Info("libp2p User Agent", zap.String("value", ua)) } @@ -210,16 +209,13 @@ func (n *p2pNetwork) MaxBatch() uint64 { // - operator public key hash // TODO: will be changed once we have a proper authentication mechanism in place func (n *p2pNetwork) getUserAgent() string { - ua := commons.GetBuildData() - ua = fmt.Sprintf("%s:%s", ua, n.nodeType.String()) - if n.operatorPrivKey != nil { - operatorPubKey, err := rsaencryption.ExtractPublicKey(n.operatorPrivKey) - if err != nil || len(operatorPubKey) == 0 { - n.logger.Error("could not extract operator public key", zap.Error(err)) - } - ua = fmt.Sprintf("%s:%s", ua, pubKeyHash(operatorPubKey)) + ua, err := GenerateUserAgent(n.operatorPrivKey, n.nodeType) + if err != nil { + n.logger.Error("could not generate user agent", zap.Error(err)) + bd := commons.GetBuildData() + ua = NewUserAgent(bd) } - return ua + return string(ua) } func (n *p2pNetwork) getOperatorPubKey() (string, error) { diff --git a/network/p2p/p2p_pubsub.go b/network/p2p/p2p_pubsub.go index 785d7a866d..c86aa3d65f 100644 --- a/network/p2p/p2p_pubsub.go +++ b/network/p2p/p2p_pubsub.go @@ -4,7 +4,6 @@ import ( "context" "fmt" "github.com/herumi/bls-eth-go-binary/bls" - "github.com/libp2p/go-libp2p-core/peer" pubsub "github.com/libp2p/go-libp2p-pubsub" "github.com/pkg/errors" "go.uber.org/zap" @@ -122,7 +121,12 @@ func (n *p2pNetwork) allPeersOfTopic(topic *pubsub.Topic) []string { n.cfg.ExporterPeerID: true, } for _, p := range topic.ListPeers() { - isValidNodeType := validateNodeType(n.peersIndex.GetPeerData, p) + ua, found := n.getUserAgentOfPeer(p) + if !found { + n.logger.Debug("could not find user agent of peer", zap.String("peer", p.String())) + continue + } + isValidNodeType := validateNodeType(ua) if s := peerToString(p); !skippedPeers[s] && isValidNodeType { ret = append(ret, peerToString(p)) } @@ -162,20 +166,9 @@ func (n *p2pNetwork) listen(ctx context.Context, sub *pubsub.Subscription) { } // validateNodeType return if peer nodeType is valid. -// checks if peer support nodeType in userAgent. if not, use peer. (backwards compatibility) -func validateNodeType(peerData func(pid string, key string) string, p peer.ID) bool { - nodeType := getNodeType(peerData, p) - - return nodeType != Exporter.String() -} - -func getNodeType(peerData func(pid string, key string) string, p peer.ID) string { - ua := peerData(p.String(), UserAgentKey) - uaParts := strings.Split(ua, ":") - if len(uaParts) > 2 { - return Unknown.FromString(uaParts[2]).String() - } - return Unknown.String() +// checks if peer support nodeType in UserAgent. if not, use peer. (backwards compatibility) +func validateNodeType(ua UserAgent) bool { + return ua.NodeType() != Exporter.String() } // getTopicName return formatted topic name diff --git a/network/p2p/peers_index.go b/network/p2p/peers_index.go index 44bd3d3905..eed6aca7f4 100644 --- a/network/p2p/peers_index.go +++ b/network/p2p/peers_index.go @@ -40,7 +40,7 @@ type peersIndex struct { // NewPeersIndex creates a new instance func NewPeersIndex(host host.Host, ids *identify.IDService, logger *zap.Logger) PeersIndex { pi := peersIndex{ - logger: logger, + logger: logger.With(zap.String("who", "PeersIndex")), host: host, ids: ids, index: make(map[string]IndexData), @@ -84,8 +84,8 @@ func (pi *peersIndex) GetPeerData(pid, key string) string { // IndexPeer indexes the given peer / connection func (pi *peersIndex) IndexPeer(conn network.Conn) { - pi.lock.RLock() - defer pi.lock.RUnlock() + pi.lock.Lock() + defer pi.lock.Unlock() if pi.ids == nil { return @@ -115,7 +115,14 @@ func (pi *peersIndex) indexPeerConnection(conn network.Conn) error { if !found { data = IndexData{} } + if data[UserAgentKey] == av { + // value was not changed, skipping + return nil + } data[UserAgentKey] = av pi.index[pid.String()] = data + pi.logger.Debug("indexed connection", zap.String("peerID", pid.String()), + zap.String("multiaddr", conn.RemoteMultiaddr().String()), + zap.String(UserAgentKey, av)) return nil } diff --git a/network/p2p/user_agent.go b/network/p2p/user_agent.go new file mode 100644 index 0000000000..857cd69093 --- /dev/null +++ b/network/p2p/user_agent.go @@ -0,0 +1,64 @@ +package p2p + +import ( + "crypto/rsa" + "fmt" + "github.com/bloxapp/ssv/utils/commons" + "github.com/bloxapp/ssv/utils/rsaencryption" + "strings" +) + +// UserAgent wraps a string with ua capabilities +type UserAgent string + +// NewUserAgent wraps the given string as a UserAgent +func NewUserAgent(raw string) UserAgent { + return UserAgent(raw) +} + +// GenerateUserAgent creates user agent string (:::) +func GenerateUserAgent(sk *rsa.PrivateKey, ntype NodeType) (UserAgent, error) { + ua := commons.GetBuildData() + ua = fmt.Sprintf("%s:%s", ua, ntype.String()) + if sk != nil { + operatorPubKey, err := rsaencryption.ExtractPublicKey(sk) + if err != nil || len(operatorPubKey) == 0 { + return NewUserAgent(ua), err + } + ua = fmt.Sprintf("%s:%s", ua, pubKeyHash(operatorPubKey)) + } + return NewUserAgent(ua), nil +} + +// NodeVersion returns the node version (e.g. v0.1.7) +func (ua UserAgent) NodeVersion() string { + uaParts := strings.Split(string(ua), ":") + if len(uaParts) > 1 { + return uaParts[1] + } + return "" +} + +// NodeType returns the node type ('operator' | 'exporter') +func (ua UserAgent) NodeType() string { + uaParts := strings.Split(string(ua), ":") + if len(uaParts) > 2 { + return Unknown.FromString(uaParts[2]).String() + } + return Unknown.String() +} + +// NodePubKeyHash returns public key hash or empty string if not available +func (ua UserAgent) NodePubKeyHash() string { + uaParts := strings.Split(string(ua), ":") + n := len(uaParts) + if n > 2 { + lastPart := uaParts[n-1] + if lastPart == Operator.String() || lastPart == Exporter.String() || lastPart == Unknown.String() { + // public key hash does not exist (probably due to older version), node type is the last entry + return "" + } + return uaParts[n-1] + } + return "" +} diff --git a/network/p2p/user_agent_test.go b/network/p2p/user_agent_test.go new file mode 100644 index 0000000000..06f4fdeedf --- /dev/null +++ b/network/p2p/user_agent_test.go @@ -0,0 +1,62 @@ +package p2p + +import ( + "github.com/bloxapp/ssv/utils/commons" + "github.com/bloxapp/ssv/utils/rsaencryption" + "github.com/stretchr/testify/require" + "strings" + "testing" +) + +func TestUserAgent(t *testing.T) { + commons.SetBuildData("ssvtest", "v0.x.x") + _, skBytes, err := rsaencryption.GenerateKeys() + require.NoError(t, err) + require.NotNil(t, skBytes) + sk, err := rsaencryption.ConvertPemToPrivateKey(string(skBytes)) + require.NoError(t, err) + + t.Run("generate valid ua", func(t *testing.T) { + ua, err := GenerateUserAgent(sk, Exporter) + require.NoError(t, err) + require.Equal(t, 0, strings.Index(string(ua), "ssvtest:v0.x.x:exporter:")) + + ua, err = GenerateUserAgent(sk, Operator) + require.NoError(t, err) + require.Equal(t, 0, strings.Index(string(ua), "ssvtest:v0.x.x:operator:")) + }) + + t.Run("generate w/o operator key", func(t *testing.T) { + ua, err := GenerateUserAgent(nil, Operator) + require.NoError(t, err) + require.Equal(t, "ssvtest:v0.x.x:operator", string(ua)) + }) + + t.Run("get node type", func(t *testing.T) { + ua, err := GenerateUserAgent(sk, Operator) + require.NoError(t, err) + require.Equal(t, Operator.String(), ua.NodeType()) + + ua, err = GenerateUserAgent(sk, Unknown) + require.NoError(t, err) + require.Equal(t, Unknown.String(), ua.NodeType()) + }) + + t.Run("get node version", func(t *testing.T) { + ua, err := GenerateUserAgent(sk, Operator) + require.NoError(t, err) + require.Equal(t, "v0.x.x", ua.NodeVersion()) + }) + + t.Run("get node pubKey hash", func(t *testing.T) { + ua, err := GenerateUserAgent(sk, Operator) + require.NoError(t, err) + require.Equal(t, 64, len(ua.NodePubKeyHash())) + }) + + t.Run("get node pubKey hash, no operator key", func(t *testing.T) { + ua, err := GenerateUserAgent(nil, Operator) + require.NoError(t, err) + require.Equal(t, 0, len(ua.NodePubKeyHash())) + }) +} diff --git a/operator/node.go b/operator/node.go index 5f15800409..71eb50544e 100644 --- a/operator/node.go +++ b/operator/node.go @@ -101,6 +101,7 @@ func (n *operatorNode) init(opts Options) error { func (n *operatorNode) Start() error { n.logger.Info("All required services are ready. OPERATOR SUCCESSFULLY CONFIGURED AND NOW RUNNING!") n.validatorsCtrl.StartValidators() + n.validatorsCtrl.StartNetworkMediators() if err := tasks.Retry(n.net.SubscribeToMainTopic, 3); err != nil { n.logger.Error("failed to subscribe to main topic", zap.Error(err)) } diff --git a/storage/basedb/storage.go b/storage/basedb/storage.go index 5fda0d9915..af12e7b4ce 100644 --- a/storage/basedb/storage.go +++ b/storage/basedb/storage.go @@ -21,7 +21,7 @@ type IDb interface { Get(prefix []byte, key []byte) (Obj, bool, error) GetMany(prefix []byte, keys [][]byte, iterator func(Obj) error) error Delete(prefix []byte, key []byte) error - GetAllByCollection(prefix []byte) ([]Obj, error) + GetAll(prefix []byte, handler func(int, Obj) error) error CountByCollection(prefix []byte) (int64, error) RemoveAllByCollection(prefix []byte) error Close() diff --git a/storage/kv/badger.go b/storage/kv/badger.go index 5cf2f6e320..0b5d9fe246 100644 --- a/storage/kv/badger.go +++ b/storage/kv/badger.go @@ -144,19 +144,36 @@ func (b *BadgerDb) Delete(prefix []byte, key []byte) error { }) } -// GetAllByCollection return all array of Obj for all keys under specified prefix(bucket) -func (b *BadgerDb) GetAllByCollection(prefix []byte) ([]basedb.Obj, error) { - var res []basedb.Obj - +// GetAll returns all the items of a given collection +func (b *BadgerDb) GetAll(prefix []byte, handler func(int, basedb.Obj) error) error { // we got issues when reading more than 100 items with iterator (items get mixed up) // instead, the keys are first fetched using an iterator, and afterwards the values are fetched one by one // to avoid issues err := b.db.View(func(txn *badger.Txn) error { rawKeys := b.listRawKeys(prefix, txn) - res = b.getAll(rawKeys, prefix, txn) + for i, k := range rawKeys { + trimmedResKey := bytes.TrimPrefix(k, prefix) + item, err := txn.Get(k) + if err != nil { + b.logger.Error("failed to get value", zap.Error(err), + zap.String("trimmedResKey", string(trimmedResKey))) + continue + } + val, err := item.ValueCopy(nil) + if err != nil { + b.logger.Error("failed to copy value", zap.Error(err)) + continue + } + if err := handler(i, basedb.Obj{ + Key: trimmedResKey, + Value: val, + }); err != nil { + return err + } + } return nil }) - return res, err + return err } // CountByCollection return the object count for all keys under specified prefix(bucket) @@ -199,32 +216,6 @@ func (b *BadgerDb) report() { zap.String("IndexCacheMetrics", indexCache.String())) } -func (b *BadgerDb) getAll(rawKeys [][]byte, prefix []byte, txn *badger.Txn) []basedb.Obj { - var res []basedb.Obj - - for _, k := range rawKeys { - trimmedResKey := bytes.TrimPrefix(k, prefix) - item, err := txn.Get(k) - if err != nil { - b.logger.Error("failed to get value", zap.Error(err), - zap.String("trimmedResKey", string(trimmedResKey))) - continue - } - val, err := item.ValueCopy(nil) - if err != nil { - b.logger.Error("failed to copy value", zap.Error(err)) - continue - } - obj := basedb.Obj{ - Key: trimmedResKey, - Value: val, - } - res = append(res, obj) - } - - return res -} - func (b *BadgerDb) listRawKeys(prefix []byte, txn *badger.Txn) [][]byte { var keys [][]byte diff --git a/storage/kv/badger_test.go b/storage/kv/badger_test.go index fe0c531c7d..463c500c4a 100644 --- a/storage/kv/badger_test.go +++ b/storage/kv/badger_test.go @@ -59,9 +59,13 @@ func TestBadgerEndToEnd(t *testing.T) { require.EqualValues(t, toSave[0].key, obj.Key) require.EqualValues(t, toSave[0].value, obj.Value) - objs, err := db.GetAllByCollection(toSave[0].prefix) + count := 0 + err = db.GetAll(toSave[0].prefix, func(i int, obj basedb.Obj) error { + count++ + return nil + }) require.NoError(t, err) - require.EqualValues(t, 2, len(objs)) + require.EqualValues(t, 2, count) obj, found, err = db.Get(toSave[2].prefix, toSave[2].key) require.True(t, found) @@ -80,7 +84,7 @@ func TestBadgerEndToEnd(t *testing.T) { require.NoError(t, db.RemoveAllByCollection([]byte("prefix2"))) } -func TestBadgerDb_GetAllByCollection(t *testing.T) { +func TestBadgerDb_GetAll(t *testing.T) { options := basedb.Options{ Type: "badger-memory", Logger: zap.L(), @@ -92,7 +96,7 @@ func TestBadgerDb_GetAllByCollection(t *testing.T) { require.NoError(t, err) defer db.Close() - getAllByCollectionTest(t, 100, db) + getAllTest(t, 100, db) }) t.Run("10K_items", func(t *testing.T) { @@ -100,7 +104,7 @@ func TestBadgerDb_GetAllByCollection(t *testing.T) { require.NoError(t, err) defer db.Close() - getAllByCollectionTest(t, 10000, db) + getAllTest(t, 10000, db) }) t.Run("100K_items", func(t *testing.T) { @@ -108,7 +112,7 @@ func TestBadgerDb_GetAllByCollection(t *testing.T) { require.NoError(t, err) defer db.Close() - getAllByCollectionTest(t, 100000, db) + getAllTest(t, 100000, db) }) } @@ -173,7 +177,7 @@ func uInt64ToByteSlice(n uint64) []byte { return b } -func getAllByCollectionTest(t *testing.T, n int, db basedb.IDb) { +func getAllTest(t *testing.T, n int, db basedb.IDb) { // populating DB prefix := []byte("test") for i := 0; i < n; i++ { @@ -182,7 +186,11 @@ func getAllByCollectionTest(t *testing.T, n int, db basedb.IDb) { } time.Sleep(1 * time.Millisecond) - all, err := db.GetAllByCollection(prefix) + var all []basedb.Obj + err := db.GetAll(prefix, func(i int, obj basedb.Obj) error { + all = append(all, obj) + return nil + }) require.Equal(t, n, len(all)) require.NoError(t, err) visited := map[string][]byte{} diff --git a/validator/controller.go b/validator/controller.go index 6b798c8d7e..e822ffcc98 100644 --- a/validator/controller.go +++ b/validator/controller.go @@ -7,6 +7,7 @@ import ( "github.com/bloxapp/ssv/beacon" "github.com/bloxapp/ssv/eth1" "github.com/bloxapp/ssv/eth1/abiparser" + controller2 "github.com/bloxapp/ssv/ibft/controller" "github.com/bloxapp/ssv/network" "github.com/bloxapp/ssv/operator/forks" "github.com/bloxapp/ssv/storage/basedb" @@ -52,6 +53,7 @@ type Controller interface { GetValidatorsIndices() []spec.ValidatorIndex GetValidator(pubKey string) (*Validator, bool) UpdateValidatorMetaDataLoop() + StartNetworkMediators() } // controller implements Controller @@ -68,6 +70,8 @@ type controller struct { metadataUpdateQueue tasks.Queue metadataUpdateInterval time.Duration + + networkMediator controller2.Mediator } // NewController creates a new validator controller instance @@ -100,6 +104,8 @@ func NewController(options ControllerOptions) Controller { metadataUpdateQueue: tasks.NewExecutionQueue(10 * time.Millisecond), metadataUpdateInterval: options.MetadataUpdateInterval, + + networkMediator: controller2.NewMediator(options.Logger), } if err := ctrl.initShares(options); err != nil { @@ -182,6 +188,18 @@ func (c *controller) setupValidators(shares []*validatorstorage.Share) { go c.updateValidatorsMetadata(fetchMetadata) } +func (c *controller) StartNetworkMediators() { + msgChan, msgDone := c.validatorsMap.optsTemplate.Network.ReceivedMsgChan() + decidedChan, decidedDone := c.validatorsMap.optsTemplate.Network.ReceivedDecidedChan() + + c.networkMediator.AddListener(network.NetworkMsg_IBFTType, msgChan, msgDone, c.getReader) + c.networkMediator.AddListener(network.NetworkMsg_DecidedType, decidedChan, decidedDone, c.getReader) +} + +func (c *controller) getReader(publicKey string) (controller2.MediatorReader, bool) { + return c.validatorsMap.GetValidator(publicKey) +} + // updateValidatorsMetadata updates metadata of the given public keys. // as part of the flow in beacon.UpdateValidatorsMetadata, // UpdateValidatorMetadata is called to persist metadata and start a specific validator diff --git a/validator/storage/share.go b/validator/storage/share.go index cad2a8e7a8..ed7cd94c5e 100644 --- a/validator/storage/share.go +++ b/validator/storage/share.go @@ -25,18 +25,20 @@ func (keys PubKeys) Aggregate() bls.PublicKey { // Share storage model type Share struct { - NodeID uint64 - PublicKey *bls.PublicKey - Committee map[uint64]*proto.Node - Metadata *beacon.ValidatorMetadata // pointer in order to support nil + NodeID uint64 + PublicKey *bls.PublicKey + Committee map[uint64]*proto.Node + Metadata *beacon.ValidatorMetadata // pointer in order to support nil + OwnerAddress string } // serializedShare struct type serializedShare struct { - NodeID uint64 - ShareKey []byte - Committee map[uint64]*proto.Node - Metadata *beacon.ValidatorMetadata // pointer in order to support nil + NodeID uint64 + ShareKey []byte + Committee map[uint64]*proto.Node + Metadata *beacon.ValidatorMetadata // pointer in order to support nil + OwnerAddress string } // CommitteeSize returns the IBFT committee size @@ -107,9 +109,10 @@ func (s *Share) VerifySignedMessage(msg *proto.SignedMessage) error { // Serialize share to []byte func (s *Share) Serialize() ([]byte, error) { value := serializedShare{ - NodeID: s.NodeID, - Committee: map[uint64]*proto.Node{}, - Metadata: s.Metadata, + NodeID: s.NodeID, + Committee: map[uint64]*proto.Node{}, + Metadata: s.Metadata, + OwnerAddress: s.OwnerAddress, } // copy committee by value for k, n := range s.Committee { @@ -145,10 +148,11 @@ func (s *Share) Deserialize(obj basedb.Obj) (*Share, error) { return nil, errors.Wrap(err, "Failed to get pubkey") } return &Share{ - NodeID: value.NodeID, - PublicKey: pubKey, - Committee: value.Committee, - Metadata: value.Metadata, + NodeID: value.NodeID, + PublicKey: pubKey, + Committee: value.Committee, + Metadata: value.Metadata, + OwnerAddress: value.OwnerAddress, }, nil } diff --git a/validator/storage/share_opts.go b/validator/storage/share_opts.go index 23700c20a6..b9575f89bf 100644 --- a/validator/storage/share_opts.go +++ b/validator/storage/share_opts.go @@ -9,17 +9,18 @@ import ( // ShareOptions - used to load validator share from config type ShareOptions struct { - NodeID uint64 `yaml:"NodeID" env:"NodeID" env-description:"Local share node ID"` - PublicKey string `yaml:"PublicKey" env:"LOCAL_NODE_ID" env-description:"Local validator public key"` - ShareKey string `yaml:"ShareKey" env:"LOCAL_SHARE_KEY" env-description:"Local share key"` - Committee map[string]int `yaml:"Committee" env:"LOCAL_COMMITTEE" env-description:"Local validator committee array"` + NodeID uint64 `yaml:"NodeID" env:"NodeID" env-description:"Local share node ID"` + PublicKey string `yaml:"PublicKey" env:"LOCAL_NODE_ID" env-description:"Local validator public key"` + ShareKey string `yaml:"ShareKey" env:"LOCAL_SHARE_KEY" env-description:"Local share key"` + Committee map[string]int `yaml:"Committee" env:"LOCAL_COMMITTEE" env-description:"Local validator committee array"` + OwnerAddress string `yaml:"OwnerAddress" env:"LOCAL_OWNER_ADDRESS" env-description:"Local validator owner address"` } // ToShare creates a Share instance from ShareOptions func (options *ShareOptions) ToShare() (*Share, error) { var err error - if len(options.PublicKey) > 0 && len(options.ShareKey) > 0 && len(options.Committee) > 0 { + if len(options.PublicKey) > 0 && len(options.ShareKey) > 0 && len(options.Committee) > 0 && len(options.OwnerAddress) > 0 { validatorPk := &bls.PublicKey{} if err = validatorPk.DeserializeHexStr(options.PublicKey); err != nil { return nil, errors.Wrap(err, "failed to decode validator key") @@ -45,10 +46,11 @@ func (options *ShareOptions) ToShare() (*Share, error) { } share := Share{ - NodeID: options.NodeID, - Metadata: nil, - PublicKey: validatorPk, - Committee: ibftCommittee, + NodeID: options.NodeID, + Metadata: nil, + PublicKey: validatorPk, + Committee: ibftCommittee, + OwnerAddress: options.OwnerAddress, } return &share, nil } diff --git a/validator/storage/share_opts_test.go b/validator/storage/share_opts_test.go index e5ca55245d..1085a13493 100644 --- a/validator/storage/share_opts_test.go +++ b/validator/storage/share_opts_test.go @@ -13,10 +13,11 @@ func TestShareOptionsToShare(t *testing.T) { origShare, sk := generateRandomValidatorShare() shareOpts := ShareOptions{ - ShareKey: sk.SerializeToHexStr(), - PublicKey: sk.GetPublicKey().SerializeToHexStr(), - NodeID: 1, - Committee: map[string]int{}, + ShareKey: sk.SerializeToHexStr(), + PublicKey: sk.GetPublicKey().SerializeToHexStr(), + NodeID: 1, + Committee: map[string]int{}, + OwnerAddress: "0xFeedB14D8b2C76FdF808C29818b06b830E8C2c0e", } t.Run("valid ShareOptions", func(t *testing.T) { @@ -28,6 +29,7 @@ func TestShareOptionsToShare(t *testing.T) { require.NotNil(t, share) require.Equal(t, len(share.Committee), 4) require.Equal(t, share.PublicKey.GetHexString(), origShare.PublicKey.GetHexString()) + require.Equal(t, share.OwnerAddress, origShare.OwnerAddress) }) t.Run("empty ShareOptions", func(t *testing.T) { diff --git a/validator/storage/storage.go b/validator/storage/storage.go index f3dde96a94..187d829b3e 100644 --- a/validator/storage/storage.go +++ b/validator/storage/storage.go @@ -93,20 +93,18 @@ func (s *Collection) GetAllValidatorsShare() ([]*Share, error) { s.lock.RLock() defer s.lock.RUnlock() - objs, err := s.db.GetAllByCollection(collectionPrefix()) - if err != nil { - return nil, errors.Wrap(err, "Failed to get val share") - } var res []*Share - for _, obj := range objs { + + err := s.db.GetAll(collectionPrefix(), func(i int, obj basedb.Obj) error { val, err := (&Share{}).Deserialize(obj) if err != nil { - return nil, errors.Wrap(err, "Failed to deserialize validator") + return errors.Wrap(err, "failed to deserialize validator") } res = append(res, val) - } + return nil + }) - return res, nil + return res, err } // UpdateValidatorMetadata updates the metadata of the given validator diff --git a/validator/storage/storage_test.go b/validator/storage/storage_test.go index d0560ee785..1ec1363db9 100644 --- a/validator/storage/storage_test.go +++ b/validator/storage/storage_test.go @@ -87,8 +87,9 @@ func generateRandomValidatorShare() (*Share, *bls.SecretKey) { } return &Share{ - NodeID: 1, - PublicKey: sk.GetPublicKey(), - Committee: ibftCommittee, + NodeID: 1, + PublicKey: sk.GetPublicKey(), + Committee: ibftCommittee, + OwnerAddress: "0xFeedB14D8b2C76FdF808C29818b06b830E8C2c0e", }, &sk } diff --git a/validator/utils.go b/validator/utils.go index cc1a0b05fa..45e6b190f1 100644 --- a/validator/utils.go +++ b/validator/utils.go @@ -63,6 +63,7 @@ func ShareFromValidatorAddedEvent(validatorAddedEvent abiparser.ValidatorAddedEv if err := validatorShare.PublicKey.Deserialize(validatorAddedEvent.PublicKey); err != nil { return nil, nil, errors.Wrap(err, "failed to deserialize share public key") } + validatorShare.OwnerAddress = validatorAddedEvent.OwnerAddress.String() var shareKey *bls.SecretKey ibftCommittee := map[uint64]*proto.Node{} diff --git a/validator/validator.go b/validator/validator.go index 987e22042b..7d35246c19 100644 --- a/validator/validator.go +++ b/validator/validator.go @@ -3,6 +3,7 @@ package validator import ( "bytes" "context" + "fmt" spec "github.com/attestantio/go-eth2-client/spec/phase0" "github.com/bloxapp/eth2-key-manager/core" "github.com/bloxapp/ssv/beacon" @@ -144,6 +145,33 @@ func (v *Validator) getSlotStartTime(slot uint64) time.Time { return start } +// GetMsgResolver returns proper handler for msg based on msg type +func (v *Validator) GetMsgResolver(networkMsg network.NetworkMsg) func(msg *proto.SignedMessage) { + switch networkMsg { + case network.NetworkMsg_IBFTType: + return v.listenToNetworkMessages + case network.NetworkMsg_DecidedType: + return v.listenToNetworkDecidedMessages + } + return func(msg *proto.SignedMessage) { + v.logger.Warn(fmt.Sprintf("handler type (%s) is not supported", networkMsg)) + } +} + +func (v *Validator) listenToNetworkMessages(msg *proto.SignedMessage) { + v.msgQueue.AddMessage(&network.Message{ + SignedMessage: msg, + Type: network.NetworkMsg_IBFTType, + }) +} + +func (v *Validator) listenToNetworkDecidedMessages(msg *proto.SignedMessage) { + v.msgQueue.AddMessage(&network.Message{ + SignedMessage: msg, + Type: network.NetworkMsg_DecidedType, + }) +} + func setupIbftController( role beacon.RoleType, logger *zap.Logger,