Skip to content

Commit

Permalink
[P2P] KISS 2 - Peer discovery [Merge me after #520] - (Issues: #416, #…
Browse files Browse the repository at this point in the history
…429) (#521)

## Description

This PR has been extracted from
#491 and is, hopefully, more
digestible from a code-review and scope point of view.

The main goal is to remove hardcoded nodes and move towards a more
dynamic environment.

It's also highlighting the potential entry points for subsequent P2P
work

The code leverages the abstractions added recently
(`currentHeightProvider` and `addressBookProvider`) to fetch the data
from an RPC endpoint.

## Issue

Fixes #416
Fixes #429

## Type of change

Please mark the relevant option(s):

- [x] New feature, functionality or library
- [ ] Bug fix
- [ ] Code health or cleanup
- [x] Major breaking change
- [ ] Documentation
- [ ] Other <!-- add details here if it a different type of change -->

## List of changes

### CLI

- Updated CLI to use to source the address book and the current height
from the RPC server leveraging the `rpcAddressBookProvider` and
`rpcCurrentHeightProvider` respectively and the `bus` for dependency
injection

### P2P

- Modules embed `base_modules.IntegratableModule` and
`base_modules.InterruptableModule` for DRYness
- Deprecated `debugAddressBookProvider`
- Added `rpcAddressBookProvider` to source the address book from the RPC
server
- Leveraging `bus` for dependency injection of the `addressBookProvider`
and `currentHeightProvider`
- Deprecated `debugCurrentHeightProvider`
- Added `rpcCurrentHeightProvider` to source the current height from the
RPC server
- Fixed raintree to use the `currentHeightProvider` instead of consensus
(that was what we wanted to avoid in the first place)
- Added `getAddrBookDelta` to calculate changes to the address book
between heights and update the internal state and componentry
accordingly
- Reacting to `ConsensusNewHeightEventType` to update the address book 
- Updated tests

### RPC

- Updated RPC to expose the node's address book via GET
/v1/p2p/staked_actors_address_book


## Testing

- [x] `make develop_test`
- [x]
[LocalNet](https://github.com/pokt-network/pocket/blob/main/docs/development/README.md)
w/ all of the steps outlined in the `README`

<!-- REMOVE this comment block after following the instructions
 If you added additional tests or infrastructure, describe it here.
 Bonus points for images and videos or gifs.
-->

## Required Checklist

- [x] I have performed a self-review of my own code
- [x] I have commented my code, particularly in hard-to-understand areas
- [x] I have tested my changes using the available tooling
- [x] I have updated the corresponding CHANGELOG

### If Applicable Checklist

- [ ] I have updated the corresponding README(s); local and/or global
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [ ] I have added, or updated,
[mermaid.js](https://mermaid-js.github.io) diagrams in the corresponding
README(s)
- [ ] I have added, or updated, documentation and
[mermaid.js](https://mermaid-js.github.io) diagrams in `shared/docs/*`
if I updated `shared/*`README(s)

---------

Signed-off-by: Alessandro De Blasis <[email protected]>
Co-authored-by: Dmitry K <[email protected]>
Co-authored-by: Dmitry Knyazev <[email protected]>
Co-authored-by: Daniel Olshansky <[email protected]>
Co-authored-by: Daniel Olshansky <[email protected]>
  • Loading branch information
5 people authored Feb 17, 2023
1 parent d7060b1 commit a90d766
Show file tree
Hide file tree
Showing 35 changed files with 789 additions and 275 deletions.
11 changes: 8 additions & 3 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ go_clean_deps: ## Runs `go mod tidy` && `go mod vendor`

.PHONY: go_lint
go_lint: ## Run all linters that are triggered by the CI pipeline
docker run -t --rm -v $(pwd):/app -w /app golangci/golangci-lint:v1.51.1 golangci-lint run -v
docker run -t --rm -v $(shell pwd):/app -w /app golangci/golangci-lint:v1.51.1 golangci-lint run -v --timeout 2m

.PHONY: gofmt
gofmt: ## Format all the .go files in the project in place.
Expand Down Expand Up @@ -463,11 +463,11 @@ localnet_up: ## Starts up a k8s LocalNet with all necessary dependencies (tl;dr

.PHONY: localnet_client_debug
localnet_client_debug: ## Opens a `client debug` cli to interact with blockchain (e.g. change pacemaker mode, reset to genesis, etc). Though the node binary updates automatiacally on every code change (i.e. hot reloads), if client is already open you need to re-run this command to execute freshly compiled binary.
kubectl exec -it deploy/pocket-v1-cli-client -- client debug
kubectl exec -it deploy/pocket-v1-cli-client --container pocket -- client debug

.PHONY: localnet_shell
localnet_shell: ## Opens a shell in the pod that has the `client` cli available. The binary updates automatically whenever the code changes (i.e. hot reloads).
kubectl exec -it deploy/pocket-v1-cli-client -- /bin/bash
kubectl exec -it deploy/pocket-v1-cli-client --container pocket -- /bin/bash

.PHONY: localnet_logs_validators
localnet_logs_validators: ## Outputs logs from all validators
Expand All @@ -482,6 +482,11 @@ localnet_down: ## Stops LocalNet and cleans up dependencies (tl;dr `tilt down` +
tilt down --file=build/localnet/Tiltfile
kubectl delete pvc --ignore-not-found=true data-dependencies-postgresql-0

.PHONY: localnet_db_cli
localnet_db_cli: ## Open a CLI to the local containerized postgres instancedb_cli:
echo "View schema by running 'SELECT schema_name FROM information_schema.schemata;'"
kubectl exec -it services/dependencies-postgresql -- bash -c "psql postgresql://postgres:LocalNetPassword@localhost"

.PHONY: check_cross_module_imports
check_cross_module_imports: ## Lists cross-module imports
$(eval exclude_common=--exclude=Makefile --exclude-dir=shared --exclude-dir=app --exclude-dir=runtime)
Expand Down
125 changes: 88 additions & 37 deletions app/client/cli/debug.go
Original file line number Diff line number Diff line change
@@ -1,16 +1,19 @@
package cli

import (
"fmt"
"os"

"github.com/manifoldco/promptui"
"github.com/pokt-network/pocket/logger"
"github.com/pokt-network/pocket/p2p"
debugABP "github.com/pokt-network/pocket/p2p/providers/addrbook_provider/debug"
debugCHP "github.com/pokt-network/pocket/p2p/providers/current_height_provider/debug"
"github.com/pokt-network/pocket/p2p/providers/addrbook_provider"
rpcABP "github.com/pokt-network/pocket/p2p/providers/addrbook_provider/rpc"
"github.com/pokt-network/pocket/p2p/providers/current_height_provider"
rpcCHP "github.com/pokt-network/pocket/p2p/providers/current_height_provider/rpc"
"github.com/pokt-network/pocket/p2p/types"
"github.com/pokt-network/pocket/runtime"
coreTypes "github.com/pokt-network/pocket/shared/core/types"
pocketCrypto "github.com/pokt-network/pocket/shared/crypto"
"github.com/pokt-network/pocket/runtime/defaults"
"github.com/pokt-network/pocket/shared/messaging"
"github.com/pokt-network/pocket/shared/modules"
"github.com/spf13/cobra"
Expand Down Expand Up @@ -44,18 +47,27 @@ var (
PromptSendBlockRequest,
}

// validators holds the list of the validators at genesis time so that we can use it to create a debug address book provider.
// Its purpose is to allow the CLI to "discover" the nodes in the network. Since currently we don't have churn and we run nodes only in LocalNet, we can rely on the genesis state.
// HACK(#416): This is a temporary solution that guarantees backward compatibility while we implement peer discovery
validators []*coreTypes.Actor

configPath string = runtime.GetEnv("CONFIG_PATH", "build/config/config1.json")
genesisPath string = runtime.GetEnv("GENESIS_PATH", "build/config/genesis.json")
rpcHost string
)

// NOTE: this is required by the linter, otherwise a simple string constant would have been enough
type cliContextKey string

const busCLICtxKey = "bus"

func init() {
debugCmd := NewDebugCommand()
rootCmd.AddCommand(debugCmd)

// by default, we point at the same endpoint used by the CLI but the debug client is used either in docker-compose of K8S, therefore we cater for overriding
validator1Endpoint := defaults.Validator1EndpointDockerCompose
if runtime.IsProcessRunningInsideKubernetes() {
validator1Endpoint = defaults.Validator1EndpointK8S
}

rpcHost = runtime.GetEnv("RPC_HOST", validator1Endpoint)
}

func NewDebugCommand() *cobra.Command {
Expand All @@ -64,24 +76,32 @@ func NewDebugCommand() *cobra.Command {
Short: "Debug utility for rapid development",
Args: cobra.ExactArgs(0),
PersistentPreRun: func(cmd *cobra.Command, args []string) {
runtimeMgr := runtime.NewManagerFromFiles(configPath, genesisPath, runtime.WithClientDebugMode(), runtime.WithRandomPK())
runtimeMgr := runtime.NewManagerFromFiles(
configPath, genesisPath,
runtime.WithClientDebugMode(),
runtime.WithRandomPK(),
)

bus := runtimeMgr.GetBus()
modulesRegistry := bus.GetModulesRegistry()

// HACK(#416): this is a temporary solution that guarantees backward compatibility while we implement peer discovery.
validators = runtimeMgr.GetGenesis().Validators
rpcUrl := fmt.Sprintf("http://%s:%s", rpcHost, defaults.DefaultRPCPort)

debugAddressBookProvider := debugABP.NewDebugAddrBookProvider(
runtimeMgr.GetConfig().P2P,
debugABP.WithActorsByHeight(
map[int64][]*coreTypes.Actor{
debugABP.ANY_HEIGHT: validators,
},
addressBookProvider := rpcABP.NewRPCAddrBookProvider(
rpcABP.WithP2PConfig(
runtimeMgr.GetConfig().P2P,
),
rpcABP.WithCustomRPCUrl(rpcUrl),
)
modulesRegistry.RegisterModule(addressBookProvider)

debugCurrentHeightProvider := debugCHP.NewDebugCurrentHeightProvider(0)
currentHeightProvider := rpcCHP.NewRPCCurrentHeightProvider(
rpcCHP.WithCustomRPCUrl(rpcUrl),
)
modulesRegistry.RegisterModule(currentHeightProvider)

// TODO(#429): refactor injecting the dependencies into the bus so that they can be consumed in an updated `P2PModule.Create()` implementation
p2pM, err := p2p.CreateWithProviders(runtimeMgr.GetBus(), debugAddressBookProvider, debugCurrentHeightProvider)
setValueInCLIContext(cmd, busCLICtxKey, bus)
p2pM, err := p2p.Create(bus)
if err != nil {
logger.Global.Fatal().Err(err).Msg("Failed to create p2p module")
}
Expand All @@ -98,7 +118,7 @@ func NewDebugCommand() *cobra.Command {
func runDebug(cmd *cobra.Command, args []string) (err error) {
for {
if selection, err := promptGetInput(); err == nil {
handleSelect(selection)
handleSelect(cmd, selection)
} else {
return err
}
Expand Down Expand Up @@ -126,57 +146,57 @@ func promptGetInput() (string, error) {
return result, nil
}

func handleSelect(selection string) {
func handleSelect(cmd *cobra.Command, selection string) {
switch selection {
case PromptResetToGenesis:
m := &messaging.DebugMessage{
Action: messaging.DebugMessageAction_DEBUG_CONSENSUS_RESET_TO_GENESIS,
Message: nil,
}
broadcastDebugMessage(m)
broadcastDebugMessage(cmd, m)
case PromptPrintNodeState:
m := &messaging.DebugMessage{
Action: messaging.DebugMessageAction_DEBUG_CONSENSUS_PRINT_NODE_STATE,
Message: nil,
}
broadcastDebugMessage(m)
broadcastDebugMessage(cmd, m)
case PromptTriggerNextView:
m := &messaging.DebugMessage{
Action: messaging.DebugMessageAction_DEBUG_CONSENSUS_TRIGGER_NEXT_VIEW,
Message: nil,
}
broadcastDebugMessage(m)
broadcastDebugMessage(cmd, m)
case PromptTogglePacemakerMode:
m := &messaging.DebugMessage{
Action: messaging.DebugMessageAction_DEBUG_CONSENSUS_TOGGLE_PACE_MAKER_MODE,
Message: nil,
}
broadcastDebugMessage(m)
broadcastDebugMessage(cmd, m)
case PromptShowLatestBlockInStore:
m := &messaging.DebugMessage{
Action: messaging.DebugMessageAction_DEBUG_SHOW_LATEST_BLOCK_IN_STORE,
Message: nil,
}
sendDebugMessage(m)
sendDebugMessage(cmd, m)
case PromptSendMetadataRequest:
m := &messaging.DebugMessage{
Action: messaging.DebugMessageAction_DEBUG_CONSENSUS_SEND_METADATA_REQ,
Message: nil,
}
broadcastDebugMessage(m)
broadcastDebugMessage(cmd, m)
case PromptSendBlockRequest:
m := &messaging.DebugMessage{
Action: messaging.DebugMessageAction_DEBUG_CONSENSUS_SEND_BLOCK_REQ,
Message: nil,
}
broadcastDebugMessage(m)
broadcastDebugMessage(cmd, m)
default:
logger.Global.Error().Msg("Selection not yet implemented...")
}
}

// Broadcast to the entire validator set
func broadcastDebugMessage(debugMsg *messaging.DebugMessage) {
func broadcastDebugMessage(cmd *cobra.Command, debugMsg *messaging.DebugMessage) {
anyProto, err := anypb.New(debugMsg)
if err != nil {
logger.Global.Fatal().Err(err).Msg("Failed to create Any proto")
Expand All @@ -185,33 +205,40 @@ func broadcastDebugMessage(debugMsg *messaging.DebugMessage) {
// TODO(olshansky): Once we implement the cleanup layer in RainTree, we'll be able to use
// broadcast. The reason it cannot be done right now is because this client is not in the
// address book of the actual validator nodes, so `node1.consensus` never receives the message.
// p2pMod.Broadcast(anyProto, messaging.PocketTopic_DEBUG_TOPIC)
// p2pMod.Broadcast(anyProto)

for _, valAddr := range validators {
addr, err := pocketCrypto.NewAddress(valAddr.GetAddress())
addrBook, err := fetchAddressBook(cmd)
for _, val := range addrBook {
addr := val.Address
if err != nil {
logger.Global.Fatal().Err(err).Msg("Failed to convert validator address into pocketCrypto.Address")
}
if err := p2pMod.Send(addr, anyProto); err != nil {
logger.Global.Fatal().Err(err).Msg("Failed to send debug message")
}
}

}

// Send to just a single (i.e. first) validator in the set
func sendDebugMessage(debugMsg *messaging.DebugMessage) {
func sendDebugMessage(cmd *cobra.Command, debugMsg *messaging.DebugMessage) {
anyProto, err := anypb.New(debugMsg)
if err != nil {
logger.Global.Error().Err(err).Msg("Failed to create Any proto")
}

addrBook, err := fetchAddressBook(cmd)
if err != nil {
logger.Global.Fatal().Msg("Unable to retrieve the addrBook")
}

var validatorAddress []byte
if len(validators) == 0 {
if len(addrBook) == 0 {
logger.Global.Fatal().Msg("No validators found")
}

// if the message needs to be broadcast, it'll be handled by the business logic of the message handler
validatorAddress, err = pocketCrypto.NewAddress(validators[0].GetAddress())
validatorAddress = addrBook[0].Address
if err != nil {
logger.Global.Fatal().Err(err).Msg("Failed to convert validator address into pocketCrypto.Address")
}
Expand All @@ -220,3 +247,27 @@ func sendDebugMessage(debugMsg *messaging.DebugMessage) {
logger.Global.Fatal().Err(err).Msg("Failed to send debug message")
}
}

// fetchAddressBook retrieves the providers from the CLI context and uses them to retrieve the address book for the current height
func fetchAddressBook(cmd *cobra.Command) (types.AddrBook, error) {
bus, ok := getValueFromCLIContext[modules.Bus](cmd, busCLICtxKey)
if !ok || bus == nil {
logger.Global.Fatal().Msg("Unable to retrieve the bus from CLI context")
}
modulesRegistry := bus.GetModulesRegistry()
addrBookProvider, err := modulesRegistry.GetModule(addrbook_provider.ModuleName)
if err != nil {
logger.Global.Fatal().Msg("Unable to retrieve the addrBookProvider")
}
currentHeightProvider, err := modulesRegistry.GetModule(current_height_provider.ModuleName)
if err != nil {
logger.Global.Fatal().Msg("Unable to retrieve the currentHeightProvider")
}

height := currentHeightProvider.(current_height_provider.CurrentHeightProvider).CurrentHeight()
addrBook, err := addrBookProvider.(addrbook_provider.AddrBookProvider).GetStakedAddrBookAtHeight(height)
if err != nil {
logger.Global.Fatal().Msg("Unable to retrieve the addrBook")
}
return addrBook, err
}
9 changes: 9 additions & 0 deletions app/client/cli/utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -187,3 +187,12 @@ func rpcResponseCodeUnhealthy(statusCode int, response []byte) error {
func boldText[T string | []byte](s T) string {
return fmt.Sprintf("\033[1m%s\033[0m", s)
}

func setValueInCLIContext(cmd *cobra.Command, key cliContextKey, value any) {
cmd.SetContext(context.WithValue(cmd.Context(), key, value))
}

func getValueFromCLIContext[T any](cmd *cobra.Command, key cliContextKey) (T, bool) {
value, ok := cmd.Context().Value(key).(T)
return value, ok
}
6 changes: 5 additions & 1 deletion app/client/doc/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

## [0.0.0.14] - 2023-02-17
## [0.0.0.15] - 2023-02-17

- Updated CLI to use to source the address book and the current height from the RPC server leveraging the `rpcAddressBookProvider` and `rpcCurrentHeightProvider` respectively and the `bus` for dependency injection

## [0.0.0.14] - 2023-02-15

- Introduced logical switch to handle parsing of the debug private keys from a local file OR from Kubernetes secret (PR #517)
- Bugfix for `Stake` command. Address erroneously sent instead of the PublicKey. (PR #518)
Expand Down
3 changes: 3 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ require (
require (
github.com/benbjohnson/clock v1.3.0
github.com/celestiaorg/smt v0.2.1-0.20220414134126-dba215ccb884
github.com/deepmap/oapi-codegen v1.12.4
github.com/dgraph-io/badger/v3 v3.2103.2
github.com/getkin/kin-openapi v0.107.0
github.com/jackc/pgconn v1.13.0
Expand Down Expand Up @@ -67,13 +68,15 @@ require (
)

require (
github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect
github.com/beorn7/perks v1.0.1 // indirect
github.com/emicklei/go-restful/v3 v3.9.0 // indirect
github.com/go-logr/logr v1.2.3 // indirect
github.com/go-openapi/jsonreference v0.20.0 // indirect
github.com/google/gnostic v0.5.7-v3refs // indirect
github.com/google/go-cmp v0.5.9 // indirect
github.com/google/gofuzz v1.1.0 // indirect
github.com/google/uuid v1.3.0 // indirect
github.com/gotestyourself/gotestyourself v2.2.0+incompatible // indirect
github.com/inconshreveable/mousetrap v1.0.1 // indirect
github.com/jackc/puddle/v2 v2.1.2 // indirect
Expand Down
10 changes: 10 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -51,18 +51,22 @@ github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
github.com/ProtonMail/go-ecvrf v0.0.1 h1:wv45+kZ0mG4G9oSTMjAlbgKqa4tPbNr4WLoCWqz5/bo=
github.com/ProtonMail/go-ecvrf v0.0.1/go.mod h1:fhZbiRYn62/JGnBG2NGwCx0oT+gr/+I5R/hwiyAFpAU=
github.com/RaveNoX/go-jsoncommentstrip v1.0.0/go.mod h1:78ihd09MekBnJnxpICcwzCMzGrKSKYe4AqU6PDYYpjk=
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
github.com/apapsch/go-jsonmerge/v2 v2.0.0 h1:axGnT1gRIfimI7gJifB699GoE/oq+F2MU7Dml6nw9rQ=
github.com/apapsch/go-jsonmerge/v2 v2.0.0/go.mod h1:lvDnEdqiQrp0O42VQGgmlKpxL1AP2+08jFMw88y4klk=
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A=
github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
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/bmatcuk/doublestar v1.1.1/go.mod h1:UD6OnuiIn0yFxxA2le/rnRU1G4RaI4UvFv1sNto9p6w=
github.com/celestiaorg/smt v0.2.1-0.20220414134126-dba215ccb884 h1:iRNKw2WmAbVgGMNYzDH5Y2yY3+jyxwEK9Hc5pwIjZAE=
github.com/celestiaorg/smt v0.2.1-0.20220414134126-dba215ccb884/go.mod h1:/sdYDakowo/XaxS2Fl7CBqtuf/O2uTqF2zmAUFAtAiw=
github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4=
Expand Down Expand Up @@ -106,6 +110,8 @@ github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxG
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/deepmap/oapi-codegen v1.12.4 h1:pPmn6qI9MuOtCz82WY2Xaw46EQjgvxednXXrP7g5Q2s=
github.com/deepmap/oapi-codegen v1.12.4/go.mod h1:3lgHGMu6myQ2vqbbTXH2H1o4eXFTGnFiDaOaKKl5yas=
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.1.1 h1:6CWw5tJNgpegArSHpNHJKldNeq03FQCwYvfMVWajOK8=
Expand Down Expand Up @@ -240,6 +246,8 @@ github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLe
github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
github.com/google/uuid v1.1.2/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 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g=
Expand Down Expand Up @@ -311,6 +319,7 @@ github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnr
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
github.com/juju/gnuflag v0.0.0-20171113085948-2ce1bb71843d/go.mod h1:2PavIy+JPciBPrBUjwbNvtwB6RQlve+hkpll6QSNmOE=
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
Expand Down Expand Up @@ -483,6 +492,7 @@ github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An
github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s=
github.com/spf13/viper v1.13.0 h1:BWSJ/M+f+3nmdz9bxB+bWX28kkALN2ok11D0rSo8EJU=
github.com/spf13/viper v1.13.0/go.mod h1:Icm2xNL3/8uyh/wFuB1jI7TiTNKp8632Nwegu+zgdYw=
github.com/spkg/bom v0.0.0-20160624110644-59b7046e48ad/go.mod h1:qLr4V1qq6nMqFKkMo8ZTx3f+BZEkzsRUY10Xsm2mwU0=
github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
Expand Down
Loading

0 comments on commit a90d766

Please sign in to comment.