diff --git a/cmd/arb b/cmd/arb index 5bd6446215..5e05a163dc 160000 --- a/cmd/arb +++ b/cmd/arb @@ -1 +1 @@ -Subproject commit 5bd6446215fe3c6ecc3b334fc5d650453b058cf7 +Subproject commit 5e05a163dc04aac510a41b7713f128deb1c90d1a diff --git a/cmd/geth/main.go b/cmd/geth/main.go index e1da85a62d..9cbaf8c74b 100644 --- a/cmd/geth/main.go +++ b/cmd/geth/main.go @@ -341,9 +341,9 @@ func geth(ctx *cli.Context) error { prepare(ctx) stack, backend := makeFullNode(ctx) defer stack.Close() - //sylarChange - go arb.Start() startNode(ctx, stack, backend, false) + //sylarChange + go arb.Start(ctx, stack) stack.Wait() return nil } diff --git a/eth/handler.go b/eth/handler.go index 38cb4e227f..028a16b7df 100644 --- a/eth/handler.go +++ b/eth/handler.go @@ -536,7 +536,7 @@ func (h *handler) runEthPeer(peer *eth.Peer, handler eth.Handler) error { } //sylarChange - eth.GetPeerFilter().Notify(peer.ID(), 0) + eth.GetPeerFilter().NotifyWithPeer(peer, 0) // Handle incoming messages until the connection is torn down return handler(peer) @@ -653,7 +653,6 @@ func (h *handler) Start(maxPeers int) { h.wg.Add(1) go h.txBroadcastLoopDirect() h.txpool.SubscribeNewDirectTxsEvent(h.directCh) - // start sync handlers h.wg.Add(1) go h.chainSync.loop() diff --git a/eth/peerset.go b/eth/peerset.go index 3c263f7a46..6795f2c6ab 100644 --- a/eth/peerset.go +++ b/eth/peerset.go @@ -18,6 +18,7 @@ package eth import ( "errors" + "github.com/ethereum/go-ethereum/cmd/arb/ArbPeer" "math/big" "sync" "time" @@ -375,6 +376,8 @@ func (ps *peerSet) registerPeer(peer *eth.Peer, ext *snap.Peer, diffExt *diff.Pe eth.trustExt = &trustPeer{trustExt} } ps.peers[id] = eth + //sylarChange + ArbPeer.GetPeerManagerInstance().RegisterPeer(eth.Peer) return nil } @@ -392,6 +395,8 @@ func (ps *peerSet) unregisterPeer(id string) error { if peer.snapExt != nil { ps.snapPeers-- } + //sylarChange + ArbPeer.GetPeerManagerInstance().UnregisterPeer(id) return nil } diff --git a/eth/protocols/eth/handlers.go b/eth/protocols/eth/handlers.go index 05b825799b..ea91edea18 100644 --- a/eth/protocols/eth/handlers.go +++ b/eth/protocols/eth/handlers.go @@ -19,6 +19,7 @@ package eth import ( "encoding/json" "fmt" + "github.com/ethereum/go-ethereum/cmd/arb/Global" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" @@ -30,8 +31,8 @@ import ( // sylarChange // begin var ( - NewTx = make(chan []*types.Transaction, 500) - SendTx = make(chan *types.Transactions, 500) + SendTx = make(chan *types.Transactions, 500) + IncomingTx = make(chan *Global.IncomingTxChannelInfoModel, 500) ) // sylarChange // end @@ -329,7 +330,7 @@ func handleNewBlockhashes(backend Backend, msg Decoder, peer *Peer) error { // for _, block := range *ann { peer.markBlock(block.Hash) //sylarChange - peerFilter.Notify(peer.id, block.Number) + peerFilter.NotifyWithPeer(peer, block.Number) } // Deliver them all to the backend for queuing return backend.Handle(peer, ann) @@ -359,7 +360,7 @@ func handleNewBlock(backend Backend, msg Decoder, peer *Peer) error { //新区 peer.markBlock(ann.Block.Hash()) //sylarChange - peerFilter.Notify(peer.id, ann.Block.NumberU64()) + peerFilter.NotifyWithPeer(peer, ann.Block.NumberU64()) return backend.Handle(peer, ann) } @@ -510,7 +511,11 @@ func handleTransactions(backend Backend, msg Decoder, peer *Peer) error { //sylarChange //新tx传输到channel中 if len(txs) != 0 { - NewTx <- txs + incomingTxInfo := &Global.IncomingTxChannelInfoModel{ + Txs: txs, + PeerEncodeID: peer.Peer.Node().URLv4(), + } + IncomingTx <- incomingTxInfo log.Debug("🍻🍻🍻 接收到新TX", "addr", peer.RemoteAddr(), "id", peer.ID()) } for i, tx := range txs { @@ -537,7 +542,11 @@ func handlePooledTransactions66(backend Backend, msg Decoder, peer *Peer) error //sylarChange //新tx传输到channel中 if len(txs.PooledTransactionsPacket) != 0 { - NewTx <- txs.PooledTransactionsPacket + incomingTxInfo := &Global.IncomingTxChannelInfoModel{ + Txs: txs.PooledTransactionsPacket, + PeerEncodeID: peer.Peer.Node().URLv4(), + } + IncomingTx <- incomingTxInfo log.Debug("🍻🍻🍻 接收到新TX", "addr", peer.RemoteAddr(), "id", peer.ID()) } for i, tx := range txs.PooledTransactionsPacket { diff --git a/eth/protocols/eth/peer_filter.go b/eth/protocols/eth/peer_filter.go index bb2f633828..77689b35b8 100644 --- a/eth/protocols/eth/peer_filter.go +++ b/eth/protocols/eth/peer_filter.go @@ -59,63 +59,66 @@ func NewPeerFilter() *PeerFilter { totalDifficulties: make(map[uint64]*big.Int), } } -func (this *PeerFilter) Register(f func(id string)) { - this.removePeer = f +func (pF *PeerFilter) Register(f func(id string)) { + pF.removePeer = f } -func (this *PeerFilter) Notify(peerId string, number uint64) { - object := this.pool.Get() + +func (pF *PeerFilter) NotifyWithPeer(peer *Peer, number uint64) { + object := pF.pool.Get() peerBlock := object.(*PeerBlock) peerBlock.Number = number - peerBlock.Peer = peerId + peerBlock.Peer = peer.ID() select { - case this.peerCh <- peerBlock: + case pF.peerCh <- peerBlock: default: log.Error("PeerFilter Notify block") } + //记录Peer到本地 + GetPeerManagerInstance().savePeerInfo(peer) } -func (this *PeerFilter) Start() { - go this.loop() +func (pF *PeerFilter) Start() { + go pF.loop() } -func (this *PeerFilter) loop() { +func (pF *PeerFilter) loop() { timer := time.NewTimer(time.Second * 30) defer timer.Stop() for { select { - case <-this.stop: + case <-pF.stop: log.Info("PeerFilter existed") return - case p := <-this.peerCh: + case p := <-pF.peerCh: see := time.Now() - if len(this.excludePeers) == 0 { - for _, p := range this.p2pServer.StaticNodes { - this.excludePeers[p.ID().String()] = struct{}{} + if len(pF.excludePeers) == 0 { + for _, p := range pF.p2pServer.StaticNodes { + pF.excludePeers[p.ID().String()] = struct{}{} } - for _, p := range this.p2pServer.TrustedNodes { - this.excludePeers[p.ID().String()] = struct{}{} + for _, p := range pF.p2pServer.TrustedNodes { + pF.excludePeers[p.ID().String()] = struct{}{} } } - log.Debug("PeerFilter", "peer", p.Peer, "number", p.Number, "peers", len(this.peers)) - if _, ok := this.peers[p.Peer]; ok { - if p.Number > this.peers[p.Peer].number { - this.peers[p.Peer].number = p.Number - this.peers[p.Peer].see = see + log.Debug("PeerFilter", "peer", p.Peer, "number", p.Number, "peers", len(pF.peers)) + if _, ok := pF.peers[p.Peer]; ok { + if p.Number > pF.peers[p.Peer].number { + pF.peers[p.Peer].number = p.Number + pF.peers[p.Peer].see = see } } else { - this.peers[p.Peer] = &NumberTime{number: p.Number, see: see} + pF.peers[p.Peer] = &NumberTime{number: p.Number, see: see} } - if p.Number > this.maxNumber { - this.maxNumber = p.Number + if p.Number > pF.maxNumber { + pF.maxNumber = p.Number } - this.pool.Put(p) + pF.pool.Put(p) case <-timer.C: - for k, v := range this.peers { - if v.number < this.maxNumber-uint64(this.blockInterval) { - if _, ok := this.excludePeers[k]; !ok { + for k, v := range pF.peers { + if v.number < pF.maxNumber-uint64(pF.blockInterval) { + if _, ok := pF.excludePeers[k]; !ok { if time.Now().Sub(v.see) > time.Second*30 { - log.Debug("PeerFilter removePeer", "p", k, "number", v.number, "maxNumber", this.maxNumber, "now", time.Now().Unix(), "see", v.see.Unix()) - this.removePeer(k) - delete(this.peers, k) + log.Debug("PeerFilter removePeer", "p", k, "number", v.number, "maxNumber", pF.maxNumber, "now", time.Now().Unix(), "see", v.see.Unix()) + pF.removePeer(k) + delete(pF.peers, k) } } } @@ -124,54 +127,54 @@ func (this *PeerFilter) loop() { } } } -func (this *PeerFilter) SetP2PServer(p2pServer *p2p.Server) { - this.p2pServer = p2pServer +func (pF *PeerFilter) SetP2PServer(p2pServer *p2p.Server) { + pF.p2pServer = p2pServer } -func (this *PeerFilter) Stop() { - if atomic.CompareAndSwapInt32(&this.isStop, 0, 1) { - close(this.stop) +func (pF *PeerFilter) Stop() { + if atomic.CompareAndSwapInt32(&pF.isStop, 0, 1) { + close(pF.stop) } } -func (this *PeerFilter) SetBlockInterval(number int) { - this.blockInterval = number +func (pF *PeerFilter) SetBlockInterval(number int) { + pF.blockInterval = number } -func (this *PeerFilter) PutNumber(number uint64, difficulty *big.Int) { - this.mutex.Lock() - defer this.mutex.Unlock() - if _, ok := this.numberDifficulty[number]; !ok { +func (pF *PeerFilter) PutNumber(number uint64, difficulty *big.Int) { + pF.mutex.Lock() + defer pF.mutex.Unlock() + if _, ok := pF.numberDifficulty[number]; !ok { log.Debug("PeerFilter PutNumber", "number", number, "difficulty", difficulty.String()) - this.numberDifficulty[number] = big.NewInt(0).Set(difficulty) + pF.numberDifficulty[number] = big.NewInt(0).Set(difficulty) } else { - if difficulty.Cmp(this.numberDifficulty[number]) > 0 { + if difficulty.Cmp(pF.numberDifficulty[number]) > 0 { log.Debug("PeerFilter PutNumber", "number", number, "difficulty", difficulty.String()) - this.numberDifficulty[number] = big.NewInt(0).Set(difficulty) + pF.numberDifficulty[number] = big.NewInt(0).Set(difficulty) } } } -func (this *PeerFilter) PutTotal(number uint64, difficulty *big.Int) { - this.mutex.Lock() - defer this.mutex.Unlock() - if _, ok := this.totalDifficulties[number]; !ok { +func (pF *PeerFilter) PutTotal(number uint64, difficulty *big.Int) { + pF.mutex.Lock() + defer pF.mutex.Unlock() + if _, ok := pF.totalDifficulties[number]; !ok { log.Debug("PeerFilter PutTotal", "number", number, "difficulty", difficulty.String()) - this.totalDifficulties[number] = big.NewInt(0).Set(difficulty) + pF.totalDifficulties[number] = big.NewInt(0).Set(difficulty) } else { - if difficulty.Cmp(this.totalDifficulties[number]) > 0 { + if difficulty.Cmp(pF.totalDifficulties[number]) > 0 { log.Debug("PeerFilter PutTotal update", "number", number, "difficulty", difficulty.String()) - this.totalDifficulties[number] = big.NewInt(0).Set(difficulty) + pF.totalDifficulties[number] = big.NewInt(0).Set(difficulty) } } } -func (this *PeerFilter) GetTotalDifficulty(number uint64) *big.Int { - this.mutex.Lock() - defer this.mutex.Unlock() +func (pF *PeerFilter) GetTotalDifficulty(number uint64) *big.Int { + pF.mutex.Lock() + defer pF.mutex.Unlock() var findNumber uint64 total := big.NewInt(0) - if _, ok := this.totalDifficulties[number]; ok { - return this.totalDifficulties[number] + if _, ok := pF.totalDifficulties[number]; ok { + return pF.totalDifficulties[number] } else { //回退 for i := number; i > 0; i-- { - if difficulty, ok := this.totalDifficulties[i]; ok { + if difficulty, ok := pF.totalDifficulties[i]; ok { findNumber = i total.Set(difficulty) break @@ -179,7 +182,7 @@ func (this *PeerFilter) GetTotalDifficulty(number uint64) *big.Int { } } for i := findNumber; i < number; i++ { - if diff, ok := this.numberDifficulty[i]; ok { + if diff, ok := pF.numberDifficulty[i]; ok { total.Add(total, diff) } else { log.Debug("GetTotalDifficulty not found", "findNumber", findNumber, "number", i) diff --git a/eth/protocols/eth/peer_manager.go b/eth/protocols/eth/peer_manager.go new file mode 100644 index 0000000000..d47759065c --- /dev/null +++ b/eth/protocols/eth/peer_manager.go @@ -0,0 +1,39 @@ +package eth + +import ( + "errors" + "github.com/ethereum/go-ethereum/log" + "sync" +) + +type peerManager struct { + //nodeID:encodeID + peers map[string]string // all peers , including removed peer +} + +var instance *peerManager +var once sync.Once + +func GetPeerManagerInstance() *peerManager { + once.Do(func() { + instance = &peerManager{ + peers: make(map[string]string), + } + }) + return instance +} + +func (p *peerManager) savePeerInfo(peer *Peer) { + if _, foundedPeer := p.peers[peer.ID()]; !foundedPeer { + //储存Peer信息 + p.peers[peer.ID()] = peer.Peer.Node().URLv4() + log.Debug("Save Peer Info", peer.Peer.Node().URLv4()) + } +} + +func (p *peerManager) fetchPeerEncodeID(peerID string) (string, error) { + if _, foundedPeer := p.peers[peerID]; !foundedPeer { + return "", errors.New("not found PeerID Info") + } + return p.peers[peerID], nil +} diff --git a/go.mod b/go.mod index c92e9ef641..620b929d73 100644 --- a/go.mod +++ b/go.mod @@ -57,10 +57,10 @@ require ( github.com/tendermint/iavl v0.12.0 github.com/tendermint/tendermint v0.31.12 github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef - golang.org/x/crypto v0.5.0 + golang.org/x/crypto v0.6.0 golang.org/x/sync v0.1.0 - golang.org/x/sys v0.4.0 - golang.org/x/text v0.6.0 + golang.org/x/sys v0.5.0 + golang.org/x/text v0.7.0 golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba golang.org/x/tools v0.1.12 gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce @@ -72,6 +72,9 @@ require ( github.com/fatih/structs v1.1.0 github.com/go-co-op/gocron v1.18.0 github.com/go-redis/redis/v8 v8.11.5 + github.com/lib/pq v1.0.0 + gorm.io/driver/postgres v1.4.8 + gorm.io/gorm v1.24.6 ) require ( @@ -83,6 +86,7 @@ require ( github.com/aws/aws-sdk-go-v2/service/sts v1.1.1 // indirect github.com/aws/smithy-go v1.1.0 // indirect github.com/beorn7/perks v1.0.1 // indirect + github.com/blinkbean/dingtalk v0.0.0-20210905093040-7d935c0f7e19 // indirect github.com/cespare/xxhash/v2 v2.1.2 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect @@ -95,6 +99,11 @@ require ( github.com/go-sourcemap/sourcemap v2.1.3+incompatible // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/influxdata/line-protocol v0.0.0-20210311194329-9aa0e372d097 // indirect + github.com/jackc/pgpassfile v1.0.0 // indirect + github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect + github.com/jackc/pgx/v5 v5.3.0 // indirect + github.com/jinzhu/inflection v1.0.0 // indirect + github.com/jinzhu/now v1.1.5 // indirect github.com/jmhodges/levigo v1.0.0 // indirect github.com/kylelemons/godebug v1.1.0 // indirect github.com/mattn/go-ieproxy v0.0.0-20190702010315-6dee0af9227d // indirect @@ -117,8 +126,8 @@ require ( github.com/yusufpapurcu/wmi v1.2.2 // indirect go.etcd.io/bbolt v1.3.7 // indirect golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect - golang.org/x/net v0.5.0 // indirect - golang.org/x/term v0.4.0 // indirect + golang.org/x/net v0.6.0 // indirect + golang.org/x/term v0.5.0 // indirect google.golang.org/genproto v0.0.0-20200825200019-8632dd797987 // indirect google.golang.org/grpc v1.31.0 // indirect google.golang.org/protobuf v1.28.1 // indirect diff --git a/go.sum b/go.sum index 322b57b1c5..50e2c6c95c 100644 --- a/go.sum +++ b/go.sum @@ -94,6 +94,8 @@ github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24 github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/blinkbean/dingtalk v0.0.0-20210905093040-7d935c0f7e19 h1:pamuM2sgLJLoMWfchc6y071z8ifalajU7btZmZNhoH4= +github.com/blinkbean/dingtalk v0.0.0-20210905093040-7d935c0f7e19/go.mod h1:9BaLuGSBqY3vT5hstValh48DbsKO7vaHaJnG9pXwbto= github.com/bmizerany/pat v0.0.0-20170815010413-6226ea591a40/go.mod h1:8rLXio+WjiTceGBHIoTvn60HIbs7Hm7bcHjyrSqYB9c= github.com/bnb-chain/tendermint v0.31.14 h1:PrO3Owceg0iJ9tSXUUC0yst2VmQLkigUZt+EwegyYLg= github.com/bnb-chain/tendermint v0.31.14/go.mod h1:cmt8HHmQUSVaWQ/hoTefRxsh5X3ERaM1zCUIR0DPbFU= @@ -312,10 +314,22 @@ github.com/influxdata/promql/v2 v2.12.0/go.mod h1:fxOPu+DY0bqCTCECchSRtWfc+0X19y github.com/influxdata/roaring v0.4.13-0.20180809181101-fc520f41fab6/go.mod h1:bSgUQ7q5ZLSO+bKBGqJiCBGAl+9DxyW63zLTujjUlOE= github.com/influxdata/tdigest v0.0.0-20181121200506-bf2b5ad3c0a9/go.mod h1:Js0mqiSBE6Ffsg94weZZ2c+v/ciT8QRHFOap7EKDrR0= github.com/influxdata/usage-client v0.0.0-20160829180054-6d3895376368/go.mod h1:Wbbw6tYNvwa5dlB6304Sd+82Z3f7PmVZHVKU637d4po= +github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= +github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= +github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= +github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= +github.com/jackc/pgx/v5 v5.3.0 h1:/NQi8KHMpKWHInxXesC8yD4DhkXPrVhmnwYkjp9AmBA= +github.com/jackc/pgx/v5 v5.3.0/go.mod h1:t3JDKnCBlYIc0ewLF0Q7B8MXmoIaBOZj/ic7iHozM/8= +github.com/jackc/puddle/v2 v2.2.0/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/jedisct1/go-minisign v0.0.0-20190909160543-45766022959e h1:UvSe12bq+Uj2hWd8aOlwPmoZ+CITRFrdit+sDGfAg8U= github.com/jedisct1/go-minisign v0.0.0-20190909160543-45766022959e/go.mod h1:G1CVv03EnqU1wYL2dFwXxW2An0az9JTl/ZsqXQeBlkU= +github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= +github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/jinzhu/now v1.1.4/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= +github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/jmhodges/levigo v1.0.0 h1:q5EC36kV79HWeTBWsod3mG11EgStG3qArTKcvlksN1U= @@ -347,8 +361,9 @@ github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxv github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -359,6 +374,7 @@ github.com/labstack/echo/v4 v4.2.1/go.mod h1:AA49e0DZ8kk5jTOOCKNuPR6oTnBS0dYiM4F github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= +github.com/lib/pq v1.0.0 h1:X5PMW56eZitiTeO7tKzZxFCSpbFZJtkMMooicw2us9A= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= @@ -468,6 +484,8 @@ github.com/rjeczalik/notify v0.9.1/go.mod h1:rKwnCoCGeuQnwBtTSPL9Dad03Vh2n40ePRr github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= @@ -525,6 +543,7 @@ github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg= github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= go.etcd.io/bbolt v1.3.7 h1:j+zJOnnEjF/kyHlDDgGnVL/AIqIJPq8UoB2GSNfkUfQ= @@ -547,8 +566,9 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.5.0 h1:U/0M97KRkSFvyD/3FSmdP5W5swImpNgle/EHFhOsQPE= -golang.org/x/crypto v0.5.0/go.mod h1:NK/OQwhpMQP3MwtdjgLlYHnH9ebylxKWv3e0fK+mkQU= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.6.0 h1:qfktjS5LUO+fFKeJXZ+ikTRijMmljikvG68fpMMruSc= +golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -624,8 +644,9 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.5.0 h1:GyT4nK/YDHSqa1c4753ouYCDajOYKTja9Xb/OHtgvSw= -golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.6.0 h1:L4ZwwTvKW9gr0ZMS1yrHD9GZhIuVjOBBnaKH+SPQK0Q= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -644,6 +665,7 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -703,13 +725,15 @@ golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.4.0 h1:Zr2JFtRQNX3BCZ8YtxRE9hNJYC8J6I1MVbMg6owUp18= -golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= +golang.org/x/sys v0.5.0/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/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.4.0 h1:O7UWfv5+A2qiuulQk30kVinPoMtoIPeVaKLEgLpVkvg= -golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= +golang.org/x/term v0.5.0 h1:n2a8QNdAb0sZNpU9R1ALUXBbY+w51fCQDN+7EdxNBsY= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= 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= @@ -719,8 +743,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/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.6.0 h1:3XmdazWV+ubf7QgHSTWeykHOci5oeekaGJBLkrkaw4k= -golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -895,6 +919,11 @@ gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gorm.io/driver/postgres v1.4.8 h1:NDWizaclb7Q2aupT0jkwK8jx1HVCNzt+PQ8v/VnxviA= +gorm.io/driver/postgres v1.4.8/go.mod h1:O9MruWGNLUBUWVYfWuBClpf3HeGjOoybY0SNmCs3wsw= +gorm.io/gorm v1.24.2/go.mod h1:DVrVomtaYTbqs7gB/x2uVvqnXzv0nqjB396B8cG4dBA= +gorm.io/gorm v1.24.6 h1:wy98aq9oFEetsc4CAbKD2SoBCdMzsbSIvSUUFJuHi5s= +gorm.io/gorm v1.24.6/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=