diff --git a/.github/workflows/actions/test-monitor-process-results/action.yml b/.github/workflows/actions/test-monitor-process-results/action.yml index ea62e2f9c20..7565e6ab20e 100644 --- a/.github/workflows/actions/test-monitor-process-results/action.yml +++ b/.github/workflows/actions/test-monitor-process-results/action.yml @@ -42,13 +42,13 @@ runs: uses: 'google-github-actions/setup-gcloud@v2' - name: Upload results to BigQuery (skipped tests) - uses: nick-fields/retry@v2 + uses: nick-fields/retry@v3 with: timeout_minutes: 1 max_attempts: 3 command: bq load --source_format=NEWLINE_DELIMITED_JSON $BIGQUERY_DATASET.$BIGQUERY_TABLE $SKIPPED_TESTS_FILE tools/test_monitor/schemas/skipped_tests_schema.json - name: Upload results to BigQuery (test run) - uses: nick-fields/retry@v2 + uses: nick-fields/retry@v3 with: timeout_minutes: 2 max_attempts: 3 diff --git a/.github/workflows/builds.yml b/.github/workflows/builds.yml index e6932b42a15..29420e2a3a8 100644 --- a/.github/workflows/builds.yml +++ b/.github/workflows/builds.yml @@ -98,12 +98,12 @@ jobs: steps: - name: Setup Go - uses: actions/setup-go@v4 + uses: actions/setup-go@v5 with: go-version: ${{ env.GO_VERSION }} - name: Checkout repo - uses: actions/checkout@v2 + uses: actions/checkout@v4 with: ref: ${{ inputs.tag }} diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index 8d11337f2c9..d9b29547058 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -24,12 +24,12 @@ jobs: environment: Production Docker Registry steps: - name: Setup Go - uses: actions/setup-go@v4 + uses: actions/setup-go@v5 timeout-minutes: 10 # fail fast. sometimes this step takes an extremely long time with: go-version: ${{ env.GO_VERSION }} - name: Checkout repo - uses: actions/checkout@v2 + uses: actions/checkout@v4 with: ref: ${{ inputs.tag }} # Provide Google Service Account credentials to Github Action, allowing interaction with the Google Container Registry diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a5dd0450e55..204731e8f3c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -35,9 +35,9 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repo - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Setup Go - uses: actions/setup-go@v4 + uses: actions/setup-go@v5 timeout-minutes: 10 # fail fast. sometimes this step takes an extremely long time with: go-version: ${{ env.GO_VERSION }} @@ -46,21 +46,19 @@ jobs: run: go generate ./... working-directory: ${{ matrix.dir }} - name: Run golangci-lint - uses: golangci/golangci-lint-action@v3 + uses: golangci/golangci-lint-action@v6 with: # Required: the version of golangci-lint is required and must be specified without patch version: we always use the latest patch version. version: v1.63 args: -v working-directory: ${{ matrix.dir }} - # https://github.com/golangci/golangci-lint-action/issues/244 - skip-cache: true tidy: name: Tidy runs-on: ubuntu-latest steps: - name: Checkout repo - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Setup private build environment if: ${{ vars.PRIVATE_BUILDS_SUPPORTED == 'true' }} @@ -69,7 +67,7 @@ jobs: cadence_deploy_key: ${{ secrets.CADENCE_DEPLOY_KEY }} - name: Setup Go - uses: actions/setup-go@v4 + uses: actions/setup-go@v5 timeout-minutes: 10 # fail fast. sometimes this step takes an extremely long time with: go-version: ${{ env.GO_VERSION }} @@ -86,9 +84,9 @@ jobs: dynamic-matrix: ${{ steps.set-test-matrix.outputs.dynamicMatrix }} steps: - name: Checkout repo - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Setup Go - uses: actions/setup-go@v4 + uses: actions/setup-go@v5 timeout-minutes: 10 # fail fast. sometimes this step takes an extremely long time with: go-version: ${{ env.GO_VERSION }} @@ -104,9 +102,9 @@ jobs: dynamic-matrix: ${{ steps.set-test-matrix.outputs.dynamicMatrix }} steps: - name: Checkout repo - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Setup Go - uses: actions/setup-go@v4 + uses: actions/setup-go@v5 timeout-minutes: 10 # fail fast. sometimes this step takes an extremely long time with: go-version: ${{ env.GO_VERSION }} @@ -122,9 +120,9 @@ jobs: dynamic-matrix: ${{ steps.set-test-matrix.outputs.dynamicMatrix }} steps: - name: Checkout repo - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Setup Go - uses: actions/setup-go@v4 + uses: actions/setup-go@v5 timeout-minutes: 10 # fail fast. sometimes this step takes an extremely long time with: go-version: ${{ env.GO_VERSION }} @@ -144,7 +142,7 @@ jobs: runs-on: ${{ matrix.targets.runner }} steps: - name: Checkout repo - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Setup private build environment if: ${{ vars.PRIVATE_BUILDS_SUPPORTED == 'true' }} @@ -153,7 +151,7 @@ jobs: cadence_deploy_key: ${{ secrets.CADENCE_DEPLOY_KEY }} - name: Setup Go - uses: actions/setup-go@v4 + uses: actions/setup-go@v5 timeout-minutes: 10 # fail fast. sometimes this step takes an extremely long time with: go-version: ${{ env.GO_VERSION }} @@ -161,7 +159,7 @@ jobs: - name: Setup tests (${{ matrix.targets.name }}) run: VERBOSE=1 make -e GO_TEST_PACKAGES="${{ matrix.targets.packages }}" install-tools - name: Run tests (${{ matrix.targets.name }}) - uses: nick-fields/retry@v2 + uses: nick-fields/retry@v3 with: timeout_minutes: 35 max_attempts: 5 @@ -170,7 +168,7 @@ jobs: #env: # RACE_DETECTOR: 1 - name: Upload coverage report - uses: codecov/codecov-action@v4 + uses: codecov/codecov-action@v5 timeout-minutes: 1 continue-on-error: true with: @@ -190,7 +188,7 @@ jobs: runs-on: ${{ matrix.targets.runner }} steps: - name: Checkout repo - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Setup private build environment if: ${{ vars.PRIVATE_BUILDS_SUPPORTED == 'true' }} @@ -199,7 +197,7 @@ jobs: cadence_deploy_key: ${{ secrets.CADENCE_DEPLOY_KEY }} - name: Setup Go - uses: actions/setup-go@v4 + uses: actions/setup-go@v5 timeout-minutes: 10 # fail fast. sometimes this step takes an extremely long time with: go-version: ${{ env.GO_VERSION }} @@ -207,7 +205,7 @@ jobs: - name: Setup tests (${{ matrix.targets.name }}) run: VERBOSE=1 make -e GO_TEST_PACKAGES="${{ matrix.targets.packages }}" install-tools - name: Run tests (${{ matrix.targets.name }}) - uses: nick-fields/retry@v2 + uses: nick-fields/retry@v3 with: timeout_minutes: 35 max_attempts: 5 @@ -216,7 +214,7 @@ jobs: #env: # RACE_DETECTOR: 1 - name: Upload coverage report - uses: codecov/codecov-action@v4 + uses: codecov/codecov-action@v5 timeout-minutes: 1 continue-on-error: true with: @@ -232,7 +230,7 @@ jobs: CADENCE_DEPLOY_KEY: ${{ secrets.CADENCE_DEPLOY_KEY }} steps: - name: Checkout repo - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: # all tags are needed for integration tests fetch-depth: 0 @@ -244,7 +242,7 @@ jobs: cadence_deploy_key: ${{ secrets.CADENCE_DEPLOY_KEY }} - name: Setup Go - uses: actions/setup-go@v4 + uses: actions/setup-go@v5 timeout-minutes: 10 # fail fast. sometimes this step takes an extremely long time with: go-version: ${{ env.GO_VERSION }} @@ -267,7 +265,7 @@ jobs: gcr.io/flow-container-registry/execution-corrupted:latest \ gcr.io/flow-container-registry/verification-corrupted:latest > flow-docker-images.tar - name: Cache Docker images - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: flow-docker-images.tar # use the workflow run id as part of the cache key to ensure these docker images will only be used for a single workflow run @@ -285,7 +283,7 @@ jobs: steps: - name: Checkout repo - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Setup private build environment if: ${{ vars.PRIVATE_BUILDS_SUPPORTED == 'true' }} @@ -294,7 +292,7 @@ jobs: cadence_deploy_key: ${{ secrets.CADENCE_DEPLOY_KEY }} - name: Setup Go - uses: actions/setup-go@v4 + uses: actions/setup-go@v5 timeout-minutes: 10 # fail fast. sometimes this step takes an extremely long time with: go-version: ${{ env.GO_VERSION }} @@ -302,7 +300,7 @@ jobs: - name: Setup tests (${{ matrix.targets.name }}) run: VERBOSE=1 make -e GO_TEST_PACKAGES="${{ matrix.targets.packages }}" install-tools - name: Run tests (${{ matrix.targets.name }}) - uses: nick-fields/retry@v2 + uses: nick-fields/retry@v3 with: timeout_minutes: 35 max_attempts: 5 @@ -311,7 +309,7 @@ jobs: #env: # RACE_DETECTOR: 1 - name: Upload coverage report - uses: codecov/codecov-action@v4 + uses: codecov/codecov-action@v5 timeout-minutes: 1 continue-on-error: true with: @@ -382,7 +380,7 @@ jobs: runs-on: ${{ matrix.runner }} steps: - name: Checkout repo - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: # all tags are needed for integration tests fetch-depth: 0 @@ -394,13 +392,13 @@ jobs: cadence_deploy_key: ${{ secrets.CADENCE_DEPLOY_KEY }} - name: Setup Go - uses: actions/setup-go@v4 + uses: actions/setup-go@v5 timeout-minutes: 10 # fail fast. sometimes this step takes an extremely long time with: go-version: ${{ env.GO_VERSION }} cache: true - name: Load cached Docker images - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: flow-docker-images.tar # use the same cache key as the docker-build job @@ -411,7 +409,7 @@ jobs: # TODO(rbtz): re-enable when we fix exisiting races. #env: # RACE_DETECTOR: 1 - uses: nick-fields/retry@v2 + uses: nick-fields/retry@v3 with: timeout_minutes: 35 max_attempts: 5 diff --git a/.github/workflows/flaky-test-monitor.yml b/.github/workflows/flaky-test-monitor.yml index e6ee0a4585f..96d1d6482fd 100644 --- a/.github/workflows/flaky-test-monitor.yml +++ b/.github/workflows/flaky-test-monitor.yml @@ -37,9 +37,9 @@ jobs: dynamic-matrix: ${{ steps.set-test-matrix.outputs.dynamicMatrix }} steps: - name: Checkout repo - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Setup Go - uses: actions/setup-go@v4 + uses: actions/setup-go@v5 with: go-version: ${{ env.GO_VERSION }} cache: true @@ -58,9 +58,9 @@ jobs: runs-on: ubuntu-20.04 steps: - name: Checkout repo - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Setup Go - uses: actions/setup-go@v4 + uses: actions/setup-go@v5 with: go-version: ${{ env.GO_VERSION }} cache: true @@ -100,9 +100,9 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repo - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Setup Go - uses: actions/setup-go@v4 + uses: actions/setup-go@v5 with: go-version: ${{ env.GO_VERSION }} cache: true @@ -160,12 +160,12 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repo - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: # all tags are needed for integration tests fetch-depth: 0 - name: Setup Go - uses: actions/setup-go@v4 + uses: actions/setup-go@v5 with: go-version: ${{ env.GO_VERSION }} cache: true diff --git a/.github/workflows/tools.yml b/.github/workflows/tools.yml index 1a7327c3ea7..c8042af3d68 100644 --- a/.github/workflows/tools.yml +++ b/.github/workflows/tools.yml @@ -32,11 +32,11 @@ jobs: with: project_id: flow - name: Setup Go - uses: actions/setup-go@v4 + uses: actions/setup-go@v5 with: go-version: ${{ env.GO_VERSION }} - name: Checkout repo - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: # to accurately get the version tag fetch-depth: 0 diff --git a/cmd/access/node_builder/access_node_builder.go b/cmd/access/node_builder/access_node_builder.go index 4c209b15693..b6f3c860d5c 100644 --- a/cmd/access/node_builder/access_node_builder.go +++ b/cmd/access/node_builder/access_node_builder.go @@ -117,7 +117,10 @@ import ( "github.com/onflow/flow-go/state/protocol/blocktimer" "github.com/onflow/flow-go/storage" bstorage "github.com/onflow/flow-go/storage/badger" + "github.com/onflow/flow-go/storage/operation/badgerimpl" + "github.com/onflow/flow-go/storage/operation/pebbleimpl" pstorage "github.com/onflow/flow-go/storage/pebble" + "github.com/onflow/flow-go/storage/store" "github.com/onflow/flow-go/utils/grpcutils" ) @@ -552,8 +555,8 @@ func (builder *FlowAccessNodeBuilder) BuildConsensusFollower() *FlowAccessNodeBu func (builder *FlowAccessNodeBuilder) BuildExecutionSyncComponents() *FlowAccessNodeBuilder { var ds datastore.Batching var bs network.BlobService - var processedBlockHeight storage.ConsumerProgress - var processedNotifications storage.ConsumerProgress + var processedBlockHeight storage.ConsumerProgressInitializer + var processedNotifications storage.ConsumerProgressInitializer var bsDependable *module.ProxiedReadyDoneAware var execDataDistributor *edrequester.ExecutionDataDistributor var execDataCacheBackend *herocache.BlockExecutionData @@ -607,21 +610,30 @@ func (builder *FlowAccessNodeBuilder) BuildExecutionSyncComponents() *FlowAccess Module("processed block height consumer progress", func(node *cmd.NodeConfig) error { // Note: progress is stored in the datastore's DB since that is where the jobqueue // writes execution data to. - if executionDataDBMode == execution_data.ExecutionDataDBModeBadger { - processedBlockHeight = bstorage.NewConsumerProgress(builder.ExecutionDatastoreManager.DB().(*badger.DB), module.ConsumeProgressExecutionDataRequesterBlockHeight) + var db storage.DB + edmdb := builder.ExecutionDatastoreManager.DB() + + if bdb, ok := edmdb.(*badger.DB); ok { + db = badgerimpl.ToDB(bdb) + } else if pdb, ok := edmdb.(*pebble.DB); ok { + db = pebbleimpl.ToDB(pdb) } else { - processedBlockHeight = pstorage.NewConsumerProgress(builder.ExecutionDatastoreManager.DB().(*pebble.DB), module.ConsumeProgressExecutionDataRequesterBlockHeight) + return fmt.Errorf("unsupported execution data DB type: %T", edmdb) } + + processedBlockHeight = store.NewConsumerProgress(db, module.ConsumeProgressExecutionDataRequesterBlockHeight) return nil }). Module("processed notifications consumer progress", func(node *cmd.NodeConfig) error { // Note: progress is stored in the datastore's DB since that is where the jobqueue // writes execution data to. + var db storage.DB if executionDataDBMode == execution_data.ExecutionDataDBModeBadger { - processedNotifications = bstorage.NewConsumerProgress(builder.ExecutionDatastoreManager.DB().(*badger.DB), module.ConsumeProgressExecutionDataRequesterNotification) + db = badgerimpl.ToDB(builder.ExecutionDatastoreManager.DB().(*badger.DB)) } else { - processedNotifications = pstorage.NewConsumerProgress(builder.ExecutionDatastoreManager.DB().(*pebble.DB), module.ConsumeProgressExecutionDataRequesterNotification) + db = pebbleimpl.ToDB(builder.ExecutionDatastoreManager.DB().(*pebble.DB)) } + processedNotifications = store.NewConsumerProgress(db, module.ConsumeProgressExecutionDataRequesterNotification) return nil }). Module("blobservice peer manager dependencies", func(node *cmd.NodeConfig) error { @@ -848,7 +860,7 @@ func (builder *FlowAccessNodeBuilder) BuildExecutionSyncComponents() *FlowAccess } if builder.executionDataIndexingEnabled { - var indexedBlockHeight storage.ConsumerProgress + var indexedBlockHeight storage.ConsumerProgressInitializer builder. AdminCommand("execute-script", func(config *cmd.NodeConfig) commands.AdminCommand { @@ -856,7 +868,7 @@ func (builder *FlowAccessNodeBuilder) BuildExecutionSyncComponents() *FlowAccess }). Module("indexed block height consumer progress", func(node *cmd.NodeConfig) error { // Note: progress is stored in the MAIN db since that is where indexed execution data is stored. - indexedBlockHeight = bstorage.NewConsumerProgress(builder.DB, module.ConsumeProgressExecutionDataIndexerBlockHeight) + indexedBlockHeight = store.NewConsumerProgress(badgerimpl.ToDB(builder.DB), module.ConsumeProgressExecutionDataIndexerBlockHeight) return nil }). Module("transaction results storage", func(node *cmd.NodeConfig) error { @@ -1633,8 +1645,8 @@ func (builder *FlowAccessNodeBuilder) enqueueRelayNetwork() { } func (builder *FlowAccessNodeBuilder) Build() (cmd.Node, error) { - var processedFinalizedBlockHeight storage.ConsumerProgress - var processedTxErrorMessagesBlockHeight storage.ConsumerProgress + var processedFinalizedBlockHeight storage.ConsumerProgressInitializer + var processedTxErrorMessagesBlockHeight storage.ConsumerProgressInitializer if builder.executionDataSyncEnabled { builder.BuildExecutionSyncComponents() @@ -1838,17 +1850,18 @@ func (builder *FlowAccessNodeBuilder) Build() (cmd.Node, error) { return nil }). Module("processed finalized block height consumer progress", func(node *cmd.NodeConfig) error { - processedFinalizedBlockHeight = bstorage.NewConsumerProgress(builder.DB, module.ConsumeProgressIngestionEngineBlockHeight) + processedFinalizedBlockHeight = store.NewConsumerProgress(badgerimpl.ToDB(builder.DB), module.ConsumeProgressIngestionEngineBlockHeight) return nil }). Module("processed last full block height monotonic consumer progress", func(node *cmd.NodeConfig) error { rootBlockHeight := node.State.Params().FinalizedRoot().Height - var err error - lastFullBlockHeight, err = counters.NewPersistentStrictMonotonicCounter( - bstorage.NewConsumerProgress(builder.DB, module.ConsumeProgressLastFullBlockHeight), - rootBlockHeight, - ) + progress, err := store.NewConsumerProgress(badgerimpl.ToDB(builder.DB), module.ConsumeProgressLastFullBlockHeight).Initialize(rootBlockHeight) + if err != nil { + return err + } + + lastFullBlockHeight, err = counters.NewPersistentStrictMonotonicCounter(progress) if err != nil { return fmt.Errorf("failed to initialize monotonic consumer progress: %w", err) } @@ -2149,8 +2162,8 @@ func (builder *FlowAccessNodeBuilder) Build() (cmd.Node, error) { if builder.storeTxResultErrorMessages { builder.Module("processed error messages block height consumer progress", func(node *cmd.NodeConfig) error { - processedTxErrorMessagesBlockHeight = bstorage.NewConsumerProgress( - builder.DB, + processedTxErrorMessagesBlockHeight = store.NewConsumerProgress( + badgerimpl.ToDB(builder.DB), module.ConsumeProgressEngineTxErrorMessagesBlockHeight, ) return nil @@ -2349,6 +2362,7 @@ func (builder *FlowAccessNodeBuilder) initPublicLibp2pNode(networkKey crypto.Pri &p2pbuilderconfig.UnicastConfig{ Unicast: builder.FlowConfig.NetworkConfig.Unicast, }). + SetProtocolPeerCacheList(protocols.FlowProtocolID(builder.SporkID)). SetBasicResolver(builder.Resolver). SetSubscriptionFilter(networkingsubscription.NewRoleBasedFilter(flow.RoleAccess, builder.IdentityProvider)). SetConnectionManager(connManager). diff --git a/cmd/execution_builder.go b/cmd/execution_builder.go index f49bc3a1adc..32ca366f5ea 100644 --- a/cmd/execution_builder.go +++ b/cmd/execution_builder.go @@ -528,6 +528,10 @@ func (exeNode *ExecutionNode) LoadProviderEngine( node.FvmOptions..., ) + opts = append(opts, computation.DefaultFVMOptions( + node.RootChainID, + exeNode.exeConf.computationConfig.CadenceTracing, + exeNode.exeConf.computationConfig.ExtensiveTracing)...) vmCtx := fvm.NewContext(opts...) var collector module.ExecutionMetrics diff --git a/cmd/observer/node_builder/observer_builder.go b/cmd/observer/node_builder/observer_builder.go index 6829b115060..0ced9001d4b 100644 --- a/cmd/observer/node_builder/observer_builder.go +++ b/cmd/observer/node_builder/observer_builder.go @@ -108,7 +108,10 @@ import ( "github.com/onflow/flow-go/state/protocol/events/gadgets" "github.com/onflow/flow-go/storage" bstorage "github.com/onflow/flow-go/storage/badger" + "github.com/onflow/flow-go/storage/operation/badgerimpl" + "github.com/onflow/flow-go/storage/operation/pebbleimpl" pstorage "github.com/onflow/flow-go/storage/pebble" + "github.com/onflow/flow-go/storage/store" "github.com/onflow/flow-go/utils/grpcutils" "github.com/onflow/flow-go/utils/io" ) @@ -1057,8 +1060,8 @@ func (builder *ObserverServiceBuilder) Build() (cmd.Node, error) { func (builder *ObserverServiceBuilder) BuildExecutionSyncComponents() *ObserverServiceBuilder { var ds datastore.Batching var bs network.BlobService - var processedBlockHeight storage.ConsumerProgress - var processedNotifications storage.ConsumerProgress + var processedBlockHeight storage.ConsumerProgressInitializer + var processedNotifications storage.ConsumerProgressInitializer var publicBsDependable *module.ProxiedReadyDoneAware var execDataDistributor *edrequester.ExecutionDataDistributor var execDataCacheBackend *herocache.BlockExecutionData @@ -1112,21 +1115,26 @@ func (builder *ObserverServiceBuilder) BuildExecutionSyncComponents() *ObserverS Module("processed block height consumer progress", func(node *cmd.NodeConfig) error { // Note: progress is stored in the datastore's DB since that is where the jobqueue // writes execution data to. + var db storage.DB if executionDataDBMode == execution_data.ExecutionDataDBModeBadger { - processedBlockHeight = bstorage.NewConsumerProgress(builder.ExecutionDatastoreManager.DB().(*badger.DB), module.ConsumeProgressExecutionDataRequesterBlockHeight) + db = badgerimpl.ToDB(builder.ExecutionDatastoreManager.DB().(*badger.DB)) } else { - processedBlockHeight = pstorage.NewConsumerProgress(builder.ExecutionDatastoreManager.DB().(*pebble.DB), module.ConsumeProgressExecutionDataRequesterBlockHeight) + db = pebbleimpl.ToDB(builder.ExecutionDatastoreManager.DB().(*pebble.DB)) } + + processedBlockHeight = store.NewConsumerProgress(db, module.ConsumeProgressExecutionDataRequesterBlockHeight) return nil }). Module("processed notifications consumer progress", func(node *cmd.NodeConfig) error { // Note: progress is stored in the datastore's DB since that is where the jobqueue // writes execution data to. + var db storage.DB if executionDataDBMode == execution_data.ExecutionDataDBModeBadger { - processedNotifications = bstorage.NewConsumerProgress(builder.ExecutionDatastoreManager.DB().(*badger.DB), module.ConsumeProgressExecutionDataRequesterNotification) + db = badgerimpl.ToDB(builder.ExecutionDatastoreManager.DB().(*badger.DB)) } else { - processedNotifications = pstorage.NewConsumerProgress(builder.ExecutionDatastoreManager.DB().(*pebble.DB), module.ConsumeProgressExecutionDataRequesterNotification) + db = pebbleimpl.ToDB(builder.ExecutionDatastoreManager.DB().(*pebble.DB)) } + processedNotifications = store.NewConsumerProgress(db, module.ConsumeProgressExecutionDataRequesterNotification) return nil }). Module("blobservice peer manager dependencies", func(node *cmd.NodeConfig) error { @@ -1311,11 +1319,11 @@ func (builder *ObserverServiceBuilder) BuildExecutionSyncComponents() *ObserverS return builder.ExecutionDataPruner, nil }) if builder.executionDataIndexingEnabled { - var indexedBlockHeight storage.ConsumerProgress + var indexedBlockHeight storage.ConsumerProgressInitializer builder.Module("indexed block height consumer progress", func(node *cmd.NodeConfig) error { // Note: progress is stored in the MAIN db since that is where indexed execution data is stored. - indexedBlockHeight = bstorage.NewConsumerProgress(builder.DB, module.ConsumeProgressExecutionDataIndexerBlockHeight) + indexedBlockHeight = store.NewConsumerProgress(badgerimpl.ToDB(builder.DB), module.ConsumeProgressExecutionDataIndexerBlockHeight) return nil }).Module("transaction results storage", func(node *cmd.NodeConfig) error { builder.Storage.LightTransactionResults = bstorage.NewLightTransactionResults(node.Metrics.Cache, node.DB, bstorage.DefaultCacheSize) diff --git a/cmd/scaffold.go b/cmd/scaffold.go index ad94c641f3f..8c02355976a 100644 --- a/cmd/scaffold.go +++ b/cmd/scaffold.go @@ -568,6 +568,7 @@ func (fnb *FlowNodeBuilder) BuildPublicLibp2pNode(address string, bootstrapIdent &p2pbuilderconfig.UnicastConfig{ Unicast: fnb.FlowConfig.NetworkConfig.Unicast, }). + SetProtocolPeerCacheList(protocols.FlowProtocolID(fnb.SporkID)). SetSubscriptionFilter( subscription.NewRoleBasedFilter( subscription.UnstakedRole, fnb.IdentityProvider, diff --git a/cmd/util/cmd/check-storage/cmd.go b/cmd/util/cmd/check-storage/cmd.go index 8b8e08b2d26..9a97969c8c4 100644 --- a/cmd/util/cmd/check-storage/cmd.go +++ b/cmd/util/cmd/check-storage/cmd.go @@ -2,7 +2,9 @@ package check_storage import ( "context" + "fmt" + "github.com/onflow/atree" "github.com/onflow/cadence/interpreter" "github.com/rs/zerolog/log" "github.com/spf13/cobra" @@ -22,12 +24,14 @@ import ( ) var ( - flagPayloads string - flagState string - flagStateCommitment string - flagOutputDirectory string - flagChain string - flagNWorker int + flagPayloads string + flagState string + flagStateCommitment string + flagOutputDirectory string + flagChain string + flagNWorker int + flagHasAccountFormatV1 bool + flagHasAccountFormatV2 bool ) var ( @@ -94,6 +98,20 @@ func init() { "Chain name", ) _ = Cmd.MarkFlagRequired("chain") + + Cmd.Flags().BoolVar( + &flagHasAccountFormatV1, + "account-format-v1", + false, + "State contains accounts in v1 format", + ) + + Cmd.Flags().BoolVar( + &flagHasAccountFormatV2, + "account-format-v2", + false, + "State contains accounts in v2 format", + ) } func run(*cobra.Command, []string) { @@ -110,6 +128,9 @@ func run(*cobra.Command, []string) { if flagState != "" && flagStateCommitment == "" { log.Fatal().Msg("--state-commitment must be provided when --state is provided") } + if !flagHasAccountFormatV1 && !flagHasAccountFormatV2 { + log.Fatal().Msg("both of or one of --account-format-v1 and --account-format-v2 must be true") + } // Get EVM account by chain evmAccount = systemcontracts.SystemContractsForChain(chainID).EVMStorage.Address @@ -323,7 +344,30 @@ func checkAccountStorageHealth(accountRegisters *registers.AccountRegisters, nWo // Check atree storage health ledger := ®isters.ReadOnlyLedger{Registers: accountRegisters} - storage := runtime.NewStorage(ledger, nil, runtime.StorageConfig{}) + var config runtime.StorageConfig + if flagHasAccountFormatV2 { + config.StorageFormatV2Enabled = true + } + storage := runtime.NewStorage(ledger, nil, config) + + // Check account format against specified flags. + err = checkAccountFormat( + ledger, + address, + flagHasAccountFormatV1, + flagHasAccountFormatV2, + ) + if err != nil { + issues = append( + issues, + accountStorageIssue{ + Address: address.Hex(), + Kind: storageErrorKindString[storageFormatErrorKind], + Msg: err.Error(), + }, + ) + return issues + } inter, err := interpreter.NewInterpreter( nil, @@ -367,6 +411,7 @@ const ( otherErrorKind storageErrorKind = iota cadenceAtreeStorageErrorKind evmAtreeStorageErrorKind + storageFormatErrorKind ) var storageErrorKindString = map[storageErrorKind]string{ @@ -380,3 +425,65 @@ type accountStorageIssue struct { Kind string Msg string } + +func hasDomainRegister(ledger atree.Ledger, address common.Address) (bool, error) { + for _, domain := range common.AllStorageDomains { + value, err := ledger.GetValue(address[:], []byte(domain.Identifier())) + if err != nil { + return false, err + } + if len(value) > 0 { + return true, nil + } + } + + return false, nil +} + +func hasAccountRegister(ledger atree.Ledger, address common.Address) (bool, error) { + value, err := ledger.GetValue(address[:], []byte(runtime.AccountStorageKey)) + if err != nil { + return false, err + } + return len(value) > 0, nil +} + +func checkAccountFormat( + ledger atree.Ledger, + address common.Address, + expectV1 bool, + expectV2 bool, +) error { + // Skip empty address because it doesn't have any account or domain registers. + if len(address) == 0 || address == common.ZeroAddress { + return nil + } + + foundDomainRegister, err := hasDomainRegister(ledger, address) + if err != nil { + return err + } + + foundAccountRegister, err := hasAccountRegister(ledger, address) + if err != nil { + return err + } + + if !foundAccountRegister && !foundDomainRegister { + return fmt.Errorf("found neither domain nor account registers") + } + + if foundAccountRegister && foundDomainRegister { + return fmt.Errorf("found both domain and account registers") + } + + if foundAccountRegister && !expectV2 { + return fmt.Errorf("found account in format v2 while only expect account in format v1") + } + + if foundDomainRegister && !expectV1 { + return fmt.Errorf("found account in format v1 while only expect account in format v2") + } + + return nil +} diff --git a/cmd/util/cmd/check-storage/evm_account_storage_health.go b/cmd/util/cmd/check-storage/evm_account_storage_health.go index 1a791438afa..1d96e3dd002 100644 --- a/cmd/util/cmd/check-storage/evm_account_storage_health.go +++ b/cmd/util/cmd/check-storage/evm_account_storage_health.go @@ -70,7 +70,7 @@ func checkCadenceAtreeRegistersInEVMAccount( ) []accountStorageIssue { var issues []accountStorageIssue - storage := runtime.NewStorage(ledger, nil, runtime.StorageConfig{}) + storage := runtime.NewStorage(ledger, nil, runtime.StorageConfig{StorageFormatV2Enabled: true}) inter, err := interpreter.NewInterpreter( nil, diff --git a/cmd/util/cmd/checkpoint-collect-stats/account_stats.go b/cmd/util/cmd/checkpoint-collect-stats/account_stats.go new file mode 100644 index 00000000000..2fc2a0bd1d2 --- /dev/null +++ b/cmd/util/cmd/checkpoint-collect-stats/account_stats.go @@ -0,0 +1,101 @@ +package checkpoint_collect_stats + +import ( + "cmp" + "slices" + + "github.com/rs/zerolog/log" + + "github.com/onflow/flow-go/fvm/systemcontracts" + "github.com/onflow/flow-go/model/flow" +) + +type accountFormat uint8 + +const ( + accountFormatUnknown accountFormat = iota + accountFormatV1 + accountFormatV2 +) + +func (format accountFormat) MarshalJSON() ([]byte, error) { + switch format { + case accountFormatV1: + return []byte("\"v1\""), nil + + case accountFormatV2: + return []byte("\"v2\""), nil + + default: + return []byte("\"unknown\""), nil + } +} + +type AccountStats struct { + stats + FormatV1Count int `json:"account_format_v1_count"` + FormatV2Count int `json:"account_format_v2_count"` + ServiceAccount *AccountInfo `json:"service_account,omitempty"` + EVMAccount *AccountInfo `json:"evm_account,omitempty"` + TopN []*AccountInfo `json:"largest_accounts"` +} + +type AccountInfo struct { + Address string `json:"address"` + Format accountFormat `json:"account_format"` + PayloadCount uint64 `json:"payload_count"` + PayloadSize uint64 `json:"payload_size"` +} + +func getAccountStatus( + chainID flow.ChainID, + accounts map[string]*AccountInfo, +) AccountStats { + accountsSlice := make([]*AccountInfo, 0, len(accounts)) + accountSizesSlice := make([]float64, 0, len(accounts)) + + var accountFormatV1Count, accountFormatV2Count int + + for _, acct := range accounts { + accountsSlice = append(accountsSlice, acct) + accountSizesSlice = append(accountSizesSlice, float64(acct.PayloadSize)) + + switch acct.Format { + case accountFormatV1: + accountFormatV1Count++ + + case accountFormatV2: + accountFormatV2Count++ + + default: + if acct.Address != "" { + log.Info().Msgf("found account without account register nor domain register: %x", acct.Address) + } + } + } + + // Sort accounts by payload size in descending order + slices.SortFunc(accountsSlice, func(a, b *AccountInfo) int { + return cmp.Compare(b.PayloadSize, a.PayloadSize) + }) + + stats := getValueStats(accountSizesSlice, percentiles) + + evmAccountAddress := systemcontracts.SystemContractsForChain(chainID).EVMStorage.Address + + serviceAccountAddress := serviceAccountAddressForChain(chainID) + + return AccountStats{ + stats: stats, + FormatV1Count: accountFormatV1Count, + FormatV2Count: accountFormatV2Count, + ServiceAccount: accounts[string(serviceAccountAddress[:])], + EVMAccount: accounts[string(evmAccountAddress[:])], + TopN: accountsSlice[:flagTopN], + } +} + +func serviceAccountAddressForChain(chainID flow.ChainID) flow.Address { + sc := systemcontracts.SystemContractsForChain(chainID) + return sc.FlowServiceAccount.Address +} diff --git a/cmd/util/cmd/checkpoint-collect-stats/cmd.go b/cmd/util/cmd/checkpoint-collect-stats/cmd.go index 30dd72dcf27..19038d63bc1 100644 --- a/cmd/util/cmd/checkpoint-collect-stats/cmd.go +++ b/cmd/util/cmd/checkpoint-collect-stats/cmd.go @@ -8,7 +8,6 @@ import ( "strings" "sync" - "github.com/montanaflynn/stats" "github.com/onflow/cadence/common" "github.com/pkg/profile" "github.com/rs/zerolog" @@ -22,7 +21,6 @@ import ( "github.com/onflow/flow-go/cmd/util/ledger/util" "github.com/onflow/flow-go/fvm/evm/emulator/state" "github.com/onflow/flow-go/fvm/evm/handler" - "github.com/onflow/flow-go/fvm/systemcontracts" "github.com/onflow/flow-go/ledger" "github.com/onflow/flow-go/ledger/common/pathfinder" "github.com/onflow/flow-go/ledger/complete" @@ -48,6 +46,12 @@ const ( accountStatsReportName = "account-stats" ) +const ( + // NOTE: this constant is defined in github.com/onflow/cadence/runtime/storage.go + // Use this contant directly from cadence runtime package after dependency is updated. + AccountStorageKey = "stored" +) + const ( domainTypePrefix = "domain " payloadChannelBufferSize = 100_000 @@ -60,6 +64,10 @@ const ( blockHashListBucketKeyPrefix = "BlockHashListBucket" ) +// percentiles are Tukey's seven-number summary (without +// the 0 and 100 because min and max are always included). +var percentiles = []float64{12.5, 25.0, 50.0, 75.0, 87.5} + var Cmd = &cobra.Command{ Use: "checkpoint-collect-stats", Short: "collects stats on tries stored in a checkpoint, or payloads from a payloads file", @@ -96,7 +104,7 @@ func init() { "Enable memory profiling") } -type Stats struct { +type LedgerStats struct { LedgerStats *complete.LedgerStats `json:",omitempty"` PayloadStats *PayloadStats } @@ -110,17 +118,9 @@ type PayloadStats struct { } type RegisterStatsByTypes struct { - Type string `json:"type"` - Counts uint64 `json:"counts"` - ValueSizeTotal float64 `json:"value_size_total"` - ValueSizeMin float64 `json:"value_size_min"` - ValueSize25thPercentile float64 `json:"value_size_25th_percentile"` - ValueSizeMedian float64 `json:"value_size_median"` - ValueSize75thPercentile float64 `json:"value_size_75th_percentile"` - ValueSize95thPercentile float64 `json:"value_size_95th_percentile"` - ValueSize99thPercentile float64 `json:"value_size_99th_percentile"` - ValueSizeMax float64 `json:"value_size_max"` - SubTypes []RegisterStatsByTypes `json:"subtypes,omitempty"` + Type string `json:"type"` + stats + SubTypes []RegisterStatsByTypes `json:"subtypes,omitempty"` } type PayloadInfo struct { @@ -130,26 +130,6 @@ type PayloadInfo struct { Size uint64 `json:"size"` } -type AccountStats struct { - AccountCount uint64 `json:"total_account_count"` - AccountSizeMin float64 `json:"account_size_min"` - AccountSize25thPercentile float64 `json:"account_size_25th_percentile"` - AccountSizeMedian float64 `json:"account_size_median"` - AccountSize75thPercentile float64 `json:"account_size_75th_percentile"` - AccountSize95thPercentile float64 `json:"account_size_95th_percentile"` - AccountSize99thPercentile float64 `json:"account_size_99th_percentile"` - AccountSizeMax float64 `json:"account_size_max"` - ServiceAccount *AccountInfo `json:"service_account,omitempty"` - EVMAccount *AccountInfo `json:"evm_account,omitempty"` - TopN []*AccountInfo `json:"largest_accounts"` -} - -type AccountInfo struct { - Address string `json:"address"` - PayloadCount uint64 `json:"payload_count"` - PayloadSize uint64 `json:"payload_size"` -} - type sizesByType map[string][]float64 func run(*cobra.Command, []string) { @@ -211,7 +191,7 @@ func run(*cobra.Command, []string) { totalPayloadCount++ // Update payload sizes by type - typ := getType(key) + typ := getRegisterType(key) valueSizesByType[typ] = append(valueSizesByType[typ], float64(valueSize)) // Update top N largest payloads @@ -233,6 +213,21 @@ func run(*cobra.Command, []string) { } account.PayloadCount++ account.PayloadSize += uint64(size) + + // Update account format + if isAccountRegister(key) { + if account.Format == accountFormatV1 { + log.Error().Msgf("found account register while domain register exists for %x", address) + } else { + account.Format = accountFormatV2 + } + } else if isDomainRegister(key) { + if account.Format == accountFormatV2 { + log.Error().Msgf("found domain register while account register exists for %x", address) + } else { + account.Format = accountFormatV1 + } + } } // At this point, all payload are processed. @@ -246,14 +241,14 @@ func run(*cobra.Command, []string) { go func() { defer wg.Done() - statsByTypes := getStats(valueSizesByType) + statsByTypes := getRegisterStats(valueSizesByType) // Sort top N largest payloads by payload size in descending order slices.SortFunc(largestPayloads.Tree, func(a, b PayloadInfo) int { return cmp.Compare(b.Size, a.Size) }) - stats := &Stats{ + stats := &LedgerStats{ LedgerStats: ledgerStats, PayloadStats: &PayloadStats{ TotalPayloadCount: totalPayloadCount, @@ -271,38 +266,7 @@ func run(*cobra.Command, []string) { go func() { defer wg.Done() - accountsSlice := make([]*AccountInfo, 0, len(accounts)) - accountSizesSlice := make([]float64, 0, len(accounts)) - - for _, acct := range accounts { - accountsSlice = append(accountsSlice, acct) - accountSizesSlice = append(accountSizesSlice, float64(acct.PayloadSize)) - } - - // Sort accounts by payload size in descending order - slices.SortFunc(accountsSlice, func(a, b *AccountInfo) int { - return cmp.Compare(b.PayloadSize, a.PayloadSize) - }) - - stats := getTypeStats("", accountSizesSlice) - - evmAccountAddress := systemcontracts.SystemContractsForChain(chainID).EVMStorage.Address - - serviceAccountAddress := serviceAccountAddressForChain(chainID) - - acctStats := &AccountStats{ - AccountCount: uint64(len(accountsSlice)), - ServiceAccount: accounts[string(serviceAccountAddress[:])], - EVMAccount: accounts[string(evmAccountAddress[:])], - TopN: accountsSlice[:flagTopN], - AccountSizeMin: stats.ValueSizeMin, - AccountSize25thPercentile: stats.ValueSize25thPercentile, - AccountSizeMedian: stats.ValueSizeMedian, - AccountSize75thPercentile: stats.ValueSize75thPercentile, - AccountSize95thPercentile: stats.ValueSize95thPercentile, - AccountSize99thPercentile: stats.ValueSize99thPercentile, - AccountSizeMax: stats.ValueSizeMax, - } + acctStats := getAccountStatus(chainID, accounts) writeStats(accountStatsReportName, acctStats) }() @@ -405,69 +369,17 @@ func getPayloadStatsFromCheckpoint(payloadCallBack func(payload *ledger.Payload) return ledgerStats } -func getTypeStats(t string, values []float64) RegisterStatsByTypes { - sum, err := stats.Sum(values) - if err != nil { - log.Fatal().Err(err).Msg("cannot compute the sum of values") - } - - min, err := stats.Min(values) - if err != nil { - log.Fatal().Err(err).Msg("cannot compute the min of values") - } - - percentile25, err := stats.Percentile(values, 25) - if err != nil { - log.Fatal().Err(err).Msg("cannot compute the 25th percentile of values") - } - - median, err := stats.Median(values) - if err != nil { - log.Fatal().Err(err).Msg("cannot compute the median of values") - } - - percentile75, err := stats.Percentile(values, 75) - if err != nil { - log.Fatal().Err(err).Msg("cannot compute the 75th percentile of values") - } - - percentile95, err := stats.Percentile(values, 95) - if err != nil { - log.Fatal().Err(err).Msg("cannot compute the 95th percentile of values") - } - - percentile99, err := stats.Percentile(values, 99) - if err != nil { - log.Fatal().Err(err).Msg("cannot compute the 99th percentile of values") - } - - max, err := stats.Max(values) - if err != nil { - log.Fatal().Err(err).Msg("cannot compute the max of values") - } - - return RegisterStatsByTypes{ - Type: t, - Counts: uint64(len(values)), - ValueSizeTotal: sum, - ValueSizeMin: min, - ValueSize25thPercentile: percentile25, - ValueSizeMedian: median, - ValueSize75thPercentile: percentile75, - ValueSize95thPercentile: percentile95, - ValueSize99thPercentile: percentile99, - ValueSizeMax: max, - } -} - -func getStats(valueSizesByType sizesByType) []RegisterStatsByTypes { +func getRegisterStats(valueSizesByType sizesByType) []RegisterStatsByTypes { domainStats := make([]RegisterStatsByTypes, 0, len(common.AllStorageDomains)) var allDomainSizes []float64 statsByTypes := make([]RegisterStatsByTypes, 0, len(valueSizesByType)) for t, values := range valueSizesByType { - stats := getTypeStats(t, values) + stats := RegisterStatsByTypes{ + Type: t, + stats: getValueStats(values, percentiles), + } if isDomainType(t) { domainStats = append(domainStats, stats) @@ -477,19 +389,22 @@ func getStats(valueSizesByType sizesByType) []RegisterStatsByTypes { } } - allDomainStats := getTypeStats("domain", allDomainSizes) - allDomainStats.SubTypes = domainStats + allDomainStats := RegisterStatsByTypes{ + Type: "domain", + stats: getValueStats(allDomainSizes, percentiles), + SubTypes: domainStats, + } statsByTypes = append(statsByTypes, allDomainStats) // Sort domain stats by payload count in descending order slices.SortFunc(allDomainStats.SubTypes, func(a, b RegisterStatsByTypes) int { - return cmp.Compare(b.Counts, a.Counts) + return cmp.Compare(b.Count, a.Count) }) // Sort stats by payload count in descending order slices.SortFunc(statsByTypes, func(a, b RegisterStatsByTypes) int { - return cmp.Compare(b.Counts, a.Counts) + return cmp.Compare(b.Count, a.Count) }) return statsByTypes @@ -507,7 +422,24 @@ func isDomainType(typ string) bool { return strings.HasPrefix(typ, domainTypePrefix) } -func getType(key ledger.Key) string { +func isDomainRegister(key ledger.Key) bool { + k := key.KeyParts[1].Value + kstr := string(k) + for _, storageDomain := range common.AllStorageDomains { + if storageDomain.Identifier() == kstr { + return true + } + } + return false +} + +func isAccountRegister(key ledger.Key) bool { + k := key.KeyParts[1].Value + kstr := string(k) + return kstr == AccountStorageKey +} + +func getRegisterType(key ledger.Key) string { k := key.KeyParts[1].Value kstr := string(k) @@ -521,6 +453,8 @@ func getType(key ledger.Key) string { } switch kstr { + case AccountStorageKey: + return "account" case flow.ContractNamesKey: return "contract names" case flow.AccountStatusKey: @@ -560,8 +494,3 @@ func getType(key ledger.Key) string { return "others" } - -func serviceAccountAddressForChain(chainID flow.ChainID) flow.Address { - sc := systemcontracts.SystemContractsForChain(chainID) - return sc.FlowServiceAccount.Address -} diff --git a/cmd/util/cmd/checkpoint-collect-stats/stats_utils.go b/cmd/util/cmd/checkpoint-collect-stats/stats_utils.go new file mode 100644 index 00000000000..a45bea98219 --- /dev/null +++ b/cmd/util/cmd/checkpoint-collect-stats/stats_utils.go @@ -0,0 +1,58 @@ +package checkpoint_collect_stats + +import ( + "cmp" + "slices" + + statslib "github.com/montanaflynn/stats" + "github.com/rs/zerolog/log" +) + +type percentileValue struct { + Percentile float64 `json:"percentile"` + Value float64 `json:"value"` +} + +type stats struct { + Count uint64 `json:"count"` + Sum float64 `json:"sum"` + Min float64 `json:"min"` + Percentiles []percentileValue + Max float64 `json:"max"` +} + +func getValueStats(values []float64, percentiles []float64) stats { + if len(values) == 0 { + return stats{} + } + + describe, err := statslib.Describe(values, true, &percentiles) + if err != nil { + log.Fatal().Err(err).Msg("cannot describe values") + } + + sum, err := statslib.Sum(values) + if err != nil { + log.Fatal().Err(err).Msg("cannot compute sum of values") + } + + percentileValues := make([]percentileValue, len(describe.DescriptionPercentiles)) + for i, pv := range describe.DescriptionPercentiles { + percentileValues[i] = percentileValue{ + Percentile: pv.Percentile, + Value: pv.Value, + } + } + + slices.SortFunc(percentileValues, func(a, b percentileValue) int { + return cmp.Compare(a.Percentile, b.Percentile) + }) + + return stats{ + Count: uint64(len(values)), + Sum: sum, + Min: describe.Min, + Max: describe.Max, + Percentiles: percentileValues, + } +} diff --git a/cmd/util/cmd/diff-states/cmd.go b/cmd/util/cmd/diff-states/cmd.go index 19a598bd916..cee34534172 100644 --- a/cmd/util/cmd/diff-states/cmd.go +++ b/cmd/util/cmd/diff-states/cmd.go @@ -11,6 +11,7 @@ import ( "github.com/dustin/go-humanize/english" "github.com/onflow/cadence/common" + "github.com/onflow/cadence/interpreter" "github.com/rs/zerolog/log" "github.com/spf13/cobra" "golang.org/x/sync/errgroup" @@ -26,17 +27,18 @@ import ( ) var ( - flagOutputDirectory string - flagPayloads1 string - flagPayloads2 string - flagState1 string - flagState2 string - flagStateCommitment1 string - flagStateCommitment2 string - flagMode string - flagAlwaysDiffValues bool - flagNWorker int - flagChain string + flagOutputDirectory string + flagPayloads1 string + flagPayloads2 string + flagState1 string + flagState2 string + flagStateCommitment1 string + flagStateCommitment2 string + flagMode string + flagAlwaysDiffValues bool + flagExcludeRandomBeaconHistory bool + flagNWorker int + flagChain string ) var Cmd = &cobra.Command{ @@ -139,8 +141,20 @@ func init() { "Chain name", ) _ = Cmd.MarkFlagRequired("chain") + + Cmd.Flags().BoolVar( + &flagExcludeRandomBeaconHistory, + "exclude-randombeaconhistory", + false, + "exclude random beacon history", + ) } +const ( + randomBeaconHistoryDomain = common.StorageDomainContract + randomBeaconHistoryDomainKey = interpreter.StringStorageMapKey("RandomBeaconHistory") +) + type mode uint8 const ( @@ -191,6 +205,10 @@ func run(*cobra.Command, []string) { ) } + if flagExcludeRandomBeaconHistory { + log.Info().Msg("--exclude-randombeaconhistory is set to exclude random beacon history") + } + var acctsToSkipForCadenceValueDiff []string // Skip EVM storage account when diffing Cadence values. @@ -336,16 +354,9 @@ func diffAccount( rw reporters.ReportWriter, mode mode, acctsToSkip []string, + serviceAccountAddress common.Address, ) (err error) { - if accountRegisters1.Count() != accountRegisters2.Count() { - rw.Write(countDiff{ - Owner: owner, - State1: accountRegisters1.Count(), - State2: accountRegisters2.Count(), - }) - } - diffValues := flagAlwaysDiffValues err = accountRegisters1.ForEach(func(owner, key string, value1 []byte) error { @@ -406,6 +417,15 @@ func diffAccount( accountRegisters1, accountRegisters2, common.AllStorageDomains, + func(address common.Address, domain common.StorageDomain, key any) bool { + if flagExcludeRandomBeaconHistory { + if isRandomBeaconHistory(serviceAccountAddress, address, domain, key) { + log.Info().Msgf("excluding random beacon history in account %s, domain %s, key %v", address, domain.Identifier(), key) + return false + } + } + return true + }, ) } @@ -423,6 +443,8 @@ func diff( ) error { log.Info().Msgf("Diffing %d accounts", registers1.AccountCount()) + serviceAccountAddress := serviceAccountAddressForChain(chainID) + if registers1.AccountCount() < nWorkers { nWorkers = registers1.AccountCount() } @@ -462,6 +484,7 @@ func diff( rw, mode, acctsToSkip, + common.Address(serviceAccountAddress), ) if err != nil { log.Warn().Err(err).Msgf("failed to diff account %x", []byte(owner)) @@ -517,6 +540,7 @@ func diff( rw, mode, acctsToSkip, + common.Address(serviceAccountAddress), ) select { @@ -677,3 +701,29 @@ func (e countDiff) MarshalJSON() ([]byte, error) { State2: e.State2, }) } + +func isRandomBeaconHistory(serviceAccountAddress, address common.Address, domain common.StorageDomain, key any) bool { + if serviceAccountAddress.Compare(address) != 0 { + return false + } + + if domain != randomBeaconHistoryDomain { + return false + } + + switch key := key.(type) { + case interpreter.StringAtreeValue: + return interpreter.StringStorageMapKey(key) == randomBeaconHistoryDomainKey + + case interpreter.StringStorageMapKey: + return key == randomBeaconHistoryDomainKey + + default: + return false + } +} + +func serviceAccountAddressForChain(chainID flow.ChainID) flow.Address { + sc := systemcontracts.SystemContractsForChain(chainID) + return sc.FlowServiceAccount.Address +} diff --git a/cmd/util/cmd/execution-state-extract/cmd.go b/cmd/util/cmd/execution-state-extract/cmd.go index 96ca319e575..ad9ddb50e30 100644 --- a/cmd/util/cmd/execution-state-extract/cmd.go +++ b/cmd/util/cmd/execution-state-extract/cmd.go @@ -33,7 +33,6 @@ var ( flagNWorker int flagNoMigration bool flagMigration string - flagAuthorizationFixes string flagNoReport bool flagValidateMigration bool flagAllowPartialStateFromPayloads bool @@ -89,11 +88,7 @@ func init() { Cmd.Flags().BoolVar(&flagNoMigration, "no-migration", false, "don't migrate the state") - Cmd.Flags().StringVar(&flagMigration, "migration", "cadence-1.0", - "migration name. 'cadence-1.0' (default) or 'fix-authorizations'") - - Cmd.Flags().StringVar(&flagAuthorizationFixes, "authorization-fixes", "", - "authorization fixes to apply. requires '--migration=fix-authorizations'") + Cmd.Flags().StringVar(&flagMigration, "migration", "", "migration name") Cmd.Flags().BoolVar(&flagNoReport, "no-report", false, "don't report the state") @@ -230,19 +225,6 @@ func run(*cobra.Command, []string) { log.Fatal().Msg("Both --validate and --diff are enabled, please specify only one (or none) of these") } - switch flagMigration { - case "cadence-1.0": - // valid, no-op - - case "fix-authorizations": - if flagAuthorizationFixes == "" { - log.Fatal().Msg("--migration=fix-authorizations requires --authorization-fixes") - } - - default: - log.Fatal().Msg("Invalid --migration: got %s, expected 'cadence-1.0' or 'fix-authorizations'") - } - var stateCommitment flow.StateCommitment if len(flagBlockHash) > 0 { @@ -325,7 +307,7 @@ func run(*cobra.Command, []string) { } // Validate chain ID - _ = flow.ChainID(flagChain).Chain() + chain := flow.ChainID(flagChain).Chain() if flagNoReport { log.Warn().Msgf("--no-report flag is deprecated") @@ -422,6 +404,8 @@ func run(*cobra.Command, []string) { var migs []migrations.NamedMigration switch flagMigration { + case "add-migrationmainnet-keys": + migs = append(migs, addMigrationMainnetKeysMigration(log.Logger, flagOutputDir, flagNWorker, chain.ChainID())...) default: log.Fatal().Msgf("unknown migration: %s", flagMigration) } diff --git a/cmd/util/cmd/execution-state-extract/execution_state_extract.go b/cmd/util/cmd/execution-state-extract/execution_state_extract.go index 1ddbc721276..ba27d5be0c3 100644 --- a/cmd/util/cmd/execution-state-extract/execution_state_extract.go +++ b/cmd/util/cmd/execution-state-extract/execution_state_extract.go @@ -10,7 +10,10 @@ import ( "github.com/rs/zerolog/log" "golang.org/x/sync/errgroup" + "github.com/onflow/flow-go-sdk/crypto" + migrators "github.com/onflow/flow-go/cmd/util/ledger/migrations" + "github.com/onflow/flow-go/cmd/util/ledger/reporters" "github.com/onflow/flow-go/cmd/util/ledger/util" "github.com/onflow/flow-go/ledger" "github.com/onflow/flow-go/ledger/common/hash" @@ -356,3 +359,37 @@ func createTrieFromPayloads(logger zerolog.Logger, payloads []*ledger.Payload) ( return newTrie, nil } + +func addMigrationMainnetKeysMigration( + log zerolog.Logger, + outputDir string, + workerCount int, + chainID flow.ChainID, +) []migrators.NamedMigration { + + log.Info().Msg("initializing add-migrationmainnet-keys migrations ...") + + rwf := reporters.NewReportFileWriterFactory(outputDir, log) + + key, err := crypto.DecodePublicKeyHex(crypto.ECDSA_P256, "711d4cd9930d695ef5c79b668d321f92ba00ed8280fded52c0fa2b15501411d026fe6fb4be3ec894facd3a00f04e32e2db5f5696d3b2b3419e4fba89fb95dca8") + if err != nil { + panic("failed to decode key") + } + + namedMigrations := []migrators.NamedMigration{ + { + Name: "add-migrationmainnet-keys", + Migrate: migrators.NewAccountBasedMigration( + log, + workerCount, + []migrators.AccountBasedMigration{ + migrators.NewAddKeyMigration(chainID, key, rwf), + }, + ), + }, + } + + log.Info().Msg("initialized migrations") + + return namedMigrations +} diff --git a/cmd/util/ledger/migrations/add_key_migration.go b/cmd/util/ledger/migrations/add_key_migration.go new file mode 100644 index 00000000000..d0f9f87fb9d --- /dev/null +++ b/cmd/util/ledger/migrations/add_key_migration.go @@ -0,0 +1,406 @@ +package migrations + +import ( + "context" + "fmt" + + "github.com/rs/zerolog" + + "github.com/onflow/cadence/common" + "github.com/onflow/crypto/hash" + + "github.com/onflow/flow-go-sdk/crypto" + + "github.com/onflow/flow-go/cmd/util/ledger/reporters" + "github.com/onflow/flow-go/cmd/util/ledger/util/registers" + "github.com/onflow/flow-go/fvm" + "github.com/onflow/flow-go/fvm/systemcontracts" + "github.com/onflow/flow-go/model/flow" +) + +// This migration is not safe to run on actual networks. +// It is used for getting control over system accounts so that they can be tested +// in a copied environment. When we need to do this it is best to create a branch +// where this variable is set to true, and use that temporary branch to run migrations. +const IAmSureIWantToRunThisMigration = false + +// The list of mainnet node addresses might need updating. Please check it and then set this to true. +const IHaveCheckedTheMainnetNodeAddressesForCorrectness = false + +// AddKeyMigration adds a new key to the core contracts accounts +type AddKeyMigration struct { + log zerolog.Logger + + accountsToAddKeyTo map[common.Address]AddKeyMigrationAccountPublicKeyData + chainID flow.ChainID + + reporter reporters.ReportWriter +} + +var _ AccountBasedMigration = (*AddKeyMigration)(nil) + +func NewAddKeyMigration( + chainID flow.ChainID, + key crypto.PublicKey, + rwf reporters.ReportWriterFactory, +) *AddKeyMigration { + if !IAmSureIWantToRunThisMigration { + panic("Cannot run AddKeyMigration migration") + } + + // this is a migration mainnet only migration + if chainID != flow.Mainnet { + panic("AddKeyMigration migration only works on mainnet") + } + + addresses := make(map[common.Address]AddKeyMigrationAccountPublicKeyData) + sc := systemcontracts.SystemContractsForChain(chainID).All() + + for _, sc := range sc { + addresses[common.Address(sc.Address)] = AddKeyMigrationAccountPublicKeyData{ + PublicKey: key, + HashAlgo: hash.SHA3_256, + } + } + + // add key to node accounts + for _, nodeAddress := range mainnetNodeAddresses() { + + address, err := common.HexToAddress(nodeAddress) + if err != nil { + // should never happen + panic(fmt.Errorf("invalid node address %s: %w", nodeAddress, err)) + } + + addresses[address] = AddKeyMigrationAccountPublicKeyData{ + PublicKey: key, + HashAlgo: hash.SHA3_256, + } + } + + return &AddKeyMigration{ + accountsToAddKeyTo: addresses, + chainID: chainID, + reporter: rwf.ReportWriter("add-key-migration"), + } +} + +type AddKeyMigrationAccountPublicKeyData struct { + PublicKey crypto.PublicKey + HashAlgo hash.HashingAlgorithm +} + +func (m *AddKeyMigration) InitMigration( + log zerolog.Logger, + _ *registers.ByAccount, + _ int, +) error { + m.log = log.With().Str("component", "AddKeyMigration").Logger() + return nil +} + +func (m *AddKeyMigration) Close() error { + return nil +} + +func (m *AddKeyMigration) MigrateAccount( + _ context.Context, + address common.Address, + accountRegisters *registers.AccountRegisters, +) error { + if !IAmSureIWantToRunThisMigration { + panic("Cannot run AddKeyMigration migration") + } + + keyData, ok := m.accountsToAddKeyTo[address] + if !ok { + return nil + } + + // Create all the runtime components we need for the migration + migrationRuntime, err := NewInterpreterMigrationRuntime( + accountRegisters, + m.chainID, + InterpreterMigrationRuntimeConfig{}, + ) + + if err != nil { + return err + } + + account, err := migrationRuntime.Accounts.Get(flow.ConvertAddress(address)) + if err != nil { + return fmt.Errorf("could not find account at address %s", address) + } + if len(account.Keys) == 0 { + // this is unexpected, + // all core contract accounts should have at least one key + m.log.Warn(). + Str("address", address.String()). + Msg("account has no keys") + } + + key := flow.AccountPublicKey{ + PublicKey: keyData.PublicKey, + SignAlgo: keyData.PublicKey.Algorithm(), + HashAlgo: keyData.HashAlgo, + Weight: fvm.AccountKeyWeightThreshold, + } + + flowAddress := flow.ConvertAddress(address) + + keyIndex, err := migrationRuntime.Accounts.GetPublicKeyCount(flowAddress) + if err != nil { + return fmt.Errorf("failed to get public key count: %w", err) + } + + err = migrationRuntime.Accounts.AppendPublicKey(flowAddress, key) + if err != nil { + return fmt.Errorf("failed to append public key: %w", err) + } + + // Finalize the transaction + result, err := migrationRuntime.TransactionState.FinalizeMainTransaction() + if err != nil { + return fmt.Errorf("failed to finalize main transaction: %w", err) + } + + // Merge the changes into the registers + expectedAddresses := map[flow.Address]struct{}{ + flow.Address(address): {}, + } + + err = registers.ApplyChanges( + accountRegisters, + result.WriteSet, + expectedAddresses, + m.log, + ) + if err != nil { + return fmt.Errorf("failed to apply register changes: %w", err) + } + + m.reporter.Write(keyAddedReport{ + Address: address.Hex(), + Index: keyIndex, + Key: key.PublicKey.String(), + }) + + return nil + +} + +type keyAddedReport struct { + Address string `json:"address"` + Index uint32 `json:"index"` + Key string `json:"key"` +} + +func mainnetNodeAddresses() []string { + if !IHaveCheckedTheMainnetNodeAddressesForCorrectness { + panic("please check that the addresses are correct then uncomment this line") + } + + return []string{ + "731fff3c92213443", // "access-001.mainnet24.nodes.onflow.org:3569", + "812c23d21adf3efd", // "access-002.mainnet24.nodes.onflow.org:3569", + "8a06114bd65a40d4", // "access-003.mainnet24.nodes.onflow.org:3569", + "7835cda55ea44a6a", // "access-004.mainnet24.nodes.onflow.org:3569", + "05c726db6e2c35b5", // "access-005.mainnet24.nodes.onflow.org:3569", + "00523f97886d672f", // "access-006.mainnet24.nodes.onflow.org:3569", + "dfa97677e212fe54", // "access-007.mainnet24.nodes.onflow.org:3569", + "decc3024db84c4f2", // "access-008.mainnet24.nodes.onflow.org:3569", + "334b37c675df7ea8", // "access-009.mainnet24.nodes.onflow.org:3569", + "f4e71586ea8c469e", // "access-010.mainnet24.nodes.onflow.org:3569", + "8f930807301b124e", // "collection-001.mainnet24.nodes.onflow.org:3569", + "7da0d4e9b8e518f0", // "collection-002.mainnet24.nodes.onflow.org:3569", + "60de8343ed646cb8", // "collection-003.mainnet24.nodes.onflow.org:3569", + "1644512674297fcc", // "collection-004.mainnet24.nodes.onflow.org:3569", + "e4778dc8fcd77572", // "collection-005.mainnet24.nodes.onflow.org:3569", + "ef5dbf5130520b5b", // "collection-006.mainnet24.nodes.onflow.org:3569", + "1d6e63bfb8ac01e5", // "collection-007.mainnet24.nodes.onflow.org:3569", + "eac8a61dd61359c1", // "collection-008.mainnet24.nodes.onflow.org:3569", + "18fb7af35eed537f", // "collection-009.mainnet24.nodes.onflow.org:3569", + "13d1486a92682d56", // "collection-010.mainnet24.nodes.onflow.org:3569", + "e1e294841a9627e8", // "collection-011.mainnet24.nodes.onflow.org:3569", + "e8022abba5379d6d", // "collection-012.mainnet24.nodes.onflow.org:3569", + "1a31f6552dc997d3", // "collection-013.mainnet24.nodes.onflow.org:3569", + "111bc4cce14ce9fa", // "collection-014.mainnet24.nodes.onflow.org:3569", + "074fa1ff7848e39b", // "collection-015.mainnet24.nodes.onflow.org:3569", + "f0e9645d16f7bbbf", // "collection-016.mainnet24.nodes.onflow.org:3569", + "02dab8b39e09b101", // "collection-017.mainnet24.nodes.onflow.org:3569", + "09f08a2a528ccf28", // "collection-018.mainnet24.nodes.onflow.org:3569", + "fbc356c4da72c596", // "collection-019.mainnet24.nodes.onflow.org:3569", + "0d00d5358d5ba714", // "collection-020.mainnet24.nodes.onflow.org:3569", + "ff3309db05a5adaa", // "collection-021.mainnet24.nodes.onflow.org:3569", + "f4193b42c920d383", // "collection-022.mainnet24.nodes.onflow.org:3569", + "062ae7ac41ded93d", // "collection-023.mainnet24.nodes.onflow.org:3569", + "f18c220e2f618119", // "collection-024.mainnet24.nodes.onflow.org:3569", + "03bffee0a79f8ba7", // "collection-025.mainnet24.nodes.onflow.org:3569", + "0895cc796b1af58e", // "collection-026.mainnet24.nodes.onflow.org:3569", + "faa61097e3e4ff30", // "collection-027.mainnet24.nodes.onflow.org:3569", + "f346aea85c4545b5", // "collection-028.mainnet24.nodes.onflow.org:3569", + "01757246d4bb4f0b", // "collection-029.mainnet24.nodes.onflow.org:3569", + "0a5f40df183e3122", // "collection-030.mainnet24.nodes.onflow.org:3569", + "f86c9c3190c03b9c", // "collection-031.mainnet24.nodes.onflow.org:3569", + "0fca5993fe7f63b8", // "collection-032.mainnet24.nodes.onflow.org:3569", + "fdf9857d76816906", // "collection-033.mainnet24.nodes.onflow.org:3569", + "f6d3b7e4ba04172f", // "collection-034.mainnet24.nodes.onflow.org:3569", + "04e06b0a32fa1d91", // "collection-035.mainnet24.nodes.onflow.org:3569", + "0db2761c119413f5", // "collection-036.mainnet24.nodes.onflow.org:3569", + "ff81aaf2996a194b", // "collection-037.mainnet24.nodes.onflow.org:3569", + "f4ab986b55ef6762", // "collection-038.mainnet24.nodes.onflow.org:3569", + "06984485dd116ddc", // "collection-039.mainnet24.nodes.onflow.org:3569", + "f13e8127b3ae35f8", // "collection-040.mainnet24.nodes.onflow.org:3569", + "030d5dc93b503f46", // "collection-041.mainnet24.nodes.onflow.org:3569", + "08276f50f7d5416f", // "collection-042.mainnet24.nodes.onflow.org:3569", + "fa14b3be7f2b4bd1", // "collection-043.mainnet24.nodes.onflow.org:3569", + "f3f40d81c08af154", // "collection-044.mainnet24.nodes.onflow.org:3569", + "01c7d16f4874fbea", // "collection-045.mainnet24.nodes.onflow.org:3569", + "0aede3f684f185c3", // "collection-046.mainnet24.nodes.onflow.org:3569", + "f8de3f180c0f8f7d", // "collection-047.mainnet24.nodes.onflow.org:3569", + "0f78faba62b0d759", // "collection-048.mainnet24.nodes.onflow.org:3569", + "fd4b2654ea4edde7", // "collection-049.mainnet24.nodes.onflow.org:3569", + "f66114cd26cba3ce", // "collection-050.mainnet24.nodes.onflow.org:3569", + "0452c823ae35a970", // "collection-051.mainnet24.nodes.onflow.org:3569", + "f2914bd2f91ccbf2", // "collection-052.mainnet24.nodes.onflow.org:3569", + "00a2973c71e2c14c", // "collection-053.mainnet24.nodes.onflow.org:3569", + "0b88a5a5bd67bf65", // "collection-054.mainnet24.nodes.onflow.org:3569", + "ea7a05344adced20", // "collection-055.mainnet24.nodes.onflow.org:3569", + "1849d9dac222e79e", // "collection-056.mainnet24.nodes.onflow.org:3569", + "1363eb430ea799b7", // "collection-057.mainnet24.nodes.onflow.org:3569", + "e15037ad86599309", // "collection-058.mainnet24.nodes.onflow.org:3569", + "e8b0899239f8298c", // "collection-059.mainnet24.nodes.onflow.org:3569", + "1a83557cb1062332", // "collection-060.mainnet24.nodes.onflow.org:3569", + "11a967e57d835d1b", // "collection-061.mainnet24.nodes.onflow.org:3569", + "e39abb0bf57d57a5", // "collection-062.mainnet24.nodes.onflow.org:3569", + "143c7ea99bc20f81", // "collection-063.mainnet24.nodes.onflow.org:3569", + "e60fa247133c053f", // "collection-064.mainnet24.nodes.onflow.org:3569", + "ed2590dedfb97b16", // "collection-065.mainnet24.nodes.onflow.org:3569", + "1f164c30574771a8", // "collection-066.mainnet24.nodes.onflow.org:3569", + "5668f9ec131bd35f", // "collection-067.mainnet24.nodes.onflow.org:3569", + "a45b25029be5d9e1", // "collection-068.mainnet24.nodes.onflow.org:3569", + "af71179b5760a7c8", // "collection-069.mainnet24.nodes.onflow.org:3569", + "5d42cb75df9ead76", // "collection-070.mainnet24.nodes.onflow.org:3569", + "aae40ed7b121f552", // "collection-071.mainnet24.nodes.onflow.org:3569", + "58d7d23939dfffec", // "collection-072.mainnet24.nodes.onflow.org:3569", + "53fde0a0f55a81c5", // "collection-073.mainnet24.nodes.onflow.org:3569", + "a1ce3c4e7da48b7b", // "collection-074.mainnet24.nodes.onflow.org:3569", + "a82e8271c20531fe", // "collection-075.mainnet24.nodes.onflow.org:3569", + "5a1d5e9f4afb3b40", // "collection-076.mainnet24.nodes.onflow.org:3569", + "51376c06867e4569", // "collection-077.mainnet24.nodes.onflow.org:3569", + "a304b0e80e804fd7", // "collection-078.mainnet24.nodes.onflow.org:3569", + "54a2754a603f17f3", // "collection-079.mainnet24.nodes.onflow.org:3569", + "a691a9a4e8c11d4d", // "collection-080.mainnet24.nodes.onflow.org:3569", + "adbb9b3d24446364", // "collection-081.mainnet24.nodes.onflow.org:3569", + "5f8847d3acba69da", // "collection-082.mainnet24.nodes.onflow.org:3569", + "a94bc422fb930b58", // "collection-083.mainnet24.nodes.onflow.org:3569", + "5b7818cc736d01e6", // "collection-084.mainnet24.nodes.onflow.org:3569", + "50522a55bfe87fcf", // "collection-085.mainnet24.nodes.onflow.org:3569", + "a261f6bb37167571", // "collection-086.mainnet24.nodes.onflow.org:3569", + "55c7331959a92d55", // "collection-087.mainnet24.nodes.onflow.org:3569", + "a7f4eff7d15727eb", // "collection-088.mainnet24.nodes.onflow.org:3569", + "acdedd6e1dd259c2", // "collection-089.mainnet24.nodes.onflow.org:3569", + "5eed0180952c537c", // "collection-090.mainnet24.nodes.onflow.org:3569", + "570dbfbf2a8de9f9", // "collection-091.mainnet24.nodes.onflow.org:3569", + "a53e6351a273e347", // "collection-092.mainnet24.nodes.onflow.org:3569", + "ae1451c86ef69d6e", // "collection-093.mainnet24.nodes.onflow.org:3569", + "5c278d26e60897d0", // "collection-094.mainnet24.nodes.onflow.org:3569", + "4fe6f159994dcf2b", // "collection-095.mainnet24.nodes.onflow.org:3569", + "bdd52db711b3c595", // "collection-096.mainnet24.nodes.onflow.org:3569", + "b6ff1f2edd36bbbc", // "consensus-001.mainnet24.nodes.onflow.org:3569", + "44ccc3c055c8b102", // "consensus-002.mainnet24.nodes.onflow.org:3569", + "4d9eded676a6bf66", // "consensus-003.mainnet24.nodes.onflow.org:3569", + "bfad0238fe58b5d8", // "consensus-004.mainnet24.nodes.onflow.org:3569", + "b48730a132ddcbf1", // "consensus-005.mainnet24.nodes.onflow.org:3569", + "46b4ec4fba23c14f", // "consensus-006.mainnet24.nodes.onflow.org:3569", + "b11229edd49c996b", // "consensus-007.mainnet24.nodes.onflow.org:3569", + "ac6c7e47811ded23", // "consensus-008.mainnet24.nodes.onflow.org:3569", + "5e5fa2a909e3e79d", // "consensus-009.mainnet24.nodes.onflow.org:3569", + "57bf1c96b6425d18", // "consensus-010.mainnet24.nodes.onflow.org:3569", + "a58cc0783ebc57a6", // "consensus-011.mainnet24.nodes.onflow.org:3569", + "aea6f2e1f239298f", // "consensus-012.mainnet24.nodes.onflow.org:3569", + "5c952e0f7ac72331", // "consensus-013.mainnet24.nodes.onflow.org:3569", + "ab33ebad14787b15", // "consensus-014.mainnet24.nodes.onflow.org:3569", + "590037439c8671ab", // "consensus-015.mainnet24.nodes.onflow.org:3569", + "522a05da50030f82", // "consensus-016.mainnet24.nodes.onflow.org:3569", + "447e60e9c90705e3", // "consensus-017.mainnet24.nodes.onflow.org:3569", + "b2bde3189e2e6761", // "consensus-018.mainnet24.nodes.onflow.org:3569", + "408e3ff616d06ddf", // "consensus-019.mainnet24.nodes.onflow.org:3569", + "4ba40d6fda5513f6", // "consensus-020.mainnet24.nodes.onflow.org:3569", + "b997d18152ab1948", // "consensus-021.mainnet24.nodes.onflow.org:3569", + "4e3114233c14416c", // "consensus-022.mainnet24.nodes.onflow.org:3569", + "bc02c8cdb4ea4bd2", // "consensus-023.mainnet24.nodes.onflow.org:3569", + "b728fa54786f35fb", // "consensus-024.mainnet24.nodes.onflow.org:3569", + "451b26baf0913f45", // "consensus-025.mainnet24.nodes.onflow.org:3569", + "4cfb98854f3085c0", // "consensus-026.mainnet24.nodes.onflow.org:3569", + "bec8446bc7ce8f7e", // "consensus-027.mainnet24.nodes.onflow.org:3569", + "b5e276f20b4bf157", // "consensus-028.mainnet24.nodes.onflow.org:3569", + "47d1aa1c83b5fbe9", // "consensus-029.mainnet24.nodes.onflow.org:3569", + "b0776fbeed0aa3cd", // "consensus-030.mainnet24.nodes.onflow.org:3569", + "4244b35065f4a973", // "consensus-031.mainnet24.nodes.onflow.org:3569", + "496e81c9a971d75a", // "consensus-032.mainnet24.nodes.onflow.org:3569", + "bb5d5d27218fdde4", // "consensus-033.mainnet24.nodes.onflow.org:3569", + "cdc78f42b8c2ce90", // "consensus-034.mainnet24.nodes.onflow.org:3569", + "3ff453ac303cc42e", // "consensus-035.mainnet24.nodes.onflow.org:3569", + "34de6135fcb9ba07", // "consensus-036.mainnet24.nodes.onflow.org:3569", + "c6edbddb7447b0b9", // "consensus-037.mainnet24.nodes.onflow.org:3569", + "314b78791af8e89d", // "consensus-038.mainnet24.nodes.onflow.org:3569", + "c378a4979206e223", // "consensus-039.mainnet24.nodes.onflow.org:3569", + "c852960e5e839c0a", // "consensus-040.mainnet24.nodes.onflow.org:3569", + "01fb1c432a2fed81", // "execution-001.mainnet24.nodes.onflow.org:3569", + "17af7970b32be7e0", // "execution-002.mainnet24.nodes.onflow.org:3569", + "e009bcd2dd94bfc4", // "execution-003.mainnet24.nodes.onflow.org:3569", + "123a603c556ab57a", // "execution-004.mainnet24.nodes.onflow.org:3569", + "88cc9deda57e8478", // "verification-001.mainnet24.nodes.onflow.org:3569", + "191052a599efcb53", // "verification-002.mainnet24.nodes.onflow.org:3569", + "eb238e4b1111c1ed", // "verification-003.mainnet24.nodes.onflow.org:3569", + "e271935d327fcf89", // "verification-004.mainnet24.nodes.onflow.org:3569", + "10424fb3ba81c537", // "verification-005.mainnet24.nodes.onflow.org:3569", + "1b687d2a7604bb1e", // "verification-006.mainnet24.nodes.onflow.org:3569", + "e95ba1c4fefab1a0", // "verification-007.mainnet24.nodes.onflow.org:3569", + "1efd64669045e984", // "verification-008.mainnet24.nodes.onflow.org:3569", + "ecceb88818bbe33a", // "verification-009.mainnet24.nodes.onflow.org:3569", + "e7e48a11d43e9d13", // "verification-010.mainnet24.nodes.onflow.org:3569", + "15d756ff5cc097ad", // "verification-011.mainnet24.nodes.onflow.org:3569", + "1c37e8c0e3612d28", // "verification-012.mainnet24.nodes.onflow.org:3569", + "ee04342e6b9f2796", // "verification-013.mainnet24.nodes.onflow.org:3569", + "e52e06b7a71a59bf", // "verification-014.mainnet24.nodes.onflow.org:3569", + "171dda592fe45301", // "verification-015.mainnet24.nodes.onflow.org:3569", + "e0bb1ffb415b0b25", // "verification-016.mainnet24.nodes.onflow.org:3569", + "1288c315c9a5019b", // "verification-017.mainnet24.nodes.onflow.org:3569", + "19a2f18c05207fb2", // "verification-018.mainnet24.nodes.onflow.org:3569", + "eb912d628dde750c", // "verification-019.mainnet24.nodes.onflow.org:3569", + "1d52ae93daf7178e", // "verification-020.mainnet24.nodes.onflow.org:3569", + "ef61727d52091d30", // "verification-021.mainnet24.nodes.onflow.org:3569", + "e44b40e49e8c6319", // "verification-022.mainnet24.nodes.onflow.org:3569", + "16789c0a167269a7", // "verification-023.mainnet24.nodes.onflow.org:3569", + "e1de59a878cd3183", // "verification-024.mainnet24.nodes.onflow.org:3569", + "13ed8546f0333b3d", // "verification-025.mainnet24.nodes.onflow.org:3569", + "18c7b7df3cb64514", // "verification-026.mainnet24.nodes.onflow.org:3569", + "eaf46b31b4484faa", // "verification-027.mainnet24.nodes.onflow.org:3569", + "e314d50e0be9f52f", // "verification-028.mainnet24.nodes.onflow.org:3569", + "112709e08317ff91", // "verification-029.mainnet24.nodes.onflow.org:3569", + "1a0d3b794f9281b8", // "verification-030.mainnet24.nodes.onflow.org:3569", + "e83ee797c76c8b06", // "verification-031.mainnet24.nodes.onflow.org:3569", + "1f982235a9d3d322", // "verification-032.mainnet24.nodes.onflow.org:3569", + "edabfedb212dd99c", // "verification-033.mainnet24.nodes.onflow.org:3569", + "e681cc42eda8a7b5", // "verification-034.mainnet24.nodes.onflow.org:3569", + "14b210ac6556ad0b", // "verification-035.mainnet24.nodes.onflow.org:3569", + "6228c2c9fc1bbe7f", // "verification-036.mainnet24.nodes.onflow.org:3569", + "901b1e2774e5b4c1", // "verification-037.mainnet24.nodes.onflow.org:3569", + "9b312cbeb860cae8", // "verification-038.mainnet24.nodes.onflow.org:3569", + "6902f050309ec056", // "verification-039.mainnet24.nodes.onflow.org:3569", + "9ea435f25e219872", // "verification-040.mainnet24.nodes.onflow.org:3569", + "6c97e91cd6df92cc", // "verification-041.mainnet24.nodes.onflow.org:3569", + "71e9beb6835ee684", // "verification-042.mainnet24.nodes.onflow.org:3569", + "780900893cff5c01", // "verification-043.mainnet24.nodes.onflow.org:3569", + "8a3adc67b40156bf", // "verification-044.mainnet24.nodes.onflow.org:3569", + "65775723697e2849", // "verification-045.mainnet24.nodes.onflow.org:3569", + "97448bcde18022f7", // "verification-046.mainnet24.nodes.onflow.org:3569", + "60e24e6f8f3f7ad3", // "verification-047.mainnet24.nodes.onflow.org:3569", + "92d1928107c1706d", // "verification-048.mainnet24.nodes.onflow.org:3569", + "99fba018cb440e44", // "verification-049.mainnet24.nodes.onflow.org:3569", + "6bc87cf643ba04fa", // "verification-050.mainnet24.nodes.onflow.org:3569", + } +} diff --git a/cmd/util/ledger/migrations/add_key_migration_test.go b/cmd/util/ledger/migrations/add_key_migration_test.go new file mode 100644 index 00000000000..a66c174020d --- /dev/null +++ b/cmd/util/ledger/migrations/add_key_migration_test.go @@ -0,0 +1,19 @@ +package migrations + +import ( + "testing" +) + +func Test_fail_if_migration_enabled(t *testing.T) { + t.Parallel() + // prevent merging this to master branch if enabled + if IAmSureIWantToRunThisMigration { + t.Fail() + } + + // a reminder to set this back to false so that we have + // it prepared for next time. + if IHaveCheckedTheMainnetNodeAddressesForCorrectness { + t.Fail() + } +} diff --git a/cmd/util/ledger/migrations/cadence_value_diff.go b/cmd/util/ledger/migrations/cadence_value_diff.go index 9241c4b5ac4..d1fa458c206 100644 --- a/cmd/util/ledger/migrations/cadence_value_diff.go +++ b/cmd/util/ledger/migrations/cadence_value_diff.go @@ -2,12 +2,10 @@ package migrations import ( "fmt" - "time" "github.com/onflow/cadence/common" "github.com/onflow/cadence/interpreter" "github.com/onflow/cadence/runtime" - "github.com/rs/zerolog/log" "golang.org/x/sync/errgroup" "github.com/onflow/flow-go/cmd/util/ledger/reporters" @@ -76,8 +74,6 @@ type difference struct { NewValueStaticType string `json:",omitempty"` } -const minLargeAccountRegisterCount = 1_000_000 - type CadenceValueDiffReporter struct { address common.Address chainID flow.ChainID @@ -102,7 +98,13 @@ func NewCadenceValueDiffReporter( } } -func (dr *CadenceValueDiffReporter) DiffStates(oldRegs, newRegs registers.Registers, domains []common.StorageDomain) { +type isValueIncludedFunc func(address common.Address, domain common.StorageDomain, key any) bool + +func (dr *CadenceValueDiffReporter) DiffStates( + oldRegs, newRegs registers.Registers, + domains []common.StorageDomain, + isValueIncluded isValueIncludedFunc, +) { oldStorage := newReadonlyStorage(oldRegs) @@ -136,101 +138,6 @@ func (dr *CadenceValueDiffReporter) DiffStates(oldRegs, newRegs registers.Regist return } - oldInter, err := interpreter.NewInterpreter( - nil, - nil, - &interpreter.Config{ - Storage: oldStorage, - }, - ) - if err != nil { - dr.reportWriter.Write( - diffError{ - Address: dr.address.Hex(), - Kind: diffErrorKindString[abortErrorKind], - Msg: fmt.Sprintf("failed to create interpreter for old registers: %s", err), - }, - ) - return - } - - newInter, err := interpreter.NewInterpreter( - nil, - nil, - &interpreter.Config{ - Storage: newStorage, - }, - ) - if err != nil { - dr.reportWriter.Write( - diffError{ - Address: dr.address.Hex(), - Kind: diffErrorKindString[abortErrorKind], - Msg: fmt.Sprintf("failed to create interpreter for new registers: %s", err), - }, - ) - return - } - - if oldRegs.Count() > minLargeAccountRegisterCount { - // Add concurrency to diff domains - var g errgroup.Group - - // NOTE: preload storage map in the same goroutine - for _, domain := range domains { - _ = oldStorage.GetDomainStorageMap(oldInter, dr.address, domain, false) - _ = newStorage.GetDomainStorageMap(newInter, dr.address, domain, false) - } - - // Create goroutine to diff storage domain - g.Go(func() (err error) { - oldRuntime, err := newReadonlyStorageRuntimeWithStorage(oldStorage, oldRegs.Count()) - if err != nil { - return fmt.Errorf("failed to create runtime for old registers: %s", err) - } - - newRuntime, err := newReadonlyStorageRuntimeWithStorage(newStorage, newRegs.Count()) - if err != nil { - return fmt.Errorf("failed to create runtime for new registers: %s", err) - } - - dr.diffDomain(oldRuntime, newRuntime, common.StorageDomainPathStorage) - return nil - }) - - // Create goroutine to diff other domains - g.Go(func() (err error) { - oldRuntime, err := newReadonlyStorageRuntimeWithStorage(oldStorage, oldRegs.Count()) - if err != nil { - return fmt.Errorf("failed to create runtime for old registers: %s", err) - } - - newRuntime, err := newReadonlyStorageRuntimeWithStorage(newStorage, oldRegs.Count()) - if err != nil { - return fmt.Errorf("failed to create runtime for new registers: %s", err) - } - - for _, domain := range domains { - if domain != common.StorageDomainPathStorage { - dr.diffDomain(oldRuntime, newRuntime, domain) - } - } - return nil - }) - - err = g.Wait() - if err != nil { - dr.reportWriter.Write( - diffError{ - Address: dr.address.Hex(), - Kind: diffErrorKindString[abortErrorKind], - Msg: err.Error(), - }) - } - - return - } - // Skip goroutine overhead for smaller accounts oldRuntime, err := newReadonlyStorageRuntimeWithStorage(oldStorage, oldRegs.Count()) if err != nil { @@ -255,7 +162,7 @@ func (dr *CadenceValueDiffReporter) DiffStates(oldRegs, newRegs registers.Regist } for _, domain := range domains { - dr.diffDomain(oldRuntime, newRuntime, domain) + dr.diffDomain(oldRuntime, newRuntime, domain, isValueIncluded) } } @@ -263,6 +170,7 @@ func (dr *CadenceValueDiffReporter) diffDomain( oldRuntime *readonlyStorageRuntime, newRuntime *readonlyStorageRuntime, domain common.StorageDomain, + isValueIncluded isValueIncludedFunc, ) { defer func() { if r := recover(); r != nil { @@ -435,104 +343,23 @@ func (dr *CadenceValueDiffReporter) diffDomain( } } - // Skip goroutine overhead for non-storage domain and small accounts. - if domain != common.StorageDomainPathStorage || - oldRuntime.PayloadCount < minLargeAccountRegisterCount || - len(sharedKeys) == 1 { + // Diffing storage domain - for _, key := range sharedKeys { - oldValue, newValue, trace, canDiff := getValues(key) - if canDiff { - diffValues( - oldRuntime.Interpreter, - oldValue, - newRuntime.Interpreter, - newValue, - trace, - ) - } + for _, key := range sharedKeys { + if !isValueIncluded(dr.address, domain, key) { + continue } - return - } - - startTime := time.Now() - - log.Info().Msgf( - "Diffing %x storage domain containing %d elements (%d payloads) ...", - dr.address[:], - len(sharedKeys), - oldRuntime.PayloadCount, - ) - - // Diffing storage domain in large account - - type job struct { - oldValue interpreter.Value - newValue interpreter.Value - trace *util.Trace - } - - nWorkers := dr.nWorkers - if len(sharedKeys) < nWorkers { - nWorkers = len(sharedKeys) - } - - jobs := make(chan job, nWorkers) - - var g errgroup.Group - - for i := 0; i < nWorkers; i++ { - - g.Go(func() error { - for job := range jobs { - diffValues( - oldRuntime.Interpreter, - job.oldValue, - newRuntime.Interpreter, - job.newValue, - job.trace, - ) - } - - return nil - }) - } - - // Launch goroutine to send account registers to jobs channel - go func() { - defer close(jobs) - - for _, key := range sharedKeys { - oldValue, newValue, trace, canDiff := getValues(key) - if canDiff { - jobs <- job{ - oldValue: oldValue, - newValue: newValue, - trace: trace, - } - } + oldValue, newValue, trace, canDiff := getValues(key) + if canDiff { + diffValues( + oldRuntime.Interpreter, + oldValue, + newRuntime.Interpreter, + newValue, + trace, + ) } - }() - - // Wait for workers - err := g.Wait() - if err != nil { - dr.reportWriter.Write( - diffError{ - Address: dr.address.Hex(), - Kind: diffErrorKindString[abortErrorKind], - Msg: fmt.Sprintf("failed to diff domain %s: %s", domain.Identifier(), err), - }) } - - log.Info(). - Msgf( - "Finished diffing %x storage domain containing %d elements (%d payloads) in %s", - dr.address[:], - len(sharedKeys), - oldRuntime.PayloadCount, - time.Since(startTime), - ) } func (dr *CadenceValueDiffReporter) diffValues( @@ -1145,7 +972,10 @@ func min(a, b int) int { func newReadonlyStorage(regs registers.Registers) *runtime.Storage { ledger := ®isters.ReadOnlyLedger{Registers: regs} - return runtime.NewStorage(ledger, nil, runtime.StorageConfig{}) + config := runtime.StorageConfig{ + StorageFormatV2Enabled: true, + } + return runtime.NewStorage(ledger, nil, config) } type readonlyStorageRuntime struct { diff --git a/cmd/util/ledger/migrations/cadence_value_diff_test.go b/cmd/util/ledger/migrations/cadence_value_diff_test.go index 43b953dce80..50ba1460d27 100644 --- a/cmd/util/ledger/migrations/cadence_value_diff_test.go +++ b/cmd/util/ledger/migrations/cadence_value_diff_test.go @@ -26,6 +26,10 @@ func TestDiffCadenceValues(t *testing.T) { const domain = common.StorageDomainPathStorage + alwaysDiff := func(address common.Address, domain common.StorageDomain, key any) bool { + return true + } + t.Run("no diff", func(t *testing.T) { t.Parallel() @@ -37,6 +41,7 @@ func TestDiffCadenceValues(t *testing.T) { createTestRegisters(t, address, domain), createTestRegisters(t, address, domain), []common.StorageDomain{domain}, + alwaysDiff, ) require.NoError(t, err) require.Equal(t, 0, len(writer.entries)) @@ -53,6 +58,7 @@ func TestDiffCadenceValues(t *testing.T) { createTestRegisters(t, address, domain), registers.NewByAccount(), []common.StorageDomain{domain}, + alwaysDiff, ) require.NoError(t, err) require.Equal(t, 1, len(writer.entries)) @@ -74,6 +80,7 @@ func TestDiffCadenceValues(t *testing.T) { createTestRegisters(t, address, domain), createStorageMapRegisters(t, address, domain, []string{"unique_key"}, []interpreter.Value{interpreter.UInt64Value(0)}), []common.StorageDomain{domain}, + alwaysDiff, ) require.NoError(t, err) @@ -101,6 +108,7 @@ func TestDiffCadenceValues(t *testing.T) { createStorageMapRegisters(t, address, domain, []string{"0", "1"}, []interpreter.Value{interpreter.UInt64Value(0), interpreter.UInt64Value(0)}), createStorageMapRegisters(t, address, domain, []string{"2", "0"}, []interpreter.Value{interpreter.UInt64Value(0), interpreter.UInt64Value(0)}), []common.StorageDomain{domain}, + alwaysDiff, ) require.NoError(t, err) @@ -128,6 +136,7 @@ func TestDiffCadenceValues(t *testing.T) { createStorageMapRegisters(t, address, domain, []string{"0", "1"}, []interpreter.Value{interpreter.UInt64Value(100), interpreter.UInt64Value(101)}), createStorageMapRegisters(t, address, domain, []string{"0", "1"}, []interpreter.Value{interpreter.UInt64Value(111), interpreter.UInt64Value(101)}), []common.StorageDomain{domain}, + alwaysDiff, ) require.NoError(t, err) @@ -155,6 +164,7 @@ func TestDiffCadenceValues(t *testing.T) { createStorageMapRegisters(t, address, domain, []string{"0", "1"}, []interpreter.Value{interpreter.UInt64Value(100), interpreter.UInt64Value(101)}), createStorageMapRegisters(t, address, domain, []string{"0", "1"}, []interpreter.Value{interpreter.UInt64Value(111), interpreter.UInt64Value(102)}), []common.StorageDomain{domain}, + alwaysDiff, ) require.NoError(t, err) @@ -261,6 +271,7 @@ func TestDiffCadenceValues(t *testing.T) { interpreter.UInt64Value(5), }), []common.StorageDomain{domain}, + alwaysDiff, ) require.NoError(t, err) @@ -385,6 +396,7 @@ func TestDiffCadenceValues(t *testing.T) { interpreter.UInt64Value(3), }), []common.StorageDomain{domain}, + alwaysDiff, ) require.NoError(t, err) @@ -516,6 +528,7 @@ func TestDiffCadenceValues(t *testing.T) { interpreter.UInt64Value(3), }), []common.StorageDomain{domain}, + alwaysDiff, ) require.NoError(t, err) @@ -647,6 +660,7 @@ func TestDiffCadenceValues(t *testing.T) { interpreter.UInt64Value(3), }), []common.StorageDomain{domain}, + alwaysDiff, ) require.NoError(t, err) diff --git a/cmd/verification_builder.go b/cmd/verification_builder.go index 70c84617f02..f7c27b6455a 100644 --- a/cmd/verification_builder.go +++ b/cmd/verification_builder.go @@ -37,7 +37,10 @@ import ( "github.com/onflow/flow-go/state/protocol" badgerState "github.com/onflow/flow-go/state/protocol/badger" "github.com/onflow/flow-go/state/protocol/blocktimer" + "github.com/onflow/flow-go/storage" "github.com/onflow/flow-go/storage/badger" + "github.com/onflow/flow-go/storage/operation/badgerimpl" + "github.com/onflow/flow-go/storage/store" ) type VerificationConfig struct { @@ -88,11 +91,11 @@ func (v *VerificationNodeBuilder) LoadComponentsAndModules() { var ( followerState protocol.FollowerState - chunkStatuses *stdmap.ChunkStatuses // used in fetcher engine - chunkRequests *stdmap.ChunkRequests // used in requester engine - processedChunkIndex *badger.ConsumerProgress // used in chunk consumer - processedBlockHeight *badger.ConsumerProgress // used in block consumer - chunkQueue *badger.ChunksQueue // used in chunk consumer + chunkStatuses *stdmap.ChunkStatuses // used in fetcher engine + chunkRequests *stdmap.ChunkRequests // used in requester engine + processedChunkIndex storage.ConsumerProgressInitializer // used in chunk consumer + processedBlockHeight storage.ConsumerProgressInitializer // used in block consumer + chunkQueue *badger.ChunksQueue // used in chunk consumer syncCore *chainsync.Core // used in follower engine assignerEngine *assigner.Engine // the assigner engine @@ -155,11 +158,11 @@ func (v *VerificationNodeBuilder) LoadComponentsAndModules() { return nil }). Module("processed chunk index consumer progress", func(node *NodeConfig) error { - processedChunkIndex = badger.NewConsumerProgress(node.DB, module.ConsumeProgressVerificationChunkIndex) + processedChunkIndex = store.NewConsumerProgress(badgerimpl.ToDB(node.DB), module.ConsumeProgressVerificationChunkIndex) return nil }). Module("processed block height consumer progress", func(node *NodeConfig) error { - processedBlockHeight = badger.NewConsumerProgress(node.DB, module.ConsumeProgressVerificationBlockHeight) + processedBlockHeight = store.NewConsumerProgress(badgerimpl.ToDB(node.DB), module.ConsumeProgressVerificationBlockHeight) return nil }). Module("chunks queue", func(node *NodeConfig) error { diff --git a/engine/access/access_test.go b/engine/access/access_test.go index 7d12c70cdcf..032c3a0e1eb 100644 --- a/engine/access/access_test.go +++ b/engine/access/access_test.go @@ -45,6 +45,8 @@ import ( "github.com/onflow/flow-go/storage" bstorage "github.com/onflow/flow-go/storage/badger" "github.com/onflow/flow-go/storage/badger/operation" + "github.com/onflow/flow-go/storage/operation/badgerimpl" + "github.com/onflow/flow-go/storage/store" "github.com/onflow/flow-go/storage/util" "github.com/onflow/flow-go/utils/unittest" "github.com/onflow/flow-go/utils/unittest/mocks" @@ -684,14 +686,13 @@ func (suite *Suite) TestGetSealedTransaction() { ) require.NoError(suite.T(), err) - lastFullBlockHeight, err := counters.NewPersistentStrictMonotonicCounter( - bstorage.NewConsumerProgress(db, module.ConsumeProgressLastFullBlockHeight), - suite.rootBlock.Height, - ) + progress, err := store.NewConsumerProgress(badgerimpl.ToDB(db), module.ConsumeProgressLastFullBlockHeight).Initialize(suite.rootBlock.Height) + require.NoError(suite.T(), err) + lastFullBlockHeight, err := counters.NewPersistentStrictMonotonicCounter(progress) require.NoError(suite.T(), err) // create the ingest engine - processedHeight := bstorage.NewConsumerProgress(db, module.ConsumeProgressIngestionEngineBlockHeight) + processedHeight := store.NewConsumerProgress(badgerimpl.ToDB(db), module.ConsumeProgressIngestionEngineBlockHeight) ingestEng, err := ingestion.New( suite.log, @@ -874,12 +875,13 @@ func (suite *Suite) TestGetTransactionResult() { ) require.NoError(suite.T(), err) - processedHeight := bstorage.NewConsumerProgress(db, module.ConsumeProgressIngestionEngineBlockHeight) + processedHeightInitializer := store.NewConsumerProgress(badgerimpl.ToDB(db), module.ConsumeProgressIngestionEngineBlockHeight) - lastFullBlockHeight, err := counters.NewPersistentStrictMonotonicCounter( - bstorage.NewConsumerProgress(db, module.ConsumeProgressLastFullBlockHeight), - suite.rootBlock.Height, - ) + lastFullBlockHeightProgress, err := store.NewConsumerProgress(badgerimpl.ToDB(db), module.ConsumeProgressLastFullBlockHeight). + Initialize(suite.rootBlock.Height) + require.NoError(suite.T(), err) + + lastFullBlockHeight, err := counters.NewPersistentStrictMonotonicCounter(lastFullBlockHeightProgress) require.NoError(suite.T(), err) // create the ingest engine @@ -896,7 +898,7 @@ func (suite *Suite) TestGetTransactionResult() { results, receipts, collectionExecutedMetric, - processedHeight, + processedHeightInitializer, lastFullBlockHeight, nil, ) @@ -1130,12 +1132,13 @@ func (suite *Suite) TestExecuteScript() { suite.net.On("Register", channels.ReceiveReceipts, mock.Anything).Return(conduit, nil). Once() - processedHeight := bstorage.NewConsumerProgress(db, module.ConsumeProgressIngestionEngineBlockHeight) + processedHeightInitializer := store.NewConsumerProgress(badgerimpl.ToDB(db), module.ConsumeProgressIngestionEngineBlockHeight) - lastFullBlockHeight, err := counters.NewPersistentStrictMonotonicCounter( - bstorage.NewConsumerProgress(db, module.ConsumeProgressLastFullBlockHeight), - suite.rootBlock.Height, - ) + lastFullBlockHeightInitializer := store.NewConsumerProgress(badgerimpl.ToDB(db), module.ConsumeProgressLastFullBlockHeight) + lastFullBlockHeightProgress, err := lastFullBlockHeightInitializer.Initialize(suite.rootBlock.Height) + require.NoError(suite.T(), err) + + lastFullBlockHeight, err := counters.NewPersistentStrictMonotonicCounter(lastFullBlockHeightProgress) require.NoError(suite.T(), err) // create the ingest engine @@ -1152,7 +1155,7 @@ func (suite *Suite) TestExecuteScript() { results, receipts, collectionExecutedMetric, - processedHeight, + processedHeightInitializer, lastFullBlockHeight, nil, ) diff --git a/engine/access/ingestion/engine.go b/engine/access/ingestion/engine.go index 0e4ac42367e..ed7c01fdbbb 100644 --- a/engine/access/ingestion/engine.go +++ b/engine/access/ingestion/engine.go @@ -125,7 +125,7 @@ func New( executionResults storage.ExecutionResults, executionReceipts storage.ExecutionReceipts, collectionExecutedMetric module.CollectionExecutedMetric, - finalizedProcessedHeight storage.ConsumerProgress, + finalizedProcessedHeight storage.ConsumerProgressInitializer, lastFullBlockHeight *counters.PersistentStrictMonotonicCounter, txErrorMessagesCore *tx_error_messages.TxErrorMessagesCore, ) (*Engine, error) { diff --git a/engine/access/ingestion/engine_test.go b/engine/access/ingestion/engine_test.go index 2f5b0169b34..abeb6c1caf1 100644 --- a/engine/access/ingestion/engine_test.go +++ b/engine/access/ingestion/engine_test.go @@ -31,8 +31,9 @@ import ( "github.com/onflow/flow-go/network/mocknetwork" protocol "github.com/onflow/flow-go/state/protocol/mock" storerr "github.com/onflow/flow-go/storage" - bstorage "github.com/onflow/flow-go/storage/badger" storage "github.com/onflow/flow-go/storage/mock" + "github.com/onflow/flow-go/storage/operation/badgerimpl" + "github.com/onflow/flow-go/storage/store" "github.com/onflow/flow-go/utils/unittest" "github.com/onflow/flow-go/utils/unittest/mocks" ) @@ -186,13 +187,12 @@ func (s *Suite) SetupTest() { // initIngestionEngine create new instance of ingestion engine and waits when it starts func (s *Suite) initIngestionEngine(ctx irrecoverable.SignalerContext) *Engine { - processedHeight := bstorage.NewConsumerProgress(s.db, module.ConsumeProgressIngestionEngineBlockHeight) + processedHeightInitializer := store.NewConsumerProgress(badgerimpl.ToDB(s.db), module.ConsumeProgressIngestionEngineBlockHeight) - var err error - s.lastFullBlockHeight, err = counters.NewPersistentStrictMonotonicCounter( - bstorage.NewConsumerProgress(s.db, module.ConsumeProgressLastFullBlockHeight), - s.finalizedBlock.Height, - ) + lastFullBlockHeight, err := store.NewConsumerProgress(badgerimpl.ToDB(s.db), module.ConsumeProgressLastFullBlockHeight).Initialize(s.finalizedBlock.Height) + require.NoError(s.T(), err) + + s.lastFullBlockHeight, err = counters.NewPersistentStrictMonotonicCounter(lastFullBlockHeight) require.NoError(s.T(), err) eng, err := New( @@ -208,7 +208,7 @@ func (s *Suite) initIngestionEngine(ctx irrecoverable.SignalerContext) *Engine { s.results, s.receipts, s.collectionExecutedMetric, - processedHeight, + processedHeightInitializer, s.lastFullBlockHeight, nil, ) diff --git a/engine/access/ingestion/tx_error_messages/tx_error_messages_engine.go b/engine/access/ingestion/tx_error_messages/tx_error_messages_engine.go index cdd65bdc0b3..036cd70c0df 100644 --- a/engine/access/ingestion/tx_error_messages/tx_error_messages_engine.go +++ b/engine/access/ingestion/tx_error_messages/tx_error_messages_engine.go @@ -69,7 +69,7 @@ func New( log zerolog.Logger, state protocol.State, headers storage.Headers, - txErrorMessagesProcessedHeight storage.ConsumerProgress, + txErrorMessagesProcessedHeight storage.ConsumerProgressInitializer, txErrorMessagesCore *TxErrorMessagesCore, ) (*Engine, error) { e := &Engine{ diff --git a/engine/access/ingestion/tx_error_messages/tx_error_messages_engine_test.go b/engine/access/ingestion/tx_error_messages/tx_error_messages_engine_test.go index b1edcffb9a5..a86e1943bb1 100644 --- a/engine/access/ingestion/tx_error_messages/tx_error_messages_engine_test.go +++ b/engine/access/ingestion/tx_error_messages/tx_error_messages_engine_test.go @@ -23,8 +23,9 @@ import ( "github.com/onflow/flow-go/module" "github.com/onflow/flow-go/module/irrecoverable" protocol "github.com/onflow/flow-go/state/protocol/mock" - bstorage "github.com/onflow/flow-go/storage/badger" storage "github.com/onflow/flow-go/storage/mock" + "github.com/onflow/flow-go/storage/operation/badgerimpl" + "github.com/onflow/flow-go/storage/store" "github.com/onflow/flow-go/utils/unittest" "github.com/onflow/flow-go/utils/unittest/mocks" ) @@ -131,8 +132,8 @@ func (s *TxErrorMessagesEngineSuite) SetupTest() { // initEngine creates a new instance of the transaction error messages engine // and waits for it to start. It initializes the engine with mocked components and state. func (s *TxErrorMessagesEngineSuite) initEngine(ctx irrecoverable.SignalerContext) *Engine { - processedTxErrorMessagesBlockHeight := bstorage.NewConsumerProgress( - s.db, + processedTxErrorMessagesBlockHeight := store.NewConsumerProgress( + badgerimpl.ToDB(s.db), module.ConsumeProgressEngineTxErrorMessagesBlockHeight, ) diff --git a/engine/access/rpc/backend/backend_stream_transactions_test.go b/engine/access/rpc/backend/backend_stream_transactions_test.go index 52049a4b0ef..aae96fa61c0 100644 --- a/engine/access/rpc/backend/backend_stream_transactions_test.go +++ b/engine/access/rpc/backend/backend_stream_transactions_test.go @@ -32,8 +32,9 @@ import ( syncmock "github.com/onflow/flow-go/module/state_synchronization/mock" protocolint "github.com/onflow/flow-go/state/protocol" protocol "github.com/onflow/flow-go/state/protocol/mock" - bstorage "github.com/onflow/flow-go/storage/badger" storagemock "github.com/onflow/flow-go/storage/mock" + "github.com/onflow/flow-go/storage/operation/badgerimpl" + "github.com/onflow/flow-go/storage/store" "github.com/onflow/flow-go/utils/unittest" "github.com/onflow/flow-go/utils/unittest/mocks" @@ -136,11 +137,9 @@ func (s *TransactionStatusSuite) SetupTest() { rootResult := unittest.ExecutionResultFixture(unittest.WithBlock(&s.rootBlock)) s.resultsMap[s.rootBlock.ID()] = rootResult - var err error - s.lastFullBlockHeight, err = counters.NewPersistentStrictMonotonicCounter( - bstorage.NewConsumerProgress(s.db, module.ConsumeProgressLastFullBlockHeight), - s.rootBlock.Header.Height, - ) + progress, err := store.NewConsumerProgress(badgerimpl.ToDB(s.db), module.ConsumeProgressLastFullBlockHeight).Initialize(s.rootBlock.Header.Height) + require.NoError(s.T(), err) + s.lastFullBlockHeight, err = counters.NewPersistentStrictMonotonicCounter(progress) require.NoError(s.T(), err) s.sealedBlock = &s.rootBlock diff --git a/engine/access/rpc/backend/backend_test.go b/engine/access/rpc/backend/backend_test.go index a3068e32645..f6459bca0d4 100644 --- a/engine/access/rpc/backend/backend_test.go +++ b/engine/access/rpc/backend/backend_test.go @@ -45,8 +45,9 @@ import ( protocol "github.com/onflow/flow-go/state/protocol/mock" "github.com/onflow/flow-go/state/protocol/util" "github.com/onflow/flow-go/storage" - bstorage "github.com/onflow/flow-go/storage/badger" storagemock "github.com/onflow/flow-go/storage/mock" + "github.com/onflow/flow-go/storage/operation/badgerimpl" + "github.com/onflow/flow-go/storage/store" "github.com/onflow/flow-go/utils/unittest" "github.com/onflow/flow-go/utils/unittest/generator" "github.com/onflow/flow-go/utils/unittest/mocks" @@ -134,10 +135,9 @@ func (suite *Suite) SetupTest() { suite.Require().NoError(err) suite.db, suite.dbDir = unittest.TempBadgerDB(suite.T()) - suite.lastFullBlockHeight, err = counters.NewPersistentStrictMonotonicCounter( - bstorage.NewConsumerProgress(suite.db, module.ConsumeProgressLastFullBlockHeight), - 0, - ) + progress, err := store.NewConsumerProgress(badgerimpl.ToDB(suite.db), module.ConsumeProgressLastFullBlockHeight).Initialize(0) + require.NoError(suite.T(), err) + suite.lastFullBlockHeight, err = counters.NewPersistentStrictMonotonicCounter(progress) suite.Require().NoError(err) } diff --git a/engine/access/state_stream/backend/backend_executiondata.go b/engine/access/state_stream/backend/backend_executiondata.go index c74a7d1ac1b..04b01aa2973 100644 --- a/engine/access/state_stream/backend/backend_executiondata.go +++ b/engine/access/state_stream/backend/backend_executiondata.go @@ -43,7 +43,7 @@ func (b *ExecutionDataBackend) GetExecutionDataByBlockID(ctx context.Context, bl if err != nil { // need custom not found handler due to blob not found error - if errors.Is(err, storage.ErrNotFound) || execution_data.IsBlobNotFoundError(err) { + if errors.Is(err, storage.ErrNotFound) || execution_data.IsBlobNotFoundError(err) || errors.Is(err, subscription.ErrBlockNotReady) { return nil, status.Errorf(codes.NotFound, "could not find execution data: %v", err) } diff --git a/engine/execution/computation/computer/computer.go b/engine/execution/computation/computer/computer.go index 05e58a4d6f2..3d72cf296bd 100644 --- a/engine/execution/computation/computer/computer.go +++ b/engine/execution/computation/computer/computer.go @@ -132,6 +132,7 @@ func SystemChunkContext(vmCtx fvm.Context, metrics module.ExecutionMetrics) fvm. // only the system transaction is allowed to call the block entropy provider fvm.WithRandomSourceHistoryCallAllowed(true), fvm.WithMetricsReporter(metrics), + fvm.WithAccountStorageLimit(false), ) } diff --git a/engine/execution/computation/computer/computer_test.go b/engine/execution/computation/computer/computer_test.go index 27b81d39c44..242cf126c1e 100644 --- a/engine/execution/computation/computer/computer_test.go +++ b/engine/execution/computation/computer/computer_test.go @@ -598,7 +598,8 @@ func TestBlockExecutor_ExecuteBlock(t *testing.T) { // create a block with 2 collections with 2 transactions each block := generateBlock(collectionCount, transactionsPerCollection, rag) - serviceEvents := systemcontracts.ServiceEventsForChain(execCtx.Chain.ChainID()) + chainID := execCtx.Chain.ChainID() + serviceEvents := systemcontracts.ServiceEventsForChain(chainID) randomSource := unittest.EpochSetupRandomSourceFixture() payload, err := ccf.Decode(nil, unittest.EpochSetupFixtureCCF(randomSource)) @@ -746,7 +747,7 @@ func TestBlockExecutor_ExecuteBlock(t *testing.T) { // make sure event index sequence are valid for i := 0; i < result.BlockExecutionResult.Size(); i++ { collectionResult := result.CollectionExecutionResultAt(i) - unittest.EnsureEventsIndexSeq(t, collectionResult.Events(), execCtx.Chain.ChainID()) + unittest.EnsureEventsIndexSeq(t, collectionResult.Events(), chainID) } sEvents := result.AllServiceEvents() // all events should have been collected diff --git a/engine/execution/computation/manager.go b/engine/execution/computation/manager.go index ee754c18392..a21db637790 100644 --- a/engine/execution/computation/manager.go +++ b/engine/execution/computation/manager.go @@ -231,7 +231,8 @@ func DefaultFVMOptions(chainID flow.ChainID, cadenceTracing bool, extensiveTraci reusableRuntime.NewReusableCadenceRuntimePool( ReusableCadenceRuntimePoolSize, runtime.Config{ - TracingEnabled: cadenceTracing, + TracingEnabled: cadenceTracing, + StorageFormatV2Enabled: true, }, )), fvm.WithEVMEnabled(true), diff --git a/engine/execution/state/bootstrap/bootstrap_test.go b/engine/execution/state/bootstrap/bootstrap_test.go index c014e957b0d..43e33d1bc58 100644 --- a/engine/execution/state/bootstrap/bootstrap_test.go +++ b/engine/execution/state/bootstrap/bootstrap_test.go @@ -53,7 +53,7 @@ func TestBootstrapLedger(t *testing.T) { } func TestBootstrapLedger_ZeroTokenSupply(t *testing.T) { - expectedStateCommitmentBytes, _ := hex.DecodeString("50eb71c0391c1e8535dcea1ed2de29b9980436ca9615064e577043eedf632ff0") + expectedStateCommitmentBytes, _ := hex.DecodeString("15a47ef3ed5d8382716b7393c7e0d82b10bbd9028fa30e097c374ec9b308250e") expectedStateCommitment, err := flow.ToStateCommitment(expectedStateCommitmentBytes) require.NoError(t, err) diff --git a/engine/testutil/mock/nodes.go b/engine/testutil/mock/nodes.go index ff9654eacef..71f991d0334 100644 --- a/engine/testutil/mock/nodes.go +++ b/engine/testutil/mock/nodes.go @@ -282,12 +282,12 @@ type VerificationNode struct { Receipts storage.ExecutionReceipts // chunk consumer and processor for fetcher engine - ProcessedChunkIndex storage.ConsumerProgress + ProcessedChunkIndex storage.ConsumerProgressInitializer ChunksQueue *bstorage.ChunksQueue ChunkConsumer *chunkconsumer.ChunkConsumer // block consumer for chunk consumer - ProcessedBlockHeight storage.ConsumerProgress + ProcessedBlockHeight storage.ConsumerProgressInitializer BlockConsumer *blockconsumer.BlockConsumer VerifierEngine *verifier.Engine diff --git a/engine/testutil/nodes.go b/engine/testutil/nodes.go index a9e536ef079..db1c7be4085 100644 --- a/engine/testutil/nodes.go +++ b/engine/testutil/nodes.go @@ -989,7 +989,7 @@ func VerificationNode(t testing.TB, } if node.ProcessedChunkIndex == nil { - node.ProcessedChunkIndex = storage.NewConsumerProgress(node.PublicDB, module.ConsumeProgressVerificationChunkIndex) + node.ProcessedChunkIndex = store.NewConsumerProgress(badgerimpl.ToDB(node.PublicDB), module.ConsumeProgressVerificationChunkIndex) } if node.ChunksQueue == nil { @@ -1000,7 +1000,7 @@ func VerificationNode(t testing.TB, } if node.ProcessedBlockHeight == nil { - node.ProcessedBlockHeight = storage.NewConsumerProgress(node.PublicDB, module.ConsumeProgressVerificationBlockHeight) + node.ProcessedBlockHeight = store.NewConsumerProgress(badgerimpl.ToDB(node.PublicDB), module.ConsumeProgressVerificationBlockHeight) } if node.VerifierEngine == nil { @@ -1016,7 +1016,7 @@ func VerificationNode(t testing.TB, chunkVerifier := chunks.NewChunkVerifier(vm, vmCtx, node.Log) - approvalStorage := storage.NewResultApprovals(node.Metrics, node.PublicDB) + approvalStorage := store.NewResultApprovals(node.Metrics, badgerimpl.ToDB(node.PublicDB)) node.VerifierEngine, err = verifier.New(node.Log, collector, diff --git a/engine/verification/assigner/blockconsumer/consumer.go b/engine/verification/assigner/blockconsumer/consumer.go index 7b6341be000..89871fecb65 100644 --- a/engine/verification/assigner/blockconsumer/consumer.go +++ b/engine/verification/assigner/blockconsumer/consumer.go @@ -42,7 +42,7 @@ func defaultProcessedIndex(state protocol.State) (uint64, error) { // index for initializing the processed index in storage. func NewBlockConsumer(log zerolog.Logger, metrics module.VerificationMetrics, - processedHeight storage.ConsumerProgress, + processedHeight storage.ConsumerProgressInitializer, blocks storage.Blocks, state protocol.State, blockProcessor assigner.FinalizedBlockProcessor, diff --git a/engine/verification/assigner/blockconsumer/consumer_test.go b/engine/verification/assigner/blockconsumer/consumer_test.go index 26b784b03db..afbe1ccc054 100644 --- a/engine/verification/assigner/blockconsumer/consumer_test.go +++ b/engine/verification/assigner/blockconsumer/consumer_test.go @@ -18,7 +18,8 @@ import ( "github.com/onflow/flow-go/module/jobqueue" "github.com/onflow/flow-go/module/metrics" "github.com/onflow/flow-go/module/trace" - bstorage "github.com/onflow/flow-go/storage/badger" + "github.com/onflow/flow-go/storage/operation/badgerimpl" + "github.com/onflow/flow-go/storage/store" "github.com/onflow/flow-go/utils/unittest" ) @@ -117,10 +118,11 @@ func withConsumer( process func(notifier module.ProcessingNotifier, block *flow.Block), withBlockConsumer func(*blockconsumer.BlockConsumer, []*flow.Block), ) { + unittest.RunWithBadgerDB(t, func(db *badger.DB) { maxProcessing := uint64(workerCount) - processedHeight := bstorage.NewConsumerProgress(db, module.ConsumeProgressVerificationBlockHeight) + processedHeight := store.NewConsumerProgress(badgerimpl.ToDB(db), module.ConsumeProgressVerificationBlockHeight) collector := &metrics.NoopCollector{} tracer := trace.NewNoopTracer() log := unittest.Logger() diff --git a/engine/verification/fetcher/chunkconsumer/consumer.go b/engine/verification/fetcher/chunkconsumer/consumer.go index 703b51d5d7e..66a71aa3dca 100644 --- a/engine/verification/fetcher/chunkconsumer/consumer.go +++ b/engine/verification/fetcher/chunkconsumer/consumer.go @@ -29,7 +29,7 @@ type ChunkConsumer struct { func NewChunkConsumer( log zerolog.Logger, metrics module.VerificationMetrics, - processedIndex storage.ConsumerProgress, // to persist the processed index + processedIndexInitializer storage.ConsumerProgressInitializer, // to persist the processed index chunksQueue storage.ChunksQueue, // to read jobs (chunks) from chunkProcessor fetcher.AssignedChunkProcessor, // to process jobs (chunks) maxProcessing uint64, // max number of jobs to be processed in parallel @@ -40,7 +40,7 @@ func NewChunkConsumer( jobs := &ChunkJobs{locators: chunksQueue} lg := log.With().Str("module", "chunk_consumer").Logger() - consumer, err := jobqueue.NewConsumer(lg, jobs, processedIndex, worker, maxProcessing, 0, DefaultJobIndex) + consumer, err := jobqueue.NewConsumer(lg, jobs, processedIndexInitializer, worker, maxProcessing, 0, DefaultJobIndex) if err != nil { return nil, err } diff --git a/engine/verification/fetcher/chunkconsumer/consumer_test.go b/engine/verification/fetcher/chunkconsumer/consumer_test.go index 1aabce2bd14..91f4ec23dbf 100644 --- a/engine/verification/fetcher/chunkconsumer/consumer_test.go +++ b/engine/verification/fetcher/chunkconsumer/consumer_test.go @@ -15,6 +15,8 @@ import ( "github.com/onflow/flow-go/module" "github.com/onflow/flow-go/module/metrics" storage "github.com/onflow/flow-go/storage/badger" + "github.com/onflow/flow-go/storage/operation/badgerimpl" + "github.com/onflow/flow-go/storage/store" "github.com/onflow/flow-go/utils/unittest" ) @@ -144,7 +146,7 @@ func WithConsumer( unittest.RunWithBadgerDB(t, func(db *badger.DB) { maxProcessing := uint64(3) - processedIndex := storage.NewConsumerProgress(db, module.ConsumeProgressVerificationChunkIndex) + processedIndex := store.NewConsumerProgress(badgerimpl.ToDB(db), module.ConsumeProgressVerificationChunkIndex) chunksQueue := storage.NewChunkQueue(db) ok, err := chunksQueue.Init(chunkconsumer.DefaultJobIndex) require.NoError(t, err) diff --git a/fvm/accountV2Migration/AccountV2Migration.cdc b/fvm/accountV2Migration/AccountV2Migration.cdc new file mode 100644 index 00000000000..671080d8866 --- /dev/null +++ b/fvm/accountV2Migration/AccountV2Migration.cdc @@ -0,0 +1,106 @@ +access(all) +contract AccountV2Migration { + + access(all) + enum StorageFormat: UInt8 { + access(all) + case Unknown + + access(all) + case V1 + + access(all) + case V2 + } + + access(all) + event Migrated( + addressStartIndex: UInt64, + count: UInt64 + ) + + access(all) + resource Admin { + access(all) + fun setNextAddressStartIndex(_ nextAddressStartIndex: UInt64) { + AccountV2Migration.nextAddressStartIndex = nextAddressStartIndex + } + + access(all) + fun setBatchSize(_ batchSize: UInt64) { + AccountV2Migration.batchSize = batchSize + } + + access(all) + fun setMaxAddressIndex(_ maxAddressIndex: UInt64) { + AccountV2Migration.maxAddressIndex = maxAddressIndex + } + + access(all) + fun migrateNextBatch() { + AccountV2Migration.migrateNextBatch() + } + } + + access(all) + let adminStoragePath: StoragePath + + access(all) + var nextAddressStartIndex: UInt64 + + access(all) + var maxAddressIndex: UInt64 + + access(all) + var batchSize: UInt64 + + init() { + self.adminStoragePath = /storage/accountV2MigrationAdmin + self.nextAddressStartIndex = 1 + self.maxAddressIndex = 0 + self.batchSize = 0 + + self.account.storage.save( + <-create Admin(), + to: self.adminStoragePath + ) + } + + access(account) + fun migrateNextBatch() { + var batchSize = self.batchSize + if batchSize <= 0 { + return + } + + let startIndex = self.nextAddressStartIndex + if startIndex > self.maxAddressIndex { + return + } + + let maxBatchSize = self.maxAddressIndex - startIndex + 1 + if batchSize > maxBatchSize { + batchSize = maxBatchSize + } + + if !scheduleAccountV2Migration( + addressStartIndex: startIndex, + count: batchSize + ) { + return + } + + self.nextAddressStartIndex = startIndex + batchSize + + emit Migrated( + addressStartIndex: startIndex, + count: batchSize + ) + } + + access(all) + fun getAccountStorageFormat(address: Address): StorageFormat? { + let rawStorageFormat = getAccountStorageFormat(address: address) + return StorageFormat(rawValue: rawStorageFormat) + } +} diff --git a/fvm/accountV2Migration/contract.go b/fvm/accountV2Migration/contract.go new file mode 100644 index 00000000000..dd1f8ee8a8f --- /dev/null +++ b/fvm/accountV2Migration/contract.go @@ -0,0 +1,224 @@ +package accountV2Migration + +import ( + _ "embed" + + "github.com/onflow/cadence/common" + cadenceErrors "github.com/onflow/cadence/errors" + "github.com/onflow/cadence/interpreter" + "github.com/onflow/cadence/runtime" + "github.com/onflow/cadence/sema" + "github.com/onflow/cadence/stdlib" + + "github.com/onflow/flow-go/fvm/errors" + "github.com/onflow/flow-go/fvm/systemcontracts" + "github.com/onflow/flow-go/model/flow" +) + +//go:embed AccountV2Migration.cdc +var ContractCode []byte + +const ContractName = "AccountV2Migration" + +const scheduleAccountV2MigrationFunctionName = "scheduleAccountV2Migration" + +// scheduleAccountV2MigrationType is the type of the `scheduleAccountV2Migration` function. +// This defines the signature as `func(addressStartIndex: UInt64, count: UInt64): Bool` +var scheduleAccountV2MigrationType = &sema.FunctionType{ + Parameters: []sema.Parameter{ + { + Identifier: "addressStartIndex", + TypeAnnotation: sema.UInt64TypeAnnotation, + }, + { + Identifier: "count", + TypeAnnotation: sema.UInt64TypeAnnotation, + }, + }, + ReturnTypeAnnotation: sema.NewTypeAnnotation(sema.BoolType), +} + +func DeclareFunctions(environment runtime.Environment, chainID flow.ChainID) { + declareScheduleAccountV2MigrationFunction(environment, chainID) + declareGetAccountStorageFormatFunction(environment, chainID) +} + +func declareScheduleAccountV2MigrationFunction(environment runtime.Environment, chainID flow.ChainID) { + + functionType := scheduleAccountV2MigrationType + + functionValue := stdlib.StandardLibraryValue{ + Name: scheduleAccountV2MigrationFunctionName, + Type: functionType, + Kind: common.DeclarationKindFunction, + Value: interpreter.NewUnmeteredStaticHostFunctionValue( + functionType, + func(invocation interpreter.Invocation) interpreter.Value { + inter := invocation.Interpreter + + // Get interpreter storage + + storage := inter.Storage() + + runtimeStorage, ok := storage.(*runtime.Storage) + if !ok { + panic(cadenceErrors.NewUnexpectedError("interpreter storage is not a runtime.Storage")) + } + + // Check the number of arguments + + actualArgumentCount := len(invocation.Arguments) + expectedArgumentCount := len(functionType.Parameters) + + if actualArgumentCount != expectedArgumentCount { + panic(errors.NewInvalidArgumentErrorf( + "incorrect number of arguments: got %d, expected %d", + actualArgumentCount, + expectedArgumentCount, + )) + } + + // Get addressStartIndex argument + + firstArgument := invocation.Arguments[0] + addressStartIndexValue, ok := firstArgument.(interpreter.UInt64Value) + if !ok { + panic(errors.NewInvalidArgumentErrorf( + "incorrect type for argument 0: got `%s`, expected `%s`", + firstArgument.StaticType(inter), + sema.UInt64Type, + )) + } + addressStartIndex := uint64(addressStartIndexValue) + + // Get count argument + + secondArgument := invocation.Arguments[1] + countValue, ok := secondArgument.(interpreter.UInt64Value) + if !ok { + panic(errors.NewInvalidArgumentErrorf( + "incorrect type for argument 1: got `%s`, expected `%s`", + secondArgument.StaticType(inter), + sema.UInt64Type, + )) + } + count := uint64(countValue) + + // Schedule the account V2 migration for addresses + + addressGenerator := chainID.Chain().NewAddressGeneratorAtIndex(addressStartIndex) + for i := uint64(0); i < count; i++ { + address := addressGenerator.CurrentAddress() + if !runtimeStorage.ScheduleV2Migration(common.Address(address)) { + return interpreter.FalseValue + } + + _, err := addressGenerator.NextAddress() + if err != nil { + panic(err) + } + } + + return interpreter.TrueValue + }, + ), + } + + sc := systemcontracts.SystemContractsForChain(chainID) + + accountV2MigrationLocation := common.NewAddressLocation( + nil, + common.Address(sc.AccountV2Migration.Address), + ContractName, + ) + + environment.DeclareValue( + functionValue, + accountV2MigrationLocation, + ) +} + +const getAccountStorageFormatFunctionName = "getAccountStorageFormat" + +// getAccountStorageFormatType is the type of the `getAccountStorageFormat` function. +// This defines the signature as `func(address: Address): UInt8` +var getAccountStorageFormatType = &sema.FunctionType{ + Parameters: []sema.Parameter{ + { + Identifier: "address", + TypeAnnotation: sema.AddressTypeAnnotation, + }, + }, + ReturnTypeAnnotation: sema.NewTypeAnnotation(sema.UInt8Type), +} + +func declareGetAccountStorageFormatFunction(environment runtime.Environment, chainID flow.ChainID) { + + functionType := getAccountStorageFormatType + + functionValue := stdlib.StandardLibraryValue{ + Name: getAccountStorageFormatFunctionName, + Type: functionType, + Kind: common.DeclarationKindFunction, + Value: interpreter.NewUnmeteredStaticHostFunctionValue( + functionType, + func(invocation interpreter.Invocation) interpreter.Value { + inter := invocation.Interpreter + + // Get interpreter storage + + storage := inter.Storage() + + runtimeStorage, ok := storage.(*runtime.Storage) + if !ok { + panic(cadenceErrors.NewUnexpectedError("interpreter storage is not a runtime.Storage")) + } + + // Check the number of arguments + + actualArgumentCount := len(invocation.Arguments) + expectedArgumentCount := len(functionType.Parameters) + + if actualArgumentCount != expectedArgumentCount { + panic(errors.NewInvalidArgumentErrorf( + "incorrect number of arguments: got %d, expected %d", + actualArgumentCount, + expectedArgumentCount, + )) + } + + // Get addressStartIndex argument + + firstArgument := invocation.Arguments[0] + addressValue, ok := firstArgument.(interpreter.AddressValue) + if !ok { + panic(errors.NewInvalidArgumentErrorf( + "incorrect type for argument 0: got `%s`, expected `%s`", + firstArgument.StaticType(inter), + sema.TheAddressType, + )) + } + address := common.Address(addressValue) + + // Get and return the storage format for the account + + return interpreter.UInt8Value(runtimeStorage.AccountStorageFormat(address)) + }, + ), + } + + sc := systemcontracts.SystemContractsForChain(chainID) + + accountV2MigrationLocation := common.NewAddressLocation( + nil, + common.Address(sc.AccountV2Migration.Address), + ContractName, + ) + + environment.DeclareValue( + functionValue, + accountV2MigrationLocation, + ) +} + +const MigratedEventTypeQualifiedIdentifier = ContractName + ".Migrated" diff --git a/fvm/accounts_test.go b/fvm/accounts_test.go index 3cbffead859..946f514f0e5 100644 --- a/fvm/accounts_test.go +++ b/fvm/accounts_test.go @@ -6,15 +6,19 @@ import ( "testing" "github.com/onflow/cadence" + "github.com/onflow/cadence/common" "github.com/onflow/cadence/encoding/ccf" jsoncdc "github.com/onflow/cadence/encoding/json" "github.com/onflow/cadence/format" + "github.com/onflow/cadence/runtime" "github.com/onflow/cadence/stdlib" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/onflow/flow-go/engine/execution/testutil" "github.com/onflow/flow-go/fvm" + "github.com/onflow/flow-go/fvm/accountV2Migration" + reusableRuntime "github.com/onflow/flow-go/fvm/runtime" "github.com/onflow/flow-go/fvm/storage/snapshot" "github.com/onflow/flow-go/model/flow" "github.com/onflow/flow-go/utils/unittest" @@ -1758,3 +1762,165 @@ func TestGetStorageCapacity(t *testing.T) { }), ) } + +func TestAccountV2Migration_getAccountStorageFormat(t *testing.T) { + + t.Run( + "service account", + newVMTest().run(func( + t *testing.T, + vm fvm.VM, + chain flow.Chain, + ctx fvm.Context, + snapshotTree snapshot.SnapshotTree, + ) { + serviceAddress := chain.ServiceAddress() + + script := fvm.Script([]byte(fmt.Sprintf( + ` + import AccountV2Migration from %[1]s + + access(all) fun main() { + let storageFormat = AccountV2Migration.getAccountStorageFormat(address: %[1]s) + assert(storageFormat == AccountV2Migration.StorageFormat.V1) + } + `, + serviceAddress.HexWithPrefix(), + ))) + + _, output, err := vm.Run(ctx, script, snapshotTree) + require.NoError(t, err) + require.NoError(t, output.Err) + }), + ) +} + +func TestAccountV2Migration_migrate(t *testing.T) { + + t.Run( + "service account", + newVMTest().withContextOptions( + fvm.WithAuthorizationChecksEnabled(false), + fvm.WithSequenceNumberCheckAndIncrementEnabled(false), + ).run(func( + t *testing.T, + vm fvm.VM, + chain flow.Chain, + ctx fvm.Context, + snapshotTree snapshot.SnapshotTree, + ) { + serviceAddress := chain.ServiceAddress() + + // Ensure the account is in V1 format after bootstrapping + + script := fvm.Script([]byte(fmt.Sprintf( + ` + import AccountV2Migration from %[1]s + + access(all) fun main() { + let storageFormat = AccountV2Migration.getAccountStorageFormat(address: %[1]s) + assert(storageFormat == AccountV2Migration.StorageFormat.V1) + } + `, + serviceAddress.HexWithPrefix(), + ))) + + _, output, err := vm.Run(ctx, script, snapshotTree) + require.NoError(t, err) + require.NoError(t, output.Err) + + // Enable the storage format V2 feature for all subsequent transactions and scripts + + ctx = fvm.NewContextFromParent( + ctx, + fvm.WithReusableCadenceRuntimePool( + reusableRuntime.NewReusableCadenceRuntimePool( + 1, + runtime.Config{ + StorageFormatV2Enabled: true, + }, + ), + ), + ) + + // Enable the account V2 migration and migrate the first batch + + serviceAddressIndex, err := chain.IndexFromAddress(serviceAddress) + require.NoError(t, err) + + batchSize := serviceAddressIndex + 1 + maxAddressIndex := serviceAddressIndex + 1 + + tx := fvm.Transaction( + flow.NewTransactionBody(). + SetScript([]byte(fmt.Sprintf( + ` + import AccountV2Migration from %[1]s + + transaction { + prepare(signer: auth(Storage) &Account) { + let admin = signer.storage + .borrow<&AccountV2Migration.Admin>( + from: AccountV2Migration.adminStoragePath + ) + ?? panic("missing account V2 migration admin resource") + admin.setBatchSize(%[2]d) + admin.setMaxAddressIndex(%[3]d) + admin.migrateNextBatch() + } + } + `, + serviceAddress.HexWithPrefix(), + batchSize, + maxAddressIndex, + ))). + AddAuthorizer(chain.ServiceAddress()), + 0, + ) + executionSnapshot, output, err := vm.Run(ctx, tx, snapshotTree) + require.NoError(t, err) + require.NoError(t, output.Err) + + require.Len(t, output.Events, 1) + + event := output.Events[0] + + accountV2MigrationLocation := common.AddressLocation{ + Address: common.Address(serviceAddress), + Name: accountV2Migration.ContractName, + } + expectedEventTypeID := accountV2MigrationLocation. + TypeID(nil, accountV2Migration.MigratedEventTypeQualifiedIdentifier) + assert.Equal(t, flow.EventType(expectedEventTypeID), event.Type) + + decodedEventPayload, err := ccf.Decode(nil, event.Payload) + require.NoError(t, err) + + require.IsType(t, cadence.Event{}, decodedEventPayload) + + eventFields := decodedEventPayload.(cadence.Composite).FieldsMappedByName() + assert.Equal(t, cadence.UInt64(1), eventFields["addressStartIndex"]) + assert.Equal(t, cadence.UInt64(batchSize), eventFields["count"]) + + snapshotTree = snapshotTree.Append(executionSnapshot) + + // Ensure the account is in V2 format after the migration + + script = fvm.Script([]byte(fmt.Sprintf( + ` + import AccountV2Migration from %[1]s + + access(all) fun main() { + let storageFormat = AccountV2Migration.getAccountStorageFormat(address: %[1]s) + assert(storageFormat == AccountV2Migration.StorageFormat.V2) + } + `, + serviceAddress.HexWithPrefix(), + ))) + + _, output, err = vm.Run(ctx, script, snapshotTree) + require.NoError(t, err) + require.NoError(t, output.Err) + }), + ) +} diff --git a/fvm/blueprints/scripts/systemChunkTransactionTemplate.cdc b/fvm/blueprints/scripts/systemChunkTransactionTemplate.cdc index 7c9564e1486..a2e5b4e2f05 100644 --- a/fvm/blueprints/scripts/systemChunkTransactionTemplate.cdc +++ b/fvm/blueprints/scripts/systemChunkTransactionTemplate.cdc @@ -2,6 +2,7 @@ import FlowEpoch from "FlowEpoch" import NodeVersionBeacon from "NodeVersionBeacon" import RandomBeaconHistory from "RandomBeaconHistory" import EVM from "EVM" +import Migration from "Migration" transaction { prepare(serviceAccount: auth(BorrowValue) &Account) { @@ -19,9 +20,12 @@ transaction { ?? panic("Couldn't borrow RandomBeaconHistory.Heartbeat Resource") randomBeaconHistoryHeartbeat.heartbeat(randomSourceHistory: randomSourceHistory()) - let evmHeartbeat = serviceAccount.storage.borrow<&EVM.Heartbeat>(from: /storage/EVMHeartbeat) - if evmHeartbeat != nil { // skip if not available - evmHeartbeat!.heartbeat() - } + let evmHeartbeat = serviceAccount.storage + .borrow<&EVM.Heartbeat>(from: /storage/EVMHeartbeat) + evmHeartbeat?.heartbeat() + + let migrationAdmin = serviceAccount.storage + .borrow<&Migration.Admin>(from: Migration.adminStoragePath) + migrationAdmin?.migrate() } } diff --git a/fvm/blueprints/system.go b/fvm/blueprints/system.go index 466f8ee47f9..f2631b6bbb2 100644 --- a/fvm/blueprints/system.go +++ b/fvm/blueprints/system.go @@ -21,7 +21,9 @@ var systemChunkTransactionTemplate string // TODO: when the EVM contract is moved to the flow-core-contracts, we can // just directly use the replace address functionality of the templates package. -var placeholderEVMAddress = "\"EVM\"" +const placeholderEVMAddress = "\"EVM\"" + +const placeholderMigrationAddress = "\"Migration\"" func prepareSystemContractCode(chainID flow.ChainID) string { sc := systemcontracts.SystemContractsForChain(chainID) @@ -34,6 +36,11 @@ func prepareSystemContractCode(chainID flow.ChainID) string { placeholderEVMAddress, sc.EVMContract.Address.HexWithPrefix(), ) + code = strings.ReplaceAll( + code, + placeholderMigrationAddress, + sc.Migration.Address.HexWithPrefix(), + ) return code } diff --git a/fvm/blueprints/system_test.go b/fvm/blueprints/system_test.go index a63ce1c28c9..2e2f924b279 100644 --- a/fvm/blueprints/system_test.go +++ b/fvm/blueprints/system_test.go @@ -18,10 +18,10 @@ func TestSystemChunkTransactionHash(t *testing.T) { // this is formatted in a way that the resulting error message is easy to copy-paste into the test. expectedHashes := []chainHash{ - {chainId: "flow-mainnet", expectedHash: "0e56f890392ad3f2a0dcc7a0e859b6d41f3c17556aa85a0f8831ae25a6537e39"}, - {chainId: "flow-testnet", expectedHash: "69c922177af520e8ecaf0ba97cb174a3ebbd03de6d5b5d1f6b6c043a9638dba3"}, - {chainId: "flow-previewnet", expectedHash: "2ec3b6b7e7d70a651600eb80f775cb57613a0a168c847b70040c469f09066a55"}, - {chainId: "flow-emulator", expectedHash: "7dcc0daaecebc7be33b068ed5c8da0620c89fd896abfc498fc0cc32a261aab1f"}, + {chainId: "flow-mainnet", expectedHash: "3408f8b1aa1b33cfc3f78c3f15217272807b14cec4ef64168bcf313bc4174621"}, + {chainId: "flow-testnet", expectedHash: "dadf3e1bf916f6cb2510cbea00ed9be78cc1b7d2b9ec29f0ef1d469ead2dda2d"}, + {chainId: "flow-previewnet", expectedHash: "ecee9d431f3ab406c64bd31c2b574035a9971feabd872f5e8f31b55dd08978f3"}, + {chainId: "flow-emulator", expectedHash: "d201f7b80ee8471754e2a1cad30f5ab888d4be3ba2c0a1cac5a3fcc0b34546a4"}, } var actualHashes []chainHash diff --git a/fvm/bootstrap.go b/fvm/bootstrap.go index a37d0948461..a530fe001da 100644 --- a/fvm/bootstrap.go +++ b/fvm/bootstrap.go @@ -11,11 +11,13 @@ import ( usdc "github.com/onflow/bridged-usdc/lib/go/contracts" storefront "github.com/onflow/nft-storefront/lib/go/contracts" + "github.com/onflow/flow-go/fvm/accountV2Migration" "github.com/onflow/flow-go/fvm/blueprints" "github.com/onflow/flow-go/fvm/environment" "github.com/onflow/flow-go/fvm/errors" "github.com/onflow/flow-go/fvm/evm/stdlib" "github.com/onflow/flow-go/fvm/meter" + "github.com/onflow/flow-go/fvm/migration" "github.com/onflow/flow-go/fvm/storage" "github.com/onflow/flow-go/fvm/storage/logical" "github.com/onflow/flow-go/fvm/systemcontracts" @@ -456,6 +458,9 @@ func (b *bootstrapExecutor) Execute() error { // set the list of nodes which are allowed to stake in this network b.setStakingAllowlist(service, b.identities.NodeIDs()) + b.deployAccountV2MigrationContract(service) + b.deployMigrationContract(service) + return nil } @@ -1115,6 +1120,32 @@ func (b *bootstrapExecutor) deployStakingCollection( panicOnMetaInvokeErrf("failed to deploy FlowStakingCollection contract: %s", txError, err) } +func (b *bootstrapExecutor) deployAccountV2MigrationContract(deployTo flow.Address) { + tx := blueprints.DeployContractTransaction( + deployTo, + accountV2Migration.ContractCode, + accountV2Migration.ContractName, + ) + txError, err := b.invokeMetaTransaction( + b.ctx, + Transaction(tx, 0), + ) + panicOnMetaInvokeErrf("failed to deploy AccountV2Migration contract: %s", txError, err) +} + +func (b *bootstrapExecutor) deployMigrationContract(deployTo flow.Address) { + tx := blueprints.DeployContractTransaction( + deployTo, + migration.ContractCode(deployTo), + migration.ContractName, + ) + txError, err := b.invokeMetaTransaction( + b.ctx, + Transaction(tx, 0), + ) + panicOnMetaInvokeErrf("failed to deploy Migration contract: %s", txError, err) +} + func (b *bootstrapExecutor) setContractDeploymentRestrictions( service flow.Address, deployment *bool, diff --git a/fvm/context.go b/fvm/context.go index 5582b9ac38e..37440880811 100644 --- a/fvm/context.go +++ b/fvm/context.go @@ -92,8 +92,8 @@ func WithChain(chain flow.Chain) Option { } } -// WithGasLimit sets the computation limit for a virtual machine context. -// @depricated, please use WithComputationLimit instead. +// Deprecated: WithGasLimit sets the computation limit for a virtual machine context. +// Use WithComputationLimit instead. func WithGasLimit(limit uint64) Option { return func(ctx Context) Context { ctx.ComputationLimit = limit diff --git a/fvm/environment/env.go b/fvm/environment/env.go index 8f5616a033c..eb1195316fd 100644 --- a/fvm/environment/env.go +++ b/fvm/environment/env.go @@ -108,10 +108,10 @@ type EnvironmentParams struct { } func DefaultEnvironmentParams() EnvironmentParams { + const chainID = flow.Mainnet return EnvironmentParams{ - Chain: flow.Mainnet.Chain(), - ServiceAccountEnabled: true, - + Chain: chainID.Chain(), + ServiceAccountEnabled: true, RuntimeParams: DefaultRuntimeParams(), ProgramLoggerParams: DefaultProgramLoggerParams(), EventEmitterParams: DefaultEventEmitterParams(), diff --git a/fvm/environment/system_contracts_test.go b/fvm/environment/system_contracts_test.go index e5870107956..9ec300f86cd 100644 --- a/fvm/environment/system_contracts_test.go +++ b/fvm/environment/system_contracts_test.go @@ -54,6 +54,8 @@ func TestSystemContractsInvoke(t *testing.T) { for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { + const chainID = flow.Mainnet + tracer := tracing.NewTracerSpan() runtimePool := reusableRuntime.NewCustomReusableCadenceRuntimePool( 0, @@ -70,7 +72,7 @@ func TestSystemContractsInvoke(t *testing.T) { }, ) invoker := environment.NewSystemContracts( - flow.Mainnet.Chain(), + chainID.Chain(), tracer, environment.NewProgramLogger( tracer, diff --git a/fvm/evm/emulator/emulator.go b/fvm/evm/emulator/emulator.go index 9aa39df69ff..7bf11e22f91 100644 --- a/fvm/evm/emulator/emulator.go +++ b/fvm/evm/emulator/emulator.go @@ -127,6 +127,14 @@ func (bl *BlockView) DirectCall(call *types.DirectCall) (res *types.Result, err err == nil && res != nil { proc.evm.Config.Tracer.OnTxEnd(res.Receipt(), res.ValidationError) } + + // call OnLog tracer hook, upon successful call result + if proc.evm.Config.Tracer.OnLog != nil && + err == nil && res != nil { + for _, log := range res.Logs { + proc.evm.Config.Tracer.OnLog(log) + } + } }() } @@ -191,6 +199,15 @@ func (bl *BlockView) RunTransaction( proc.evm.Config.Tracer.OnTxEnd(res.Receipt(), res.ValidationError) } + // call OnLog tracer hook, upon successful tx result + if proc.evm.Config.Tracer != nil && + proc.evm.Config.Tracer.OnLog != nil && + res != nil { + for _, log := range res.Logs { + proc.evm.Config.Tracer.OnLog(log) + } + } + return res, nil } @@ -243,6 +260,15 @@ func (bl *BlockView) BatchRunTransactions(txs []*gethTypes.Transaction) ([]*type res != nil { proc.evm.Config.Tracer.OnTxEnd(res.Receipt(), res.ValidationError) } + + // call OnLog tracer hook, upon successful tx result + if proc.evm.Config.Tracer != nil && + proc.evm.Config.Tracer.OnLog != nil && + res != nil { + for _, log := range res.Logs { + proc.evm.Config.Tracer.OnLog(log) + } + } } // finalize after all the batch transactions are executed to save resources diff --git a/fvm/migration/Migration.cdc b/fvm/migration/Migration.cdc new file mode 100644 index 00000000000..28879db3643 --- /dev/null +++ b/fvm/migration/Migration.cdc @@ -0,0 +1,32 @@ + +import "AccountV2Migration" + +access(all) +contract Migration { + + access(all) + resource Admin { + + access(all) + fun migrate() { + Migration.migrate() + } + } + + access(all) + let adminStoragePath: StoragePath + + init() { + self.adminStoragePath = /storage/migrationAdmin + + self.account.storage.save( + <-create Admin(), + to: self.adminStoragePath + ) + } + + access(contract) + fun migrate() { + AccountV2Migration.migrateNextBatch() + } +} diff --git a/fvm/migration/migration.go b/fvm/migration/migration.go new file mode 100644 index 00000000000..f7a9a17ee18 --- /dev/null +++ b/fvm/migration/migration.go @@ -0,0 +1,24 @@ +package migration + +import ( + _ "embed" + "fmt" + "regexp" + + "github.com/onflow/flow-go/model/flow" +) + +//go:embed Migration.cdc +var contractCode string + +const ContractName = "Migration" + +var accountV2MigrationImportPattern = regexp.MustCompile(`(?m)^import "AccountV2Migration"`) + +func ContractCode(accountV2MigrationAddress flow.Address) []byte { + evmContract := accountV2MigrationImportPattern.ReplaceAllString( + contractCode, + fmt.Sprintf("import AccountV2Migration from %s", accountV2MigrationAddress.HexWithPrefix()), + ) + return []byte(evmContract) +} diff --git a/fvm/runtime/reusable_cadence_runtime.go b/fvm/runtime/reusable_cadence_runtime.go index 138156897b1..2a00b133256 100644 --- a/fvm/runtime/reusable_cadence_runtime.go +++ b/fvm/runtime/reusable_cadence_runtime.go @@ -20,9 +20,8 @@ type Environment interface { } // randomSourceFunctionType is the type of the `randomSource` function. -// This defies the signature as `func (): [UInt8]` +// This defines the signature as `func(): [UInt8]` var randomSourceFunctionType = &sema.FunctionType{ - Parameters: []sema.Parameter{}, ReturnTypeAnnotation: sema.NewTypeAnnotation(sema.ByteArrayType), } @@ -34,13 +33,23 @@ type ReusableCadenceRuntime struct { fvmEnv Environment } -func NewReusableCadenceRuntime(rt runtime.Runtime, config runtime.Config) *ReusableCadenceRuntime { +func NewReusableCadenceRuntime( + rt runtime.Runtime, + config runtime.Config, +) *ReusableCadenceRuntime { reusable := &ReusableCadenceRuntime{ Runtime: rt, TxRuntimeEnv: runtime.NewBaseInterpreterEnvironment(config), ScriptRuntimeEnv: runtime.NewScriptInterpreterEnvironment(config), } + reusable.declareRandomSourceHistory() + + return reusable +} + +func (reusable *ReusableCadenceRuntime) declareRandomSourceHistory() { + // Declare the `randomSourceHistory` function. This function is **only** used by the // System transaction, to fill the `RandomBeaconHistory` contract via the heartbeat // resource. This allows the `RandomBeaconHistory` contract to be a standard contract, @@ -49,22 +58,32 @@ func NewReusableCadenceRuntime(rt runtime.Runtime, config runtime.Config) *Reusa // it is not part of the cadence standard library, and can just be injected from here. // It also doesnt need user documentation, since it is not (and should not) // be called by the user. If it is called by the user it will panic. + functionType := randomSourceFunctionType + blockRandomSource := stdlib.StandardLibraryValue{ Name: "randomSourceHistory", - Type: randomSourceFunctionType, + Type: functionType, Kind: common.DeclarationKindFunction, Value: interpreter.NewUnmeteredStaticHostFunctionValue( - randomSourceFunctionType, + functionType, func(invocation interpreter.Invocation) interpreter.Value { - if len(invocation.Arguments) != 0 { + + actualArgumentCount := len(invocation.Arguments) + expectedArgumentCount := len(functionType.Parameters) + + if actualArgumentCount != expectedArgumentCount { panic(errors.NewInvalidArgumentErrorf( - "randomSourceHistory should be called without arguments")) + "incorrect number of arguments: got %d, expected %d", + actualArgumentCount, + expectedArgumentCount, + )) } var err error var source []byte - if reusable.fvmEnv != nil { - source, err = reusable.fvmEnv.RandomSourceHistory() + fvmEnv := reusable.fvmEnv + if fvmEnv != nil { + source, err = fvmEnv.RandomSourceHistory() } else { err = errors.NewOperationNotSupportedError("randomSourceHistory") } @@ -81,8 +100,6 @@ func NewReusableCadenceRuntime(rt runtime.Runtime, config runtime.Config) *Reusa } reusable.TxRuntimeEnv.DeclareValue(blockRandomSource, nil) - - return reusable } func (reusable *ReusableCadenceRuntime) SetFvmEnvironment(fvmEnv Environment) { diff --git a/fvm/runtime/reusable_cadence_runtime_test.go b/fvm/runtime/reusable_cadence_runtime_test.go index 758fa2f7426..cf6a2a44867 100644 --- a/fvm/runtime/reusable_cadence_runtime_test.go +++ b/fvm/runtime/reusable_cadence_runtime_test.go @@ -59,7 +59,7 @@ func TestReusableCadenceRuntimePoolSharing(t *testing.T) { default: } - var otherPool ReusableCadenceRuntimePool = pool + var otherPool = pool entry := otherPool.Borrow(nil) require.NotNil(t, entry) diff --git a/fvm/script.go b/fvm/script.go index 728bf236c0e..5d9a1fd4dc3 100644 --- a/fvm/script.go +++ b/fvm/script.go @@ -8,6 +8,7 @@ import ( "github.com/onflow/cadence/common" "github.com/onflow/cadence/runtime" + "github.com/onflow/flow-go/fvm/accountV2Migration" "github.com/onflow/flow-go/fvm/environment" "github.com/onflow/flow-go/fvm/errors" "github.com/onflow/flow-go/fvm/evm" @@ -200,10 +201,11 @@ func (executor *scriptExecutor) executeScript() error { rt := executor.env.BorrowCadenceRuntime() defer executor.env.ReturnCadenceRuntime(rt) + chainID := executor.ctx.Chain.ChainID() + if executor.ctx.EVMEnabled { - chain := executor.ctx.Chain err := evm.SetupEnvironment( - chain.ChainID(), + chainID, executor.env, rt.ScriptRuntimeEnv, ) @@ -212,6 +214,11 @@ func (executor *scriptExecutor) executeScript() error { } } + accountV2Migration.DeclareFunctions( + rt.ScriptRuntimeEnv, + chainID, + ) + value, err := rt.ExecuteScript( runtime.Script{ Source: executor.proc.Script, diff --git a/fvm/systemcontracts/system_contracts.go b/fvm/systemcontracts/system_contracts.go index 775649c565c..f200fe59ae2 100644 --- a/fvm/systemcontracts/system_contracts.go +++ b/fvm/systemcontracts/system_contracts.go @@ -44,6 +44,8 @@ const ( ContractNameEVM = "EVM" ContractNameBurner = "Burner" ContractNameCrypto = "Crypto" + ContractNameMigration = "Migration" + ContractNameAccountV2Migration = "AccountV2Migration" // AccountNameEVMStorage is not a contract, but a special account that is used to store EVM state AccountNameEVMStorage = "EVMStorageAccount" @@ -183,6 +185,10 @@ type SystemContracts struct { // Utility contracts Burner SystemContract Crypto SystemContract + + // Migration contracts + Migration SystemContract + AccountV2Migration SystemContract } // AsTemplateEnv returns a template environment with all system contracts filled in. @@ -242,6 +248,9 @@ func (c SystemContracts) All() []SystemContract { c.Burner, c.Crypto, + + c.Migration, + c.AccountV2Migration, } } @@ -392,6 +401,9 @@ func init() { ContractNameBurner: burnerAddressFunc, ContractNameCrypto: serviceAddressFunc, + + ContractNameMigration: serviceAddressFunc, + ContractNameAccountV2Migration: serviceAddressFunc, } getSystemContractsForChain := func(chainID flow.ChainID) *SystemContracts { @@ -449,6 +461,9 @@ func init() { Burner: addressOfContract(ContractNameBurner), Crypto: addressOfContract(ContractNameCrypto), + + Migration: addressOfContract(ContractNameMigration), + AccountV2Migration: addressOfContract(ContractNameAccountV2Migration), } return contracts diff --git a/fvm/transactionInvoker.go b/fvm/transactionInvoker.go index de2fc63c1a9..4308d2b8e06 100644 --- a/fvm/transactionInvoker.go +++ b/fvm/transactionInvoker.go @@ -10,6 +10,7 @@ import ( "go.opentelemetry.io/otel/attribute" otelTrace "go.opentelemetry.io/otel/trace" + "github.com/onflow/flow-go/fvm/accountV2Migration" "github.com/onflow/flow-go/fvm/environment" "github.com/onflow/flow-go/fvm/errors" "github.com/onflow/flow-go/fvm/evm" @@ -186,11 +187,12 @@ func (executor *transactionExecutor) preprocess() error { // infrequently modified and are expensive to compute. For now this includes // reading meter parameter overrides and parsing programs. func (executor *transactionExecutor) preprocessTransactionBody() error { - // setup evm + chainID := executor.ctx.Chain.ChainID() + + // setup EVM if executor.ctx.EVMEnabled { - chain := executor.ctx.Chain err := evm.SetupEnvironment( - chain.ChainID(), + chainID, executor.env, executor.cadenceRuntime.TxRuntimeEnv, ) @@ -198,6 +200,12 @@ func (executor *transactionExecutor) preprocessTransactionBody() error { return err } } + + accountV2Migration.DeclareFunctions( + executor.cadenceRuntime.TxRuntimeEnv, + chainID, + ) + // get meter parameters executionParameters, executionStateRead, err := getExecutionParameters( executor.env.Logger(), @@ -253,11 +261,12 @@ func (executor *transactionExecutor) execute() error { } func (executor *transactionExecutor) ExecuteTransactionBody() error { - // setup evm + chainID := executor.ctx.Chain.ChainID() + + // setup EVM if executor.ctx.EVMEnabled { - chain := executor.ctx.Chain err := evm.SetupEnvironment( - chain.ChainID(), + chainID, executor.env, executor.cadenceRuntime.TxRuntimeEnv, ) @@ -266,6 +275,11 @@ func (executor *transactionExecutor) ExecuteTransactionBody() error { } } + accountV2Migration.DeclareFunctions( + executor.cadenceRuntime.TxRuntimeEnv, + chainID, + ) + var invalidator derived.TransactionInvalidator if !executor.errs.CollectedError() { diff --git a/go.mod b/go.mod index d7fb0d1c454..2c7a7670350 100644 --- a/go.mod +++ b/go.mod @@ -16,17 +16,17 @@ require ( github.com/ef-ds/deque v1.0.4 github.com/ethereum/go-ethereum v1.13.10 github.com/fxamacker/cbor/v2 v2.4.1-0.20230228173756-c0c9f774e40c - github.com/gammazero/workerpool v1.1.2 + github.com/gammazero/workerpool v1.1.3 github.com/gogo/protobuf v1.3.2 github.com/golang/mock v1.6.0 github.com/golang/protobuf v1.5.4 github.com/google/go-cmp v0.6.0 - github.com/google/pprof v0.0.0-20231229205709-960ae82b1e42 + github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad github.com/google/uuid v1.6.0 github.com/gorilla/mux v1.8.1 github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0 github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 - github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 + github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 github.com/hashicorp/go-multierror v1.1.1 github.com/hashicorp/golang-lru v1.0.2 github.com/improbable-eng/grpc-web v0.15.0 @@ -39,13 +39,13 @@ require ( github.com/ipfs/go-log v1.0.5 github.com/ipfs/go-log/v2 v2.5.1 github.com/libp2p/go-addr-util v0.1.0 - github.com/libp2p/go-libp2p v0.32.2 + github.com/libp2p/go-libp2p v0.38.2 github.com/libp2p/go-libp2p-kad-dht v0.25.2 github.com/libp2p/go-libp2p-kbucket v0.6.3 - github.com/libp2p/go-libp2p-pubsub v0.10.0 - github.com/montanaflynn/stats v0.7.0 - github.com/multiformats/go-multiaddr v0.12.2 - github.com/multiformats/go-multiaddr-dns v0.3.1 + github.com/libp2p/go-libp2p-pubsub v0.13.0 + github.com/montanaflynn/stats v0.7.1 + github.com/multiformats/go-multiaddr v0.14.0 + github.com/multiformats/go-multiaddr-dns v0.4.1 github.com/multiformats/go-multihash v0.2.3 github.com/onflow/atree v0.9.0 github.com/onflow/cadence v1.3.1 @@ -59,7 +59,7 @@ require ( github.com/pierrec/lz4 v2.6.1+incompatible github.com/pkg/errors v0.9.1 github.com/pkg/profile v1.7.0 - github.com/prometheus/client_golang v1.18.0 + github.com/prometheus/client_golang v1.20.5 github.com/rs/cors v1.8.0 github.com/rs/zerolog v1.29.0 github.com/schollz/progressbar/v3 v3.13.1 @@ -71,24 +71,24 @@ require ( github.com/stretchr/testify v1.10.0 github.com/vmihailenco/msgpack v4.0.4+incompatible github.com/vmihailenco/msgpack/v4 v4.3.11 - go.opentelemetry.io/otel v1.24.0 - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 - go.opentelemetry.io/otel/sdk v1.24.0 - go.opentelemetry.io/otel/trace v1.24.0 + go.opentelemetry.io/otel v1.31.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0 + go.opentelemetry.io/otel/sdk v1.31.0 + go.opentelemetry.io/otel/trace v1.31.0 go.uber.org/atomic v1.11.0 go.uber.org/multierr v1.11.0 - golang.org/x/crypto v0.28.0 - golang.org/x/exp v0.0.0-20240119083558-1b970713d09a - golang.org/x/sync v0.8.0 - golang.org/x/sys v0.26.0 - golang.org/x/text v0.19.0 + golang.org/x/crypto v0.31.0 + golang.org/x/exp v0.0.0-20241217172543-b2144cdd0a67 + golang.org/x/sync v0.10.0 + golang.org/x/sys v0.28.0 + golang.org/x/text v0.21.0 golang.org/x/time v0.5.0 - golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d + golang.org/x/tools v0.28.0 google.golang.org/api v0.169.0 google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de - google.golang.org/grpc v1.64.1 + google.golang.org/grpc v1.67.1 google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.2.0 - google.golang.org/protobuf v1.34.2 + google.golang.org/protobuf v1.36.0 gotest.tools v2.2.0+incompatible pgregory.net/rapid v1.1.0 ) @@ -98,22 +98,23 @@ require ( github.com/coreos/go-semver v0.3.0 github.com/docker/go-units v0.5.0 github.com/dustin/go-humanize v1.0.1 - github.com/go-playground/validator/v10 v10.14.1 + github.com/go-playground/validator/v10 v10.19.0 github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb - github.com/gorilla/websocket v1.5.0 + github.com/gorilla/websocket v1.5.3 github.com/hashicorp/golang-lru/v2 v2.0.7 github.com/holiman/uint256 v1.3.0 github.com/huandu/go-clone/generic v1.7.2 github.com/ipfs/boxo v0.17.1-0.20240131173518-89bceff34bf1 + github.com/libp2p/go-libp2p-routing-helpers v0.7.4 github.com/mitchellh/mapstructure v1.5.0 github.com/onflow/bridged-usdc/lib/go/contracts v1.0.0 github.com/onflow/go-ethereum v1.14.7 github.com/onflow/nft-storefront/lib/go/contracts v1.0.0 github.com/onflow/wal v1.0.2 - github.com/slok/go-http-metrics v0.10.0 + github.com/slok/go-http-metrics v0.12.0 github.com/sony/gobreaker v0.5.0 - golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 - google.golang.org/genproto/googleapis/api v0.0.0-20240814211410-ddb44dafa142 + golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da + google.golang.org/genproto/googleapis/api v0.0.0-20241007155032-5fefd90f89a9 google.golang.org/genproto/googleapis/bytestream v0.0.0-20240304161311-37d4d3c04a78 gopkg.in/yaml.v2 v2.4.0 ) @@ -122,6 +123,7 @@ require ( cloud.google.com/go v0.112.1 // indirect cloud.google.com/go/iam v1.1.6 // indirect github.com/DataDog/zstd v1.5.2 // indirect + github.com/Jorropo/jsync v1.0.1 // indirect github.com/Microsoft/go-winio v0.6.2 // indirect github.com/OneOfOne/xxhash v1.2.8 // indirect github.com/SaveTheRbtz/mph v0.1.1-0.20240117162131-4166ec7869bc // indirect @@ -144,7 +146,7 @@ require ( github.com/beorn7/perks v1.0.1 // indirect github.com/bits-and-blooms/bitset v1.10.0 // indirect github.com/btcsuite/btcd/chaincfg/chainhash v1.0.2 // indirect - github.com/cenkalti/backoff/v4 v4.2.1 // indirect + github.com/cenkalti/backoff/v4 v4.3.0 // indirect github.com/cespare/xxhash v1.1.0 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/cockroachdb/errors v1.11.3 // indirect @@ -161,35 +163,36 @@ require ( github.com/cskr/pubsub v1.0.2 // indirect github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c // indirect github.com/deckarep/golang-set/v2 v2.6.0 // indirect - github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 // indirect github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f // indirect github.com/dgraph-io/ristretto v0.1.0 // indirect github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 // indirect - github.com/elastic/gosigar v0.14.2 // indirect + github.com/elastic/gosigar v0.14.3 // indirect github.com/ethereum/c-kzg-4844 v1.0.0 // indirect github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0 // indirect github.com/felixge/fgprof v0.9.3 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/flynn/noise v1.0.1 // indirect + github.com/filecoin-project/go-clock v0.1.0 // indirect + github.com/flynn/noise v1.1.0 // indirect github.com/francoispqt/gojay v1.2.13 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/fxamacker/circlehash v0.3.0 // indirect - github.com/gabriel-vasile/mimetype v1.4.3 // indirect - github.com/gammazero/deque v0.1.0 // indirect + github.com/gabriel-vasile/mimetype v1.4.6 // indirect + github.com/gammazero/deque v1.0.0 // indirect github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff // indirect github.com/getsentry/sentry-go v0.27.0 // indirect github.com/go-kit/kit v0.12.0 // indirect github.com/go-kit/log v0.2.1 // indirect - github.com/go-logfmt/logfmt v0.5.1 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logfmt/logfmt v0.6.0 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.3.0 // indirect github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect - github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect + github.com/go-task/slim-sprig/v3 v3.0.0 // indirect github.com/godbus/dbus/v5 v5.1.0 // indirect github.com/gofrs/flock v0.8.1 // indirect - github.com/golang/glog v1.2.0 // indirect + github.com/golang/glog v1.2.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/google/gopacket v1.1.19 // indirect github.com/google/s2a-go v0.1.7 // indirect @@ -207,7 +210,7 @@ require ( github.com/ipfs/go-ipfs-pq v0.0.3 // indirect github.com/ipfs/go-ipfs-util v0.0.3 // indirect github.com/ipfs/go-metrics-interface v0.0.1 // indirect - github.com/ipfs/go-peertaskqueue v0.8.1 // indirect + github.com/ipfs/go-peertaskqueue v0.8.2 // indirect github.com/ipld/go-ipld-prime v0.21.0 // indirect github.com/jackpal/go-nat-pmp v1.0.2 // indirect github.com/jbenet/go-temp-err-catcher v0.1.0 // indirect @@ -215,21 +218,20 @@ require ( github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/k0kubun/pp v3.0.1+incompatible // indirect github.com/kevinburke/go-bindata v3.24.0+incompatible // indirect - github.com/klauspost/compress v1.17.4 // indirect - github.com/klauspost/cpuid/v2 v2.2.6 // indirect + github.com/klauspost/compress v1.17.11 // indirect + github.com/klauspost/cpuid/v2 v2.2.9 // indirect github.com/koron/go-ssdp v0.0.4 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect - github.com/leodido/go-urn v1.2.4 // indirect + github.com/leodido/go-urn v1.4.0 // indirect github.com/libp2p/go-buffer-pool v0.1.0 // indirect github.com/libp2p/go-cidranger v1.1.0 // indirect - github.com/libp2p/go-flow-metrics v0.1.0 // indirect + github.com/libp2p/go-flow-metrics v0.2.0 // indirect github.com/libp2p/go-libp2p-asn-util v0.4.1 // indirect github.com/libp2p/go-libp2p-record v0.2.0 // indirect - github.com/libp2p/go-libp2p-routing-helpers v0.7.3 // indirect github.com/libp2p/go-msgio v0.3.0 // indirect github.com/libp2p/go-nat v0.2.0 // indirect - github.com/libp2p/go-netroute v0.2.1 // indirect + github.com/libp2p/go-netroute v0.2.2 // indirect github.com/libp2p/go-reuseport v0.4.0 // indirect github.com/libp2p/go-yamux/v4 v4.0.1 // indirect github.com/logrusorgru/aurora/v4 v4.0.0 // indirect @@ -239,8 +241,7 @@ require ( github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-runewidth v0.0.15 // indirect - github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect - github.com/miekg/dns v1.1.57 // indirect + github.com/miekg/dns v1.1.62 // indirect github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b // indirect github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc // indirect github.com/minio/sha256-simd v1.0.1 // indirect @@ -252,33 +253,49 @@ require ( github.com/multiformats/go-multiaddr-fmt v0.1.0 // indirect github.com/multiformats/go-multibase v0.2.0 // indirect github.com/multiformats/go-multicodec v0.9.0 // indirect - github.com/multiformats/go-multistream v0.5.0 // indirect + github.com/multiformats/go-multistream v0.6.0 // indirect github.com/multiformats/go-varint v0.0.7 // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/olekukonko/tablewriter v0.0.5 // indirect github.com/onflow/flow-ft/lib/go/contracts v1.0.1 // indirect github.com/onflow/flow-ft/lib/go/templates v1.0.1 // indirect github.com/onflow/flow-nft/lib/go/contracts v1.2.2 // indirect github.com/onflow/flow-nft/lib/go/templates v1.2.1 // indirect github.com/onflow/sdks v0.6.0-preview.1 // indirect - github.com/onsi/ginkgo v1.16.5 // indirect - github.com/onsi/ginkgo/v2 v2.13.2 // indirect - github.com/opencontainers/runtime-spec v1.1.0 // indirect + github.com/onsi/ginkgo/v2 v2.22.0 // indirect + github.com/opencontainers/runtime-spec v1.2.0 // indirect github.com/opentracing/opentracing-go v1.2.0 // indirect - github.com/pelletier/go-toml/v2 v2.0.6 // indirect + github.com/pelletier/go-toml/v2 v2.2.1 // indirect + github.com/pion/datachannel v1.5.10 // indirect + github.com/pion/dtls/v2 v2.2.12 // indirect + github.com/pion/ice/v2 v2.3.37 // indirect + github.com/pion/interceptor v0.1.37 // indirect + github.com/pion/logging v0.2.2 // indirect + github.com/pion/mdns v0.0.12 // indirect + github.com/pion/randutil v0.1.0 // indirect + github.com/pion/rtcp v1.2.15 // indirect + github.com/pion/rtp v1.8.10 // indirect + github.com/pion/sctp v1.8.35 // indirect + github.com/pion/sdp/v3 v3.0.9 // indirect + github.com/pion/srtp/v2 v2.0.20 // indirect + github.com/pion/stun v0.6.1 // indirect + github.com/pion/transport/v2 v2.2.10 // indirect + github.com/pion/transport/v3 v3.0.7 // indirect + github.com/pion/turn/v2 v2.1.6 // indirect + github.com/pion/webrtc/v3 v3.3.5 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/polydawn/refmt v0.89.0 // indirect github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect - github.com/prometheus/client_model v0.5.0 // indirect - github.com/prometheus/common v0.45.0 // indirect - github.com/prometheus/procfs v0.12.0 // indirect + github.com/prometheus/client_model v0.6.1 // indirect + github.com/prometheus/common v0.61.0 // indirect + github.com/prometheus/procfs v0.15.1 // indirect github.com/psiemens/sconfig v0.1.0 // indirect - github.com/quic-go/qpack v0.4.0 // indirect - github.com/quic-go/qtls-go1-20 v0.4.1 // indirect - github.com/quic-go/quic-go v0.40.1 // indirect - github.com/quic-go/webtransport-go v0.6.0 // indirect + github.com/quic-go/qpack v0.5.1 // indirect + github.com/quic-go/quic-go v0.48.2 // indirect + github.com/quic-go/webtransport-go v0.8.1-0.20241018022711-4ac2c9250e66 // indirect github.com/raulk/go-watchdog v1.3.0 // indirect github.com/rivo/uniseg v0.4.4 // indirect - github.com/rogpeppe/go-internal v1.10.0 // indirect + github.com/rogpeppe/go-internal v1.13.1 // indirect github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible // indirect github.com/spaolacci/murmur3 v1.1.0 // indirect github.com/spf13/afero v1.10.0 // indirect @@ -296,26 +313,27 @@ require ( github.com/tyler-smith/go-bip39 v1.1.0 // indirect github.com/vmihailenco/tagparser v0.1.1 // indirect github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1 // indirect + github.com/wlynxg/anet v0.0.5 // indirect github.com/x448/float16 v0.8.4 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect github.com/zeebo/blake3 v0.2.4 // indirect go.opencensus.io v0.24.0 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 // indirect - go.opentelemetry.io/otel/metric v1.24.0 // indirect - go.opentelemetry.io/proto/otlp v1.0.0 // indirect - go.uber.org/dig v1.17.1 // indirect - go.uber.org/fx v1.20.1 // indirect - go.uber.org/mock v0.4.0 // indirect - go.uber.org/zap v1.26.0 // indirect - golang.org/x/mod v0.17.0 // indirect - golang.org/x/net v0.26.0 // indirect - golang.org/x/oauth2 v0.18.0 // indirect - golang.org/x/term v0.25.0 // indirect - gonum.org/v1/gonum v0.14.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.31.0 // indirect + go.opentelemetry.io/otel/metric v1.31.0 // indirect + go.opentelemetry.io/proto/otlp v1.3.1 // indirect + go.uber.org/dig v1.18.0 // indirect + go.uber.org/fx v1.23.0 // indirect + go.uber.org/mock v0.5.0 // indirect + go.uber.org/zap v1.27.0 // indirect + golang.org/x/mod v0.22.0 // indirect + golang.org/x/net v0.33.0 // indirect + golang.org/x/oauth2 v0.24.0 // indirect + golang.org/x/term v0.27.0 // indirect + gonum.org/v1/gonum v0.15.0 // indirect google.golang.org/appengine v1.6.8 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20241007155032-5fefd90f89a9 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect lukechampine.com/blake3 v1.3.0 // indirect diff --git a/go.sum b/go.sum index cf57b54c3b9..430024cca07 100644 --- a/go.sum +++ b/go.sum @@ -77,6 +77,8 @@ github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym github.com/DataDog/zstd v1.4.1/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= github.com/DataDog/zstd v1.5.2 h1:vUG4lAyuPCXO0TLbXvPv7EB7cNK1QV/luu55UHLrrn8= github.com/DataDog/zstd v1.5.2/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= +github.com/Jorropo/jsync v1.0.1 h1:6HgRolFZnsdfzRUj+ImB9og1JYOxQoReSywkHOGSaUU= +github.com/Jorropo/jsync v1.0.1/go.mod h1:jCOZj3vrBCri3bSU3ErUYvevKlnbssrXeCivybS5ABQ= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= @@ -172,11 +174,15 @@ github.com/btcsuite/btcd/btcec/v2 v2.3.4/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY github.com/btcsuite/btcd/chaincfg/chainhash v1.0.2 h1:KdUfX2zKommPRa+PD0sWZUyXe9w277ABlgELO7H04IM= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.2/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= +github.com/bytedance/sonic v1.11.5 h1:G00FYjjqll5iQ1PYXynbg/hyzqBqavH8Mo9/oTopd9k= +github.com/bytedance/sonic v1.11.5/go.mod h1:X2PC2giUdj/Cv2lliWFLk6c/DUQok5rViJSemeB0wDw= +github.com/bytedance/sonic/loader v0.1.0 h1:skjHJ2Bi9ibbq3Dwzh1w42MQ7wZJrXmEZr/uqUn3f0Q= +github.com/bytedance/sonic/loader v0.1.0/go.mod h1:UmRT+IRTGKz/DAkzcEGzyVqQFJ7H9BqwBO3pm9H/+HY= github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= -github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= -github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= +github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/cp v0.1.0 h1:SE+dxFebS7Iik5LK0tsi1k9ZCxEaFX4AjQmoyA+1dJk= github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= @@ -192,6 +198,10 @@ github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMn github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cloudwego/base64x v0.1.3 h1:b5J/l8xolB7dyDTTmhJP2oTs5LdrjyrUFuNxdfq5hAg= +github.com/cloudwego/base64x v0.1.3/go.mod h1:1+1K5BUHIQzyapgpF7LwvOGAEDicKtt1umPV+aN8pi8= +github.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg= +github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= @@ -260,8 +270,8 @@ github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80N github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etlyjdBU4sfcs2WYQMs= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 h1:rpfIENRNNilwHwZeG5+P150SMrnNEcHYvcCuK6dPZSg= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f h1:U5y3Y5UE0w7amNe7Z5G/twsBW0KEalRQXZzf8ufSh9I= github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f/go.mod h1:xH/i4TFMt8koVQZ6WFms69WAsDWr2XsYL3Hkl7jkoLE= github.com/dgraph-io/badger/v2 v2.2007.3/go.mod h1:26P/7fbL4kUZVEVKLAKXkBXKOydDmM2p1e+NhhnBCAE= @@ -288,8 +298,8 @@ github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaB github.com/ef-ds/deque v1.0.4 h1:iFAZNmveMT9WERAkqLJ+oaABF9AcVQ5AjXem/hroniI= github.com/ef-ds/deque v1.0.4/go.mod h1:gXDnTC3yqvBcHbq2lcExjtAcVrOnJCbMcZXmuj8Z4tg= github.com/elastic/gosigar v0.12.0/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= -github.com/elastic/gosigar v0.14.2 h1:Dg80n8cr90OZ7x+bAax/QjoW/XqTI11RmA79ZwIm9/4= -github.com/elastic/gosigar v0.14.2/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= +github.com/elastic/gosigar v0.14.3 h1:xwkKwPia+hSfg9GqrCUKYdId102m9qTJIIr7egmK/uo= +github.com/elastic/gosigar v0.14.3/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= @@ -312,9 +322,11 @@ github.com/felixge/fgprof v0.9.3 h1:VvyZxILNuCiUCSXtPtYmmtGvb65nqXh2QFWc0Wpf2/g= github.com/felixge/fgprof v0.9.3/go.mod h1:RdbpDgzqYVh/T9fPELJyV7EYJuHB55UTEULNun8eiPw= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/filecoin-project/go-clock v0.1.0 h1:SFbYIM75M8NnFm1yMHhN9Ahy3W5bEZV9gd6MPfXbKVU= +github.com/filecoin-project/go-clock v0.1.0/go.mod h1:4uB/O4PvOjlx1VCMdZ9MyDZXRm//gkj1ELEbxfI1AZs= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= -github.com/flynn/noise v1.0.1 h1:vPp/jdQLXC6ppsXSj/pM3W1BIJ5FEHE2TulSJBpb43Y= -github.com/flynn/noise v1.0.1/go.mod h1:xbMo+0i6+IGbYdJhF31t2eR1BIU0CYc12+BNAKwUTag= +github.com/flynn/noise v1.1.0 h1:KjPQoQCEFdZDiP03phOvGi11+SVVhBG2wOWAorLsstg= +github.com/flynn/noise v1.1.0/go.mod h1:xbMo+0i6+IGbYdJhF31t2eR1BIU0CYc12+BNAKwUTag= github.com/francoispqt/gojay v1.2.13 h1:d2m3sFjloqoIUQU3TsHBgj6qg/BVGlTBeHDUmyJnXKk= github.com/francoispqt/gojay v1.2.13/go.mod h1:ehT5mTG4ua4581f1++1WLG0vPdaA9HaiDsoyrBGkyDY= github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= @@ -329,12 +341,12 @@ github.com/fxamacker/cbor/v2 v2.4.1-0.20230228173756-c0c9f774e40c h1:5tm/Wbs9d9r github.com/fxamacker/cbor/v2 v2.4.1-0.20230228173756-c0c9f774e40c/go.mod h1:TA1xS00nchWmaBnEIxPSE5oHLuJBAVvqrtAnWBwBCVo= github.com/fxamacker/circlehash v0.3.0 h1:XKdvTtIJV9t7DDUtsf0RIpC1OcxZtPbmgIH7ekx28WA= github.com/fxamacker/circlehash v0.3.0/go.mod h1:3aq3OfVvsWtkWMb6A1owjOQFA+TLsD5FgJflnaQwtMM= -github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= -github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= -github.com/gammazero/deque v0.1.0 h1:f9LnNmq66VDeuAlSAapemq/U7hJ2jpIWa4c09q8Dlik= -github.com/gammazero/deque v0.1.0/go.mod h1:KQw7vFau1hHuM8xmI9RbgKFbAsQFWmBpqQ2KenFLk6M= -github.com/gammazero/workerpool v1.1.2 h1:vuioDQbgrz4HoaCi2q1HLlOXdpbap5AET7xu5/qj87g= -github.com/gammazero/workerpool v1.1.2/go.mod h1:UelbXcO0zCIGFcufcirHhq2/xtLXJdQ29qZNlXG9OjQ= +github.com/gabriel-vasile/mimetype v1.4.6 h1:3+PzJTKLkvgjeTbts6msPJt4DixhT4YtFNf1gtGe3zc= +github.com/gabriel-vasile/mimetype v1.4.6/go.mod h1:JX1qVKqZd40hUPpAfiNTe0Sne7hdfKSbOqqmkq8GCXc= +github.com/gammazero/deque v1.0.0 h1:LTmimT8H7bXkkCy6gZX7zNLtkbz4NdS2z8LZuor3j34= +github.com/gammazero/deque v1.0.0/go.mod h1:iflpYvtGfM3U8S8j+sZEKIak3SAKYpA5/SQewgfXDKo= +github.com/gammazero/workerpool v1.1.3 h1:WixN4xzukFoN0XSeXF6puqEqFTl2mECI9S6W44HWy9Q= +github.com/gammazero/workerpool v1.1.3/go.mod h1:wPjyBLDbyKnUn2XwwyD3EEwo9dHutia9/fwNmSHWACc= github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff h1:tY80oXqGNY4FhTFhk+o9oFHGINQ/+vhlm8HFzi6znCI= github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= github.com/getsentry/sentry-go v0.27.0 h1:Pv98CIbtB3LkMWmXi4Joa5OOcwbmnX88sF5qbK3r3Ps= @@ -344,8 +356,8 @@ github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= github.com/gin-gonic/gin v1.5.0/go.mod h1:Nd6IXA8m5kNZdNEHMBd93KT+mdY3+bewLgRvmCsR2Do= github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= -github.com/gin-gonic/gin v1.8.1 h1:4+fr/el88TOO3ewCmQr8cx/CtZ/umlIRIs5M4NTNjf8= -github.com/gin-gonic/gin v1.8.1/go.mod h1:ji8BvRH1azfM+SYow9zQ6SZMvR8qOMZHmsCuWR9tTTk= +github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg= +github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU= github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= @@ -363,11 +375,11 @@ github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBj github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNVA= -github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= +github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= +github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= @@ -386,23 +398,19 @@ github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+ github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= -github.com/go-playground/validator/v10 v10.14.1 h1:9c50NUPC30zyuKprjL3vNZ0m5oG+jU0zvx4AqHGnv4k= -github.com/go-playground/validator/v10 v10.14.1/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= +github.com/go-playground/validator/v10 v10.19.0 h1:ol+5Fu+cSq9JD7SoSqe04GMI92cbn0+wvQ3bZ8b/AU4= +github.com/go-playground/validator/v10 v10.19.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= 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/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= +github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= +github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= github.com/go-yaml/yaml v2.1.0+incompatible/go.mod h1:w2MrLa16VYP0jy6N7M5kHaCkaLENm+P+Tv+MfurjSw0= +github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee h1:s+21KNqlpePfkah2I+gwHF8xmJWRjooY+5248k6m4A0= github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= -github.com/gobwas/httphead v0.1.0 h1:exrUm0f4YX0L7EBwZHuCF4GDp8aJfVeBrlLQrs6NqWU= -github.com/gobwas/httphead v0.1.0/go.mod h1:O/RXo79gxV8G+RqlR/otEwx4Q36zl9rqC5u12GKvMCM= +github.com/gobwas/pool v0.2.0 h1:QEmUOlnSjWtnpRGHF3SauEiOsy82Cup83Vf2LcMlnc8= github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= -github.com/gobwas/pool v0.2.1 h1:xfeeEhW7pwmX8nuLVlqbzVc7udMDrwetjEv+TZIz1og= -github.com/gobwas/pool v0.2.1/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/ws v1.0.2 h1:CoAavW/wd/kulfZmSIBt6p24n4j7tHgNVCjsfHVNUbo= github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= -github.com/gobwas/ws v1.2.1 h1:F2aeBZrm2NDsc7vbovKrWSogd4wvfAxg0FQ89/iqOTk= -github.com/gobwas/ws v1.2.1/go.mod h1:hRKAFb8wOxFROYNsT1bqfWnhX+b5MFeJM9r2ZSwg/KY= github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= @@ -419,8 +427,8 @@ github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXP github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.2.0 h1:uCdmnmatrKCgMBlM4rMuJZWOkPDqdbZPnrMXDY4gI68= -github.com/golang/glog v1.2.0/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= +github.com/golang/glog v1.2.2 h1:1+mZ9upx1Dh6FmUTFR1naJ77miKiXgALjWOZ3NVFPmY= +github.com/golang/glog v1.2.2/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -513,8 +521,8 @@ github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20211214055906-6f57359322fd/go.mod h1:KgnwoLYCZ8IQu3XUZ8Nc/bM9CCZFOyjUNOSygVozoDg= github.com/google/pprof v0.0.0-20220412212628-83db2b799d1f/go.mod h1:Pt31oes+eGImORns3McJn8zHefuQl2rG8l6xQjGYB4U= -github.com/google/pprof v0.0.0-20231229205709-960ae82b1e42 h1:dHLYa5D8/Ta0aLR2XcPsrkpAgGeFs6thhMcQK0oQ0n8= -github.com/google/pprof v0.0.0-20231229205709-960ae82b1e42/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik= +github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad h1:a6HEuzUHeKH6hwfN/ZoQgRgVIWFJljSWa/zetS2WTvg= +github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= @@ -522,6 +530,7 @@ github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3 github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= @@ -550,8 +559,8 @@ github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWS github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= -github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= +github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= @@ -564,8 +573,8 @@ github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpg github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 h1:Wqo399gCIufwto+VfwCSvsnfGpF/w5E9CNxSwbpD6No= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0/go.mod h1:qmOFXW2epJhM0qSnUUYpldc7gVz2KMQwJ/QYCDIa7XU= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 h1:asbCHRVmodnJTuQ3qamDwqVOIjwqUPTYmYuemVOx+Ys= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0/go.mod h1:ggCgvZ2r7uOoQjOyu2Y1NhHmEPPzzuhWgcza5M1Ji1I= github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -657,8 +666,8 @@ github.com/ipfs/go-log/v2 v2.5.1 h1:1XdUzF7048prq4aBjDQQ4SL5RxftpRGdXhNRwKSAlcY= github.com/ipfs/go-log/v2 v2.5.1/go.mod h1:prSpmC1Gpllc9UYWxDiZDreBYw7zp4Iqp1kOLU9U5UI= github.com/ipfs/go-metrics-interface v0.0.1 h1:j+cpbjYvu4R8zbleSs36gvB7jR+wsL2fGD6n0jO4kdg= github.com/ipfs/go-metrics-interface v0.0.1/go.mod h1:6s6euYU4zowdslK0GKHmqaIZ3j/b/tL7HTWtJ4VPgWY= -github.com/ipfs/go-peertaskqueue v0.8.1 h1:YhxAs1+wxb5jk7RvS0LHdyiILpNmRIRnZVztekOF0pg= -github.com/ipfs/go-peertaskqueue v0.8.1/go.mod h1:Oxxd3eaK279FxeydSPPVGHzbwVeHjatZ2GA8XD+KbPU= +github.com/ipfs/go-peertaskqueue v0.8.2 h1:PaHFRaVFdxQk1Qo3OKiHPYjmmusQy7gKQUaL8JDszAU= +github.com/ipfs/go-peertaskqueue v0.8.2/go.mod h1:L6QPvou0346c2qPJNiJa6BvOibxDfaiPlqHInmzg0FA= github.com/ipld/go-ipld-prime v0.21.0 h1:n4JmcpOlPDIxBcY037SVfpd1G+Sj1nKZah0m6QH9C2E= github.com/ipld/go-ipld-prime v0.21.0/go.mod h1:3RLqy//ERg/y5oShXXdx5YIp50cFGOanyMctpPjsvxQ= github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= @@ -703,10 +712,10 @@ github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+o github.com/klauspost/compress v1.10.3/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/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= -github.com/klauspost/compress v1.17.4 h1:Ej5ixsIri7BrIjBkRZLTo6ghwrEtHFk7ijlczPW4fZ4= -github.com/klauspost/compress v1.17.4/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM= -github.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc= -github.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= +github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= +github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= +github.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY= +github.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/koron/go-ssdp v0.0.4 h1:1IDwrghSKYM7yLf7XCzbByg2sJ/JcNOZRXS2jczTwz0= @@ -729,30 +738,30 @@ github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7 github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= github.com/leodido/go-urn v1.1.0/go.mod h1:+cyI34gQWZcE1eQU7NVgKkkzdXDQHr1dBMtdAPozLkw= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= -github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= -github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= +github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= +github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= 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.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= github.com/libp2p/go-cidranger v1.1.0 h1:ewPN8EZ0dd1LSnrtuwd4709PXVcITVeuwbag38yPW7c= github.com/libp2p/go-cidranger v1.1.0/go.mod h1:KWZTfSr+r9qEo9OkI9/SIEeAtw+NNoU0dXIXt15Okic= -github.com/libp2p/go-flow-metrics v0.1.0 h1:0iPhMI8PskQwzh57jB9WxIuIOQ0r+15PChFGkx3Q3WM= -github.com/libp2p/go-flow-metrics v0.1.0/go.mod h1:4Xi8MX8wj5aWNDAZttg6UPmc0ZrnFNsMtpsYUClFtro= -github.com/libp2p/go-libp2p v0.32.2 h1:s8GYN4YJzgUoyeYNPdW7JZeZ5Ee31iNaIBfGYMAY4FQ= -github.com/libp2p/go-libp2p v0.32.2/go.mod h1:E0LKe+diV/ZVJVnOJby8VC5xzHF0660osg71skcxJvk= +github.com/libp2p/go-flow-metrics v0.2.0 h1:EIZzjmeOE6c8Dav0sNv35vhZxATIXWZg6j/C08XmmDw= +github.com/libp2p/go-flow-metrics v0.2.0/go.mod h1:st3qqfu8+pMfh+9Mzqb2GTiwrAGjIPszEjZmtksN8Jc= +github.com/libp2p/go-libp2p v0.38.2 h1:9SZQDOCi82A25An4kx30lEtr6kGTxrtoaDkbs5xrK5k= +github.com/libp2p/go-libp2p v0.38.2/go.mod h1:QWV4zGL3O9nXKdHirIC59DoRcZ446dfkjbOJ55NEWFo= github.com/libp2p/go-libp2p-asn-util v0.4.1 h1:xqL7++IKD9TBFMgnLPZR6/6iYhawHKHl950SO9L6n94= github.com/libp2p/go-libp2p-asn-util v0.4.1/go.mod h1:d/NI6XZ9qxw67b4e+NgpQexCIiFYJjErASrYW4PFDN8= github.com/libp2p/go-libp2p-kad-dht v0.25.2 h1:FOIk9gHoe4YRWXTu8SY9Z1d0RILol0TrtApsMDPjAVQ= github.com/libp2p/go-libp2p-kad-dht v0.25.2/go.mod h1:6za56ncRHYXX4Nc2vn8z7CZK0P4QiMcrn77acKLM2Oo= github.com/libp2p/go-libp2p-kbucket v0.6.3 h1:p507271wWzpy2f1XxPzCQG9NiN6R6lHL9GiSErbQQo0= github.com/libp2p/go-libp2p-kbucket v0.6.3/go.mod h1:RCseT7AH6eJWxxk2ol03xtP9pEHetYSPXOaJnOiD8i0= -github.com/libp2p/go-libp2p-pubsub v0.10.0 h1:wS0S5FlISavMaAbxyQn3dxMOe2eegMfswM471RuHJwA= -github.com/libp2p/go-libp2p-pubsub v0.10.0/go.mod h1:1OxbaT/pFRO5h+Dpze8hdHQ63R0ke55XTs6b6NwLLkw= +github.com/libp2p/go-libp2p-pubsub v0.13.0 h1:RmFQ2XAy3zQtbt2iNPy7Tt0/3fwTnHpCQSSnmGnt1Ps= +github.com/libp2p/go-libp2p-pubsub v0.13.0/go.mod h1:m0gpUOyrXKXdE7c8FNQ9/HLfWbxaEw7xku45w+PaqZo= github.com/libp2p/go-libp2p-record v0.2.0 h1:oiNUOCWno2BFuxt3my4i1frNrt7PerzB3queqa1NkQ0= github.com/libp2p/go-libp2p-record v0.2.0/go.mod h1:I+3zMkvvg5m2OcSdoL0KPljyJyvNDFGKX7QdlpYUcwk= -github.com/libp2p/go-libp2p-routing-helpers v0.7.3 h1:u1LGzAMVRK9Nqq5aYDVOiq/HaB93U9WWczBzGyAC5ZY= -github.com/libp2p/go-libp2p-routing-helpers v0.7.3/go.mod h1:cN4mJAD/7zfPKXBcs9ze31JGYAZgzdABEm+q/hkswb8= +github.com/libp2p/go-libp2p-routing-helpers v0.7.4 h1:6LqS1Bzn5CfDJ4tzvP9uwh42IB7TJLNFJA6dEeGBv84= +github.com/libp2p/go-libp2p-routing-helpers v0.7.4/go.mod h1:we5WDj9tbolBXOuF1hGOkR+r7Uh1408tQbAKaT5n1LE= github.com/libp2p/go-libp2p-testing v0.12.0 h1:EPvBb4kKMWO29qP4mZGyhVzUyR25dvfUIK5WDu6iPUA= github.com/libp2p/go-libp2p-testing v0.12.0/go.mod h1:KcGDRXyN7sQCllucn1cOOS+Dmm7ujhfEyXQL5lvkcPg= github.com/libp2p/go-maddr-filter v0.1.0/go.mod h1:VzZhTXkMucEGGEOSKddrwGiOv0tUhgnKqNEmIAz/bPU= @@ -760,8 +769,8 @@ github.com/libp2p/go-msgio v0.3.0 h1:mf3Z8B1xcFN314sWX+2vOTShIE0Mmn2TXn3YCUQGNj0 github.com/libp2p/go-msgio v0.3.0/go.mod h1:nyRM819GmVaF9LX3l03RMh10QdOroF++NBbxAb0mmDM= github.com/libp2p/go-nat v0.2.0 h1:Tyz+bUFAYqGyJ/ppPPymMGbIgNRH+WqC5QrT5fKrrGk= github.com/libp2p/go-nat v0.2.0/go.mod h1:3MJr+GRpRkyT65EpVPBstXLvOlAPzUVlG6Pwg9ohLJk= -github.com/libp2p/go-netroute v0.2.1 h1:V8kVrpD8GK0Riv15/7VN6RbUQ3URNZVosw7H2v9tksU= -github.com/libp2p/go-netroute v0.2.1/go.mod h1:hraioZr0fhBjG0ZRXJJ6Zj2IVEVNx6tDTFQfSmcq7mQ= +github.com/libp2p/go-netroute v0.2.2 h1:Dejd8cQ47Qx2kRABg6lPwknU7+nBnFRpko45/fFPuZ8= +github.com/libp2p/go-netroute v0.2.2/go.mod h1:Rntq6jUAH0l9Gg17w5bFGhcC9a+vk4KNXs6s7IljKYE= github.com/libp2p/go-reuseport v0.4.0 h1:nR5KU7hD0WxXCJbmw7r2rhRYruNRl2koHw8fQscQm2s= github.com/libp2p/go-reuseport v0.4.0/go.mod h1:ZtI03j/wO5hZVDFo2jKywN6bYKWLOy8Se6DrI2E1cLU= github.com/libp2p/go-yamux/v4 v4.0.1 h1:FfDR4S1wj6Bw2Pqbc8Uz7pCxeRBPbwsBbEdfwiCypkQ= @@ -801,13 +810,10 @@ github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg= -github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k= github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= -github.com/miekg/dns v1.1.57 h1:Jzi7ApEIzwEPLHWRcafCN9LZSBbqQpxjt/wpgvg7wcM= -github.com/miekg/dns v1.1.57/go.mod h1:uqRjCRUuEAA6qsOiJvDd+CFo/vW+y5WR6SNmHE55hZk= +github.com/miekg/dns v1.1.62 h1:cN8OuEF1/x5Rq6Np+h1epln8OiyPWV+lROx9LxcGgIQ= +github.com/miekg/dns v1.1.62/go.mod h1:mvDlcItzm+br7MToIKqkglaGhlFMHJ9DTNNWONWXbNQ= github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c h1:bzE/A84HN25pxAuk9Eej1Kz9OUelF97nAc82bDquQI8= github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c/go.mod h1:0SQS9kMwD2VsyFEB++InYyBJroV/FRmBgcydeSUcJms= github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b h1:z78hV3sbSMAUoyUMM0I83AUIT6Hu17AWfgjzIbtrYFc= @@ -840,8 +846,8 @@ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lN github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/montanaflynn/stats v0.7.0 h1:r3y12KyNxj/Sb/iOE46ws+3mS1+MZca1wlHQFPsY/JU= -github.com/montanaflynn/stats v0.7.0/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= +github.com/montanaflynn/stats v0.7.1 h1:etflOAAHORrCC44V+aR6Ftzort912ZU+YLiSTuV8eaE= +github.com/montanaflynn/stats v0.7.1/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= github.com/mr-tron/base58 v1.1.2/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= github.com/mr-tron/base58 v1.1.3/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= @@ -854,13 +860,12 @@ github.com/multiformats/go-base36 v0.1.0/go.mod h1:kFGE83c6s80PklsHO9sRn2NCoffoR github.com/multiformats/go-base36 v0.2.0 h1:lFsAbNOGeKtuKozrtBsAkSVhv1p9D0/qedU9rQyccr0= github.com/multiformats/go-base36 v0.2.0/go.mod h1:qvnKE++v+2MWCfePClUEjE78Z7P2a1UV0xHgWc0hkp4= github.com/multiformats/go-multiaddr v0.1.1/go.mod h1:aMKBKNEYmzmDmxfX88/vz+J5IU55txyt0p4aiWVohjo= -github.com/multiformats/go-multiaddr v0.2.0/go.mod h1:0nO36NvPpyV4QzvTLi/lafl2y95ncPj0vFwVF6k6wJ4= github.com/multiformats/go-multiaddr v0.2.2/go.mod h1:NtfXiOtHvghW9KojvtySjH5y0u0xW5UouOmQQrn6a3Y= github.com/multiformats/go-multiaddr v0.3.3/go.mod h1:lCKNGP1EQ1eZ35Za2wlqnabm9xQkib3fyB+nZXHLag0= -github.com/multiformats/go-multiaddr v0.12.2 h1:9G9sTY/wCYajKa9lyfWPmpZAwe6oV+Wb1zcmMS1HG24= -github.com/multiformats/go-multiaddr v0.12.2/go.mod h1:GKyaTYjZRdcUhyOetrxTk9z0cW+jA/YrnqTOvKgi44M= -github.com/multiformats/go-multiaddr-dns v0.3.1 h1:QgQgR+LQVt3NPTjbrLLpsaT2ufAA2y0Mkk+QRVJbW3A= -github.com/multiformats/go-multiaddr-dns v0.3.1/go.mod h1:G/245BRQ6FJGmryJCrOuTdB37AMA5AMOVuO6NY3JwTk= +github.com/multiformats/go-multiaddr v0.14.0 h1:bfrHrJhrRuh/NXH5mCnemjpbGjzRw/b+tJFOD41g2tU= +github.com/multiformats/go-multiaddr v0.14.0/go.mod h1:6EkVAxtznq2yC3QT5CM1UTAwG0GTP3EWAIcjHuzQ+r4= +github.com/multiformats/go-multiaddr-dns v0.4.1 h1:whi/uCLbDS3mSEUMb1MsoT4uzUeZB0N32yzufqS0i5M= +github.com/multiformats/go-multiaddr-dns v0.4.1/go.mod h1:7hfthtB4E4pQwirrz+J0CcDUfbWzTqEzVyYKKIKpgkc= github.com/multiformats/go-multiaddr-fmt v0.1.0 h1:WLEFClPycPkp4fnIzoFoV9FVd49/eQsuaL3/CWe167E= github.com/multiformats/go-multiaddr-fmt v0.1.0/go.mod h1:hGtDIW4PU4BqJ50gW2quDuPVjyWNZxToGUh/HwTZYJo= github.com/multiformats/go-multibase v0.0.3/go.mod h1:5+1R4eQrT3PkYZ24C3W2Ue2tPwIdYQD509ZjSb5y9Oc= @@ -873,13 +878,14 @@ github.com/multiformats/go-multihash v0.0.13/go.mod h1:VdAWLKTwram9oKAatUcLxBNUj github.com/multiformats/go-multihash v0.0.14/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= github.com/multiformats/go-multihash v0.2.3 h1:7Lyc8XfX/IY2jWb/gI7JP+o7JEq9hOa7BFvVU9RSh+U= github.com/multiformats/go-multihash v0.2.3/go.mod h1:dXgKXCXjBzdscBLk9JkjINiEsCKRVch90MdaGiKsvSM= -github.com/multiformats/go-multistream v0.5.0 h1:5htLSLl7lvJk3xx3qT/8Zm9J4K8vEOf/QGkvOGQAyiE= -github.com/multiformats/go-multistream v0.5.0/go.mod h1:n6tMZiwiP2wUsR8DgfDWw1dydlEqV3l6N3/GBsX6ILA= -github.com/multiformats/go-varint v0.0.1/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= +github.com/multiformats/go-multistream v0.6.0 h1:ZaHKbsL404720283o4c/IHQXiS6gb8qAN5EIJ4PN5EA= +github.com/multiformats/go-multistream v0.6.0/go.mod h1:MOyoG5otO24cHIg8kf9QW2/NozURlkP/rvi2FQJyCPg= github.com/multiformats/go-varint v0.0.5/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= github.com/multiformats/go-varint v0.0.6/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= github.com/multiformats/go-varint v0.0.7 h1:sWSGR+f/eu5ABZA2ZpYKBILXTTs9JWpdEM/nEGOHFS8= github.com/multiformats/go-varint v0.0.7/go.mod h1:r8PUYw/fD/SjBCiKOoDlGF6QawOELpZAu9eioSos/OU= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= @@ -894,8 +900,8 @@ github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OS github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo= github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= 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/nxadm/tail v1.4.11 h1:8feyoE3OzPrcshW5/MJ4sGESc5cqmGkGCWlco4l0bqY= +github.com/nxadm/tail v1.4.11/go.mod h1:OTaG3NK980DZzxbRq6lEuzgU+mug70nY11sMd4JXXHc= 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= @@ -944,17 +950,17 @@ github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108 github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/ginkgo/v2 v2.13.2 h1:Bi2gGVkfn6gQcjNjZJVO8Gf0FHzMPf2phUei9tejVMs= -github.com/onsi/ginkgo/v2 v2.13.2/go.mod h1:XStQ8QcGwLyF4HdfcZB8SFOS/MWCgDuXMSBe6zrvLgM= +github.com/onsi/ginkgo/v2 v2.22.0 h1:Yed107/8DjTr0lKCNt7Dn8yQ6ybuDRQoMGrNFKzMfHg= +github.com/onsi/ginkgo/v2 v2.22.0/go.mod h1:7Du3c42kxCUegi0IImZ1wUQzMBVecgIHjR1C+NkhLQo= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.29.0 h1:KIA/t2t5UBzoirT4H9tsML45GEbo3ouUnBHsCfD2tVg= -github.com/onsi/gomega v1.29.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ= +github.com/onsi/gomega v1.34.2 h1:pNCwDkzrsv7MS9kpaQvVb1aVLahQXyJ/Tv5oAZMI3i8= +github.com/onsi/gomega v1.34.2/go.mod h1:v1xfxRgk0KIsG+QOdm7p8UosrOzPYRo60fd3B/1Dukc= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.1.0 h1:HHUyrt9mwHUjtasSbXSMvs4cyFxh+Bll4AjJ9odEGpg= -github.com/opencontainers/runtime-spec v1.1.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.2.0 h1:z97+pHb3uELt/yiAWD691HNHQIF07bE7dzrbT927iTk= +github.com/opencontainers/runtime-spec v1.2.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= @@ -972,8 +978,8 @@ github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 h1:onHthvaw9LFnH4t2D github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58/go.mod h1:DXv8WO4yhMYhSNPKjeNKa5WY9YCIEBRbNzFFPJbWO6Y= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml/v2 v2.0.6 h1:nrzqCb7j9cDFj2coyLNLaZuJTLjWjlaz6nvTvIwycIU= -github.com/pelletier/go-toml/v2 v2.0.6/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek= +github.com/pelletier/go-toml/v2 v2.2.1 h1:9TA9+T8+8CUCO2+WYnDLCgrYi9+omqKXyjDtosvtEhg= +github.com/pelletier/go-toml/v2 v2.2.1/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= @@ -981,6 +987,48 @@ github.com/pierrec/lz4 v2.6.1+incompatible h1:9UY3+iC23yxF0UfGaYrGplQ+79Rg+h/q9F github.com/pierrec/lz4 v2.6.1+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= +github.com/pion/datachannel v1.5.10 h1:ly0Q26K1i6ZkGf42W7D4hQYR90pZwzFOjTq5AuCKk4o= +github.com/pion/datachannel v1.5.10/go.mod h1:p/jJfC9arb29W7WrxyKbepTU20CFgyx5oLo8Rs4Py/M= +github.com/pion/dtls/v2 v2.2.7/go.mod h1:8WiMkebSHFD0T+dIU+UeBaoV7kDhOW5oDCzZ7WZ/F9s= +github.com/pion/dtls/v2 v2.2.12 h1:KP7H5/c1EiVAAKUmXyCzPiQe5+bCJrpOeKg/L05dunk= +github.com/pion/dtls/v2 v2.2.12/go.mod h1:d9SYc9fch0CqK90mRk1dC7AkzzpwJj6u2GU3u+9pqFE= +github.com/pion/ice/v2 v2.3.37 h1:ObIdaNDu1rCo7hObhs34YSBcO7fjslJMZV0ux+uZWh0= +github.com/pion/ice/v2 v2.3.37/go.mod h1:mBF7lnigdqgtB+YHkaY/Y6s6tsyRyo4u4rPGRuOjUBQ= +github.com/pion/interceptor v0.1.37 h1:aRA8Zpab/wE7/c0O3fh1PqY0AJI3fCSEM5lRWJVorwI= +github.com/pion/interceptor v0.1.37/go.mod h1:JzxbJ4umVTlZAf+/utHzNesY8tmRkM2lVmkS82TTj8Y= +github.com/pion/logging v0.2.2 h1:M9+AIj/+pxNsDfAT64+MAVgJO0rsyLnoJKCqf//DoeY= +github.com/pion/logging v0.2.2/go.mod h1:k0/tDVsRCX2Mb2ZEmTqNa7CWsQPc+YYCB7Q+5pahoms= +github.com/pion/mdns v0.0.12 h1:CiMYlY+O0azojWDmxdNr7ADGrnZ+V6Ilfner+6mSVK8= +github.com/pion/mdns v0.0.12/go.mod h1:VExJjv8to/6Wqm1FXK+Ii/Z9tsVk/F5sD/N70cnYFbk= +github.com/pion/randutil v0.1.0 h1:CFG1UdESneORglEsnimhUjf33Rwjubwj6xfiOXBa3mA= +github.com/pion/randutil v0.1.0/go.mod h1:XcJrSMMbbMRhASFVOlj/5hQial/Y8oH/HVo7TBZq+j8= +github.com/pion/rtcp v1.2.12/go.mod h1:sn6qjxvnwyAkkPzPULIbVqSKI5Dv54Rv7VG0kNxh9L4= +github.com/pion/rtcp v1.2.15 h1:LZQi2JbdipLOj4eBjK4wlVoQWfrZbh3Q6eHtWtJBZBo= +github.com/pion/rtcp v1.2.15/go.mod h1:jlGuAjHMEXwMUHK78RgX0UmEJFV4zUKOFHR7OP+D3D0= +github.com/pion/rtp v1.8.3/go.mod h1:pBGHaFt/yW7bf1jjWAoUjpSNoDnw98KTMg+jWWvziqU= +github.com/pion/rtp v1.8.10 h1:puphjdbjPB+L+NFaVuZ5h6bt1g5q4kFIoI+r5q/g0CU= +github.com/pion/rtp v1.8.10/go.mod h1:8uMBJj32Pa1wwx8Fuv/AsFhn8jsgw+3rUC2PfoBZ8p4= +github.com/pion/sctp v1.8.35 h1:qwtKvNK1Wc5tHMIYgTDJhfZk7vATGVHhXbUDfHbYwzA= +github.com/pion/sctp v1.8.35/go.mod h1:EcXP8zCYVTRy3W9xtOF7wJm1L1aXfKRQzaM33SjQlzg= +github.com/pion/sdp/v3 v3.0.9 h1:pX++dCHoHUwq43kuwf3PyJfHlwIj4hXA7Vrifiq0IJY= +github.com/pion/sdp/v3 v3.0.9/go.mod h1:B5xmvENq5IXJimIO4zfp6LAe1fD9N+kFv+V/1lOdz8M= +github.com/pion/srtp/v2 v2.0.20 h1:HNNny4s+OUmG280ETrCdgFndp4ufx3/uy85EawYEhTk= +github.com/pion/srtp/v2 v2.0.20/go.mod h1:0KJQjA99A6/a0DOVTu1PhDSw0CXF2jTkqOoMg3ODqdA= +github.com/pion/stun v0.6.1 h1:8lp6YejULeHBF8NmV8e2787BogQhduZugh5PdhDyyN4= +github.com/pion/stun v0.6.1/go.mod h1:/hO7APkX4hZKu/D0f2lHzNyvdkTGtIy3NDmLR7kSz/8= +github.com/pion/transport/v2 v2.2.1/go.mod h1:cXXWavvCnFF6McHTft3DWS9iic2Mftcz1Aq29pGcU5g= +github.com/pion/transport/v2 v2.2.3/go.mod h1:q2U/tf9FEfnSBGSW6w5Qp5PFWRLRj3NjLhCCgpRK4p0= +github.com/pion/transport/v2 v2.2.4/go.mod h1:q2U/tf9FEfnSBGSW6w5Qp5PFWRLRj3NjLhCCgpRK4p0= +github.com/pion/transport/v2 v2.2.10 h1:ucLBLE8nuxiHfvkFKnkDQRYWYfp8ejf4YBOPfaQpw6Q= +github.com/pion/transport/v2 v2.2.10/go.mod h1:sq1kSLWs+cHW9E+2fJP95QudkzbK7wscs8yYgQToO5E= +github.com/pion/transport/v3 v3.0.1/go.mod h1:UY7kiITrlMv7/IKgd5eTUcaahZx5oUN3l9SzK5f5xE0= +github.com/pion/transport/v3 v3.0.7 h1:iRbMH05BzSNwhILHoBoAPxoB9xQgOaJk+591KC9P1o0= +github.com/pion/transport/v3 v3.0.7/go.mod h1:YleKiTZ4vqNxVwh77Z0zytYi7rXHl7j6uPLGhhz9rwo= +github.com/pion/turn/v2 v2.1.3/go.mod h1:huEpByKKHix2/b9kmTAM3YoX6MKP+/D//0ClgUYR2fY= +github.com/pion/turn/v2 v2.1.6 h1:Xr2niVsiPTB0FPtt+yAWKFUkU1eotQbGgpTIld4x1Gc= +github.com/pion/turn/v2 v2.1.6/go.mod h1:huEpByKKHix2/b9kmTAM3YoX6MKP+/D//0ClgUYR2fY= +github.com/pion/webrtc/v3 v3.3.5 h1:ZsSzaMz/i9nblPdiAkZoP+E6Kmjw+jnyq3bEmU3EtRg= +github.com/pion/webrtc/v3 v3.3.5/go.mod h1:liNa+E1iwyzyXqNUwvoMRNQ10x8h8FOeJKL8RkIbamE= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -1004,16 +1052,16 @@ github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDf github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.18.0 h1:HzFfmkOzH5Q8L8G+kSJKUx5dtG87sewO+FoDDqP5Tbk= -github.com/prometheus/client_golang v1.18.0/go.mod h1:T+GXkCk5wSJyOqMIzVgvvjFDlkOQntgjkJWKrN5txjA= +github.com/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y= +github.com/prometheus/client_golang v1.20.5/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw= -github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= +github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= +github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= @@ -1022,8 +1070,8 @@ github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y8 github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= -github.com/prometheus/common v0.45.0 h1:2BGz0eBc2hdMDLnO/8n0jeB3oPrt2D08CekT0lneoxM= -github.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY= +github.com/prometheus/common v0.61.0 h1:3gv/GThfX0cV2lpO7gkTUwZru38mxevy90Bj8YFSRQQ= +github.com/prometheus/common v0.61.0/go.mod h1:zr29OCN/2BsJRaFwG8QOBr41D6kkchKbpeNH7pAjb/s= 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= @@ -1032,19 +1080,17 @@ github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsT github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.3.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= -github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= +github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= +github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/psiemens/sconfig v0.1.0 h1:xfWqW+TRpih7mXZIqKYTmpRhlZLQ1kbxV8EjllPv76s= github.com/psiemens/sconfig v0.1.0/go.mod h1:+MLKqdledP/8G3rOBpknbLh0IclCf4WneJUtS26JB2U= -github.com/quic-go/qpack v0.4.0 h1:Cr9BXA1sQS2SmDUWjSofMPNKmvF6IiIfDRmgU0w1ZCo= -github.com/quic-go/qpack v0.4.0/go.mod h1:UZVnYIfi5GRk+zI9UMaCPsmZ2xKJP7XBUvVyT1Knj9A= -github.com/quic-go/qtls-go1-20 v0.4.1 h1:D33340mCNDAIKBqXuAvexTNMUByrYmFYVfKfDN5nfFs= -github.com/quic-go/qtls-go1-20 v0.4.1/go.mod h1:X9Nh97ZL80Z+bX/gUXMbipO6OxdiDi58b/fMC9mAL+k= -github.com/quic-go/quic-go v0.40.1 h1:X3AGzUNFs0jVuO3esAGnTfvdgvL4fq655WaOi1snv1Q= -github.com/quic-go/quic-go v0.40.1/go.mod h1:PeN7kuVJ4xZbxSv/4OX6S1USOX8MJvydwpTx31vx60c= -github.com/quic-go/webtransport-go v0.6.0 h1:CvNsKqc4W2HljHJnoT+rMmbRJybShZ0YPFDD3NxaZLY= -github.com/quic-go/webtransport-go v0.6.0/go.mod h1:9KjU4AEBqEQidGHNDkZrb8CAa1abRaosM2yGOyiikEc= +github.com/quic-go/qpack v0.5.1 h1:giqksBPnT/HDtZ6VhtFKgoLOWmlyo9Ei6u9PqzIMbhI= +github.com/quic-go/qpack v0.5.1/go.mod h1:+PC4XFrEskIVkcLzpEkbLqq1uCoxPhQuvK5rH1ZgaEg= +github.com/quic-go/quic-go v0.48.2 h1:wsKXZPeGWpMpCGSWqOcqpW2wZYic/8T3aqiOID0/KWE= +github.com/quic-go/quic-go v0.48.2/go.mod h1:yBgs3rWBOADpga7F+jJsb6Ybg1LSYiQvwWlLX+/6HMs= +github.com/quic-go/webtransport-go v0.8.1-0.20241018022711-4ac2c9250e66 h1:4WFk6u3sOT6pLa1kQ50ZVdm8BQFgJNA117cepZxtLIg= +github.com/quic-go/webtransport-go v0.8.1-0.20241018022711-4ac2c9250e66/go.mod h1:Vp72IJajgeOL6ddqrAhmp7IM9zbTcgkQxD/YdxrVwMw= github.com/raulk/go-watchdog v1.3.0 h1:oUmdlHxdkXRJlwfG0O9omj8ukerm8MEQavSiDTEtBsk= github.com/raulk/go-watchdog v1.3.0/go.mod h1:fIvOnLbF0b0ZwkB9YU4mOW9Did//4vPZtDqv66NfsMU= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= @@ -1055,8 +1101,8 @@ github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6So github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/cors v1.8.0 h1:P2KMzcFwrPoSjkF1WLRPsp3UMLyql8L4v9hQpVeK5so= github.com/rs/cors v1.8.0/go.mod h1:EBwu+T5AvHOcXwvZIkQFjUN6s8Czyqw12GL/Y0tUyRM= @@ -1107,8 +1153,8 @@ github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrf github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/slok/go-http-metrics v0.10.0 h1:rh0LaYEKza5eaYRGDXujKrOln57nHBi4TtVhmNEpbgM= -github.com/slok/go-http-metrics v0.10.0/go.mod h1:lFqdaS4kWMfUKCSukjC47PdCeTk+hXDUVm8kLHRqJ38= +github.com/slok/go-http-metrics v0.12.0 h1:mAb7hrX4gB4ItU6NkFoKYdBslafg3o60/HbGBRsKaG8= +github.com/slok/go-http-metrics v0.12.0/go.mod h1:Ee/mdT9BYvGrlGzlClkK05pP2hRHmVbRF9dtUVS8LNA= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/assertions v1.2.0 h1:42S6lae5dvLc7BrLu/0ugRtcFVjoJNMC/N3yZFZkDFs= github.com/smartystreets/assertions v1.2.0/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo= @@ -1165,7 +1211,9 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= @@ -1187,6 +1235,8 @@ github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1 github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/turbolent/prettier v0.0.0-20220320183459-661cc755135d h1:5JInRQbk5UBX8JfUvKh2oYTLMVwj3p6n+wapDDm7hko= github.com/turbolent/prettier v0.0.0-20220320183459-661cc755135d/go.mod h1:Nlx5Y115XQvNcIdIy7dZXaNSUpzwBSge4/Ivk93/Yog= +github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= +github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= @@ -1194,8 +1244,8 @@ github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/ugorji/go/codec v1.2.7 h1:YPXUKf7fYbp/y8xloBqZOw2qaVggbfwMlI8WM3wZUJ0= -github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY= +github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE= +github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= @@ -1215,6 +1265,9 @@ github.com/warpfork/go-wish v0.0.0-20220906213052-39a1cc7a02d0/go.mod h1:x6AKhvS github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1 h1:EKhdznlJHPMoKr0XTrX+IlJs1LH3lyx2nfr1dOlZ79k= github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1/go.mod h1:8UvriyWtv5Q5EOgjHaSseUEdkQfvwFv1I/In/O2M9gc= github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc/go.mod h1:bopw91TMyo8J3tvftk8xmU2kPmlrt4nScJQZU2hE5EM= +github.com/wlynxg/anet v0.0.3/go.mod h1:eay5PRQr7fIVAMbTbchTnO9gG65Hg/uYGdc7mguHxoA= +github.com/wlynxg/anet v0.0.5 h1:J3VJGi1gvo0JwZ/P1/Yc/8p63SoW98B5dHkYDmpgvvU= +github.com/wlynxg/anet v0.0.5/go.mod h1:eay5PRQr7fIVAMbTbchTnO9gG65Hg/uYGdc7mguHxoA= github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= @@ -1250,23 +1303,23 @@ go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 h1:4Pp6oUg3+e/6M4C0A/3kJ2VYa++dsWVTtGgLVj5xtHg= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0/go.mod h1:Mjt1i1INqiaoZOMGR1RIUJN+i3ChKoFRqzrRQhlkbs0= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 h1:jq9TW8u3so/bN+JPT166wjOI6/vQPF6Xe7nMNIltagk= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0/go.mod h1:p8pYQP+m5XfbZm9fxtSKAbM6oIllS7s2AfxrChvc7iw= -go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo= -go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 h1:cl5P5/GIfFh4t6xyruOgJP5QiA1pw4fYYdv6nc6CBWw= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0/go.mod h1:zgBdWWAu7oEEMC06MMKc5NLbA/1YDXV1sMpSqEeLQLg= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 h1:tIqheXEFWAZ7O8A7m+J0aPTmpJN3YQ7qetUAdkkkKpk= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0/go.mod h1:nUeKExfxAQVbiVFn32YXpXZZHZ61Cc3s3Rn1pDBGAb0= -go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI= -go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco= -go.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw= -go.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg= -go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI= -go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 h1:UP6IpuHFkUgOQL9FFQFrZ+5LiwhhYRbi7VZSIx6Nj5s= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0/go.mod h1:qxuZLtbq5QDtdeSHsS7bcf6EH6uO6jUAgk764zd3rhM= +go.opentelemetry.io/otel v1.31.0 h1:NsJcKPIW0D0H3NgzPDHmo0WW6SptzPdqg/L1zsIm2hY= +go.opentelemetry.io/otel v1.31.0/go.mod h1:O0C14Yl9FgkjqcCZAsE053C13OaddMYr/hz6clDkEJE= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.31.0 h1:K0XaT3DwHAcV4nKLzcQvwAgSyisUghWoY20I7huthMk= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.31.0/go.mod h1:B5Ki776z/MBnVha1Nzwp5arlzBbE3+1jk+pGmaP5HME= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0 h1:FFeLy03iVTXP6ffeN2iXrxfGsZGCjVx0/4KlizjyBwU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0/go.mod h1:TMu73/k1CP8nBUpDLc71Wj/Kf7ZS9FK5b53VapRsP9o= +go.opentelemetry.io/otel/metric v1.31.0 h1:FSErL0ATQAmYHUIzSezZibnyVlft1ybhy4ozRPcF2fE= +go.opentelemetry.io/otel/metric v1.31.0/go.mod h1:C3dEloVbLuYoX41KpmAhOqNriGbA+qqH6PQ5E5mUfnY= +go.opentelemetry.io/otel/sdk v1.31.0 h1:xLY3abVHYZ5HSfOg3l2E5LUj2Cwva5Y7yGxnSW9H5Gk= +go.opentelemetry.io/otel/sdk v1.31.0/go.mod h1:TfRbMdhvxIIr/B2N2LQW2S5v9m3gOQ/08KsbbO5BPT0= +go.opentelemetry.io/otel/trace v1.31.0 h1:ffjsj1aRouKewfr85U2aGagJ46+MvodynlQ1HYdmJys= +go.opentelemetry.io/otel/trace v1.31.0/go.mod h1:TXZkRk7SM2ZQLtR6eoAWQFIHPvzQ06FJAsO1tJg480A= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I= -go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM= +go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= +go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= 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= @@ -1274,15 +1327,15 @@ go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= -go.uber.org/dig v1.17.1 h1:Tga8Lz8PcYNsWsyHMZ1Vm0OQOUaJNDyvPImgbAu9YSc= -go.uber.org/dig v1.17.1/go.mod h1:Us0rSJiThwCv2GteUN0Q7OKvU7n5J4dxZ9JKUXozFdE= -go.uber.org/fx v1.20.1 h1:zVwVQGS8zYvhh9Xxcu4w1M6ESyeMzebzj2NbSayZ4Mk= -go.uber.org/fx v1.20.1/go.mod h1:iSYNbHf2y55acNCwCXKx7LbWb5WG1Bnue5RDXz1OREg= +go.uber.org/dig v1.18.0 h1:imUL1UiY0Mg4bqbFfsRQO5G4CGRBec/ZujWTvSVp3pw= +go.uber.org/dig v1.18.0/go.mod h1:Us0rSJiThwCv2GteUN0Q7OKvU7n5J4dxZ9JKUXozFdE= +go.uber.org/fx v1.23.0 h1:lIr/gYWQGfTwGcSXWXu4vP5Ws6iqnNEIY+F/aFzCKTg= +go.uber.org/fx v1.23.0/go.mod h1:o/D9n+2mLP6v1EG+qsdT1O8wKopYAsqZasju97SDFCU= go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= -go.uber.org/mock v0.4.0 h1:VcM4ZOtdbR4f6VXfiOpwpVJDL6lCReaZ6mw31wqh7KU= -go.uber.org/mock v0.4.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc= +go.uber.org/mock v0.5.0 h1:KAMbZvZPyBPWgD14IrIQ38QCyjwpvVVV6K/bHl1IwQU= +go.uber.org/mock v0.5.0/go.mod h1:ge71pBPLYDk7QIi1LupWxdAykm7KIEFchiOqd6z7qMM= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= @@ -1294,9 +1347,11 @@ go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= -go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= -go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= +golang.org/x/arch v0.7.0 h1:pskyeJh/3AmoQ8CPE95vxHLqp1G1GfGNXTmcl9NEKTc= +golang.org/x/arch v0.7.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys= 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-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -1315,8 +1370,11 @@ golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw= -golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U= +golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE= +golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= +golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= +golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -1328,8 +1386,8 @@ golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= -golang.org/x/exp v0.0.0-20240119083558-1b970713d09a h1:Q8/wZp0KX97QFTc2ywcOE0YRjZPVIx+MXInMzdvQqcA= -golang.org/x/exp v0.0.0-20240119083558-1b970713d09a/go.mod h1:idGWGoKP1toJGkd5/ig9ZLuPcZBC3ewk7SzmH0uou08= +golang.org/x/exp v0.0.0-20241217172543-b2144cdd0a67 h1:1UoZQm6f0P/ZO0w1Ri+f+ifG/gXhegadRdwBIXEFWDo= +golang.org/x/exp v0.0.0-20241217172543-b2144cdd0a67/go.mod h1:qj5a5QZpwLU2NLQudwIN5koi3beDhSAlJwa67PuM98c= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -1357,8 +1415,9 @@ golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= -golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4= +golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1419,8 +1478,13 @@ golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ= -golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= +golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= +golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I= +golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= 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= golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -1442,8 +1506,8 @@ golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.18.0 h1:09qnuIAgzdx1XplqJvW6CQqMCtGZykZWcXzPMPUusvI= -golang.org/x/oauth2 v0.18.0/go.mod h1:Wf7knwG0MPoWIMMBgFlEaSUDaKskp0dCfrlJRJXbBi8= +golang.org/x/oauth2 v0.24.0 h1:KTBBxWqUa0ykRPLtV69rRto9TLXcqYkeswu48x/gvNE= +golang.org/x/oauth2 v0.24.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1457,8 +1521,9 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ 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.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= -golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= +golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180810173357-98c5dad5d1a0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1521,11 +1586,9 @@ golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/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-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1562,16 +1625,24 @@ golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo= -golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= 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.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.25.0 h1:WtHI/ltw4NvSUig5KARz9h521QvRC8RmF/cuYqifU24= -golang.org/x/term v0.25.0/go.mod h1:RPyXicDX+6vLxogjjRxjgD2TKtmAO6NZBsBRfrOLu7M= +golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= +golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= +golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q= +golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= 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= @@ -1582,8 +1653,12 @@ 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.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM= -golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= 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= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1643,7 +1718,6 @@ golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82u golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= @@ -1654,17 +1728,18 @@ golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= -golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.28.0 h1:WuB6qZ4RPCQo5aP3WdKZS7i595EdWqWR8vqJTlwTVK8= +golang.org/x/tools v0.28.0/go.mod h1:dcIOrVd3mfQKTgrDVQHqCPMWy6lnhfhtX3hLXYVLfRw= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= -golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= -gonum.org/v1/gonum v0.14.0 h1:2NiG67LD1tEH0D7kM+ps2V+fXmsAnpUeec7n8tcr4S0= -gonum.org/v1/gonum v0.14.0/go.mod h1:AoWeoz0becf9QMWtE8iWXNXc27fK4fNeHNf/oMejGfU= +golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY= +golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.15.0 h1:2lYxjRbTYyxkJxlhC+LvJIx3SsANPdRybu1tGj9/OrQ= +gonum.org/v1/gonum v0.15.0/go.mod h1:xzZVBJBtS+Mz4q0Yl2LJTk+OxOg4jiXZ7qBoM0uISGo= google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= google.golang.org/api v0.0.0-20181030000543-1d582fd0359e/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= google.golang.org/api v0.1.0/go.mod h1:UGEZY7KEX120AnNLIHFMKIo4obdJhkp2tPbaPlQx13Y= @@ -1805,12 +1880,12 @@ google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de h1:F6qOa9AZTYJXOUEr4jDysRDLrm4PHePlge4v4TGAlxY= google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:VUhTRKeHn9wwcdrk73nvdC9gF178Tzhmt/qyaFcPLSo= -google.golang.org/genproto/googleapis/api v0.0.0-20240814211410-ddb44dafa142 h1:wKguEg1hsxI2/L3hUYrpo1RVi48K+uTyzKqprwLXsb8= -google.golang.org/genproto/googleapis/api v0.0.0-20240814211410-ddb44dafa142/go.mod h1:d6be+8HhtEtucleCbxpPW9PA9XwISACu8nvpPqF0BVo= +google.golang.org/genproto/googleapis/api v0.0.0-20241007155032-5fefd90f89a9 h1:T6rh4haD3GVYsgEfWExoCZA2o2FmbNyKpTuAxbEFPTg= +google.golang.org/genproto/googleapis/api v0.0.0-20241007155032-5fefd90f89a9/go.mod h1:wp2WsuBYj6j8wUdo3ToZsdxxixbvQNAHqVJrTgi5E5M= google.golang.org/genproto/googleapis/bytestream v0.0.0-20240304161311-37d4d3c04a78 h1:YqFWYZXim8bG9v68xU8WjTZmYKb5M5dMeSOWIp6jogI= google.golang.org/genproto/googleapis/bytestream v0.0.0-20240304161311-37d4d3c04a78/go.mod h1:vh/N7795ftP0AkN1w8XKqN4w1OdUKXW5Eummda+ofv8= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142 h1:e7S5W7MGGLaSu8j3YjdezkZ+m1/Nm0uRVRMEMGk26Xs= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241007155032-5fefd90f89a9 h1:QCqS/PdaHTSWGvupk2F/ehwHtGc0/GYkT+3GAcR1CCc= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241007155032-5fefd90f89a9/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= @@ -1848,8 +1923,8 @@ google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9K google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.64.1 h1:LKtvyfbX3UGVPFcGqJ9ItpVWW6oN/2XqTxfAnwRRXiA= -google.golang.org/grpc v1.64.1/go.mod h1:hiQF4LFZelK2WKaP6W0L92zGHtiQdZxk8CrSdvyjeP0= +google.golang.org/grpc v1.67.1 h1:zWnc1Vrcno+lHZCOofnIMvycFcc0QRGIzm9dhnDX68E= +google.golang.org/grpc v1.67.1/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.2.0 h1:TLkBREm4nIsEcexnCjgQd5GQWaHcqMzwQV0TX9pq8S0= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.2.0/go.mod h1:DNq5QpG7LJqD2AamLZ7zvKE0DEpVl2BSEVjFycAAjRY= @@ -1867,8 +1942,8 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0 google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= -google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= +google.golang.org/protobuf v1.36.0 h1:mjIs9gYtt56AzC4ZaffQuh88TZurBGhIJMBZGSxNerQ= +google.golang.org/protobuf v1.36.0/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/insecure/cmd/mods_override.sh b/insecure/cmd/mods_override.sh index 8f05aa7bc7f..c78d39a0daa 100755 --- a/insecure/cmd/mods_override.sh +++ b/insecure/cmd/mods_override.sh @@ -5,8 +5,5 @@ mv insecure/go.mod insecure/go2.mod cp ./go.mod ./go2.mod cp ./go.sum ./go2.sum -# inject forked libp2p-pubsub into main module to allow building corrupt Docker images -echo "require github.com/yhassanzadeh13/go-libp2p-pubsub v0.6.11-flow-expose-msg.0.20240220190333-03695dea34a3" >> ./go.mod - # update go.sum since added new dependency go mod tidy diff --git a/insecure/corruptlibp2p/fixtures.go b/insecure/corruptlibp2p/fixtures.go index 5821e7cd03d..e6cb9fac9a6 100644 --- a/insecure/corruptlibp2p/fixtures.go +++ b/insecure/corruptlibp2p/fixtures.go @@ -1,10 +1,10 @@ package corruptlibp2p import ( + corrupt "github.com/libp2p/go-libp2p-pubsub" pubsub "github.com/libp2p/go-libp2p-pubsub" pubsubpb "github.com/libp2p/go-libp2p-pubsub/pb" "github.com/libp2p/go-libp2p/core/peer" - corrupt "github.com/yhassanzadeh13/go-libp2p-pubsub" "github.com/onflow/flow-go/network/p2p" ) diff --git a/insecure/corruptlibp2p/gossipsub_spammer.go b/insecure/corruptlibp2p/gossipsub_spammer.go index 94e936c9b87..94e8c8557c8 100644 --- a/insecure/corruptlibp2p/gossipsub_spammer.go +++ b/insecure/corruptlibp2p/gossipsub_spammer.go @@ -5,12 +5,11 @@ import ( "testing" "time" + corrupt "github.com/libp2p/go-libp2p-pubsub" pb "github.com/libp2p/go-libp2p-pubsub/pb" "github.com/libp2p/go-libp2p/core/peer" "github.com/stretchr/testify/require" - corrupt "github.com/yhassanzadeh13/go-libp2p-pubsub" - "github.com/onflow/flow-go/insecure/internal" "github.com/onflow/flow-go/model/flow" "github.com/onflow/flow-go/module" @@ -68,7 +67,7 @@ func NewGossipSubRouterSpammerWithRpcInspector(t *testing.T, // ctlMessages is the list of spam messages to send to the victim node. func (s *GossipSubRouterSpammer) SpamControlMessage(t *testing.T, victim p2p.LibP2PNode, ctlMessages []pb.ControlMessage, msgs ...*pb.Message) { for _, ctlMessage := range ctlMessages { - require.True(t, s.router.Get().SendControl(victim.ID(), &ctlMessage, msgs...)) + s.router.Get().SendControl(victim.ID(), &ctlMessage, msgs...) } } @@ -112,12 +111,17 @@ func newSpammerNodeWithRpcInspector( inspector func(id peer.ID, rpc *corrupt.RPC) error) (p2p.LibP2PNode, flow.Identity, *atomicRouter) { router := newAtomicRouter() var opts []p2ptest.NodeFixtureParameterOption - opts = append(opts, p2ptest.WithRole(role), - internal.WithCorruptGossipSub(CorruptGossipSubFactory(func(r *corrupt.GossipSubRouter) { - require.NotNil(t, r) - router.set(r) - }), - CorruptGossipSubConfigFactoryWithInspector(inspector))) + opts = append(opts, + p2ptest.WithRole(role), + p2ptest.WithValidateQueueSize(10_000), // set a high limit to avoid dropping messages + internal.WithCorruptGossipSub( + CorruptGossipSubFactory(func(r *corrupt.GossipSubRouter) { + require.NotNil(t, r) + router.set(r) + }), + CorruptGossipSubConfigFactoryWithInspector(inspector), + ), + ) spammerNode, spammerId := p2ptest.NodeFixture( t, sporkId, diff --git a/insecure/corruptlibp2p/libp2p_node_factory.go b/insecure/corruptlibp2p/libp2p_node_factory.go index 4fc1aecfc9a..4b63968e680 100644 --- a/insecure/corruptlibp2p/libp2p_node_factory.go +++ b/insecure/corruptlibp2p/libp2p_node_factory.go @@ -4,11 +4,11 @@ import ( "context" "fmt" + corrupt "github.com/libp2p/go-libp2p-pubsub" "github.com/libp2p/go-libp2p/core/host" "github.com/libp2p/go-libp2p/core/peer" madns "github.com/multiformats/go-multiaddr-dns" "github.com/rs/zerolog" - corrupt "github.com/yhassanzadeh13/go-libp2p-pubsub" fcrypto "github.com/onflow/crypto" @@ -128,8 +128,8 @@ func InitCorruptLibp2pNode( return builder.Build() } -// CorruptGossipSubFactory returns a factory function that creates a new instance of the forked gossipsub module from -// github.com/yhassanzadeh13/go-libp2p-pubsub for the purpose of BFT testing and attack vector implementation. +// CorruptGossipSubFactory returns a factory function that creates a new instance of the corrupt +// gossipsub adapter for the purpose of BFT testing and attack vector implementation. func CorruptGossipSubFactory(routerOpts ...func(*corrupt.GossipSubRouter)) p2p.GossipSubFactoryFunc { factory := func( ctx context.Context, @@ -146,16 +146,16 @@ func CorruptGossipSubFactory(routerOpts ...func(*corrupt.GossipSubRouter)) p2p.G return factory } -// CorruptGossipSubConfigFactory returns a factory function that creates a new instance of the forked gossipsub config -// from github.com/yhassanzadeh13/go-libp2p-pubsub for the purpose of BFT testing and attack vector implementation. +// CorruptGossipSubConfigFactory returns a factory function that creates a new instance of the corrupt +// gossipsub config for the purpose of BFT testing and attack vector implementation. func CorruptGossipSubConfigFactory(opts ...CorruptPubSubAdapterConfigOption) p2p.GossipSubAdapterConfigFunc { return func(base *p2p.BasePubSubAdapterConfig) p2p.PubSubAdapterConfig { return NewCorruptPubSubAdapterConfig(base, opts...) } } -// CorruptGossipSubConfigFactoryWithInspector returns a factory function that creates a new instance of the forked gossipsub config -// from github.com/yhassanzadeh13/go-libp2p-pubsub for the purpose of BFT testing and attack vector implementation. +// CorruptGossipSubConfigFactoryWithInspector returns a factory function that creates a new instance +// of the corrupt gossipsub config for the purpose of BFT testing and attack vector implementation. func CorruptGossipSubConfigFactoryWithInspector(inspector func(peer.ID, *corrupt.RPC) error) p2p.GossipSubAdapterConfigFunc { return func(base *p2p.BasePubSubAdapterConfig) p2p.PubSubAdapterConfig { return NewCorruptPubSubAdapterConfig(base, WithInspector(inspector)) diff --git a/insecure/corruptlibp2p/pubsub_adapter.go b/insecure/corruptlibp2p/pubsub_adapter.go index 80abf1f5454..0a191dcfb56 100644 --- a/insecure/corruptlibp2p/pubsub_adapter.go +++ b/insecure/corruptlibp2p/pubsub_adapter.go @@ -4,11 +4,11 @@ import ( "context" "fmt" + corrupt "github.com/libp2p/go-libp2p-pubsub" pubsub "github.com/libp2p/go-libp2p-pubsub" "github.com/libp2p/go-libp2p/core/host" "github.com/libp2p/go-libp2p/core/peer" "github.com/rs/zerolog" - corrupt "github.com/yhassanzadeh13/go-libp2p-pubsub" "github.com/onflow/flow-go/insecure/internal" "github.com/onflow/flow-go/model/flow" @@ -20,15 +20,8 @@ import ( "github.com/onflow/flow-go/utils/logging" ) -// CorruptGossipSubAdapter is a wrapper around the forked pubsub topic from -// github.com/yhassanzadeh13/go-libp2p-pubsub that implements the p2p.PubSubAdapter. -// This is needed because in order to use the forked pubsub module, we need to -// use the entire dependency tree of the forked module which is resolved to -// github.com/yhassanzadeh13/go-libp2p-pubsub. This means that we cannot use -// the original libp2p pubsub module in the same package. -// Note: we use the forked pubsub module for sake of BFT testing and attack vector -// implementation, it is designed to be completely isolated in the "insecure" package, and -// totally separated from the rest of the codebase. +// CorruptGossipSubAdapter is a wrapper that implements the p2p.PubSubAdapter and injects some additional +// observability. type CorruptGossipSubAdapter struct { component.Component gossipSub *corrupt.PubSub diff --git a/insecure/corruptlibp2p/pubsub_adapter_config.go b/insecure/corruptlibp2p/pubsub_adapter_config.go index e3343f2dce8..275a8e69497 100644 --- a/insecure/corruptlibp2p/pubsub_adapter_config.go +++ b/insecure/corruptlibp2p/pubsub_adapter_config.go @@ -3,24 +3,16 @@ package corruptlibp2p import ( "time" + corrupt "github.com/libp2p/go-libp2p-pubsub" pb "github.com/libp2p/go-libp2p-pubsub/pb" "github.com/libp2p/go-libp2p/core/peer" "github.com/libp2p/go-libp2p/core/routing" discoveryRouting "github.com/libp2p/go-libp2p/p2p/discovery/routing" - corrupt "github.com/yhassanzadeh13/go-libp2p-pubsub" "github.com/onflow/flow-go/network/p2p" ) -// CorruptPubSubAdapterConfig is a wrapper around the forked pubsub topic from -// github.com/yhassanzadeh13/go-libp2p-pubsub that implements the p2p.PubSubAdapterConfig. -// This is needed because in order to use the forked pubsub module, we need to -// use the entire dependency tree of the forked module which is resolved to -// github.com/yhassanzadeh13/go-libp2p-pubsub. This means that we cannot use -// the original libp2p pubsub module in the same package. -// Note: we use the forked pubsub module for sake of BFT testing and attack vector -// implementation, it is designed to be completely isolated in the "insecure" package, and -// totally separated from the rest of the codebase. +// CorruptPubSubAdapterConfig is a wrapper that implements the p2p.PubSubAdapterConfig. type CorruptPubSubAdapterConfig struct { options []corrupt.Option inspector func(peer.ID, *corrupt.RPC) error @@ -163,6 +155,10 @@ func (c *CorruptPubSubAdapterConfig) WithPeerGater(_ map[string]float64, _ time. // CorruptPubSub does not need peer gater. This is a no-op. } +func (c *CorruptPubSubAdapterConfig) WithValidateQueueSize(size int) { + c.options = append(c.options, corrupt.WithValidateQueueSize(size)) +} + func (c *CorruptPubSubAdapterConfig) Build() []corrupt.Option { return c.options } diff --git a/insecure/corruptlibp2p/spam_test.go b/insecure/corruptlibp2p/spam_test.go index bc901cbc116..807b99570ee 100644 --- a/insecure/corruptlibp2p/spam_test.go +++ b/insecure/corruptlibp2p/spam_test.go @@ -12,9 +12,9 @@ import ( pb "github.com/libp2p/go-libp2p-pubsub/pb" + corrupt "github.com/libp2p/go-libp2p-pubsub" "github.com/libp2p/go-libp2p/core/peer" "github.com/stretchr/testify/require" - corrupt "github.com/yhassanzadeh13/go-libp2p-pubsub" "github.com/onflow/flow-go/insecure/corruptlibp2p" "github.com/onflow/flow-go/insecure/internal" diff --git a/insecure/go.mod b/insecure/go.mod index 740c5488022..8751901181d 100644 --- a/insecure/go.mod +++ b/insecure/go.mod @@ -7,18 +7,17 @@ require ( github.com/golang/protobuf v1.5.4 github.com/hashicorp/go-multierror v1.1.1 github.com/ipfs/go-datastore v0.6.0 - github.com/libp2p/go-libp2p v0.32.2 - github.com/libp2p/go-libp2p-pubsub v0.10.0 - github.com/multiformats/go-multiaddr-dns v0.3.1 + github.com/libp2p/go-libp2p v0.38.2 + github.com/libp2p/go-libp2p-pubsub v0.13.0 + github.com/multiformats/go-multiaddr-dns v0.4.1 github.com/onflow/crypto v0.25.2 github.com/onflow/flow-go v0.36.2-0.20240717162253-d5d2e606ef53 github.com/rs/zerolog v1.29.0 github.com/spf13/pflag v1.0.5 github.com/stretchr/testify v1.10.0 - github.com/yhassanzadeh13/go-libp2p-pubsub v0.6.11-flow-expose-msg.0.20240220190333-03695dea34a3 // libp2p v0.32.0 go.uber.org/atomic v1.11.0 - google.golang.org/grpc v1.64.1 - google.golang.org/protobuf v1.34.2 + google.golang.org/grpc v1.67.1 + google.golang.org/protobuf v1.36.0 ) require ( @@ -27,6 +26,7 @@ require ( cloud.google.com/go/iam v1.1.6 // indirect cloud.google.com/go/storage v1.38.0 // indirect github.com/DataDog/zstd v1.5.2 // indirect + github.com/Jorropo/jsync v1.0.1 // indirect github.com/Microsoft/go-winio v0.6.2 // indirect github.com/SaveTheRbtz/mph v0.1.1-0.20240117162131-4166ec7869bc // indirect github.com/StackExchange/wmi v1.2.1 // indirect @@ -51,7 +51,7 @@ require ( github.com/beorn7/perks v1.0.1 // indirect github.com/bits-and-blooms/bitset v1.10.0 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.4 // indirect - github.com/cenkalti/backoff/v4 v4.2.1 // indirect + github.com/cenkalti/backoff/v4 v4.3.0 // indirect github.com/cespare/xxhash v1.1.0 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/cockroachdb/errors v1.11.3 // indirect @@ -71,7 +71,7 @@ require ( github.com/davecgh/go-spew v1.1.1 // indirect github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c // indirect github.com/deckarep/golang-set/v2 v2.6.0 // indirect - github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 // indirect github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f // indirect github.com/dgraph-io/badger/v2 v2.2007.4 // indirect github.com/dgraph-io/ristretto v0.1.0 // indirect @@ -79,49 +79,50 @@ require ( github.com/docker/go-units v0.5.0 // indirect github.com/dustin/go-humanize v1.0.1 // indirect github.com/ef-ds/deque v1.0.4 // indirect - github.com/elastic/gosigar v0.14.2 // indirect + github.com/elastic/gosigar v0.14.3 // indirect github.com/ethereum/c-kzg-4844 v1.0.0 // indirect github.com/ethereum/go-ethereum v1.13.10 // indirect github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/flynn/noise v1.0.1 // indirect + github.com/filecoin-project/go-clock v0.1.0 // indirect + github.com/flynn/noise v1.1.0 // indirect github.com/francoispqt/gojay v1.2.13 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/fxamacker/cbor/v2 v2.4.1-0.20230228173756-c0c9f774e40c // indirect github.com/fxamacker/circlehash v0.3.0 // indirect - github.com/gabriel-vasile/mimetype v1.4.3 // indirect - github.com/gammazero/deque v0.1.0 // indirect - github.com/gammazero/workerpool v1.1.2 // indirect + github.com/gabriel-vasile/mimetype v1.4.6 // indirect + github.com/gammazero/deque v1.0.0 // indirect + github.com/gammazero/workerpool v1.1.3 // indirect github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff // indirect github.com/getsentry/sentry-go v0.27.0 // indirect github.com/go-kit/kit v0.12.0 // indirect github.com/go-kit/log v0.2.1 // indirect - github.com/go-logfmt/logfmt v0.5.1 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logfmt/logfmt v0.6.0 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.3.0 // indirect github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect - github.com/go-playground/validator/v10 v10.14.1 // indirect - github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect + github.com/go-playground/validator/v10 v10.19.0 // indirect + github.com/go-task/slim-sprig/v3 v3.0.0 // indirect github.com/godbus/dbus/v5 v5.1.0 // indirect github.com/gofrs/flock v0.8.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/glog v1.2.0 // indirect + github.com/golang/glog v1.2.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/mock v1.6.0 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect github.com/google/gopacket v1.1.19 // indirect - github.com/google/pprof v0.0.0-20231229205709-960ae82b1e42 // indirect + github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad // indirect github.com/google/s2a-go v0.1.7 // indirect github.com/google/uuid v1.6.0 // indirect github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect github.com/googleapis/gax-go/v2 v2.12.2 // indirect github.com/gorilla/mux v1.8.1 // indirect - github.com/gorilla/websocket v1.5.0 // indirect + github.com/gorilla/websocket v1.5.3 // indirect github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0 // indirect github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/golang-lru v1.0.2 // indirect github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect @@ -134,7 +135,7 @@ require ( github.com/improbable-eng/grpc-web v0.15.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/ipfs/bbloom v0.0.4 // indirect - github.com/ipfs/boxo v0.17.1-0.20240131173518-89bceff34bf1 // indirect + github.com/ipfs/boxo v0.27.2 // indirect github.com/ipfs/go-block-format v0.2.0 // indirect github.com/ipfs/go-cid v0.4.1 // indirect github.com/ipfs/go-cidutil v0.1.0 // indirect @@ -147,7 +148,7 @@ require ( github.com/ipfs/go-log v1.0.5 // indirect github.com/ipfs/go-log/v2 v2.5.1 // indirect github.com/ipfs/go-metrics-interface v0.0.1 // indirect - github.com/ipfs/go-peertaskqueue v0.8.1 // indirect + github.com/ipfs/go-peertaskqueue v0.8.2 // indirect github.com/ipld/go-ipld-prime v0.21.0 // indirect github.com/jackpal/go-nat-pmp v1.0.2 // indirect github.com/jbenet/go-temp-err-catcher v0.1.0 // indirect @@ -155,24 +156,24 @@ require ( github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/k0kubun/pp v3.0.1+incompatible // indirect github.com/kevinburke/go-bindata v3.24.0+incompatible // indirect - github.com/klauspost/compress v1.17.4 // indirect - github.com/klauspost/cpuid/v2 v2.2.6 // indirect + github.com/klauspost/compress v1.17.11 // indirect + github.com/klauspost/cpuid/v2 v2.2.9 // indirect github.com/koron/go-ssdp v0.0.4 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect - github.com/leodido/go-urn v1.2.4 // indirect + github.com/leodido/go-urn v1.4.0 // indirect github.com/libp2p/go-addr-util v0.1.0 // indirect github.com/libp2p/go-buffer-pool v0.1.0 // indirect github.com/libp2p/go-cidranger v1.1.0 // indirect - github.com/libp2p/go-flow-metrics v0.1.0 // indirect + github.com/libp2p/go-flow-metrics v0.2.0 // indirect github.com/libp2p/go-libp2p-asn-util v0.4.1 // indirect - github.com/libp2p/go-libp2p-kad-dht v0.25.2 // indirect - github.com/libp2p/go-libp2p-kbucket v0.6.3 // indirect + github.com/libp2p/go-libp2p-kad-dht v0.28.2 // indirect + github.com/libp2p/go-libp2p-kbucket v0.6.4 // indirect github.com/libp2p/go-libp2p-record v0.2.0 // indirect - github.com/libp2p/go-libp2p-routing-helpers v0.7.3 // indirect + github.com/libp2p/go-libp2p-routing-helpers v0.7.4 // indirect github.com/libp2p/go-msgio v0.3.0 // indirect github.com/libp2p/go-nat v0.2.0 // indirect - github.com/libp2p/go-netroute v0.2.1 // indirect + github.com/libp2p/go-netroute v0.2.2 // indirect github.com/libp2p/go-reuseport v0.4.0 // indirect github.com/libp2p/go-yamux/v4 v4.0.1 // indirect github.com/logrusorgru/aurora/v4 v4.0.0 // indirect @@ -182,7 +183,7 @@ require ( github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-runewidth v0.0.15 // indirect - github.com/miekg/dns v1.1.57 // indirect + github.com/miekg/dns v1.1.62 // indirect github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b // indirect github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc // indirect github.com/minio/sha256-simd v1.0.1 // indirect @@ -192,14 +193,14 @@ require ( github.com/mr-tron/base58 v1.2.0 // indirect github.com/multiformats/go-base32 v0.1.0 // indirect github.com/multiformats/go-base36 v0.2.0 // indirect - github.com/multiformats/go-multiaddr v0.12.2 // indirect + github.com/multiformats/go-multiaddr v0.14.0 // indirect github.com/multiformats/go-multiaddr-fmt v0.1.0 // indirect github.com/multiformats/go-multibase v0.2.0 // indirect github.com/multiformats/go-multicodec v0.9.0 // indirect github.com/multiformats/go-multihash v0.2.3 // indirect - github.com/multiformats/go-multistream v0.5.0 // indirect + github.com/multiformats/go-multistream v0.6.0 // indirect github.com/multiformats/go-varint v0.0.7 // indirect - github.com/nxadm/tail v1.4.8 // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/olekukonko/tablewriter v0.0.5 // indirect github.com/onflow/atree v0.9.0 // indirect github.com/onflow/bridged-usdc/lib/go/contracts v1.0.0 // indirect @@ -216,34 +217,50 @@ require ( github.com/onflow/nft-storefront/lib/go/contracts v1.0.0 // indirect github.com/onflow/sdks v0.6.0-preview.1 // indirect github.com/onflow/wal v1.0.2 // indirect - github.com/onsi/ginkgo/v2 v2.13.2 // indirect - github.com/opencontainers/runtime-spec v1.1.0 // indirect + github.com/onsi/ginkgo/v2 v2.22.0 // indirect + github.com/opencontainers/runtime-spec v1.2.0 // indirect github.com/opentracing/opentracing-go v1.2.0 // indirect github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 // indirect - github.com/pelletier/go-toml/v2 v2.0.6 // indirect + github.com/pelletier/go-toml/v2 v2.2.1 // indirect github.com/pierrec/lz4 v2.6.1+incompatible // indirect + github.com/pion/datachannel v1.5.10 // indirect + github.com/pion/dtls/v2 v2.2.12 // indirect + github.com/pion/ice/v2 v2.3.37 // indirect + github.com/pion/interceptor v0.1.37 // indirect + github.com/pion/logging v0.2.2 // indirect + github.com/pion/mdns v0.0.12 // indirect + github.com/pion/randutil v0.1.0 // indirect + github.com/pion/rtcp v1.2.15 // indirect + github.com/pion/rtp v1.8.10 // indirect + github.com/pion/sctp v1.8.35 // indirect + github.com/pion/sdp/v3 v3.0.9 // indirect + github.com/pion/srtp/v2 v2.0.20 // indirect + github.com/pion/stun v0.6.1 // indirect + github.com/pion/transport/v2 v2.2.10 // indirect + github.com/pion/transport/v3 v3.0.7 // indirect + github.com/pion/turn/v2 v2.1.6 // indirect + github.com/pion/webrtc/v3 v3.3.5 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/polydawn/refmt v0.89.0 // indirect github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect - github.com/prometheus/client_golang v1.18.0 // indirect - github.com/prometheus/client_model v0.5.0 // indirect - github.com/prometheus/common v0.46.0 // indirect - github.com/prometheus/procfs v0.12.0 // indirect + github.com/prometheus/client_golang v1.20.5 // indirect + github.com/prometheus/client_model v0.6.1 // indirect + github.com/prometheus/common v0.61.0 // indirect + github.com/prometheus/procfs v0.15.1 // indirect github.com/psiemens/sconfig v0.1.0 // indirect - github.com/quic-go/qpack v0.4.0 // indirect - github.com/quic-go/qtls-go1-20 v0.4.1 // indirect - github.com/quic-go/quic-go v0.40.1 // indirect - github.com/quic-go/webtransport-go v0.6.0 // indirect + github.com/quic-go/qpack v0.5.1 // indirect + github.com/quic-go/quic-go v0.48.2 // indirect + github.com/quic-go/webtransport-go v0.8.1-0.20241018022711-4ac2c9250e66 // indirect github.com/raulk/go-watchdog v1.3.0 // indirect github.com/rivo/uniseg v0.4.4 // indirect - github.com/rogpeppe/go-internal v1.10.0 // indirect + github.com/rogpeppe/go-internal v1.13.1 // indirect github.com/rs/cors v1.8.0 // indirect github.com/schollz/progressbar/v3 v3.13.1 // indirect github.com/sethvargo/go-retry v0.2.3 // indirect github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible // indirect github.com/shirou/gopsutil/v3 v3.22.2 // indirect - github.com/slok/go-http-metrics v0.10.0 // indirect + github.com/slok/go-http-metrics v0.12.0 // indirect github.com/sony/gobreaker v0.5.0 // indirect github.com/spaolacci/murmur3 v1.1.0 // indirect github.com/spf13/afero v1.10.0 // indirect @@ -265,42 +282,43 @@ require ( github.com/vmihailenco/msgpack/v4 v4.3.11 // indirect github.com/vmihailenco/tagparser v0.1.1 // indirect github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1 // indirect + github.com/wlynxg/anet v0.0.5 // indirect github.com/x448/float16 v0.8.4 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect github.com/zeebo/blake3 v0.2.4 // indirect go.opencensus.io v0.24.0 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 // indirect - go.opentelemetry.io/otel v1.24.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 // indirect - go.opentelemetry.io/otel/metric v1.24.0 // indirect - go.opentelemetry.io/otel/sdk v1.24.0 // indirect - go.opentelemetry.io/otel/trace v1.24.0 // indirect - go.opentelemetry.io/proto/otlp v1.0.0 // indirect - go.uber.org/dig v1.17.1 // indirect - go.uber.org/fx v1.20.1 // indirect - go.uber.org/mock v0.4.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 // indirect + go.opentelemetry.io/otel v1.31.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.31.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0 // indirect + go.opentelemetry.io/otel/metric v1.31.0 // indirect + go.opentelemetry.io/otel/sdk v1.31.0 // indirect + go.opentelemetry.io/otel/trace v1.31.0 // indirect + go.opentelemetry.io/proto/otlp v1.3.1 // indirect + go.uber.org/dig v1.18.0 // indirect + go.uber.org/fx v1.23.0 // indirect + go.uber.org/mock v0.5.0 // indirect go.uber.org/multierr v1.11.0 // indirect - go.uber.org/zap v1.26.0 // indirect - golang.org/x/crypto v0.28.0 // indirect - golang.org/x/exp v0.0.0-20240119083558-1b970713d09a // indirect - golang.org/x/mod v0.17.0 // indirect - golang.org/x/net v0.26.0 // indirect - golang.org/x/oauth2 v0.18.0 // indirect - golang.org/x/sync v0.8.0 // indirect - golang.org/x/sys v0.26.0 // indirect - golang.org/x/term v0.25.0 // indirect - golang.org/x/text v0.19.0 // indirect + go.uber.org/zap v1.27.0 // indirect + golang.org/x/crypto v0.31.0 // indirect + golang.org/x/exp v0.0.0-20241217172543-b2144cdd0a67 // indirect + golang.org/x/mod v0.22.0 // indirect + golang.org/x/net v0.33.0 // indirect + golang.org/x/oauth2 v0.24.0 // indirect + golang.org/x/sync v0.10.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/term v0.27.0 // indirect + golang.org/x/text v0.21.0 // indirect golang.org/x/time v0.5.0 // indirect - golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d // indirect - golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect - gonum.org/v1/gonum v0.14.0 // indirect + golang.org/x/tools v0.28.0 // indirect + golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect + gonum.org/v1/gonum v0.15.0 // indirect google.golang.org/api v0.169.0 // indirect google.golang.org/appengine v1.6.8 // indirect google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240814211410-ddb44dafa142 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20241007155032-5fefd90f89a9 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20241007155032-5fefd90f89a9 // indirect google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.2.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect @@ -310,3 +328,6 @@ require ( ) replace github.com/onflow/flow-go => ../ + +// Using custom fork until https://github.com/onflow/flow-go/issues/5338 is resolved +replace github.com/ipfs/boxo => github.com/onflow/boxo v0.0.0-20240201202436-f2477b92f483 diff --git a/insecure/go.sum b/insecure/go.sum index 22dac274285..2b4ad447b46 100644 --- a/insecure/go.sum +++ b/insecure/go.sum @@ -58,6 +58,8 @@ github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym github.com/DataDog/zstd v1.4.1/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= github.com/DataDog/zstd v1.5.2 h1:vUG4lAyuPCXO0TLbXvPv7EB7cNK1QV/luu55UHLrrn8= github.com/DataDog/zstd v1.5.2/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= +github.com/Jorropo/jsync v1.0.1 h1:6HgRolFZnsdfzRUj+ImB9og1JYOxQoReSywkHOGSaUU= +github.com/Jorropo/jsync v1.0.1/go.mod h1:jCOZj3vrBCri3bSU3ErUYvevKlnbssrXeCivybS5ABQ= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= @@ -151,11 +153,15 @@ github.com/btcsuite/btcd/btcec/v2 v2.3.4/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY github.com/btcsuite/btcd/chaincfg/chainhash v1.0.2 h1:KdUfX2zKommPRa+PD0sWZUyXe9w277ABlgELO7H04IM= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.2/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= +github.com/bytedance/sonic v1.11.5 h1:G00FYjjqll5iQ1PYXynbg/hyzqBqavH8Mo9/oTopd9k= +github.com/bytedance/sonic v1.11.5/go.mod h1:X2PC2giUdj/Cv2lliWFLk6c/DUQok5rViJSemeB0wDw= +github.com/bytedance/sonic/loader v0.1.0 h1:skjHJ2Bi9ibbq3Dwzh1w42MQ7wZJrXmEZr/uqUn3f0Q= +github.com/bytedance/sonic/loader v0.1.0/go.mod h1:UmRT+IRTGKz/DAkzcEGzyVqQFJ7H9BqwBO3pm9H/+HY= github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= -github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= -github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= +github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/cp v0.1.0 h1:SE+dxFebS7Iik5LK0tsi1k9ZCxEaFX4AjQmoyA+1dJk= github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= @@ -171,6 +177,10 @@ github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMn github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cloudwego/base64x v0.1.3 h1:b5J/l8xolB7dyDTTmhJP2oTs5LdrjyrUFuNxdfq5hAg= +github.com/cloudwego/base64x v0.1.3/go.mod h1:1+1K5BUHIQzyapgpF7LwvOGAEDicKtt1umPV+aN8pi8= +github.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg= +github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= @@ -233,8 +243,8 @@ github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80N github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etlyjdBU4sfcs2WYQMs= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 h1:rpfIENRNNilwHwZeG5+P150SMrnNEcHYvcCuK6dPZSg= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f h1:U5y3Y5UE0w7amNe7Z5G/twsBW0KEalRQXZzf8ufSh9I= github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f/go.mod h1:xH/i4TFMt8koVQZ6WFms69WAsDWr2XsYL3Hkl7jkoLE= github.com/dgraph-io/badger/v2 v2.2007.3/go.mod h1:26P/7fbL4kUZVEVKLAKXkBXKOydDmM2p1e+NhhnBCAE= @@ -261,8 +271,8 @@ github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaB github.com/ef-ds/deque v1.0.4 h1:iFAZNmveMT9WERAkqLJ+oaABF9AcVQ5AjXem/hroniI= github.com/ef-ds/deque v1.0.4/go.mod h1:gXDnTC3yqvBcHbq2lcExjtAcVrOnJCbMcZXmuj8Z4tg= github.com/elastic/gosigar v0.12.0/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= -github.com/elastic/gosigar v0.14.2 h1:Dg80n8cr90OZ7x+bAax/QjoW/XqTI11RmA79ZwIm9/4= -github.com/elastic/gosigar v0.14.2/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= +github.com/elastic/gosigar v0.14.3 h1:xwkKwPia+hSfg9GqrCUKYdId102m9qTJIIr7egmK/uo= +github.com/elastic/gosigar v0.14.3/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= @@ -279,9 +289,11 @@ github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0/go.mod h1:D9A github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/filecoin-project/go-clock v0.1.0 h1:SFbYIM75M8NnFm1yMHhN9Ahy3W5bEZV9gd6MPfXbKVU= +github.com/filecoin-project/go-clock v0.1.0/go.mod h1:4uB/O4PvOjlx1VCMdZ9MyDZXRm//gkj1ELEbxfI1AZs= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= -github.com/flynn/noise v1.0.1 h1:vPp/jdQLXC6ppsXSj/pM3W1BIJ5FEHE2TulSJBpb43Y= -github.com/flynn/noise v1.0.1/go.mod h1:xbMo+0i6+IGbYdJhF31t2eR1BIU0CYc12+BNAKwUTag= +github.com/flynn/noise v1.1.0 h1:KjPQoQCEFdZDiP03phOvGi11+SVVhBG2wOWAorLsstg= +github.com/flynn/noise v1.1.0/go.mod h1:xbMo+0i6+IGbYdJhF31t2eR1BIU0CYc12+BNAKwUTag= github.com/francoispqt/gojay v1.2.13 h1:d2m3sFjloqoIUQU3TsHBgj6qg/BVGlTBeHDUmyJnXKk= github.com/francoispqt/gojay v1.2.13/go.mod h1:ehT5mTG4ua4581f1++1WLG0vPdaA9HaiDsoyrBGkyDY= github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= @@ -296,12 +308,12 @@ github.com/fxamacker/cbor/v2 v2.4.1-0.20230228173756-c0c9f774e40c h1:5tm/Wbs9d9r github.com/fxamacker/cbor/v2 v2.4.1-0.20230228173756-c0c9f774e40c/go.mod h1:TA1xS00nchWmaBnEIxPSE5oHLuJBAVvqrtAnWBwBCVo= github.com/fxamacker/circlehash v0.3.0 h1:XKdvTtIJV9t7DDUtsf0RIpC1OcxZtPbmgIH7ekx28WA= github.com/fxamacker/circlehash v0.3.0/go.mod h1:3aq3OfVvsWtkWMb6A1owjOQFA+TLsD5FgJflnaQwtMM= -github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= -github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= -github.com/gammazero/deque v0.1.0 h1:f9LnNmq66VDeuAlSAapemq/U7hJ2jpIWa4c09q8Dlik= -github.com/gammazero/deque v0.1.0/go.mod h1:KQw7vFau1hHuM8xmI9RbgKFbAsQFWmBpqQ2KenFLk6M= -github.com/gammazero/workerpool v1.1.2 h1:vuioDQbgrz4HoaCi2q1HLlOXdpbap5AET7xu5/qj87g= -github.com/gammazero/workerpool v1.1.2/go.mod h1:UelbXcO0zCIGFcufcirHhq2/xtLXJdQ29qZNlXG9OjQ= +github.com/gabriel-vasile/mimetype v1.4.6 h1:3+PzJTKLkvgjeTbts6msPJt4DixhT4YtFNf1gtGe3zc= +github.com/gabriel-vasile/mimetype v1.4.6/go.mod h1:JX1qVKqZd40hUPpAfiNTe0Sne7hdfKSbOqqmkq8GCXc= +github.com/gammazero/deque v1.0.0 h1:LTmimT8H7bXkkCy6gZX7zNLtkbz4NdS2z8LZuor3j34= +github.com/gammazero/deque v1.0.0/go.mod h1:iflpYvtGfM3U8S8j+sZEKIak3SAKYpA5/SQewgfXDKo= +github.com/gammazero/workerpool v1.1.3 h1:WixN4xzukFoN0XSeXF6puqEqFTl2mECI9S6W44HWy9Q= +github.com/gammazero/workerpool v1.1.3/go.mod h1:wPjyBLDbyKnUn2XwwyD3EEwo9dHutia9/fwNmSHWACc= github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff h1:tY80oXqGNY4FhTFhk+o9oFHGINQ/+vhlm8HFzi6znCI= github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= github.com/getsentry/sentry-go v0.27.0 h1:Pv98CIbtB3LkMWmXi4Joa5OOcwbmnX88sF5qbK3r3Ps= @@ -311,8 +323,8 @@ github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= github.com/gin-gonic/gin v1.5.0/go.mod h1:Nd6IXA8m5kNZdNEHMBd93KT+mdY3+bewLgRvmCsR2Do= github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= -github.com/gin-gonic/gin v1.8.1 h1:4+fr/el88TOO3ewCmQr8cx/CtZ/umlIRIs5M4NTNjf8= -github.com/gin-gonic/gin v1.8.1/go.mod h1:ji8BvRH1azfM+SYow9zQ6SZMvR8qOMZHmsCuWR9tTTk= +github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg= +github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU= github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= @@ -330,11 +342,11 @@ github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBj github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNVA= -github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= +github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= +github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= @@ -353,22 +365,19 @@ github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+ github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= -github.com/go-playground/validator/v10 v10.14.1 h1:9c50NUPC30zyuKprjL3vNZ0m5oG+jU0zvx4AqHGnv4k= -github.com/go-playground/validator/v10 v10.14.1/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= +github.com/go-playground/validator/v10 v10.19.0 h1:ol+5Fu+cSq9JD7SoSqe04GMI92cbn0+wvQ3bZ8b/AU4= +github.com/go-playground/validator/v10 v10.19.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= +github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= +github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= github.com/go-yaml/yaml v2.1.0+incompatible/go.mod h1:w2MrLa16VYP0jy6N7M5kHaCkaLENm+P+Tv+MfurjSw0= +github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee h1:s+21KNqlpePfkah2I+gwHF8xmJWRjooY+5248k6m4A0= github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= -github.com/gobwas/httphead v0.1.0 h1:exrUm0f4YX0L7EBwZHuCF4GDp8aJfVeBrlLQrs6NqWU= -github.com/gobwas/httphead v0.1.0/go.mod h1:O/RXo79gxV8G+RqlR/otEwx4Q36zl9rqC5u12GKvMCM= +github.com/gobwas/pool v0.2.0 h1:QEmUOlnSjWtnpRGHF3SauEiOsy82Cup83Vf2LcMlnc8= github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= -github.com/gobwas/pool v0.2.1 h1:xfeeEhW7pwmX8nuLVlqbzVc7udMDrwetjEv+TZIz1og= -github.com/gobwas/pool v0.2.1/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/ws v1.0.2 h1:CoAavW/wd/kulfZmSIBt6p24n4j7tHgNVCjsfHVNUbo= github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= -github.com/gobwas/ws v1.2.1 h1:F2aeBZrm2NDsc7vbovKrWSogd4wvfAxg0FQ89/iqOTk= -github.com/gobwas/ws v1.2.1/go.mod h1:hRKAFb8wOxFROYNsT1bqfWnhX+b5MFeJM9r2ZSwg/KY= github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= @@ -385,8 +394,8 @@ github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXP github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.2.0 h1:uCdmnmatrKCgMBlM4rMuJZWOkPDqdbZPnrMXDY4gI68= -github.com/golang/glog v1.2.0/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= +github.com/golang/glog v1.2.2 h1:1+mZ9upx1Dh6FmUTFR1naJ77miKiXgALjWOZ3NVFPmY= +github.com/golang/glog v1.2.2/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -468,8 +477,8 @@ github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20231229205709-960ae82b1e42 h1:dHLYa5D8/Ta0aLR2XcPsrkpAgGeFs6thhMcQK0oQ0n8= -github.com/google/pprof v0.0.0-20231229205709-960ae82b1e42/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik= +github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad h1:a6HEuzUHeKH6hwfN/ZoQgRgVIWFJljSWa/zetS2WTvg= +github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= @@ -477,6 +486,7 @@ github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3 github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= @@ -499,8 +509,8 @@ github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWS github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= -github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= +github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= @@ -512,8 +522,8 @@ github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgf github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 h1:Wqo399gCIufwto+VfwCSvsnfGpF/w5E9CNxSwbpD6No= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0/go.mod h1:qmOFXW2epJhM0qSnUUYpldc7gVz2KMQwJ/QYCDIa7XU= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 h1:asbCHRVmodnJTuQ3qamDwqVOIjwqUPTYmYuemVOx+Ys= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0/go.mod h1:ggCgvZ2r7uOoQjOyu2Y1NhHmEPPzzuhWgcza5M1Ji1I= github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -568,8 +578,6 @@ github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLf github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs= github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0= -github.com/ipfs/boxo v0.17.1-0.20240131173518-89bceff34bf1 h1:5H/HYvdmbxp09+sAvdqJzyrWoyCS6OroeW9Ym06Tb+0= -github.com/ipfs/boxo v0.17.1-0.20240131173518-89bceff34bf1/go.mod h1:pIZgTWdm3k3pLF9Uq6MB8JEcW07UDwNJjlXW1HELW80= github.com/ipfs/go-block-format v0.2.0 h1:ZqrkxBA2ICbDRbK8KJs/u0O3dlp6gmAuuXUJNiW1Ycs= github.com/ipfs/go-block-format v0.2.0/go.mod h1:+jpL11nFx5A/SPpsoBn6Bzkra/zaArfSmsknbPMYgzM= github.com/ipfs/go-cid v0.0.7/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I= @@ -606,8 +614,10 @@ github.com/ipfs/go-log/v2 v2.5.1 h1:1XdUzF7048prq4aBjDQQ4SL5RxftpRGdXhNRwKSAlcY= github.com/ipfs/go-log/v2 v2.5.1/go.mod h1:prSpmC1Gpllc9UYWxDiZDreBYw7zp4Iqp1kOLU9U5UI= github.com/ipfs/go-metrics-interface v0.0.1 h1:j+cpbjYvu4R8zbleSs36gvB7jR+wsL2fGD6n0jO4kdg= github.com/ipfs/go-metrics-interface v0.0.1/go.mod h1:6s6euYU4zowdslK0GKHmqaIZ3j/b/tL7HTWtJ4VPgWY= -github.com/ipfs/go-peertaskqueue v0.8.1 h1:YhxAs1+wxb5jk7RvS0LHdyiILpNmRIRnZVztekOF0pg= -github.com/ipfs/go-peertaskqueue v0.8.1/go.mod h1:Oxxd3eaK279FxeydSPPVGHzbwVeHjatZ2GA8XD+KbPU= +github.com/ipfs/go-peertaskqueue v0.8.2 h1:PaHFRaVFdxQk1Qo3OKiHPYjmmusQy7gKQUaL8JDszAU= +github.com/ipfs/go-peertaskqueue v0.8.2/go.mod h1:L6QPvou0346c2qPJNiJa6BvOibxDfaiPlqHInmzg0FA= +github.com/ipfs/go-test v0.0.4 h1:DKT66T6GBB6PsDFLoO56QZPrOmzJkqU1FZH5C9ySkew= +github.com/ipfs/go-test v0.0.4/go.mod h1:qhIM1EluEfElKKM6fnWxGn822/z9knUGM1+I/OAQNKI= github.com/ipld/go-ipld-prime v0.21.0 h1:n4JmcpOlPDIxBcY037SVfpd1G+Sj1nKZah0m6QH9C2E= github.com/ipld/go-ipld-prime v0.21.0/go.mod h1:3RLqy//ERg/y5oShXXdx5YIp50cFGOanyMctpPjsvxQ= github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= @@ -652,10 +662,10 @@ github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+o github.com/klauspost/compress v1.10.3/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/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= -github.com/klauspost/compress v1.17.4 h1:Ej5ixsIri7BrIjBkRZLTo6ghwrEtHFk7ijlczPW4fZ4= -github.com/klauspost/compress v1.17.4/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM= -github.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc= -github.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= +github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= +github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= +github.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY= +github.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/koron/go-ssdp v0.0.4 h1:1IDwrghSKYM7yLf7XCzbByg2sJ/JcNOZRXS2jczTwz0= @@ -678,30 +688,30 @@ github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7 github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= github.com/leodido/go-urn v1.1.0/go.mod h1:+cyI34gQWZcE1eQU7NVgKkkzdXDQHr1dBMtdAPozLkw= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= -github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= -github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= +github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= +github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= 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.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= github.com/libp2p/go-cidranger v1.1.0 h1:ewPN8EZ0dd1LSnrtuwd4709PXVcITVeuwbag38yPW7c= github.com/libp2p/go-cidranger v1.1.0/go.mod h1:KWZTfSr+r9qEo9OkI9/SIEeAtw+NNoU0dXIXt15Okic= -github.com/libp2p/go-flow-metrics v0.1.0 h1:0iPhMI8PskQwzh57jB9WxIuIOQ0r+15PChFGkx3Q3WM= -github.com/libp2p/go-flow-metrics v0.1.0/go.mod h1:4Xi8MX8wj5aWNDAZttg6UPmc0ZrnFNsMtpsYUClFtro= -github.com/libp2p/go-libp2p v0.32.2 h1:s8GYN4YJzgUoyeYNPdW7JZeZ5Ee31iNaIBfGYMAY4FQ= -github.com/libp2p/go-libp2p v0.32.2/go.mod h1:E0LKe+diV/ZVJVnOJby8VC5xzHF0660osg71skcxJvk= +github.com/libp2p/go-flow-metrics v0.2.0 h1:EIZzjmeOE6c8Dav0sNv35vhZxATIXWZg6j/C08XmmDw= +github.com/libp2p/go-flow-metrics v0.2.0/go.mod h1:st3qqfu8+pMfh+9Mzqb2GTiwrAGjIPszEjZmtksN8Jc= +github.com/libp2p/go-libp2p v0.38.2 h1:9SZQDOCi82A25An4kx30lEtr6kGTxrtoaDkbs5xrK5k= +github.com/libp2p/go-libp2p v0.38.2/go.mod h1:QWV4zGL3O9nXKdHirIC59DoRcZ446dfkjbOJ55NEWFo= github.com/libp2p/go-libp2p-asn-util v0.4.1 h1:xqL7++IKD9TBFMgnLPZR6/6iYhawHKHl950SO9L6n94= github.com/libp2p/go-libp2p-asn-util v0.4.1/go.mod h1:d/NI6XZ9qxw67b4e+NgpQexCIiFYJjErASrYW4PFDN8= -github.com/libp2p/go-libp2p-kad-dht v0.25.2 h1:FOIk9gHoe4YRWXTu8SY9Z1d0RILol0TrtApsMDPjAVQ= -github.com/libp2p/go-libp2p-kad-dht v0.25.2/go.mod h1:6za56ncRHYXX4Nc2vn8z7CZK0P4QiMcrn77acKLM2Oo= -github.com/libp2p/go-libp2p-kbucket v0.6.3 h1:p507271wWzpy2f1XxPzCQG9NiN6R6lHL9GiSErbQQo0= -github.com/libp2p/go-libp2p-kbucket v0.6.3/go.mod h1:RCseT7AH6eJWxxk2ol03xtP9pEHetYSPXOaJnOiD8i0= -github.com/libp2p/go-libp2p-pubsub v0.10.0 h1:wS0S5FlISavMaAbxyQn3dxMOe2eegMfswM471RuHJwA= -github.com/libp2p/go-libp2p-pubsub v0.10.0/go.mod h1:1OxbaT/pFRO5h+Dpze8hdHQ63R0ke55XTs6b6NwLLkw= +github.com/libp2p/go-libp2p-kad-dht v0.28.2 h1:/VivUl/Ru0tVgkWNhDDBy8pK6q+gRdI+z8VfqmSUJWo= +github.com/libp2p/go-libp2p-kad-dht v0.28.2/go.mod h1:sUR/qh4p/5+YFXBtwOiCmIBeBA2YD94ttmL+Xk8+pTE= +github.com/libp2p/go-libp2p-kbucket v0.6.4 h1:OjfiYxU42TKQSB8t8WYd8MKhYhMJeO2If+NiuKfb6iQ= +github.com/libp2p/go-libp2p-kbucket v0.6.4/go.mod h1:jp6w82sczYaBsAypt5ayACcRJi0lgsba7o4TzJKEfWA= +github.com/libp2p/go-libp2p-pubsub v0.13.0 h1:RmFQ2XAy3zQtbt2iNPy7Tt0/3fwTnHpCQSSnmGnt1Ps= +github.com/libp2p/go-libp2p-pubsub v0.13.0/go.mod h1:m0gpUOyrXKXdE7c8FNQ9/HLfWbxaEw7xku45w+PaqZo= github.com/libp2p/go-libp2p-record v0.2.0 h1:oiNUOCWno2BFuxt3my4i1frNrt7PerzB3queqa1NkQ0= github.com/libp2p/go-libp2p-record v0.2.0/go.mod h1:I+3zMkvvg5m2OcSdoL0KPljyJyvNDFGKX7QdlpYUcwk= -github.com/libp2p/go-libp2p-routing-helpers v0.7.3 h1:u1LGzAMVRK9Nqq5aYDVOiq/HaB93U9WWczBzGyAC5ZY= -github.com/libp2p/go-libp2p-routing-helpers v0.7.3/go.mod h1:cN4mJAD/7zfPKXBcs9ze31JGYAZgzdABEm+q/hkswb8= +github.com/libp2p/go-libp2p-routing-helpers v0.7.4 h1:6LqS1Bzn5CfDJ4tzvP9uwh42IB7TJLNFJA6dEeGBv84= +github.com/libp2p/go-libp2p-routing-helpers v0.7.4/go.mod h1:we5WDj9tbolBXOuF1hGOkR+r7Uh1408tQbAKaT5n1LE= github.com/libp2p/go-libp2p-testing v0.12.0 h1:EPvBb4kKMWO29qP4mZGyhVzUyR25dvfUIK5WDu6iPUA= github.com/libp2p/go-libp2p-testing v0.12.0/go.mod h1:KcGDRXyN7sQCllucn1cOOS+Dmm7ujhfEyXQL5lvkcPg= github.com/libp2p/go-maddr-filter v0.1.0/go.mod h1:VzZhTXkMucEGGEOSKddrwGiOv0tUhgnKqNEmIAz/bPU= @@ -709,8 +719,8 @@ github.com/libp2p/go-msgio v0.3.0 h1:mf3Z8B1xcFN314sWX+2vOTShIE0Mmn2TXn3YCUQGNj0 github.com/libp2p/go-msgio v0.3.0/go.mod h1:nyRM819GmVaF9LX3l03RMh10QdOroF++NBbxAb0mmDM= github.com/libp2p/go-nat v0.2.0 h1:Tyz+bUFAYqGyJ/ppPPymMGbIgNRH+WqC5QrT5fKrrGk= github.com/libp2p/go-nat v0.2.0/go.mod h1:3MJr+GRpRkyT65EpVPBstXLvOlAPzUVlG6Pwg9ohLJk= -github.com/libp2p/go-netroute v0.2.1 h1:V8kVrpD8GK0Riv15/7VN6RbUQ3URNZVosw7H2v9tksU= -github.com/libp2p/go-netroute v0.2.1/go.mod h1:hraioZr0fhBjG0ZRXJJ6Zj2IVEVNx6tDTFQfSmcq7mQ= +github.com/libp2p/go-netroute v0.2.2 h1:Dejd8cQ47Qx2kRABg6lPwknU7+nBnFRpko45/fFPuZ8= +github.com/libp2p/go-netroute v0.2.2/go.mod h1:Rntq6jUAH0l9Gg17w5bFGhcC9a+vk4KNXs6s7IljKYE= github.com/libp2p/go-reuseport v0.4.0 h1:nR5KU7hD0WxXCJbmw7r2rhRYruNRl2koHw8fQscQm2s= github.com/libp2p/go-reuseport v0.4.0/go.mod h1:ZtI03j/wO5hZVDFo2jKywN6bYKWLOy8Se6DrI2E1cLU= github.com/libp2p/go-yamux/v4 v4.0.1 h1:FfDR4S1wj6Bw2Pqbc8Uz7pCxeRBPbwsBbEdfwiCypkQ= @@ -752,9 +762,8 @@ github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= -github.com/miekg/dns v1.1.57 h1:Jzi7ApEIzwEPLHWRcafCN9LZSBbqQpxjt/wpgvg7wcM= -github.com/miekg/dns v1.1.57/go.mod h1:uqRjCRUuEAA6qsOiJvDd+CFo/vW+y5WR6SNmHE55hZk= +github.com/miekg/dns v1.1.62 h1:cN8OuEF1/x5Rq6Np+h1epln8OiyPWV+lROx9LxcGgIQ= +github.com/miekg/dns v1.1.62/go.mod h1:mvDlcItzm+br7MToIKqkglaGhlFMHJ9DTNNWONWXbNQ= github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c h1:bzE/A84HN25pxAuk9Eej1Kz9OUelF97nAc82bDquQI8= github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c/go.mod h1:0SQS9kMwD2VsyFEB++InYyBJroV/FRmBgcydeSUcJms= github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b h1:z78hV3sbSMAUoyUMM0I83AUIT6Hu17AWfgjzIbtrYFc= @@ -799,13 +808,12 @@ github.com/multiformats/go-base36 v0.1.0/go.mod h1:kFGE83c6s80PklsHO9sRn2NCoffoR github.com/multiformats/go-base36 v0.2.0 h1:lFsAbNOGeKtuKozrtBsAkSVhv1p9D0/qedU9rQyccr0= github.com/multiformats/go-base36 v0.2.0/go.mod h1:qvnKE++v+2MWCfePClUEjE78Z7P2a1UV0xHgWc0hkp4= github.com/multiformats/go-multiaddr v0.1.1/go.mod h1:aMKBKNEYmzmDmxfX88/vz+J5IU55txyt0p4aiWVohjo= -github.com/multiformats/go-multiaddr v0.2.0/go.mod h1:0nO36NvPpyV4QzvTLi/lafl2y95ncPj0vFwVF6k6wJ4= github.com/multiformats/go-multiaddr v0.2.2/go.mod h1:NtfXiOtHvghW9KojvtySjH5y0u0xW5UouOmQQrn6a3Y= github.com/multiformats/go-multiaddr v0.3.3/go.mod h1:lCKNGP1EQ1eZ35Za2wlqnabm9xQkib3fyB+nZXHLag0= -github.com/multiformats/go-multiaddr v0.12.2 h1:9G9sTY/wCYajKa9lyfWPmpZAwe6oV+Wb1zcmMS1HG24= -github.com/multiformats/go-multiaddr v0.12.2/go.mod h1:GKyaTYjZRdcUhyOetrxTk9z0cW+jA/YrnqTOvKgi44M= -github.com/multiformats/go-multiaddr-dns v0.3.1 h1:QgQgR+LQVt3NPTjbrLLpsaT2ufAA2y0Mkk+QRVJbW3A= -github.com/multiformats/go-multiaddr-dns v0.3.1/go.mod h1:G/245BRQ6FJGmryJCrOuTdB37AMA5AMOVuO6NY3JwTk= +github.com/multiformats/go-multiaddr v0.14.0 h1:bfrHrJhrRuh/NXH5mCnemjpbGjzRw/b+tJFOD41g2tU= +github.com/multiformats/go-multiaddr v0.14.0/go.mod h1:6EkVAxtznq2yC3QT5CM1UTAwG0GTP3EWAIcjHuzQ+r4= +github.com/multiformats/go-multiaddr-dns v0.4.1 h1:whi/uCLbDS3mSEUMb1MsoT4uzUeZB0N32yzufqS0i5M= +github.com/multiformats/go-multiaddr-dns v0.4.1/go.mod h1:7hfthtB4E4pQwirrz+J0CcDUfbWzTqEzVyYKKIKpgkc= github.com/multiformats/go-multiaddr-fmt v0.1.0 h1:WLEFClPycPkp4fnIzoFoV9FVd49/eQsuaL3/CWe167E= github.com/multiformats/go-multiaddr-fmt v0.1.0/go.mod h1:hGtDIW4PU4BqJ50gW2quDuPVjyWNZxToGUh/HwTZYJo= github.com/multiformats/go-multibase v0.0.3/go.mod h1:5+1R4eQrT3PkYZ24C3W2Ue2tPwIdYQD509ZjSb5y9Oc= @@ -818,13 +826,14 @@ github.com/multiformats/go-multihash v0.0.13/go.mod h1:VdAWLKTwram9oKAatUcLxBNUj github.com/multiformats/go-multihash v0.0.14/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= github.com/multiformats/go-multihash v0.2.3 h1:7Lyc8XfX/IY2jWb/gI7JP+o7JEq9hOa7BFvVU9RSh+U= github.com/multiformats/go-multihash v0.2.3/go.mod h1:dXgKXCXjBzdscBLk9JkjINiEsCKRVch90MdaGiKsvSM= -github.com/multiformats/go-multistream v0.5.0 h1:5htLSLl7lvJk3xx3qT/8Zm9J4K8vEOf/QGkvOGQAyiE= -github.com/multiformats/go-multistream v0.5.0/go.mod h1:n6tMZiwiP2wUsR8DgfDWw1dydlEqV3l6N3/GBsX6ILA= -github.com/multiformats/go-varint v0.0.1/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= +github.com/multiformats/go-multistream v0.6.0 h1:ZaHKbsL404720283o4c/IHQXiS6gb8qAN5EIJ4PN5EA= +github.com/multiformats/go-multistream v0.6.0/go.mod h1:MOyoG5otO24cHIg8kf9QW2/NozURlkP/rvi2FQJyCPg= github.com/multiformats/go-varint v0.0.5/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= github.com/multiformats/go-varint v0.0.6/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= github.com/multiformats/go-varint v0.0.7 h1:sWSGR+f/eu5ABZA2ZpYKBILXTTs9JWpdEM/nEGOHFS8= github.com/multiformats/go-varint v0.0.7/go.mod h1:r8PUYw/fD/SjBCiKOoDlGF6QawOELpZAu9eioSos/OU= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= @@ -839,8 +848,8 @@ github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OS github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo= github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= 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/nxadm/tail v1.4.11 h1:8feyoE3OzPrcshW5/MJ4sGESc5cqmGkGCWlco4l0bqY= +github.com/nxadm/tail v1.4.11/go.mod h1:OTaG3NK980DZzxbRq6lEuzgU+mug70nY11sMd4JXXHc= 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= @@ -849,6 +858,8 @@ github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onflow/atree v0.9.0 h1:M+Z/UPwzv0/Yy7ChI5T1ZIHD3YN1cs/hxGEs/HWhzaY= github.com/onflow/atree v0.9.0/go.mod h1:FT6udJF9Q7VQTu3wknDhFX+VV4D44ZGdqtTAE5iztck= +github.com/onflow/boxo v0.0.0-20240201202436-f2477b92f483 h1:LpiQhTAfM9CAmNVEs0n//cBBgCg+vJSiIxTHYUklZ84= +github.com/onflow/boxo v0.0.0-20240201202436-f2477b92f483/go.mod h1:pIZgTWdm3k3pLF9Uq6MB8JEcW07UDwNJjlXW1HELW80= github.com/onflow/bridged-usdc/lib/go/contracts v1.0.0 h1:ofdfKH8KgY6qVFnlngTontds/IBERANeWl0PBPCtPOA= github.com/onflow/bridged-usdc/lib/go/contracts v1.0.0/go.mod h1:K4/oaEhhnSuJ9q6fpq1w9WEWRGtkNskhmoyH8t+X9Mk= github.com/onflow/cadence v1.3.1 h1:bs9TFHQy8HHbwTtCtg5cLdyndWhmwq55RSwID1cb220= @@ -885,17 +896,17 @@ github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108 github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/ginkgo/v2 v2.13.2 h1:Bi2gGVkfn6gQcjNjZJVO8Gf0FHzMPf2phUei9tejVMs= -github.com/onsi/ginkgo/v2 v2.13.2/go.mod h1:XStQ8QcGwLyF4HdfcZB8SFOS/MWCgDuXMSBe6zrvLgM= +github.com/onsi/ginkgo/v2 v2.22.0 h1:Yed107/8DjTr0lKCNt7Dn8yQ6ybuDRQoMGrNFKzMfHg= +github.com/onsi/ginkgo/v2 v2.22.0/go.mod h1:7Du3c42kxCUegi0IImZ1wUQzMBVecgIHjR1C+NkhLQo= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.29.0 h1:KIA/t2t5UBzoirT4H9tsML45GEbo3ouUnBHsCfD2tVg= -github.com/onsi/gomega v1.29.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ= +github.com/onsi/gomega v1.34.2 h1:pNCwDkzrsv7MS9kpaQvVb1aVLahQXyJ/Tv5oAZMI3i8= +github.com/onsi/gomega v1.34.2/go.mod h1:v1xfxRgk0KIsG+QOdm7p8UosrOzPYRo60fd3B/1Dukc= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.1.0 h1:HHUyrt9mwHUjtasSbXSMvs4cyFxh+Bll4AjJ9odEGpg= -github.com/opencontainers/runtime-spec v1.1.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.2.0 h1:z97+pHb3uELt/yiAWD691HNHQIF07bE7dzrbT927iTk= +github.com/opencontainers/runtime-spec v1.2.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= @@ -913,8 +924,8 @@ github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 h1:onHthvaw9LFnH4t2D github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58/go.mod h1:DXv8WO4yhMYhSNPKjeNKa5WY9YCIEBRbNzFFPJbWO6Y= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml/v2 v2.0.6 h1:nrzqCb7j9cDFj2coyLNLaZuJTLjWjlaz6nvTvIwycIU= -github.com/pelletier/go-toml/v2 v2.0.6/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek= +github.com/pelletier/go-toml/v2 v2.2.1 h1:9TA9+T8+8CUCO2+WYnDLCgrYi9+omqKXyjDtosvtEhg= +github.com/pelletier/go-toml/v2 v2.2.1/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= @@ -922,6 +933,48 @@ github.com/pierrec/lz4 v2.6.1+incompatible h1:9UY3+iC23yxF0UfGaYrGplQ+79Rg+h/q9F github.com/pierrec/lz4 v2.6.1+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= +github.com/pion/datachannel v1.5.10 h1:ly0Q26K1i6ZkGf42W7D4hQYR90pZwzFOjTq5AuCKk4o= +github.com/pion/datachannel v1.5.10/go.mod h1:p/jJfC9arb29W7WrxyKbepTU20CFgyx5oLo8Rs4Py/M= +github.com/pion/dtls/v2 v2.2.7/go.mod h1:8WiMkebSHFD0T+dIU+UeBaoV7kDhOW5oDCzZ7WZ/F9s= +github.com/pion/dtls/v2 v2.2.12 h1:KP7H5/c1EiVAAKUmXyCzPiQe5+bCJrpOeKg/L05dunk= +github.com/pion/dtls/v2 v2.2.12/go.mod h1:d9SYc9fch0CqK90mRk1dC7AkzzpwJj6u2GU3u+9pqFE= +github.com/pion/ice/v2 v2.3.37 h1:ObIdaNDu1rCo7hObhs34YSBcO7fjslJMZV0ux+uZWh0= +github.com/pion/ice/v2 v2.3.37/go.mod h1:mBF7lnigdqgtB+YHkaY/Y6s6tsyRyo4u4rPGRuOjUBQ= +github.com/pion/interceptor v0.1.37 h1:aRA8Zpab/wE7/c0O3fh1PqY0AJI3fCSEM5lRWJVorwI= +github.com/pion/interceptor v0.1.37/go.mod h1:JzxbJ4umVTlZAf+/utHzNesY8tmRkM2lVmkS82TTj8Y= +github.com/pion/logging v0.2.2 h1:M9+AIj/+pxNsDfAT64+MAVgJO0rsyLnoJKCqf//DoeY= +github.com/pion/logging v0.2.2/go.mod h1:k0/tDVsRCX2Mb2ZEmTqNa7CWsQPc+YYCB7Q+5pahoms= +github.com/pion/mdns v0.0.12 h1:CiMYlY+O0azojWDmxdNr7ADGrnZ+V6Ilfner+6mSVK8= +github.com/pion/mdns v0.0.12/go.mod h1:VExJjv8to/6Wqm1FXK+Ii/Z9tsVk/F5sD/N70cnYFbk= +github.com/pion/randutil v0.1.0 h1:CFG1UdESneORglEsnimhUjf33Rwjubwj6xfiOXBa3mA= +github.com/pion/randutil v0.1.0/go.mod h1:XcJrSMMbbMRhASFVOlj/5hQial/Y8oH/HVo7TBZq+j8= +github.com/pion/rtcp v1.2.12/go.mod h1:sn6qjxvnwyAkkPzPULIbVqSKI5Dv54Rv7VG0kNxh9L4= +github.com/pion/rtcp v1.2.15 h1:LZQi2JbdipLOj4eBjK4wlVoQWfrZbh3Q6eHtWtJBZBo= +github.com/pion/rtcp v1.2.15/go.mod h1:jlGuAjHMEXwMUHK78RgX0UmEJFV4zUKOFHR7OP+D3D0= +github.com/pion/rtp v1.8.3/go.mod h1:pBGHaFt/yW7bf1jjWAoUjpSNoDnw98KTMg+jWWvziqU= +github.com/pion/rtp v1.8.10 h1:puphjdbjPB+L+NFaVuZ5h6bt1g5q4kFIoI+r5q/g0CU= +github.com/pion/rtp v1.8.10/go.mod h1:8uMBJj32Pa1wwx8Fuv/AsFhn8jsgw+3rUC2PfoBZ8p4= +github.com/pion/sctp v1.8.35 h1:qwtKvNK1Wc5tHMIYgTDJhfZk7vATGVHhXbUDfHbYwzA= +github.com/pion/sctp v1.8.35/go.mod h1:EcXP8zCYVTRy3W9xtOF7wJm1L1aXfKRQzaM33SjQlzg= +github.com/pion/sdp/v3 v3.0.9 h1:pX++dCHoHUwq43kuwf3PyJfHlwIj4hXA7Vrifiq0IJY= +github.com/pion/sdp/v3 v3.0.9/go.mod h1:B5xmvENq5IXJimIO4zfp6LAe1fD9N+kFv+V/1lOdz8M= +github.com/pion/srtp/v2 v2.0.20 h1:HNNny4s+OUmG280ETrCdgFndp4ufx3/uy85EawYEhTk= +github.com/pion/srtp/v2 v2.0.20/go.mod h1:0KJQjA99A6/a0DOVTu1PhDSw0CXF2jTkqOoMg3ODqdA= +github.com/pion/stun v0.6.1 h1:8lp6YejULeHBF8NmV8e2787BogQhduZugh5PdhDyyN4= +github.com/pion/stun v0.6.1/go.mod h1:/hO7APkX4hZKu/D0f2lHzNyvdkTGtIy3NDmLR7kSz/8= +github.com/pion/transport/v2 v2.2.1/go.mod h1:cXXWavvCnFF6McHTft3DWS9iic2Mftcz1Aq29pGcU5g= +github.com/pion/transport/v2 v2.2.3/go.mod h1:q2U/tf9FEfnSBGSW6w5Qp5PFWRLRj3NjLhCCgpRK4p0= +github.com/pion/transport/v2 v2.2.4/go.mod h1:q2U/tf9FEfnSBGSW6w5Qp5PFWRLRj3NjLhCCgpRK4p0= +github.com/pion/transport/v2 v2.2.10 h1:ucLBLE8nuxiHfvkFKnkDQRYWYfp8ejf4YBOPfaQpw6Q= +github.com/pion/transport/v2 v2.2.10/go.mod h1:sq1kSLWs+cHW9E+2fJP95QudkzbK7wscs8yYgQToO5E= +github.com/pion/transport/v3 v3.0.1/go.mod h1:UY7kiITrlMv7/IKgd5eTUcaahZx5oUN3l9SzK5f5xE0= +github.com/pion/transport/v3 v3.0.7 h1:iRbMH05BzSNwhILHoBoAPxoB9xQgOaJk+591KC9P1o0= +github.com/pion/transport/v3 v3.0.7/go.mod h1:YleKiTZ4vqNxVwh77Z0zytYi7rXHl7j6uPLGhhz9rwo= +github.com/pion/turn/v2 v2.1.3/go.mod h1:huEpByKKHix2/b9kmTAM3YoX6MKP+/D//0ClgUYR2fY= +github.com/pion/turn/v2 v2.1.6 h1:Xr2niVsiPTB0FPtt+yAWKFUkU1eotQbGgpTIld4x1Gc= +github.com/pion/turn/v2 v2.1.6/go.mod h1:huEpByKKHix2/b9kmTAM3YoX6MKP+/D//0ClgUYR2fY= +github.com/pion/webrtc/v3 v3.3.5 h1:ZsSzaMz/i9nblPdiAkZoP+E6Kmjw+jnyq3bEmU3EtRg= +github.com/pion/webrtc/v3 v3.3.5/go.mod h1:liNa+E1iwyzyXqNUwvoMRNQ10x8h8FOeJKL8RkIbamE= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -943,16 +996,16 @@ github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDf github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.18.0 h1:HzFfmkOzH5Q8L8G+kSJKUx5dtG87sewO+FoDDqP5Tbk= -github.com/prometheus/client_golang v1.18.0/go.mod h1:T+GXkCk5wSJyOqMIzVgvvjFDlkOQntgjkJWKrN5txjA= +github.com/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y= +github.com/prometheus/client_golang v1.20.5/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw= -github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= +github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= +github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= @@ -961,8 +1014,8 @@ github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y8 github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= -github.com/prometheus/common v0.46.0 h1:doXzt5ybi1HBKpsZOL0sSkaNHJJqkyfEWZGGqqScV0Y= -github.com/prometheus/common v0.46.0/go.mod h1:Tp0qkxpb9Jsg54QMe+EAmqXkSV7Evdy1BTn+g2pa/hQ= +github.com/prometheus/common v0.61.0 h1:3gv/GThfX0cV2lpO7gkTUwZru38mxevy90Bj8YFSRQQ= +github.com/prometheus/common v0.61.0/go.mod h1:zr29OCN/2BsJRaFwG8QOBr41D6kkchKbpeNH7pAjb/s= 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= @@ -971,19 +1024,17 @@ github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsT github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.3.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= -github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= +github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= +github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/psiemens/sconfig v0.1.0 h1:xfWqW+TRpih7mXZIqKYTmpRhlZLQ1kbxV8EjllPv76s= github.com/psiemens/sconfig v0.1.0/go.mod h1:+MLKqdledP/8G3rOBpknbLh0IclCf4WneJUtS26JB2U= -github.com/quic-go/qpack v0.4.0 h1:Cr9BXA1sQS2SmDUWjSofMPNKmvF6IiIfDRmgU0w1ZCo= -github.com/quic-go/qpack v0.4.0/go.mod h1:UZVnYIfi5GRk+zI9UMaCPsmZ2xKJP7XBUvVyT1Knj9A= -github.com/quic-go/qtls-go1-20 v0.4.1 h1:D33340mCNDAIKBqXuAvexTNMUByrYmFYVfKfDN5nfFs= -github.com/quic-go/qtls-go1-20 v0.4.1/go.mod h1:X9Nh97ZL80Z+bX/gUXMbipO6OxdiDi58b/fMC9mAL+k= -github.com/quic-go/quic-go v0.40.1 h1:X3AGzUNFs0jVuO3esAGnTfvdgvL4fq655WaOi1snv1Q= -github.com/quic-go/quic-go v0.40.1/go.mod h1:PeN7kuVJ4xZbxSv/4OX6S1USOX8MJvydwpTx31vx60c= -github.com/quic-go/webtransport-go v0.6.0 h1:CvNsKqc4W2HljHJnoT+rMmbRJybShZ0YPFDD3NxaZLY= -github.com/quic-go/webtransport-go v0.6.0/go.mod h1:9KjU4AEBqEQidGHNDkZrb8CAa1abRaosM2yGOyiikEc= +github.com/quic-go/qpack v0.5.1 h1:giqksBPnT/HDtZ6VhtFKgoLOWmlyo9Ei6u9PqzIMbhI= +github.com/quic-go/qpack v0.5.1/go.mod h1:+PC4XFrEskIVkcLzpEkbLqq1uCoxPhQuvK5rH1ZgaEg= +github.com/quic-go/quic-go v0.48.2 h1:wsKXZPeGWpMpCGSWqOcqpW2wZYic/8T3aqiOID0/KWE= +github.com/quic-go/quic-go v0.48.2/go.mod h1:yBgs3rWBOADpga7F+jJsb6Ybg1LSYiQvwWlLX+/6HMs= +github.com/quic-go/webtransport-go v0.8.1-0.20241018022711-4ac2c9250e66 h1:4WFk6u3sOT6pLa1kQ50ZVdm8BQFgJNA117cepZxtLIg= +github.com/quic-go/webtransport-go v0.8.1-0.20241018022711-4ac2c9250e66/go.mod h1:Vp72IJajgeOL6ddqrAhmp7IM9zbTcgkQxD/YdxrVwMw= github.com/raulk/go-watchdog v1.3.0 h1:oUmdlHxdkXRJlwfG0O9omj8ukerm8MEQavSiDTEtBsk= github.com/raulk/go-watchdog v1.3.0/go.mod h1:fIvOnLbF0b0ZwkB9YU4mOW9Did//4vPZtDqv66NfsMU= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= @@ -993,8 +1044,8 @@ github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUc github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/cors v1.8.0 h1:P2KMzcFwrPoSjkF1WLRPsp3UMLyql8L4v9hQpVeK5so= github.com/rs/cors v1.8.0/go.mod h1:EBwu+T5AvHOcXwvZIkQFjUN6s8Czyqw12GL/Y0tUyRM= @@ -1045,8 +1096,8 @@ github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrf github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/slok/go-http-metrics v0.10.0 h1:rh0LaYEKza5eaYRGDXujKrOln57nHBi4TtVhmNEpbgM= -github.com/slok/go-http-metrics v0.10.0/go.mod h1:lFqdaS4kWMfUKCSukjC47PdCeTk+hXDUVm8kLHRqJ38= +github.com/slok/go-http-metrics v0.12.0 h1:mAb7hrX4gB4ItU6NkFoKYdBslafg3o60/HbGBRsKaG8= +github.com/slok/go-http-metrics v0.12.0/go.mod h1:Ee/mdT9BYvGrlGzlClkK05pP2hRHmVbRF9dtUVS8LNA= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/assertions v1.2.0 h1:42S6lae5dvLc7BrLu/0ugRtcFVjoJNMC/N3yZFZkDFs= github.com/smartystreets/assertions v1.2.0/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo= @@ -1098,12 +1149,13 @@ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= @@ -1125,6 +1177,8 @@ github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1 github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/turbolent/prettier v0.0.0-20220320183459-661cc755135d h1:5JInRQbk5UBX8JfUvKh2oYTLMVwj3p6n+wapDDm7hko= github.com/turbolent/prettier v0.0.0-20220320183459-661cc755135d/go.mod h1:Nlx5Y115XQvNcIdIy7dZXaNSUpzwBSge4/Ivk93/Yog= +github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= +github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= @@ -1132,8 +1186,8 @@ github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/ugorji/go/codec v1.2.7 h1:YPXUKf7fYbp/y8xloBqZOw2qaVggbfwMlI8WM3wZUJ0= -github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY= +github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE= +github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= @@ -1153,12 +1207,13 @@ github.com/warpfork/go-wish v0.0.0-20220906213052-39a1cc7a02d0/go.mod h1:x6AKhvS github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1 h1:EKhdznlJHPMoKr0XTrX+IlJs1LH3lyx2nfr1dOlZ79k= github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1/go.mod h1:8UvriyWtv5Q5EOgjHaSseUEdkQfvwFv1I/In/O2M9gc= github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc/go.mod h1:bopw91TMyo8J3tvftk8xmU2kPmlrt4nScJQZU2hE5EM= +github.com/wlynxg/anet v0.0.3/go.mod h1:eay5PRQr7fIVAMbTbchTnO9gG65Hg/uYGdc7mguHxoA= +github.com/wlynxg/anet v0.0.5 h1:J3VJGi1gvo0JwZ/P1/Yc/8p63SoW98B5dHkYDmpgvvU= +github.com/wlynxg/anet v0.0.5/go.mod h1:eay5PRQr7fIVAMbTbchTnO9gG65Hg/uYGdc7mguHxoA= github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/yhassanzadeh13/go-libp2p-pubsub v0.6.11-flow-expose-msg.0.20240220190333-03695dea34a3 h1:GyrwPbleN4FGHa/Ku1aiNKowV4l4FCKRzZfCbvbv5P4= -github.com/yhassanzadeh13/go-libp2p-pubsub v0.6.11-flow-expose-msg.0.20240220190333-03695dea34a3/go.mod h1:Irbd2TlWD6Bk0i9ggIqd+WPz0Axp8wP9VuNCm2+Ibrg= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -1189,22 +1244,22 @@ go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 h1:4Pp6oUg3+e/6M4C0A/3kJ2VYa++dsWVTtGgLVj5xtHg= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0/go.mod h1:Mjt1i1INqiaoZOMGR1RIUJN+i3ChKoFRqzrRQhlkbs0= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 h1:jq9TW8u3so/bN+JPT166wjOI6/vQPF6Xe7nMNIltagk= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0/go.mod h1:p8pYQP+m5XfbZm9fxtSKAbM6oIllS7s2AfxrChvc7iw= -go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo= -go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 h1:cl5P5/GIfFh4t6xyruOgJP5QiA1pw4fYYdv6nc6CBWw= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0/go.mod h1:zgBdWWAu7oEEMC06MMKc5NLbA/1YDXV1sMpSqEeLQLg= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 h1:tIqheXEFWAZ7O8A7m+J0aPTmpJN3YQ7qetUAdkkkKpk= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0/go.mod h1:nUeKExfxAQVbiVFn32YXpXZZHZ61Cc3s3Rn1pDBGAb0= -go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI= -go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco= -go.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw= -go.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg= -go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI= -go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= -go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I= -go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 h1:UP6IpuHFkUgOQL9FFQFrZ+5LiwhhYRbi7VZSIx6Nj5s= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0/go.mod h1:qxuZLtbq5QDtdeSHsS7bcf6EH6uO6jUAgk764zd3rhM= +go.opentelemetry.io/otel v1.31.0 h1:NsJcKPIW0D0H3NgzPDHmo0WW6SptzPdqg/L1zsIm2hY= +go.opentelemetry.io/otel v1.31.0/go.mod h1:O0C14Yl9FgkjqcCZAsE053C13OaddMYr/hz6clDkEJE= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.31.0 h1:K0XaT3DwHAcV4nKLzcQvwAgSyisUghWoY20I7huthMk= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.31.0/go.mod h1:B5Ki776z/MBnVha1Nzwp5arlzBbE3+1jk+pGmaP5HME= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0 h1:FFeLy03iVTXP6ffeN2iXrxfGsZGCjVx0/4KlizjyBwU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0/go.mod h1:TMu73/k1CP8nBUpDLc71Wj/Kf7ZS9FK5b53VapRsP9o= +go.opentelemetry.io/otel/metric v1.31.0 h1:FSErL0ATQAmYHUIzSezZibnyVlft1ybhy4ozRPcF2fE= +go.opentelemetry.io/otel/metric v1.31.0/go.mod h1:C3dEloVbLuYoX41KpmAhOqNriGbA+qqH6PQ5E5mUfnY= +go.opentelemetry.io/otel/sdk v1.31.0 h1:xLY3abVHYZ5HSfOg3l2E5LUj2Cwva5Y7yGxnSW9H5Gk= +go.opentelemetry.io/otel/sdk v1.31.0/go.mod h1:TfRbMdhvxIIr/B2N2LQW2S5v9m3gOQ/08KsbbO5BPT0= +go.opentelemetry.io/otel/trace v1.31.0 h1:ffjsj1aRouKewfr85U2aGagJ46+MvodynlQ1HYdmJys= +go.opentelemetry.io/otel/trace v1.31.0/go.mod h1:TXZkRk7SM2ZQLtR6eoAWQFIHPvzQ06FJAsO1tJg480A= +go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= +go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= 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= @@ -1212,15 +1267,15 @@ go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= -go.uber.org/dig v1.17.1 h1:Tga8Lz8PcYNsWsyHMZ1Vm0OQOUaJNDyvPImgbAu9YSc= -go.uber.org/dig v1.17.1/go.mod h1:Us0rSJiThwCv2GteUN0Q7OKvU7n5J4dxZ9JKUXozFdE= -go.uber.org/fx v1.20.1 h1:zVwVQGS8zYvhh9Xxcu4w1M6ESyeMzebzj2NbSayZ4Mk= -go.uber.org/fx v1.20.1/go.mod h1:iSYNbHf2y55acNCwCXKx7LbWb5WG1Bnue5RDXz1OREg= +go.uber.org/dig v1.18.0 h1:imUL1UiY0Mg4bqbFfsRQO5G4CGRBec/ZujWTvSVp3pw= +go.uber.org/dig v1.18.0/go.mod h1:Us0rSJiThwCv2GteUN0Q7OKvU7n5J4dxZ9JKUXozFdE= +go.uber.org/fx v1.23.0 h1:lIr/gYWQGfTwGcSXWXu4vP5Ws6iqnNEIY+F/aFzCKTg= +go.uber.org/fx v1.23.0/go.mod h1:o/D9n+2mLP6v1EG+qsdT1O8wKopYAsqZasju97SDFCU= go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= -go.uber.org/mock v0.4.0 h1:VcM4ZOtdbR4f6VXfiOpwpVJDL6lCReaZ6mw31wqh7KU= -go.uber.org/mock v0.4.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc= +go.uber.org/mock v0.5.0 h1:KAMbZvZPyBPWgD14IrIQ38QCyjwpvVVV6K/bHl1IwQU= +go.uber.org/mock v0.5.0/go.mod h1:ge71pBPLYDk7QIi1LupWxdAykm7KIEFchiOqd6z7qMM= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= @@ -1232,9 +1287,11 @@ go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= -go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= -go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= +golang.org/x/arch v0.7.0 h1:pskyeJh/3AmoQ8CPE95vxHLqp1G1GfGNXTmcl9NEKTc= +golang.org/x/arch v0.7.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys= 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-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -1253,8 +1310,11 @@ golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw= -golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U= +golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE= +golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= +golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= +golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -1266,8 +1326,8 @@ golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= -golang.org/x/exp v0.0.0-20240119083558-1b970713d09a h1:Q8/wZp0KX97QFTc2ywcOE0YRjZPVIx+MXInMzdvQqcA= -golang.org/x/exp v0.0.0-20240119083558-1b970713d09a/go.mod h1:idGWGoKP1toJGkd5/ig9ZLuPcZBC3ewk7SzmH0uou08= +golang.org/x/exp v0.0.0-20241217172543-b2144cdd0a67 h1:1UoZQm6f0P/ZO0w1Ri+f+ifG/gXhegadRdwBIXEFWDo= +golang.org/x/exp v0.0.0-20241217172543-b2144cdd0a67/go.mod h1:qj5a5QZpwLU2NLQudwIN5koi3beDhSAlJwa67PuM98c= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -1294,8 +1354,9 @@ golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= -golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4= +golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1349,8 +1410,13 @@ golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96b golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ= -golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= +golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= +golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I= +golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= 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= golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -1362,8 +1428,8 @@ golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.18.0 h1:09qnuIAgzdx1XplqJvW6CQqMCtGZykZWcXzPMPUusvI= -golang.org/x/oauth2 v0.18.0/go.mod h1:Wf7knwG0MPoWIMMBgFlEaSUDaKskp0dCfrlJRJXbBi8= +golang.org/x/oauth2 v0.24.0 h1:KTBBxWqUa0ykRPLtV69rRto9TLXcqYkeswu48x/gvNE= +golang.org/x/oauth2 v0.24.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1377,8 +1443,9 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ 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.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= -golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= +golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180810173357-98c5dad5d1a0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1443,7 +1510,6 @@ golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1462,16 +1528,24 @@ golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo= -golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= 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.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.25.0 h1:WtHI/ltw4NvSUig5KARz9h521QvRC8RmF/cuYqifU24= -golang.org/x/term v0.25.0/go.mod h1:RPyXicDX+6vLxogjjRxjgD2TKtmAO6NZBsBRfrOLu7M= +golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= +golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= +golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q= +golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= 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= @@ -1481,8 +1555,12 @@ golang.org/x/text v0.3.4/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.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM= -golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= 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= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1549,16 +1627,17 @@ golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= -golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.28.0 h1:WuB6qZ4RPCQo5aP3WdKZS7i595EdWqWR8vqJTlwTVK8= +golang.org/x/tools v0.28.0/go.mod h1:dcIOrVd3mfQKTgrDVQHqCPMWy6lnhfhtX3hLXYVLfRw= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= -golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= -gonum.org/v1/gonum v0.14.0 h1:2NiG67LD1tEH0D7kM+ps2V+fXmsAnpUeec7n8tcr4S0= -gonum.org/v1/gonum v0.14.0/go.mod h1:AoWeoz0becf9QMWtE8iWXNXc27fK4fNeHNf/oMejGfU= +golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY= +golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.15.0 h1:2lYxjRbTYyxkJxlhC+LvJIx3SsANPdRybu1tGj9/OrQ= +gonum.org/v1/gonum v0.15.0/go.mod h1:xzZVBJBtS+Mz4q0Yl2LJTk+OxOg4jiXZ7qBoM0uISGo= google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= google.golang.org/api v0.0.0-20181030000543-1d582fd0359e/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= google.golang.org/api v0.1.0/go.mod h1:UGEZY7KEX120AnNLIHFMKIo4obdJhkp2tPbaPlQx13Y= @@ -1640,12 +1719,12 @@ google.golang.org/genproto v0.0.0-20210126160654-44e461bb6506/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de h1:F6qOa9AZTYJXOUEr4jDysRDLrm4PHePlge4v4TGAlxY= google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:VUhTRKeHn9wwcdrk73nvdC9gF178Tzhmt/qyaFcPLSo= -google.golang.org/genproto/googleapis/api v0.0.0-20240814211410-ddb44dafa142 h1:wKguEg1hsxI2/L3hUYrpo1RVi48K+uTyzKqprwLXsb8= -google.golang.org/genproto/googleapis/api v0.0.0-20240814211410-ddb44dafa142/go.mod h1:d6be+8HhtEtucleCbxpPW9PA9XwISACu8nvpPqF0BVo= +google.golang.org/genproto/googleapis/api v0.0.0-20241007155032-5fefd90f89a9 h1:T6rh4haD3GVYsgEfWExoCZA2o2FmbNyKpTuAxbEFPTg= +google.golang.org/genproto/googleapis/api v0.0.0-20241007155032-5fefd90f89a9/go.mod h1:wp2WsuBYj6j8wUdo3ToZsdxxixbvQNAHqVJrTgi5E5M= google.golang.org/genproto/googleapis/bytestream v0.0.0-20240304161311-37d4d3c04a78 h1:YqFWYZXim8bG9v68xU8WjTZmYKb5M5dMeSOWIp6jogI= google.golang.org/genproto/googleapis/bytestream v0.0.0-20240304161311-37d4d3c04a78/go.mod h1:vh/N7795ftP0AkN1w8XKqN4w1OdUKXW5Eummda+ofv8= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142 h1:e7S5W7MGGLaSu8j3YjdezkZ+m1/Nm0uRVRMEMGk26Xs= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241007155032-5fefd90f89a9 h1:QCqS/PdaHTSWGvupk2F/ehwHtGc0/GYkT+3GAcR1CCc= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241007155032-5fefd90f89a9/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= @@ -1670,8 +1749,8 @@ google.golang.org/grpc v1.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.64.1 h1:LKtvyfbX3UGVPFcGqJ9ItpVWW6oN/2XqTxfAnwRRXiA= -google.golang.org/grpc v1.64.1/go.mod h1:hiQF4LFZelK2WKaP6W0L92zGHtiQdZxk8CrSdvyjeP0= +google.golang.org/grpc v1.67.1 h1:zWnc1Vrcno+lHZCOofnIMvycFcc0QRGIzm9dhnDX68E= +google.golang.org/grpc v1.67.1/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.2.0 h1:TLkBREm4nIsEcexnCjgQd5GQWaHcqMzwQV0TX9pq8S0= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.2.0/go.mod h1:DNq5QpG7LJqD2AamLZ7zvKE0DEpVl2BSEVjFycAAjRY= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= @@ -1687,8 +1766,8 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= -google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= +google.golang.org/protobuf v1.36.0 h1:mjIs9gYtt56AzC4ZaffQuh88TZurBGhIJMBZGSxNerQ= +google.golang.org/protobuf v1.36.0/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/insecure/integration/functional/test/gossipsub/rpc_inspector/validation_inspector_test.go b/insecure/integration/functional/test/gossipsub/rpc_inspector/validation_inspector_test.go index 1c43a9999e7..2b84d675a5a 100644 --- a/insecure/integration/functional/test/gossipsub/rpc_inspector/validation_inspector_test.go +++ b/insecure/integration/functional/test/gossipsub/rpc_inspector/validation_inspector_test.go @@ -7,13 +7,13 @@ import ( "testing" "time" + corrupt "github.com/libp2p/go-libp2p-pubsub" pubsub "github.com/libp2p/go-libp2p-pubsub" pb "github.com/libp2p/go-libp2p-pubsub/pb" pubsub_pb "github.com/libp2p/go-libp2p-pubsub/pb" "github.com/libp2p/go-libp2p/core/peer" mockery "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" - corrupt "github.com/yhassanzadeh13/go-libp2p-pubsub" "go.uber.org/atomic" "github.com/onflow/flow-go/config" diff --git a/insecure/integration/functional/test/gossipsub/scoring/ihave_spam_test.go b/insecure/integration/functional/test/gossipsub/scoring/ihave_spam_test.go index 8debc74e7d7..2b36199b25f 100644 --- a/insecure/integration/functional/test/gossipsub/scoring/ihave_spam_test.go +++ b/insecure/integration/functional/test/gossipsub/scoring/ihave_spam_test.go @@ -6,11 +6,11 @@ import ( "testing" "time" + corrupt "github.com/libp2p/go-libp2p-pubsub" pubsub "github.com/libp2p/go-libp2p-pubsub" pb "github.com/libp2p/go-libp2p-pubsub/pb" "github.com/libp2p/go-libp2p/core/peer" "github.com/stretchr/testify/require" - corrupt "github.com/yhassanzadeh13/go-libp2p-pubsub" "github.com/onflow/flow-go/config" "github.com/onflow/flow-go/insecure/corruptlibp2p" diff --git a/insecure/integration/functional/test/gossipsub/scoring/scoring_test.go b/insecure/integration/functional/test/gossipsub/scoring/scoring_test.go index 184f365f60c..bdcee5e67d0 100644 --- a/insecure/integration/functional/test/gossipsub/scoring/scoring_test.go +++ b/insecure/integration/functional/test/gossipsub/scoring/scoring_test.go @@ -2,6 +2,7 @@ package scoring import ( "context" + "fmt" "testing" "time" @@ -115,7 +116,9 @@ func testGossipSubInvalidMessageDeliveryScoring(t *testing.T, spamMsgFactory fun t.Name(), idProvider, p2ptest.WithRole(role), - p2ptest.OverrideFlowConfig(cfg)) + p2ptest.OverrideFlowConfig(cfg), + p2ptest.WithValidateQueueSize(3000), // prevent node from dropping messages on slow CI machines + ) ids := flow.IdentityList{&spammer.SpammerId, &victimIdentity} idProvider.SetIdentities(ids) @@ -144,31 +147,44 @@ func testGossipSubInvalidMessageDeliveryScoring(t *testing.T, spamMsgFactory fun spammer.SpamControlMessage(t, victimNode, spammer.GenerateCtlMessages(1), msgs...) - scoreParams := cfg.NetworkConfig.GossipSub.ScoringParameters + thresholds := cfg.NetworkConfig.GossipSub.ScoringParameters.PeerScoring.Internal.Thresholds // wait for at most 3 seconds for the victim node to penalize the spammer node. // Each heartbeat is 1 second, so 3 heartbeats should be enough to penalize the spammer node. // Ideally, we should wait for 1 heartbeat, but the score may not be updated immediately after the heartbeat. + details := "" require.Eventually(t, func() bool { spammerScore, ok := victimNode.PeerScoreExposer().GetScore(spammer.SpammerNode.ID()) if !ok { + details = "failed to get spammer score" return false } - if spammerScore >= scoreParams.PeerScoring.Internal.Thresholds.Gossip { + details = fmt.Sprintf("spammer score: %f", spammerScore) + if spammerScore >= thresholds.Gossip { // ensure the score is low enough so that no gossip is routed by victim node to spammer node. return false } - if spammerScore >= scoreParams.PeerScoring.Internal.Thresholds.Publish { - // ensure the score is low enough so that non of the published messages of the victim node are routed to the spammer node. + details = fmt.Sprintf("%s, gossip threshold: %f", details, thresholds.Gossip) + if spammerScore >= thresholds.Publish { + // ensure the score is low enough so that none of the published messages of the victim node are routed to the spammer node. return false } - if spammerScore >= scoreParams.PeerScoring.Internal.Thresholds.Graylist { + details = fmt.Sprintf("%s, publish threshold: %f", details, thresholds.Publish) + if spammerScore >= thresholds.Graylist { // ensure the score is low enough so that the victim node does not accept RPC messages from the spammer node. return false } + details = fmt.Sprintf("%s, graylist threshold: %f", details, thresholds.Graylist) return true - }, 5*time.Second, 100*time.Millisecond) + }, 5*time.Second, 100*time.Millisecond, details) + + spammerScore, ok := victimNode.PeerScoreExposer().GetScore(spammer.SpammerNode.ID()) + require.True(t, ok) + t.Logf("spammer score: %f", spammerScore) + t.Logf("gossip theshold: %f", thresholds.Gossip) + t.Logf("publish theshold: %f", thresholds.Publish) + t.Logf("graylist theshold: %f", thresholds.Graylist) topicsSnapshot, ok := victimNode.PeerScoreExposer().GetTopicScores(spammer.SpammerNode.ID()) require.True(t, ok) diff --git a/insecure/internal/subscription.go b/insecure/internal/subscription.go index 60df67de909..f0d1abdc952 100644 --- a/insecure/internal/subscription.go +++ b/insecure/internal/subscription.go @@ -3,21 +3,15 @@ package internal import ( "context" + corrupt "github.com/libp2p/go-libp2p-pubsub" pubsub "github.com/libp2p/go-libp2p-pubsub" - corrupt "github.com/yhassanzadeh13/go-libp2p-pubsub" "github.com/onflow/flow-go/network/p2p" ) -// CorruptSubscription is a wrapper around the forked pubsub subscription from -// github.com/yhassanzadeh13/go-libp2p-pubsub that implements the p2p.Subscription. -// This is needed because in order to use the forked pubsub module, we need to -// use the entire dependency tree of the forked module which is resolved to -// github.com/yhassanzadeh13/go-libp2p-pubsub. This means that we cannot use -// the original libp2p pubsub module in the same package. -// Note: we use the forked pubsub module for sake of BFT testing and attack vector -// implementation, it is designed to be completely isolated in the "insecure" package, and -// totally separated from the rest of the codebase. +// CorruptSubscription is a wrapper that implements the p2p.Subscription. +// This is previously needed because we used a forked pubsub module. This is no longer the case +// so we could refactor this in the future to remove this wrapper. type CorruptSubscription struct { s *corrupt.Subscription } diff --git a/insecure/internal/topic.go b/insecure/internal/topic.go index 0b0c9c77156..82dba5365f7 100644 --- a/insecure/internal/topic.go +++ b/insecure/internal/topic.go @@ -3,20 +3,14 @@ package internal import ( "context" - corrupt "github.com/yhassanzadeh13/go-libp2p-pubsub" + corrupt "github.com/libp2p/go-libp2p-pubsub" "github.com/onflow/flow-go/network/p2p" ) -// CorruptTopic is a wrapper around the forked pubsub topic from -// github.com/yhassanzadeh13/go-libp2p-pubsub that implements the p2p.Topic. -// This is needed because in order to use the forked pubsub module, we need to -// use the entire dependency tree of the forked module which is resolved to -// github.com/yhassanzadeh13/go-libp2p-pubsub. This means that we cannot use -// the original libp2p pubsub module in the same package. -// Note: we use the forked pubsub module for sake of BFT testing and attack vector -// implementation, it is designed to be completely isolated in the "insecure" package, and -// totally separated from the rest of the codebase. +// CorruptTopic is a wrapper that implements the p2p.Topic. +// This is previously needed because we used a forked pubsub module. This is no longer the case +// so we could refactor this in the future to remove this wrapper. type CorruptTopic struct { t *corrupt.Topic } diff --git a/integration/go.mod b/integration/go.mod index 8cdd7313488..70239e174a7 100644 --- a/integration/go.mod +++ b/integration/go.mod @@ -13,13 +13,13 @@ require ( github.com/docker/go-connections v0.4.0 github.com/go-git/go-git/v5 v5.11.0 github.com/go-yaml/yaml v2.1.0+incompatible - github.com/gorilla/websocket v1.5.0 - github.com/ipfs/boxo v0.17.1-0.20240131173518-89bceff34bf1 + github.com/gorilla/websocket v1.5.3 + github.com/ipfs/boxo v0.27.2 github.com/ipfs/go-cid v0.4.1 github.com/ipfs/go-datastore v0.6.0 github.com/ipfs/go-ds-badger2 v0.1.3 github.com/ipfs/go-ds-pebble v0.3.1-0.20240828032824-d745b9d3200b - github.com/libp2p/go-libp2p v0.32.2 + github.com/libp2p/go-libp2p v0.38.2 github.com/onflow/cadence v1.3.1 github.com/onflow/crypto v0.25.2 github.com/onflow/flow-core-contracts/lib/go/contracts v1.4.0 @@ -29,19 +29,19 @@ require ( github.com/onflow/flow-go/insecure v0.0.0-00010101000000-000000000000 github.com/onflow/flow/protobuf/go/flow v0.4.9 github.com/onflow/go-ethereum v1.14.7 - github.com/prometheus/client_golang v1.18.0 - github.com/prometheus/client_model v0.5.0 - github.com/prometheus/common v0.46.0 + github.com/prometheus/client_golang v1.20.5 + github.com/prometheus/client_model v0.6.1 + github.com/prometheus/common v0.61.0 github.com/psiemens/graceland v1.0.0 github.com/rs/zerolog v1.29.0 github.com/stretchr/testify v1.10.0 go.einride.tech/pid v0.1.0 go.uber.org/atomic v1.11.0 - go.uber.org/mock v0.4.0 - golang.org/x/exp v0.0.0-20240119083558-1b970713d09a - golang.org/x/sync v0.8.0 - google.golang.org/grpc v1.64.1 - google.golang.org/protobuf v1.34.2 + go.uber.org/mock v0.5.0 + golang.org/x/exp v0.0.0-20241217172543-b2144cdd0a67 + golang.org/x/sync v0.10.0 + google.golang.org/grpc v1.67.1 + google.golang.org/protobuf v1.36.0 gopkg.in/yaml.v3 v3.0.1 ) @@ -53,6 +53,7 @@ require ( dario.cat/mergo v1.0.0 // indirect github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect github.com/DataDog/zstd v1.5.2 // indirect + github.com/Jorropo/jsync v1.0.1 // indirect github.com/Microsoft/go-winio v0.6.2 // indirect github.com/ProtonMail/go-crypto v0.0.0-20230828082145-3c4c8a2d2371 // indirect github.com/SaveTheRbtz/mph v0.1.1-0.20240117162131-4166ec7869bc // indirect @@ -79,7 +80,7 @@ require ( github.com/beorn7/perks v1.0.1 // indirect github.com/bits-and-blooms/bitset v1.10.0 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.4 // indirect - github.com/cenkalti/backoff/v4 v4.2.1 // indirect + github.com/cenkalti/backoff/v4 v4.3.0 // indirect github.com/cespare/xxhash v1.1.0 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/cloudflare/circl v1.3.3 // indirect @@ -101,7 +102,7 @@ require ( github.com/davecgh/go-spew v1.1.1 // indirect github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c // indirect github.com/deckarep/golang-set/v2 v2.6.0 // indirect - github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 // indirect github.com/dgraph-io/ristretto v0.1.0 // indirect github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 // indirect github.com/distribution/reference v0.5.0 // indirect @@ -112,46 +113,47 @@ require ( github.com/docker/go-units v0.5.0 // indirect github.com/dustin/go-humanize v1.0.1 // indirect github.com/ef-ds/deque v1.0.4 // indirect - github.com/elastic/gosigar v0.14.2 // indirect + github.com/elastic/gosigar v0.14.3 // indirect github.com/emirpasic/gods v1.18.1 // indirect github.com/ethereum/c-kzg-4844 v1.0.0 // indirect github.com/ethereum/go-ethereum v1.13.10 // indirect github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/flynn/noise v1.0.1 // indirect + github.com/filecoin-project/go-clock v0.1.0 // indirect + github.com/flynn/noise v1.1.0 // indirect github.com/francoispqt/gojay v1.2.13 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/fxamacker/cbor/v2 v2.4.1-0.20230228173756-c0c9f774e40c // indirect github.com/fxamacker/circlehash v0.3.0 // indirect - github.com/gabriel-vasile/mimetype v1.4.3 // indirect - github.com/gammazero/deque v0.1.0 // indirect - github.com/gammazero/workerpool v1.1.2 // indirect + github.com/gabriel-vasile/mimetype v1.4.6 // indirect + github.com/gammazero/deque v1.0.0 // indirect + github.com/gammazero/workerpool v1.1.3 // indirect github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff // indirect github.com/getsentry/sentry-go v0.27.0 // indirect github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect github.com/go-git/go-billy/v5 v5.5.0 // indirect github.com/go-kit/kit v0.12.0 // indirect github.com/go-kit/log v0.2.1 // indirect - github.com/go-logfmt/logfmt v0.5.1 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logfmt/logfmt v0.6.0 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.3.0 // indirect github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect - github.com/go-playground/validator/v10 v10.14.1 // indirect - github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect + github.com/go-playground/validator/v10 v10.19.0 // indirect + github.com/go-task/slim-sprig/v3 v3.0.0 // indirect github.com/goccy/go-json v0.10.2 // indirect github.com/godbus/dbus/v5 v5.1.0 // indirect github.com/gofrs/flock v0.8.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/glog v1.2.0 // indirect + github.com/golang/glog v1.2.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/mock v1.6.0 // indirect github.com/golang/protobuf v1.5.4 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect github.com/google/flatbuffers v23.5.26+incompatible // indirect github.com/google/gopacket v1.1.19 // indirect - github.com/google/pprof v0.0.0-20231229205709-960ae82b1e42 // indirect + github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad // indirect github.com/google/s2a-go v0.1.7 // indirect github.com/google/uuid v1.6.0 // indirect github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect @@ -159,7 +161,7 @@ require ( github.com/gorilla/mux v1.8.1 // indirect github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0 // indirect github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect github.com/hashicorp/golang-lru v1.0.2 // indirect @@ -181,7 +183,7 @@ require ( github.com/ipfs/go-log v1.0.5 // indirect github.com/ipfs/go-log/v2 v2.5.1 // indirect github.com/ipfs/go-metrics-interface v0.0.1 // indirect - github.com/ipfs/go-peertaskqueue v0.8.1 // indirect + github.com/ipfs/go-peertaskqueue v0.8.2 // indirect github.com/ipld/go-ipld-prime v0.21.0 // indirect github.com/jackpal/go-nat-pmp v1.0.2 // indirect github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect @@ -191,25 +193,25 @@ require ( github.com/k0kubun/pp v3.0.1+incompatible // indirect github.com/kevinburke/go-bindata v3.24.0+incompatible // indirect github.com/kevinburke/ssh_config v1.2.0 // indirect - github.com/klauspost/compress v1.17.4 // indirect - github.com/klauspost/cpuid/v2 v2.2.6 // indirect + github.com/klauspost/compress v1.17.11 // indirect + github.com/klauspost/cpuid/v2 v2.2.9 // indirect github.com/koron/go-ssdp v0.0.4 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect - github.com/leodido/go-urn v1.2.4 // indirect + github.com/leodido/go-urn v1.4.0 // indirect github.com/libp2p/go-addr-util v0.1.0 // indirect github.com/libp2p/go-buffer-pool v0.1.0 // indirect github.com/libp2p/go-cidranger v1.1.0 // indirect - github.com/libp2p/go-flow-metrics v0.1.0 // indirect + github.com/libp2p/go-flow-metrics v0.2.0 // indirect github.com/libp2p/go-libp2p-asn-util v0.4.1 // indirect - github.com/libp2p/go-libp2p-kad-dht v0.25.2 // indirect - github.com/libp2p/go-libp2p-kbucket v0.6.3 // indirect - github.com/libp2p/go-libp2p-pubsub v0.10.0 // indirect + github.com/libp2p/go-libp2p-kad-dht v0.28.2 // indirect + github.com/libp2p/go-libp2p-kbucket v0.6.4 // indirect + github.com/libp2p/go-libp2p-pubsub v0.13.0 // indirect github.com/libp2p/go-libp2p-record v0.2.0 // indirect - github.com/libp2p/go-libp2p-routing-helpers v0.7.3 // indirect + github.com/libp2p/go-libp2p-routing-helpers v0.7.4 // indirect github.com/libp2p/go-msgio v0.3.0 // indirect github.com/libp2p/go-nat v0.2.0 // indirect - github.com/libp2p/go-netroute v0.2.1 // indirect + github.com/libp2p/go-netroute v0.2.2 // indirect github.com/libp2p/go-reuseport v0.4.0 // indirect github.com/libp2p/go-yamux/v4 v4.0.1 // indirect github.com/logrusorgru/aurora/v4 v4.0.0 // indirect @@ -219,7 +221,7 @@ require ( github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-runewidth v0.0.15 // indirect - github.com/miekg/dns v1.1.57 // indirect + github.com/miekg/dns v1.1.62 // indirect github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b // indirect github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc // indirect github.com/minio/sha256-simd v1.0.1 // indirect @@ -231,14 +233,15 @@ require ( github.com/mr-tron/base58 v1.2.0 // indirect github.com/multiformats/go-base32 v0.1.0 // indirect github.com/multiformats/go-base36 v0.2.0 // indirect - github.com/multiformats/go-multiaddr v0.12.2 // indirect - github.com/multiformats/go-multiaddr-dns v0.3.1 // indirect + github.com/multiformats/go-multiaddr v0.14.0 // indirect + github.com/multiformats/go-multiaddr-dns v0.4.1 // indirect github.com/multiformats/go-multiaddr-fmt v0.1.0 // indirect github.com/multiformats/go-multibase v0.2.0 // indirect github.com/multiformats/go-multicodec v0.9.0 // indirect github.com/multiformats/go-multihash v0.2.3 // indirect - github.com/multiformats/go-multistream v0.5.0 // indirect + github.com/multiformats/go-multistream v0.6.0 // indirect github.com/multiformats/go-varint v0.0.7 // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/olekukonko/tablewriter v0.0.5 // indirect github.com/onflow/atree v0.9.0 // indirect github.com/onflow/bridged-usdc/lib/go/contracts v1.0.0 // indirect @@ -249,29 +252,45 @@ require ( github.com/onflow/nft-storefront/lib/go/contracts v1.0.0 // indirect github.com/onflow/sdks v0.6.0-preview.1 // indirect github.com/onflow/wal v1.0.2 // indirect - github.com/onsi/ginkgo/v2 v2.13.2 // indirect + github.com/onsi/ginkgo/v2 v2.22.0 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.0.2 // indirect - github.com/opencontainers/runtime-spec v1.1.0 // indirect + github.com/opencontainers/runtime-spec v1.2.0 // indirect github.com/opentracing/opentracing-go v1.2.0 // indirect github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 // indirect github.com/pelletier/go-toml/v2 v2.2.2 // indirect github.com/pierrec/lz4 v2.6.1+incompatible // indirect github.com/pierrec/lz4/v4 v4.1.18 // indirect + github.com/pion/datachannel v1.5.10 // indirect + github.com/pion/dtls/v2 v2.2.12 // indirect + github.com/pion/ice/v2 v2.3.37 // indirect + github.com/pion/interceptor v0.1.37 // indirect + github.com/pion/logging v0.2.2 // indirect + github.com/pion/mdns v0.0.12 // indirect + github.com/pion/randutil v0.1.0 // indirect + github.com/pion/rtcp v1.2.15 // indirect + github.com/pion/rtp v1.8.10 // indirect + github.com/pion/sctp v1.8.35 // indirect + github.com/pion/sdp/v3 v3.0.9 // indirect + github.com/pion/srtp/v2 v2.0.20 // indirect + github.com/pion/stun v0.6.1 // indirect + github.com/pion/transport/v2 v2.2.10 // indirect + github.com/pion/transport/v3 v3.0.7 // indirect + github.com/pion/turn/v2 v2.1.6 // indirect + github.com/pion/webrtc/v3 v3.3.5 // indirect github.com/pjbgf/sha1cd v0.3.0 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/polydawn/refmt v0.89.0 // indirect github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect - github.com/prometheus/procfs v0.12.0 // indirect + github.com/prometheus/procfs v0.15.1 // indirect github.com/psiemens/sconfig v0.1.0 // indirect - github.com/quic-go/qpack v0.4.0 // indirect - github.com/quic-go/qtls-go1-20 v0.4.1 // indirect - github.com/quic-go/quic-go v0.40.1 // indirect - github.com/quic-go/webtransport-go v0.6.0 // indirect + github.com/quic-go/qpack v0.5.1 // indirect + github.com/quic-go/quic-go v0.48.2 // indirect + github.com/quic-go/webtransport-go v0.8.1-0.20241018022711-4ac2c9250e66 // indirect github.com/raulk/go-watchdog v1.3.0 // indirect github.com/rivo/uniseg v0.4.4 // indirect - github.com/rogpeppe/go-internal v1.11.0 // indirect + github.com/rogpeppe/go-internal v1.13.1 // indirect github.com/rootless-containers/rootlesskit v1.1.1 // indirect github.com/schollz/progressbar/v3 v3.13.1 // indirect github.com/sergi/go-diff v1.2.0 // indirect @@ -281,7 +300,7 @@ require ( github.com/shoenig/go-m1cpu v0.1.6 // indirect github.com/sirupsen/logrus v1.9.3 // indirect github.com/skeema/knownhosts v1.2.1 // indirect - github.com/slok/go-http-metrics v0.10.0 // indirect + github.com/slok/go-http-metrics v0.12.0 // indirect github.com/sony/gobreaker v0.5.0 // indirect github.com/spaolacci/murmur3 v1.1.0 // indirect github.com/spf13/afero v1.11.0 // indirect @@ -304,42 +323,42 @@ require ( github.com/vmihailenco/msgpack/v4 v4.3.12 // indirect github.com/vmihailenco/tagparser v0.1.2 // indirect github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1 // indirect + github.com/wlynxg/anet v0.0.5 // indirect github.com/x448/float16 v0.8.4 // indirect github.com/xanzy/ssh-agent v0.3.3 // indirect - github.com/yhassanzadeh13/go-libp2p-pubsub v0.6.11-flow-expose-msg.0.20240220190333-03695dea34a3 // indirect github.com/yusufpapurcu/wmi v1.2.4 // indirect github.com/zeebo/blake3 v0.2.4 // indirect github.com/zeebo/xxh3 v1.0.2 // indirect go.opencensus.io v0.24.0 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 // indirect - go.opentelemetry.io/otel v1.24.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 // indirect - go.opentelemetry.io/otel/metric v1.24.0 // indirect - go.opentelemetry.io/otel/sdk v1.24.0 // indirect - go.opentelemetry.io/otel/trace v1.24.0 // indirect - go.opentelemetry.io/proto/otlp v1.0.0 // indirect - go.uber.org/dig v1.17.1 // indirect - go.uber.org/fx v1.20.1 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 // indirect + go.opentelemetry.io/otel v1.31.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.31.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0 // indirect + go.opentelemetry.io/otel/metric v1.31.0 // indirect + go.opentelemetry.io/otel/sdk v1.31.0 // indirect + go.opentelemetry.io/otel/trace v1.31.0 // indirect + go.opentelemetry.io/proto/otlp v1.3.1 // indirect + go.uber.org/dig v1.18.0 // indirect + go.uber.org/fx v1.23.0 // indirect go.uber.org/multierr v1.11.0 // indirect - go.uber.org/zap v1.26.0 // indirect - golang.org/x/crypto v0.28.0 // indirect - golang.org/x/mod v0.18.0 // indirect - golang.org/x/net v0.26.0 // indirect - golang.org/x/oauth2 v0.18.0 // indirect - golang.org/x/sys v0.26.0 // indirect - golang.org/x/term v0.25.0 // indirect - golang.org/x/text v0.19.0 // indirect + go.uber.org/zap v1.27.0 // indirect + golang.org/x/crypto v0.31.0 // indirect + golang.org/x/mod v0.22.0 // indirect + golang.org/x/net v0.33.0 // indirect + golang.org/x/oauth2 v0.24.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/term v0.27.0 // indirect + golang.org/x/text v0.21.0 // indirect golang.org/x/time v0.5.0 // indirect - golang.org/x/tools v0.22.0 // indirect - golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect - gonum.org/v1/gonum v0.14.0 // indirect + golang.org/x/tools v0.28.0 // indirect + golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect + gonum.org/v1/gonum v0.15.0 // indirect google.golang.org/api v0.169.0 // indirect google.golang.org/appengine v1.6.8 // indirect google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240814211410-ddb44dafa142 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20241007155032-5fefd90f89a9 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20241007155032-5fefd90f89a9 // indirect google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.2.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect @@ -350,3 +369,6 @@ require ( replace github.com/onflow/flow-go => ../ replace github.com/onflow/flow-go/insecure => ../insecure + +// Using custom fork until https://github.com/onflow/flow-go/issues/5338 is resolved +replace github.com/ipfs/boxo => github.com/onflow/boxo v0.0.0-20240201202436-f2477b92f483 diff --git a/integration/go.sum b/integration/go.sum index 04bbbf963f6..36e6b97002f 100644 --- a/integration/go.sum +++ b/integration/go.sum @@ -32,6 +32,8 @@ github.com/BurntSushi/toml v1.2.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbi github.com/DataDog/zstd v1.4.1/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= github.com/DataDog/zstd v1.5.2 h1:vUG4lAyuPCXO0TLbXvPv7EB7cNK1QV/luu55UHLrrn8= github.com/DataDog/zstd v1.5.2/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= +github.com/Jorropo/jsync v1.0.1 h1:6HgRolFZnsdfzRUj+ImB9og1JYOxQoReSywkHOGSaUU= +github.com/Jorropo/jsync v1.0.1/go.mod h1:jCOZj3vrBCri3bSU3ErUYvevKlnbssrXeCivybS5ABQ= github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= @@ -120,8 +122,8 @@ github.com/btcsuite/btcd/chaincfg/chainhash v1.0.2 h1:KdUfX2zKommPRa+PD0sWZUyXe9 github.com/btcsuite/btcd/chaincfg/chainhash v1.0.2/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= -github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= -github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= +github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/cp v0.1.0 h1:SE+dxFebS7Iik5LK0tsi1k9ZCxEaFX4AjQmoyA+1dJk= github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= @@ -200,8 +202,8 @@ github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80N github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etlyjdBU4sfcs2WYQMs= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 h1:rpfIENRNNilwHwZeG5+P150SMrnNEcHYvcCuK6dPZSg= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= github.com/dgraph-io/badger/v2 v2.2007.3/go.mod h1:26P/7fbL4kUZVEVKLAKXkBXKOydDmM2p1e+NhhnBCAE= github.com/dgraph-io/badger/v2 v2.2007.4 h1:TRWBQg8UrlUhaFdco01nO2uXwzKS7zd+HVdwV/GHc4o= github.com/dgraph-io/badger/v2 v2.2007.4/go.mod h1:vSw/ax2qojzbN6eXHIx6KPKtCSHJN/Uz0X0VPruTIhk= @@ -236,8 +238,8 @@ github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+m github.com/ef-ds/deque v1.0.4 h1:iFAZNmveMT9WERAkqLJ+oaABF9AcVQ5AjXem/hroniI= github.com/ef-ds/deque v1.0.4/go.mod h1:gXDnTC3yqvBcHbq2lcExjtAcVrOnJCbMcZXmuj8Z4tg= github.com/elastic/gosigar v0.12.0/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= -github.com/elastic/gosigar v0.14.2 h1:Dg80n8cr90OZ7x+bAax/QjoW/XqTI11RmA79ZwIm9/4= -github.com/elastic/gosigar v0.14.2/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= +github.com/elastic/gosigar v0.14.3 h1:xwkKwPia+hSfg9GqrCUKYdId102m9qTJIIr7egmK/uo= +github.com/elastic/gosigar v0.14.3/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a h1:mATvB/9r/3gvcejNsXKSkQ6lcIaNec2nyfOdlTBR2lU= github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a/go.mod h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM= github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= @@ -255,9 +257,11 @@ github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0/go.mod h1:D9A github.com/fanliao/go-promise v0.0.0-20141029170127-1890db352a72/go.mod h1:PjfxuH4FZdUyfMdtBio2lsRr1AKEaVPwelzuHuh8Lqc= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/filecoin-project/go-clock v0.1.0 h1:SFbYIM75M8NnFm1yMHhN9Ahy3W5bEZV9gd6MPfXbKVU= +github.com/filecoin-project/go-clock v0.1.0/go.mod h1:4uB/O4PvOjlx1VCMdZ9MyDZXRm//gkj1ELEbxfI1AZs= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= -github.com/flynn/noise v1.0.1 h1:vPp/jdQLXC6ppsXSj/pM3W1BIJ5FEHE2TulSJBpb43Y= -github.com/flynn/noise v1.0.1/go.mod h1:xbMo+0i6+IGbYdJhF31t2eR1BIU0CYc12+BNAKwUTag= +github.com/flynn/noise v1.1.0 h1:KjPQoQCEFdZDiP03phOvGi11+SVVhBG2wOWAorLsstg= +github.com/flynn/noise v1.1.0/go.mod h1:xbMo+0i6+IGbYdJhF31t2eR1BIU0CYc12+BNAKwUTag= github.com/francoispqt/gojay v1.2.13 h1:d2m3sFjloqoIUQU3TsHBgj6qg/BVGlTBeHDUmyJnXKk= github.com/francoispqt/gojay v1.2.13/go.mod h1:ehT5mTG4ua4581f1++1WLG0vPdaA9HaiDsoyrBGkyDY= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= @@ -270,12 +274,12 @@ github.com/fxamacker/cbor/v2 v2.4.1-0.20230228173756-c0c9f774e40c h1:5tm/Wbs9d9r github.com/fxamacker/cbor/v2 v2.4.1-0.20230228173756-c0c9f774e40c/go.mod h1:TA1xS00nchWmaBnEIxPSE5oHLuJBAVvqrtAnWBwBCVo= github.com/fxamacker/circlehash v0.3.0 h1:XKdvTtIJV9t7DDUtsf0RIpC1OcxZtPbmgIH7ekx28WA= github.com/fxamacker/circlehash v0.3.0/go.mod h1:3aq3OfVvsWtkWMb6A1owjOQFA+TLsD5FgJflnaQwtMM= -github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= -github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= -github.com/gammazero/deque v0.1.0 h1:f9LnNmq66VDeuAlSAapemq/U7hJ2jpIWa4c09q8Dlik= -github.com/gammazero/deque v0.1.0/go.mod h1:KQw7vFau1hHuM8xmI9RbgKFbAsQFWmBpqQ2KenFLk6M= -github.com/gammazero/workerpool v1.1.2 h1:vuioDQbgrz4HoaCi2q1HLlOXdpbap5AET7xu5/qj87g= -github.com/gammazero/workerpool v1.1.2/go.mod h1:UelbXcO0zCIGFcufcirHhq2/xtLXJdQ29qZNlXG9OjQ= +github.com/gabriel-vasile/mimetype v1.4.6 h1:3+PzJTKLkvgjeTbts6msPJt4DixhT4YtFNf1gtGe3zc= +github.com/gabriel-vasile/mimetype v1.4.6/go.mod h1:JX1qVKqZd40hUPpAfiNTe0Sne7hdfKSbOqqmkq8GCXc= +github.com/gammazero/deque v1.0.0 h1:LTmimT8H7bXkkCy6gZX7zNLtkbz4NdS2z8LZuor3j34= +github.com/gammazero/deque v1.0.0/go.mod h1:iflpYvtGfM3U8S8j+sZEKIak3SAKYpA5/SQewgfXDKo= +github.com/gammazero/workerpool v1.1.3 h1:WixN4xzukFoN0XSeXF6puqEqFTl2mECI9S6W44HWy9Q= +github.com/gammazero/workerpool v1.1.3/go.mod h1:wPjyBLDbyKnUn2XwwyD3EEwo9dHutia9/fwNmSHWACc= github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff h1:tY80oXqGNY4FhTFhk+o9oFHGINQ/+vhlm8HFzi6znCI= github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= github.com/getsentry/sentry-go v0.27.0 h1:Pv98CIbtB3LkMWmXi4Joa5OOcwbmnX88sF5qbK3r3Ps= @@ -302,11 +306,11 @@ github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNVA= -github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= +github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= +github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= @@ -319,11 +323,11 @@ github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/o github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= -github.com/go-playground/validator/v10 v10.14.1 h1:9c50NUPC30zyuKprjL3vNZ0m5oG+jU0zvx4AqHGnv4k= -github.com/go-playground/validator/v10 v10.14.1/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= +github.com/go-playground/validator/v10 v10.19.0 h1:ol+5Fu+cSq9JD7SoSqe04GMI92cbn0+wvQ3bZ8b/AU4= +github.com/go-playground/validator/v10 v10.19.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= +github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= +github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= 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-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= @@ -340,8 +344,8 @@ github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXP github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.2.0 h1:uCdmnmatrKCgMBlM4rMuJZWOkPDqdbZPnrMXDY4gI68= -github.com/golang/glog v1.2.0/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= +github.com/golang/glog v1.2.2 h1:1+mZ9upx1Dh6FmUTFR1naJ77miKiXgALjWOZ3NVFPmY= +github.com/golang/glog v1.2.2/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= @@ -401,8 +405,8 @@ github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXi github.com/google/martian/v3 v3.3.2 h1:IqNFLAmvJOgVlpdEBiQbDc2EwKW77amAycfTuWKdfvw= github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20231229205709-960ae82b1e42 h1:dHLYa5D8/Ta0aLR2XcPsrkpAgGeFs6thhMcQK0oQ0n8= -github.com/google/pprof v0.0.0-20231229205709-960ae82b1e42/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik= +github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad h1:a6HEuzUHeKH6hwfN/ZoQgRgVIWFJljSWa/zetS2WTvg= +github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= @@ -410,6 +414,7 @@ github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3 github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= @@ -425,8 +430,8 @@ github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB7 github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= -github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= +github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0 h1:pRhl55Yx1eC7BZ1N+BBWwnKaMyD8uC+34TLdndZMAKk= @@ -435,8 +440,8 @@ github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92Bcuy github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 h1:Wqo399gCIufwto+VfwCSvsnfGpF/w5E9CNxSwbpD6No= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0/go.mod h1:qmOFXW2epJhM0qSnUUYpldc7gVz2KMQwJ/QYCDIa7XU= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 h1:asbCHRVmodnJTuQ3qamDwqVOIjwqUPTYmYuemVOx+Ys= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0/go.mod h1:ggCgvZ2r7uOoQjOyu2Y1NhHmEPPzzuhWgcza5M1Ji1I= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -468,8 +473,6 @@ github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLf github.com/insomniacslk/dhcp v0.0.0-20230516061539-49801966e6cb/go.mod h1:7474bZ1YNCvarT6WFKie4kEET6J0KYRDC4XJqqXzQW4= github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs= github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0= -github.com/ipfs/boxo v0.17.1-0.20240131173518-89bceff34bf1 h1:5H/HYvdmbxp09+sAvdqJzyrWoyCS6OroeW9Ym06Tb+0= -github.com/ipfs/boxo v0.17.1-0.20240131173518-89bceff34bf1/go.mod h1:pIZgTWdm3k3pLF9Uq6MB8JEcW07UDwNJjlXW1HELW80= github.com/ipfs/go-block-format v0.2.0 h1:ZqrkxBA2ICbDRbK8KJs/u0O3dlp6gmAuuXUJNiW1Ycs= github.com/ipfs/go-block-format v0.2.0/go.mod h1:+jpL11nFx5A/SPpsoBn6Bzkra/zaArfSmsknbPMYgzM= github.com/ipfs/go-cid v0.0.7/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I= @@ -506,8 +509,10 @@ github.com/ipfs/go-log/v2 v2.5.1 h1:1XdUzF7048prq4aBjDQQ4SL5RxftpRGdXhNRwKSAlcY= github.com/ipfs/go-log/v2 v2.5.1/go.mod h1:prSpmC1Gpllc9UYWxDiZDreBYw7zp4Iqp1kOLU9U5UI= github.com/ipfs/go-metrics-interface v0.0.1 h1:j+cpbjYvu4R8zbleSs36gvB7jR+wsL2fGD6n0jO4kdg= github.com/ipfs/go-metrics-interface v0.0.1/go.mod h1:6s6euYU4zowdslK0GKHmqaIZ3j/b/tL7HTWtJ4VPgWY= -github.com/ipfs/go-peertaskqueue v0.8.1 h1:YhxAs1+wxb5jk7RvS0LHdyiILpNmRIRnZVztekOF0pg= -github.com/ipfs/go-peertaskqueue v0.8.1/go.mod h1:Oxxd3eaK279FxeydSPPVGHzbwVeHjatZ2GA8XD+KbPU= +github.com/ipfs/go-peertaskqueue v0.8.2 h1:PaHFRaVFdxQk1Qo3OKiHPYjmmusQy7gKQUaL8JDszAU= +github.com/ipfs/go-peertaskqueue v0.8.2/go.mod h1:L6QPvou0346c2qPJNiJa6BvOibxDfaiPlqHInmzg0FA= +github.com/ipfs/go-test v0.0.4 h1:DKT66T6GBB6PsDFLoO56QZPrOmzJkqU1FZH5C9ySkew= +github.com/ipfs/go-test v0.0.4/go.mod h1:qhIM1EluEfElKKM6fnWxGn822/z9knUGM1+I/OAQNKI= github.com/ipld/go-ipld-prime v0.21.0 h1:n4JmcpOlPDIxBcY037SVfpd1G+Sj1nKZah0m6QH9C2E= github.com/ipld/go-ipld-prime v0.21.0/go.mod h1:3RLqy//ERg/y5oShXXdx5YIp50cFGOanyMctpPjsvxQ= github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= @@ -552,10 +557,10 @@ github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQL github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= -github.com/klauspost/compress v1.17.4 h1:Ej5ixsIri7BrIjBkRZLTo6ghwrEtHFk7ijlczPW4fZ4= -github.com/klauspost/compress v1.17.4/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM= -github.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc= -github.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= +github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= +github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= +github.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY= +github.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/koron/go-ssdp v0.0.4 h1:1IDwrghSKYM7yLf7XCzbByg2sJ/JcNOZRXS2jczTwz0= github.com/koron/go-ssdp v0.0.4/go.mod h1:oDXq+E5IL5q0U8uSBcoAXzTzInwy5lEgC91HoKtbmZk= @@ -574,8 +579,8 @@ github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0 github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= 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/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= -github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= +github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= +github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/libp2p/go-addr-util v0.1.0 h1:acKsntI33w2bTU7tC9a0SaPimJGfSI0bFKC18ChxeVI= @@ -584,22 +589,22 @@ github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6 github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= github.com/libp2p/go-cidranger v1.1.0 h1:ewPN8EZ0dd1LSnrtuwd4709PXVcITVeuwbag38yPW7c= github.com/libp2p/go-cidranger v1.1.0/go.mod h1:KWZTfSr+r9qEo9OkI9/SIEeAtw+NNoU0dXIXt15Okic= -github.com/libp2p/go-flow-metrics v0.1.0 h1:0iPhMI8PskQwzh57jB9WxIuIOQ0r+15PChFGkx3Q3WM= -github.com/libp2p/go-flow-metrics v0.1.0/go.mod h1:4Xi8MX8wj5aWNDAZttg6UPmc0ZrnFNsMtpsYUClFtro= -github.com/libp2p/go-libp2p v0.32.2 h1:s8GYN4YJzgUoyeYNPdW7JZeZ5Ee31iNaIBfGYMAY4FQ= -github.com/libp2p/go-libp2p v0.32.2/go.mod h1:E0LKe+diV/ZVJVnOJby8VC5xzHF0660osg71skcxJvk= +github.com/libp2p/go-flow-metrics v0.2.0 h1:EIZzjmeOE6c8Dav0sNv35vhZxATIXWZg6j/C08XmmDw= +github.com/libp2p/go-flow-metrics v0.2.0/go.mod h1:st3qqfu8+pMfh+9Mzqb2GTiwrAGjIPszEjZmtksN8Jc= +github.com/libp2p/go-libp2p v0.38.2 h1:9SZQDOCi82A25An4kx30lEtr6kGTxrtoaDkbs5xrK5k= +github.com/libp2p/go-libp2p v0.38.2/go.mod h1:QWV4zGL3O9nXKdHirIC59DoRcZ446dfkjbOJ55NEWFo= github.com/libp2p/go-libp2p-asn-util v0.4.1 h1:xqL7++IKD9TBFMgnLPZR6/6iYhawHKHl950SO9L6n94= github.com/libp2p/go-libp2p-asn-util v0.4.1/go.mod h1:d/NI6XZ9qxw67b4e+NgpQexCIiFYJjErASrYW4PFDN8= -github.com/libp2p/go-libp2p-kad-dht v0.25.2 h1:FOIk9gHoe4YRWXTu8SY9Z1d0RILol0TrtApsMDPjAVQ= -github.com/libp2p/go-libp2p-kad-dht v0.25.2/go.mod h1:6za56ncRHYXX4Nc2vn8z7CZK0P4QiMcrn77acKLM2Oo= -github.com/libp2p/go-libp2p-kbucket v0.6.3 h1:p507271wWzpy2f1XxPzCQG9NiN6R6lHL9GiSErbQQo0= -github.com/libp2p/go-libp2p-kbucket v0.6.3/go.mod h1:RCseT7AH6eJWxxk2ol03xtP9pEHetYSPXOaJnOiD8i0= -github.com/libp2p/go-libp2p-pubsub v0.10.0 h1:wS0S5FlISavMaAbxyQn3dxMOe2eegMfswM471RuHJwA= -github.com/libp2p/go-libp2p-pubsub v0.10.0/go.mod h1:1OxbaT/pFRO5h+Dpze8hdHQ63R0ke55XTs6b6NwLLkw= +github.com/libp2p/go-libp2p-kad-dht v0.28.2 h1:/VivUl/Ru0tVgkWNhDDBy8pK6q+gRdI+z8VfqmSUJWo= +github.com/libp2p/go-libp2p-kad-dht v0.28.2/go.mod h1:sUR/qh4p/5+YFXBtwOiCmIBeBA2YD94ttmL+Xk8+pTE= +github.com/libp2p/go-libp2p-kbucket v0.6.4 h1:OjfiYxU42TKQSB8t8WYd8MKhYhMJeO2If+NiuKfb6iQ= +github.com/libp2p/go-libp2p-kbucket v0.6.4/go.mod h1:jp6w82sczYaBsAypt5ayACcRJi0lgsba7o4TzJKEfWA= +github.com/libp2p/go-libp2p-pubsub v0.13.0 h1:RmFQ2XAy3zQtbt2iNPy7Tt0/3fwTnHpCQSSnmGnt1Ps= +github.com/libp2p/go-libp2p-pubsub v0.13.0/go.mod h1:m0gpUOyrXKXdE7c8FNQ9/HLfWbxaEw7xku45w+PaqZo= github.com/libp2p/go-libp2p-record v0.2.0 h1:oiNUOCWno2BFuxt3my4i1frNrt7PerzB3queqa1NkQ0= github.com/libp2p/go-libp2p-record v0.2.0/go.mod h1:I+3zMkvvg5m2OcSdoL0KPljyJyvNDFGKX7QdlpYUcwk= -github.com/libp2p/go-libp2p-routing-helpers v0.7.3 h1:u1LGzAMVRK9Nqq5aYDVOiq/HaB93U9WWczBzGyAC5ZY= -github.com/libp2p/go-libp2p-routing-helpers v0.7.3/go.mod h1:cN4mJAD/7zfPKXBcs9ze31JGYAZgzdABEm+q/hkswb8= +github.com/libp2p/go-libp2p-routing-helpers v0.7.4 h1:6LqS1Bzn5CfDJ4tzvP9uwh42IB7TJLNFJA6dEeGBv84= +github.com/libp2p/go-libp2p-routing-helpers v0.7.4/go.mod h1:we5WDj9tbolBXOuF1hGOkR+r7Uh1408tQbAKaT5n1LE= github.com/libp2p/go-libp2p-testing v0.12.0 h1:EPvBb4kKMWO29qP4mZGyhVzUyR25dvfUIK5WDu6iPUA= github.com/libp2p/go-libp2p-testing v0.12.0/go.mod h1:KcGDRXyN7sQCllucn1cOOS+Dmm7ujhfEyXQL5lvkcPg= github.com/libp2p/go-maddr-filter v0.1.0/go.mod h1:VzZhTXkMucEGGEOSKddrwGiOv0tUhgnKqNEmIAz/bPU= @@ -607,8 +612,8 @@ github.com/libp2p/go-msgio v0.3.0 h1:mf3Z8B1xcFN314sWX+2vOTShIE0Mmn2TXn3YCUQGNj0 github.com/libp2p/go-msgio v0.3.0/go.mod h1:nyRM819GmVaF9LX3l03RMh10QdOroF++NBbxAb0mmDM= github.com/libp2p/go-nat v0.2.0 h1:Tyz+bUFAYqGyJ/ppPPymMGbIgNRH+WqC5QrT5fKrrGk= github.com/libp2p/go-nat v0.2.0/go.mod h1:3MJr+GRpRkyT65EpVPBstXLvOlAPzUVlG6Pwg9ohLJk= -github.com/libp2p/go-netroute v0.2.1 h1:V8kVrpD8GK0Riv15/7VN6RbUQ3URNZVosw7H2v9tksU= -github.com/libp2p/go-netroute v0.2.1/go.mod h1:hraioZr0fhBjG0ZRXJJ6Zj2IVEVNx6tDTFQfSmcq7mQ= +github.com/libp2p/go-netroute v0.2.2 h1:Dejd8cQ47Qx2kRABg6lPwknU7+nBnFRpko45/fFPuZ8= +github.com/libp2p/go-netroute v0.2.2/go.mod h1:Rntq6jUAH0l9Gg17w5bFGhcC9a+vk4KNXs6s7IljKYE= github.com/libp2p/go-reuseport v0.4.0 h1:nR5KU7hD0WxXCJbmw7r2rhRYruNRl2koHw8fQscQm2s= github.com/libp2p/go-reuseport v0.4.0/go.mod h1:ZtI03j/wO5hZVDFo2jKywN6bYKWLOy8Se6DrI2E1cLU= github.com/libp2p/go-yamux/v4 v4.0.1 h1:FfDR4S1wj6Bw2Pqbc8Uz7pCxeRBPbwsBbEdfwiCypkQ= @@ -646,9 +651,8 @@ github.com/mdlayher/netlink v1.1.1/go.mod h1:WTYpFb/WTvlRJAyKhZL5/uy69TDDpHHu2VZ github.com/mdlayher/packet v1.1.1/go.mod h1:DRvYY5mH4M4lUqAnMg04E60U4fjUKMZ/4g2cHElZkKo= github.com/mdlayher/socket v0.4.0/go.mod h1:xxFqz5GRCUN3UEOm9CZqEJsAbe1C8OwSK46NlmWuVoc= github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4= -github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= -github.com/miekg/dns v1.1.57 h1:Jzi7ApEIzwEPLHWRcafCN9LZSBbqQpxjt/wpgvg7wcM= -github.com/miekg/dns v1.1.57/go.mod h1:uqRjCRUuEAA6qsOiJvDd+CFo/vW+y5WR6SNmHE55hZk= +github.com/miekg/dns v1.1.62 h1:cN8OuEF1/x5Rq6Np+h1epln8OiyPWV+lROx9LxcGgIQ= +github.com/miekg/dns v1.1.62/go.mod h1:mvDlcItzm+br7MToIKqkglaGhlFMHJ9DTNNWONWXbNQ= github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c h1:bzE/A84HN25pxAuk9Eej1Kz9OUelF97nAc82bDquQI8= github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c/go.mod h1:0SQS9kMwD2VsyFEB++InYyBJroV/FRmBgcydeSUcJms= github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b h1:z78hV3sbSMAUoyUMM0I83AUIT6Hu17AWfgjzIbtrYFc= @@ -690,13 +694,12 @@ github.com/multiformats/go-base36 v0.1.0/go.mod h1:kFGE83c6s80PklsHO9sRn2NCoffoR github.com/multiformats/go-base36 v0.2.0 h1:lFsAbNOGeKtuKozrtBsAkSVhv1p9D0/qedU9rQyccr0= github.com/multiformats/go-base36 v0.2.0/go.mod h1:qvnKE++v+2MWCfePClUEjE78Z7P2a1UV0xHgWc0hkp4= github.com/multiformats/go-multiaddr v0.1.1/go.mod h1:aMKBKNEYmzmDmxfX88/vz+J5IU55txyt0p4aiWVohjo= -github.com/multiformats/go-multiaddr v0.2.0/go.mod h1:0nO36NvPpyV4QzvTLi/lafl2y95ncPj0vFwVF6k6wJ4= github.com/multiformats/go-multiaddr v0.2.2/go.mod h1:NtfXiOtHvghW9KojvtySjH5y0u0xW5UouOmQQrn6a3Y= github.com/multiformats/go-multiaddr v0.3.3/go.mod h1:lCKNGP1EQ1eZ35Za2wlqnabm9xQkib3fyB+nZXHLag0= -github.com/multiformats/go-multiaddr v0.12.2 h1:9G9sTY/wCYajKa9lyfWPmpZAwe6oV+Wb1zcmMS1HG24= -github.com/multiformats/go-multiaddr v0.12.2/go.mod h1:GKyaTYjZRdcUhyOetrxTk9z0cW+jA/YrnqTOvKgi44M= -github.com/multiformats/go-multiaddr-dns v0.3.1 h1:QgQgR+LQVt3NPTjbrLLpsaT2ufAA2y0Mkk+QRVJbW3A= -github.com/multiformats/go-multiaddr-dns v0.3.1/go.mod h1:G/245BRQ6FJGmryJCrOuTdB37AMA5AMOVuO6NY3JwTk= +github.com/multiformats/go-multiaddr v0.14.0 h1:bfrHrJhrRuh/NXH5mCnemjpbGjzRw/b+tJFOD41g2tU= +github.com/multiformats/go-multiaddr v0.14.0/go.mod h1:6EkVAxtznq2yC3QT5CM1UTAwG0GTP3EWAIcjHuzQ+r4= +github.com/multiformats/go-multiaddr-dns v0.4.1 h1:whi/uCLbDS3mSEUMb1MsoT4uzUeZB0N32yzufqS0i5M= +github.com/multiformats/go-multiaddr-dns v0.4.1/go.mod h1:7hfthtB4E4pQwirrz+J0CcDUfbWzTqEzVyYKKIKpgkc= github.com/multiformats/go-multiaddr-fmt v0.1.0 h1:WLEFClPycPkp4fnIzoFoV9FVd49/eQsuaL3/CWe167E= github.com/multiformats/go-multiaddr-fmt v0.1.0/go.mod h1:hGtDIW4PU4BqJ50gW2quDuPVjyWNZxToGUh/HwTZYJo= github.com/multiformats/go-multibase v0.0.3/go.mod h1:5+1R4eQrT3PkYZ24C3W2Ue2tPwIdYQD509ZjSb5y9Oc= @@ -709,24 +712,27 @@ github.com/multiformats/go-multihash v0.0.13/go.mod h1:VdAWLKTwram9oKAatUcLxBNUj github.com/multiformats/go-multihash v0.0.14/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= github.com/multiformats/go-multihash v0.2.3 h1:7Lyc8XfX/IY2jWb/gI7JP+o7JEq9hOa7BFvVU9RSh+U= github.com/multiformats/go-multihash v0.2.3/go.mod h1:dXgKXCXjBzdscBLk9JkjINiEsCKRVch90MdaGiKsvSM= -github.com/multiformats/go-multistream v0.5.0 h1:5htLSLl7lvJk3xx3qT/8Zm9J4K8vEOf/QGkvOGQAyiE= -github.com/multiformats/go-multistream v0.5.0/go.mod h1:n6tMZiwiP2wUsR8DgfDWw1dydlEqV3l6N3/GBsX6ILA= -github.com/multiformats/go-varint v0.0.1/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= +github.com/multiformats/go-multistream v0.6.0 h1:ZaHKbsL404720283o4c/IHQXiS6gb8qAN5EIJ4PN5EA= +github.com/multiformats/go-multistream v0.6.0/go.mod h1:MOyoG5otO24cHIg8kf9QW2/NozURlkP/rvi2FQJyCPg= github.com/multiformats/go-varint v0.0.5/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= github.com/multiformats/go-varint v0.0.6/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= github.com/multiformats/go-varint v0.0.7 h1:sWSGR+f/eu5ABZA2ZpYKBILXTTs9JWpdEM/nEGOHFS8= github.com/multiformats/go-varint v0.0.7/go.mod h1:r8PUYw/fD/SjBCiKOoDlGF6QawOELpZAu9eioSos/OU= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo= github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= 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/nxadm/tail v1.4.11 h1:8feyoE3OzPrcshW5/MJ4sGESc5cqmGkGCWlco4l0bqY= +github.com/nxadm/tail v1.4.11/go.mod h1:OTaG3NK980DZzxbRq6lEuzgU+mug70nY11sMd4JXXHc= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onflow/atree v0.9.0 h1:M+Z/UPwzv0/Yy7ChI5T1ZIHD3YN1cs/hxGEs/HWhzaY= github.com/onflow/atree v0.9.0/go.mod h1:FT6udJF9Q7VQTu3wknDhFX+VV4D44ZGdqtTAE5iztck= +github.com/onflow/boxo v0.0.0-20240201202436-f2477b92f483 h1:LpiQhTAfM9CAmNVEs0n//cBBgCg+vJSiIxTHYUklZ84= +github.com/onflow/boxo v0.0.0-20240201202436-f2477b92f483/go.mod h1:pIZgTWdm3k3pLF9Uq6MB8JEcW07UDwNJjlXW1HELW80= github.com/onflow/bridged-usdc/lib/go/contracts v1.0.0 h1:ofdfKH8KgY6qVFnlngTontds/IBERANeWl0PBPCtPOA= github.com/onflow/bridged-usdc/lib/go/contracts v1.0.0/go.mod h1:K4/oaEhhnSuJ9q6fpq1w9WEWRGtkNskhmoyH8t+X9Mk= github.com/onflow/cadence v1.3.1 h1:bs9TFHQy8HHbwTtCtg5cLdyndWhmwq55RSwID1cb220= @@ -762,19 +768,19 @@ github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108 github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/ginkgo/v2 v2.13.2 h1:Bi2gGVkfn6gQcjNjZJVO8Gf0FHzMPf2phUei9tejVMs= -github.com/onsi/ginkgo/v2 v2.13.2/go.mod h1:XStQ8QcGwLyF4HdfcZB8SFOS/MWCgDuXMSBe6zrvLgM= +github.com/onsi/ginkgo/v2 v2.22.0 h1:Yed107/8DjTr0lKCNt7Dn8yQ6ybuDRQoMGrNFKzMfHg= +github.com/onsi/ginkgo/v2 v2.22.0/go.mod h1:7Du3c42kxCUegi0IImZ1wUQzMBVecgIHjR1C+NkhLQo= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.29.0 h1:KIA/t2t5UBzoirT4H9tsML45GEbo3ouUnBHsCfD2tVg= -github.com/onsi/gomega v1.29.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ= +github.com/onsi/gomega v1.34.2 h1:pNCwDkzrsv7MS9kpaQvVb1aVLahQXyJ/Tv5oAZMI3i8= +github.com/onsi/gomega v1.34.2/go.mod h1:v1xfxRgk0KIsG+QOdm7p8UosrOzPYRo60fd3B/1Dukc= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.0.2 h1:9yCKha/T5XdGtO0q9Q9a6T5NUCsTn/DrBg0D7ufOcFM= github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.1.0 h1:HHUyrt9mwHUjtasSbXSMvs4cyFxh+Bll4AjJ9odEGpg= -github.com/opencontainers/runtime-spec v1.1.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.2.0 h1:z97+pHb3uELt/yiAWD691HNHQIF07bE7dzrbT927iTk= +github.com/opencontainers/runtime-spec v1.2.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= @@ -792,6 +798,48 @@ github.com/pierrec/lz4/v4 v4.1.18 h1:xaKrnTkyoqfh1YItXl56+6KJNVYWlEEPuAQW9xsplYQ github.com/pierrec/lz4/v4 v4.1.18/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= +github.com/pion/datachannel v1.5.10 h1:ly0Q26K1i6ZkGf42W7D4hQYR90pZwzFOjTq5AuCKk4o= +github.com/pion/datachannel v1.5.10/go.mod h1:p/jJfC9arb29W7WrxyKbepTU20CFgyx5oLo8Rs4Py/M= +github.com/pion/dtls/v2 v2.2.7/go.mod h1:8WiMkebSHFD0T+dIU+UeBaoV7kDhOW5oDCzZ7WZ/F9s= +github.com/pion/dtls/v2 v2.2.12 h1:KP7H5/c1EiVAAKUmXyCzPiQe5+bCJrpOeKg/L05dunk= +github.com/pion/dtls/v2 v2.2.12/go.mod h1:d9SYc9fch0CqK90mRk1dC7AkzzpwJj6u2GU3u+9pqFE= +github.com/pion/ice/v2 v2.3.37 h1:ObIdaNDu1rCo7hObhs34YSBcO7fjslJMZV0ux+uZWh0= +github.com/pion/ice/v2 v2.3.37/go.mod h1:mBF7lnigdqgtB+YHkaY/Y6s6tsyRyo4u4rPGRuOjUBQ= +github.com/pion/interceptor v0.1.37 h1:aRA8Zpab/wE7/c0O3fh1PqY0AJI3fCSEM5lRWJVorwI= +github.com/pion/interceptor v0.1.37/go.mod h1:JzxbJ4umVTlZAf+/utHzNesY8tmRkM2lVmkS82TTj8Y= +github.com/pion/logging v0.2.2 h1:M9+AIj/+pxNsDfAT64+MAVgJO0rsyLnoJKCqf//DoeY= +github.com/pion/logging v0.2.2/go.mod h1:k0/tDVsRCX2Mb2ZEmTqNa7CWsQPc+YYCB7Q+5pahoms= +github.com/pion/mdns v0.0.12 h1:CiMYlY+O0azojWDmxdNr7ADGrnZ+V6Ilfner+6mSVK8= +github.com/pion/mdns v0.0.12/go.mod h1:VExJjv8to/6Wqm1FXK+Ii/Z9tsVk/F5sD/N70cnYFbk= +github.com/pion/randutil v0.1.0 h1:CFG1UdESneORglEsnimhUjf33Rwjubwj6xfiOXBa3mA= +github.com/pion/randutil v0.1.0/go.mod h1:XcJrSMMbbMRhASFVOlj/5hQial/Y8oH/HVo7TBZq+j8= +github.com/pion/rtcp v1.2.12/go.mod h1:sn6qjxvnwyAkkPzPULIbVqSKI5Dv54Rv7VG0kNxh9L4= +github.com/pion/rtcp v1.2.15 h1:LZQi2JbdipLOj4eBjK4wlVoQWfrZbh3Q6eHtWtJBZBo= +github.com/pion/rtcp v1.2.15/go.mod h1:jlGuAjHMEXwMUHK78RgX0UmEJFV4zUKOFHR7OP+D3D0= +github.com/pion/rtp v1.8.3/go.mod h1:pBGHaFt/yW7bf1jjWAoUjpSNoDnw98KTMg+jWWvziqU= +github.com/pion/rtp v1.8.10 h1:puphjdbjPB+L+NFaVuZ5h6bt1g5q4kFIoI+r5q/g0CU= +github.com/pion/rtp v1.8.10/go.mod h1:8uMBJj32Pa1wwx8Fuv/AsFhn8jsgw+3rUC2PfoBZ8p4= +github.com/pion/sctp v1.8.35 h1:qwtKvNK1Wc5tHMIYgTDJhfZk7vATGVHhXbUDfHbYwzA= +github.com/pion/sctp v1.8.35/go.mod h1:EcXP8zCYVTRy3W9xtOF7wJm1L1aXfKRQzaM33SjQlzg= +github.com/pion/sdp/v3 v3.0.9 h1:pX++dCHoHUwq43kuwf3PyJfHlwIj4hXA7Vrifiq0IJY= +github.com/pion/sdp/v3 v3.0.9/go.mod h1:B5xmvENq5IXJimIO4zfp6LAe1fD9N+kFv+V/1lOdz8M= +github.com/pion/srtp/v2 v2.0.20 h1:HNNny4s+OUmG280ETrCdgFndp4ufx3/uy85EawYEhTk= +github.com/pion/srtp/v2 v2.0.20/go.mod h1:0KJQjA99A6/a0DOVTu1PhDSw0CXF2jTkqOoMg3ODqdA= +github.com/pion/stun v0.6.1 h1:8lp6YejULeHBF8NmV8e2787BogQhduZugh5PdhDyyN4= +github.com/pion/stun v0.6.1/go.mod h1:/hO7APkX4hZKu/D0f2lHzNyvdkTGtIy3NDmLR7kSz/8= +github.com/pion/transport/v2 v2.2.1/go.mod h1:cXXWavvCnFF6McHTft3DWS9iic2Mftcz1Aq29pGcU5g= +github.com/pion/transport/v2 v2.2.3/go.mod h1:q2U/tf9FEfnSBGSW6w5Qp5PFWRLRj3NjLhCCgpRK4p0= +github.com/pion/transport/v2 v2.2.4/go.mod h1:q2U/tf9FEfnSBGSW6w5Qp5PFWRLRj3NjLhCCgpRK4p0= +github.com/pion/transport/v2 v2.2.10 h1:ucLBLE8nuxiHfvkFKnkDQRYWYfp8ejf4YBOPfaQpw6Q= +github.com/pion/transport/v2 v2.2.10/go.mod h1:sq1kSLWs+cHW9E+2fJP95QudkzbK7wscs8yYgQToO5E= +github.com/pion/transport/v3 v3.0.1/go.mod h1:UY7kiITrlMv7/IKgd5eTUcaahZx5oUN3l9SzK5f5xE0= +github.com/pion/transport/v3 v3.0.7 h1:iRbMH05BzSNwhILHoBoAPxoB9xQgOaJk+591KC9P1o0= +github.com/pion/transport/v3 v3.0.7/go.mod h1:YleKiTZ4vqNxVwh77Z0zytYi7rXHl7j6uPLGhhz9rwo= +github.com/pion/turn/v2 v2.1.3/go.mod h1:huEpByKKHix2/b9kmTAM3YoX6MKP+/D//0ClgUYR2fY= +github.com/pion/turn/v2 v2.1.6 h1:Xr2niVsiPTB0FPtt+yAWKFUkU1eotQbGgpTIld4x1Gc= +github.com/pion/turn/v2 v2.1.6/go.mod h1:huEpByKKHix2/b9kmTAM3YoX6MKP+/D//0ClgUYR2fY= +github.com/pion/webrtc/v3 v3.3.5 h1:ZsSzaMz/i9nblPdiAkZoP+E6Kmjw+jnyq3bEmU3EtRg= +github.com/pion/webrtc/v3 v3.3.5/go.mod h1:liNa+E1iwyzyXqNUwvoMRNQ10x8h8FOeJKL8RkIbamE= github.com/pjbgf/sha1cd v0.3.0 h1:4D5XXmUUBUl/xQ6IjCkEAbqXskkq/4O7LmGn0AqMDs4= github.com/pjbgf/sha1cd v0.3.0/go.mod h1:nZ1rrWOcGJ5uZgEEVL1VUM9iRQiZvWdbZjkKyFzPPsI= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= @@ -810,40 +858,40 @@ github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXP github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= -github.com/prometheus/client_golang v1.18.0 h1:HzFfmkOzH5Q8L8G+kSJKUx5dtG87sewO+FoDDqP5Tbk= -github.com/prometheus/client_golang v1.18.0/go.mod h1:T+GXkCk5wSJyOqMIzVgvvjFDlkOQntgjkJWKrN5txjA= +github.com/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y= +github.com/prometheus/client_golang v1.20.5/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw= github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= +github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= +github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= -github.com/prometheus/common v0.46.0 h1:doXzt5ybi1HBKpsZOL0sSkaNHJJqkyfEWZGGqqScV0Y= -github.com/prometheus/common v0.46.0/go.mod h1:Tp0qkxpb9Jsg54QMe+EAmqXkSV7Evdy1BTn+g2pa/hQ= +github.com/prometheus/common v0.61.0 h1:3gv/GThfX0cV2lpO7gkTUwZru38mxevy90Bj8YFSRQQ= +github.com/prometheus/common v0.61.0/go.mod h1:zr29OCN/2BsJRaFwG8QOBr41D6kkchKbpeNH7pAjb/s= 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-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= -github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= +github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= +github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/psiemens/graceland v1.0.0 h1:L580AVV4Q2XLcPpmvxJRH9UpEAYr/eu2jBKmMglhvM8= github.com/psiemens/graceland v1.0.0/go.mod h1:1Tof+vt1LbmcZFE0lzgdwMN0QBymAChG3FRgDx8XisU= github.com/psiemens/sconfig v0.1.0 h1:xfWqW+TRpih7mXZIqKYTmpRhlZLQ1kbxV8EjllPv76s= github.com/psiemens/sconfig v0.1.0/go.mod h1:+MLKqdledP/8G3rOBpknbLh0IclCf4WneJUtS26JB2U= -github.com/quic-go/qpack v0.4.0 h1:Cr9BXA1sQS2SmDUWjSofMPNKmvF6IiIfDRmgU0w1ZCo= -github.com/quic-go/qpack v0.4.0/go.mod h1:UZVnYIfi5GRk+zI9UMaCPsmZ2xKJP7XBUvVyT1Knj9A= -github.com/quic-go/qtls-go1-20 v0.4.1 h1:D33340mCNDAIKBqXuAvexTNMUByrYmFYVfKfDN5nfFs= -github.com/quic-go/qtls-go1-20 v0.4.1/go.mod h1:X9Nh97ZL80Z+bX/gUXMbipO6OxdiDi58b/fMC9mAL+k= -github.com/quic-go/quic-go v0.40.1 h1:X3AGzUNFs0jVuO3esAGnTfvdgvL4fq655WaOi1snv1Q= -github.com/quic-go/quic-go v0.40.1/go.mod h1:PeN7kuVJ4xZbxSv/4OX6S1USOX8MJvydwpTx31vx60c= -github.com/quic-go/webtransport-go v0.6.0 h1:CvNsKqc4W2HljHJnoT+rMmbRJybShZ0YPFDD3NxaZLY= -github.com/quic-go/webtransport-go v0.6.0/go.mod h1:9KjU4AEBqEQidGHNDkZrb8CAa1abRaosM2yGOyiikEc= +github.com/quic-go/qpack v0.5.1 h1:giqksBPnT/HDtZ6VhtFKgoLOWmlyo9Ei6u9PqzIMbhI= +github.com/quic-go/qpack v0.5.1/go.mod h1:+PC4XFrEskIVkcLzpEkbLqq1uCoxPhQuvK5rH1ZgaEg= +github.com/quic-go/quic-go v0.48.2 h1:wsKXZPeGWpMpCGSWqOcqpW2wZYic/8T3aqiOID0/KWE= +github.com/quic-go/quic-go v0.48.2/go.mod h1:yBgs3rWBOADpga7F+jJsb6Ybg1LSYiQvwWlLX+/6HMs= +github.com/quic-go/webtransport-go v0.8.1-0.20241018022711-4ac2c9250e66 h1:4WFk6u3sOT6pLa1kQ50ZVdm8BQFgJNA117cepZxtLIg= +github.com/quic-go/webtransport-go v0.8.1-0.20241018022711-4ac2c9250e66/go.mod h1:Vp72IJajgeOL6ddqrAhmp7IM9zbTcgkQxD/YdxrVwMw= github.com/raulk/go-watchdog v1.3.0 h1:oUmdlHxdkXRJlwfG0O9omj8ukerm8MEQavSiDTEtBsk= github.com/raulk/go-watchdog v1.3.0/go.mod h1:fIvOnLbF0b0ZwkB9YU4mOW9Did//4vPZtDqv66NfsMU= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= @@ -852,8 +900,8 @@ github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUc github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= -github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= -github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= github.com/rootless-containers/rootlesskit v1.1.1 h1:F5psKWoWY9/VjZ3ifVcaosjvFZJOagX85U22M0/EQZE= github.com/rootless-containers/rootlesskit v1.1.1/go.mod h1:UD5GoA3dqKCJrnvnhVgQQnweMF2qZnf9KLw8EewcMZI= github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= @@ -908,8 +956,8 @@ github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/skeema/knownhosts v1.2.1 h1:SHWdIUa82uGZz+F+47k8SY4QhhI291cXCpopT1lK2AQ= github.com/skeema/knownhosts v1.2.1/go.mod h1:xYbVRSPxqBZFrdmDyMmsOs+uX1UZC3nTN3ThzgDxUwo= -github.com/slok/go-http-metrics v0.10.0 h1:rh0LaYEKza5eaYRGDXujKrOln57nHBi4TtVhmNEpbgM= -github.com/slok/go-http-metrics v0.10.0/go.mod h1:lFqdaS4kWMfUKCSukjC47PdCeTk+hXDUVm8kLHRqJ38= +github.com/slok/go-http-metrics v0.12.0 h1:mAb7hrX4gB4ItU6NkFoKYdBslafg3o60/HbGBRsKaG8= +github.com/slok/go-http-metrics v0.12.0/go.mod h1:Ee/mdT9BYvGrlGzlClkK05pP2hRHmVbRF9dtUVS8LNA= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/assertions v1.2.0 h1:42S6lae5dvLc7BrLu/0ugRtcFVjoJNMC/N3yZFZkDFs= github.com/smartystreets/assertions v1.2.0/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo= @@ -960,7 +1008,7 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= @@ -1006,6 +1054,9 @@ github.com/warpfork/go-wish v0.0.0-20220906213052-39a1cc7a02d0/go.mod h1:x6AKhvS github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1 h1:EKhdznlJHPMoKr0XTrX+IlJs1LH3lyx2nfr1dOlZ79k= github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1/go.mod h1:8UvriyWtv5Q5EOgjHaSseUEdkQfvwFv1I/In/O2M9gc= github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc/go.mod h1:bopw91TMyo8J3tvftk8xmU2kPmlrt4nScJQZU2hE5EM= +github.com/wlynxg/anet v0.0.3/go.mod h1:eay5PRQr7fIVAMbTbchTnO9gG65Hg/uYGdc7mguHxoA= +github.com/wlynxg/anet v0.0.5 h1:J3VJGi1gvo0JwZ/P1/Yc/8p63SoW98B5dHkYDmpgvvU= +github.com/wlynxg/anet v0.0.5/go.mod h1:eay5PRQr7fIVAMbTbchTnO9gG65Hg/uYGdc7mguHxoA= github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM= @@ -1013,8 +1064,6 @@ github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= -github.com/yhassanzadeh13/go-libp2p-pubsub v0.6.11-flow-expose-msg.0.20240220190333-03695dea34a3 h1:GyrwPbleN4FGHa/Ku1aiNKowV4l4FCKRzZfCbvbv5P4= -github.com/yhassanzadeh13/go-libp2p-pubsub v0.6.11-flow-expose-msg.0.20240220190333-03695dea34a3/go.mod h1:Irbd2TlWD6Bk0i9ggIqd+WPz0Axp8wP9VuNCm2+Ibrg= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= @@ -1037,36 +1086,36 @@ go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 h1:4Pp6oUg3+e/6M4C0A/3kJ2VYa++dsWVTtGgLVj5xtHg= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0/go.mod h1:Mjt1i1INqiaoZOMGR1RIUJN+i3ChKoFRqzrRQhlkbs0= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 h1:jq9TW8u3so/bN+JPT166wjOI6/vQPF6Xe7nMNIltagk= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0/go.mod h1:p8pYQP+m5XfbZm9fxtSKAbM6oIllS7s2AfxrChvc7iw= -go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo= -go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 h1:cl5P5/GIfFh4t6xyruOgJP5QiA1pw4fYYdv6nc6CBWw= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0/go.mod h1:zgBdWWAu7oEEMC06MMKc5NLbA/1YDXV1sMpSqEeLQLg= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 h1:tIqheXEFWAZ7O8A7m+J0aPTmpJN3YQ7qetUAdkkkKpk= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0/go.mod h1:nUeKExfxAQVbiVFn32YXpXZZHZ61Cc3s3Rn1pDBGAb0= -go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI= -go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco= -go.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw= -go.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg= -go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI= -go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= -go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I= -go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 h1:UP6IpuHFkUgOQL9FFQFrZ+5LiwhhYRbi7VZSIx6Nj5s= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0/go.mod h1:qxuZLtbq5QDtdeSHsS7bcf6EH6uO6jUAgk764zd3rhM= +go.opentelemetry.io/otel v1.31.0 h1:NsJcKPIW0D0H3NgzPDHmo0WW6SptzPdqg/L1zsIm2hY= +go.opentelemetry.io/otel v1.31.0/go.mod h1:O0C14Yl9FgkjqcCZAsE053C13OaddMYr/hz6clDkEJE= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.31.0 h1:K0XaT3DwHAcV4nKLzcQvwAgSyisUghWoY20I7huthMk= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.31.0/go.mod h1:B5Ki776z/MBnVha1Nzwp5arlzBbE3+1jk+pGmaP5HME= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0 h1:FFeLy03iVTXP6ffeN2iXrxfGsZGCjVx0/4KlizjyBwU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0/go.mod h1:TMu73/k1CP8nBUpDLc71Wj/Kf7ZS9FK5b53VapRsP9o= +go.opentelemetry.io/otel/metric v1.31.0 h1:FSErL0ATQAmYHUIzSezZibnyVlft1ybhy4ozRPcF2fE= +go.opentelemetry.io/otel/metric v1.31.0/go.mod h1:C3dEloVbLuYoX41KpmAhOqNriGbA+qqH6PQ5E5mUfnY= +go.opentelemetry.io/otel/sdk v1.31.0 h1:xLY3abVHYZ5HSfOg3l2E5LUj2Cwva5Y7yGxnSW9H5Gk= +go.opentelemetry.io/otel/sdk v1.31.0/go.mod h1:TfRbMdhvxIIr/B2N2LQW2S5v9m3gOQ/08KsbbO5BPT0= +go.opentelemetry.io/otel/trace v1.31.0 h1:ffjsj1aRouKewfr85U2aGagJ46+MvodynlQ1HYdmJys= +go.opentelemetry.io/otel/trace v1.31.0/go.mod h1:TXZkRk7SM2ZQLtR6eoAWQFIHPvzQ06FJAsO1tJg480A= +go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= +go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= -go.uber.org/dig v1.17.1 h1:Tga8Lz8PcYNsWsyHMZ1Vm0OQOUaJNDyvPImgbAu9YSc= -go.uber.org/dig v1.17.1/go.mod h1:Us0rSJiThwCv2GteUN0Q7OKvU7n5J4dxZ9JKUXozFdE= -go.uber.org/fx v1.20.1 h1:zVwVQGS8zYvhh9Xxcu4w1M6ESyeMzebzj2NbSayZ4Mk= -go.uber.org/fx v1.20.1/go.mod h1:iSYNbHf2y55acNCwCXKx7LbWb5WG1Bnue5RDXz1OREg= +go.uber.org/dig v1.18.0 h1:imUL1UiY0Mg4bqbFfsRQO5G4CGRBec/ZujWTvSVp3pw= +go.uber.org/dig v1.18.0/go.mod h1:Us0rSJiThwCv2GteUN0Q7OKvU7n5J4dxZ9JKUXozFdE= +go.uber.org/fx v1.23.0 h1:lIr/gYWQGfTwGcSXWXu4vP5Ws6iqnNEIY+F/aFzCKTg= +go.uber.org/fx v1.23.0/go.mod h1:o/D9n+2mLP6v1EG+qsdT1O8wKopYAsqZasju97SDFCU= go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= -go.uber.org/mock v0.4.0 h1:VcM4ZOtdbR4f6VXfiOpwpVJDL6lCReaZ6mw31wqh7KU= -go.uber.org/mock v0.4.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc= +go.uber.org/mock v0.5.0 h1:KAMbZvZPyBPWgD14IrIQ38QCyjwpvVVV6K/bHl1IwQU= +go.uber.org/mock v0.5.0/go.mod h1:ge71pBPLYDk7QIi1LupWxdAykm7KIEFchiOqd6z7qMM= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= @@ -1076,8 +1125,8 @@ go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9E go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= -go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= -go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= 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-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -1096,11 +1145,14 @@ golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0 golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw= -golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U= +golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE= +golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= +golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= +golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20240119083558-1b970713d09a h1:Q8/wZp0KX97QFTc2ywcOE0YRjZPVIx+MXInMzdvQqcA= -golang.org/x/exp v0.0.0-20240119083558-1b970713d09a/go.mod h1:idGWGoKP1toJGkd5/ig9ZLuPcZBC3ewk7SzmH0uou08= +golang.org/x/exp v0.0.0-20241217172543-b2144cdd0a67 h1:1UoZQm6f0P/ZO0w1Ri+f+ifG/gXhegadRdwBIXEFWDo= +golang.org/x/exp v0.0.0-20241217172543-b2144cdd0a67/go.mod h1:qj5a5QZpwLU2NLQudwIN5koi3beDhSAlJwa67PuM98c= golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= @@ -1115,8 +1167,8 @@ golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.18.0 h1:5+9lSbEzPSdWkH32vYPBwEpX8KwDbM52Ud9xBUvNlb0= -golang.org/x/mod v0.18.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4= +golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1154,15 +1206,18 @@ golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ= -golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= +golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= +golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= +golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I= +golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= 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= golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.18.0 h1:09qnuIAgzdx1XplqJvW6CQqMCtGZykZWcXzPMPUusvI= -golang.org/x/oauth2 v0.18.0/go.mod h1:Wf7knwG0MPoWIMMBgFlEaSUDaKskp0dCfrlJRJXbBi8= +golang.org/x/oauth2 v0.24.0 h1:KTBBxWqUa0ykRPLtV69rRto9TLXcqYkeswu48x/gvNE= +golang.org/x/oauth2 v0.24.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1175,8 +1230,8 @@ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= -golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= +golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180810173357-98c5dad5d1a0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1213,7 +1268,6 @@ golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201204225414-ed752295db88/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= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1233,21 +1287,27 @@ golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo= -golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= 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.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= +golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -golang.org/x/term v0.25.0 h1:WtHI/ltw4NvSUig5KARz9h521QvRC8RmF/cuYqifU24= -golang.org/x/term v0.25.0/go.mod h1:RPyXicDX+6vLxogjjRxjgD2TKtmAO6NZBsBRfrOLu7M= +golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= +golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= +golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q= +golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= 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= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= @@ -1259,8 +1319,10 @@ golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM= -golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= 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= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1291,16 +1353,16 @@ golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.22.0 h1:gqSGLZqv+AI9lIQzniJ0nZDRG5GBPsSi+DRNHWNz6yA= -golang.org/x/tools v0.22.0/go.mod h1:aCwcsjqvq7Yqt6TNyX7QMU2enbQ/Gt0bo6krSeEri+c= +golang.org/x/tools v0.28.0 h1:WuB6qZ4RPCQo5aP3WdKZS7i595EdWqWR8vqJTlwTVK8= +golang.org/x/tools v0.28.0/go.mod h1:dcIOrVd3mfQKTgrDVQHqCPMWy6lnhfhtX3hLXYVLfRw= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= -golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= -gonum.org/v1/gonum v0.14.0 h1:2NiG67LD1tEH0D7kM+ps2V+fXmsAnpUeec7n8tcr4S0= -gonum.org/v1/gonum v0.14.0/go.mod h1:AoWeoz0becf9QMWtE8iWXNXc27fK4fNeHNf/oMejGfU= +golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY= +golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.15.0 h1:2lYxjRbTYyxkJxlhC+LvJIx3SsANPdRybu1tGj9/OrQ= +gonum.org/v1/gonum v0.15.0/go.mod h1:xzZVBJBtS+Mz4q0Yl2LJTk+OxOg4jiXZ7qBoM0uISGo= google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= google.golang.org/api v0.0.0-20181030000543-1d582fd0359e/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= google.golang.org/api v0.1.0/go.mod h1:UGEZY7KEX120AnNLIHFMKIo4obdJhkp2tPbaPlQx13Y= @@ -1322,12 +1384,12 @@ google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98 google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de h1:F6qOa9AZTYJXOUEr4jDysRDLrm4PHePlge4v4TGAlxY= google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:VUhTRKeHn9wwcdrk73nvdC9gF178Tzhmt/qyaFcPLSo= -google.golang.org/genproto/googleapis/api v0.0.0-20240814211410-ddb44dafa142 h1:wKguEg1hsxI2/L3hUYrpo1RVi48K+uTyzKqprwLXsb8= -google.golang.org/genproto/googleapis/api v0.0.0-20240814211410-ddb44dafa142/go.mod h1:d6be+8HhtEtucleCbxpPW9PA9XwISACu8nvpPqF0BVo= +google.golang.org/genproto/googleapis/api v0.0.0-20241007155032-5fefd90f89a9 h1:T6rh4haD3GVYsgEfWExoCZA2o2FmbNyKpTuAxbEFPTg= +google.golang.org/genproto/googleapis/api v0.0.0-20241007155032-5fefd90f89a9/go.mod h1:wp2WsuBYj6j8wUdo3ToZsdxxixbvQNAHqVJrTgi5E5M= google.golang.org/genproto/googleapis/bytestream v0.0.0-20240304161311-37d4d3c04a78 h1:YqFWYZXim8bG9v68xU8WjTZmYKb5M5dMeSOWIp6jogI= google.golang.org/genproto/googleapis/bytestream v0.0.0-20240304161311-37d4d3c04a78/go.mod h1:vh/N7795ftP0AkN1w8XKqN4w1OdUKXW5Eummda+ofv8= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142 h1:e7S5W7MGGLaSu8j3YjdezkZ+m1/Nm0uRVRMEMGk26Xs= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241007155032-5fefd90f89a9 h1:QCqS/PdaHTSWGvupk2F/ehwHtGc0/GYkT+3GAcR1CCc= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241007155032-5fefd90f89a9/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= @@ -1337,8 +1399,8 @@ google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyac google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.64.1 h1:LKtvyfbX3UGVPFcGqJ9ItpVWW6oN/2XqTxfAnwRRXiA= -google.golang.org/grpc v1.64.1/go.mod h1:hiQF4LFZelK2WKaP6W0L92zGHtiQdZxk8CrSdvyjeP0= +google.golang.org/grpc v1.67.1 h1:zWnc1Vrcno+lHZCOofnIMvycFcc0QRGIzm9dhnDX68E= +google.golang.org/grpc v1.67.1/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.2.0 h1:TLkBREm4nIsEcexnCjgQd5GQWaHcqMzwQV0TX9pq8S0= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.2.0/go.mod h1:DNq5QpG7LJqD2AamLZ7zvKE0DEpVl2BSEVjFycAAjRY= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= @@ -1354,8 +1416,8 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0 google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= -google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= +google.golang.org/protobuf v1.36.0 h1:mjIs9gYtt56AzC4ZaffQuh88TZurBGhIJMBZGSxNerQ= +google.golang.org/protobuf v1.36.0/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/integration/internal/emulator/blockchain.go b/integration/internal/emulator/blockchain.go index b16a042f868..8bc6fdfc846 100644 --- a/integration/internal/emulator/blockchain.go +++ b/integration/internal/emulator/blockchain.go @@ -129,7 +129,9 @@ func (b *Blockchain) ReloadBlockchain() (*Blockchain, error) { fvm.WithReusableCadenceRuntimePool( reusableRuntime.NewReusableCadenceRuntimePool( 0, - runtime.Config{}), + runtime.Config{ + StorageFormatV2Enabled: b.conf.AccountStorageFormatV2Enabled, + }), ), fvm.WithEntropyProvider(b.entropyProvider), fvm.WithEVMEnabled(true), @@ -1012,6 +1014,15 @@ func (b *Blockchain) systemChunkTransaction() (*flowgo.TransactionBody, error) { ), ) + script = strings.ReplaceAll( + script, + `import Migration from "Migration"`, + fmt.Sprintf( + `import Migration from %s`, + serviceAddress.HexWithPrefix(), + ), + ) + tx := flowgo.NewTransactionBody(). SetScript([]byte(script)). SetComputeLimit(flowgo.DefaultMaxTransactionGasLimit). @@ -1034,6 +1045,7 @@ func (b *Blockchain) executeSystemChunkTransaction() error { fvm.WithSequenceNumberCheckAndIncrementEnabled(false), fvm.WithRandomSourceHistoryCallAllowed(true), fvm.WithBlockHeader(b.pendingBlock.Block().Header), + fvm.WithAccountStorageLimit(false), ) executionSnapshot, output, err := b.vm.Run( diff --git a/integration/internal/emulator/config.go b/integration/internal/emulator/config.go index d87be0a162c..c5be8bc587b 100644 --- a/integration/internal/emulator/config.go +++ b/integration/internal/emulator/config.go @@ -16,24 +16,25 @@ import ( // config is a set of configuration options for an emulated emulator. type config struct { - ServiceKey *ServiceKey - Store EmulatorStorage - SimpleAddresses bool - GenesisTokenSupply cadence.UFix64 - TransactionMaxGasLimit uint64 - ScriptGasLimit uint64 - TransactionExpiry uint - StorageLimitEnabled bool - TransactionFeesEnabled bool - ExecutionEffortWeights meter.ExecutionEffortWeights - ContractRemovalEnabled bool - MinimumStorageReservation cadence.UFix64 - StorageMBPerFLOW cadence.UFix64 - Logger zerolog.Logger - ServerLogger zerolog.Logger - TransactionValidationEnabled bool - ChainID flowgo.ChainID - AutoMine bool + ServiceKey *ServiceKey + Store EmulatorStorage + SimpleAddresses bool + GenesisTokenSupply cadence.UFix64 + TransactionMaxGasLimit uint64 + ScriptGasLimit uint64 + TransactionExpiry uint + StorageLimitEnabled bool + TransactionFeesEnabled bool + ExecutionEffortWeights meter.ExecutionEffortWeights + ContractRemovalEnabled bool + MinimumStorageReservation cadence.UFix64 + StorageMBPerFLOW cadence.UFix64 + Logger zerolog.Logger + ServerLogger zerolog.Logger + TransactionValidationEnabled bool + ChainID flowgo.ChainID + AutoMine bool + AccountStorageFormatV2Enabled bool } const defaultGenesisTokenSupply = "1000000000.0" @@ -272,3 +273,11 @@ func WithChainID(chainID flowgo.ChainID) Option { c.ChainID = chainID } } + +// WithAccountStorageFormatV2Enabled enabled/disables the account storage format V2. +// The default is false. +func WithAccountStorageFormatV2Enabled(enabled bool) Option { + return func(c *config) { + c.AccountStorageFormatV2Enabled = enabled + } +} diff --git a/integration/internal/emulator/templates/systemChunkTransactionTemplate.cdc b/integration/internal/emulator/templates/systemChunkTransactionTemplate.cdc index ef714ed20ba..1c7f657406a 100644 --- a/integration/internal/emulator/templates/systemChunkTransactionTemplate.cdc +++ b/integration/internal/emulator/templates/systemChunkTransactionTemplate.cdc @@ -1,5 +1,6 @@ import RandomBeaconHistory from "RandomBeaconHistory" import EVM from "EVM" +import Migration from "Migration" transaction { prepare(serviceAccount: auth(BorrowValue) &Account) { @@ -12,5 +13,9 @@ transaction { .borrow<&EVM.Heartbeat>(from: /storage/EVMHeartbeat) ?? panic("Couldn't borrow EVM.Heartbeat Resource") evmHeartbeat.heartbeat() + + let migrationAdmin = serviceAccount.storage + .borrow<&Migration.Admin>(from: Migration.adminStoragePath) + migrationAdmin?.migrate() } } diff --git a/integration/localnet/builder/bootstrap.go b/integration/localnet/builder/bootstrap.go index 27749a39f99..c2548c222c2 100644 --- a/integration/localnet/builder/bootstrap.go +++ b/integration/localnet/builder/bootstrap.go @@ -421,7 +421,7 @@ func prepareAccessService(container testnet.ContainerConfig, i int, n int) Servi fmt.Sprintf("--secure-rpc-addr=%s:%s", container.ContainerName, testnet.GRPCSecurePort), fmt.Sprintf("--http-addr=%s:%s", container.ContainerName, testnet.GRPCWebPort), fmt.Sprintf("--rest-addr=%s:%s", container.ContainerName, testnet.RESTPort), - fmt.Sprintf("--state-stream-addr=%s:%s", container.ContainerName, testnet.ExecutionStatePort), + fmt.Sprintf("--state-stream-addr=%s:%s", container.ContainerName, testnet.GRPCPort), fmt.Sprintf("--collection-ingress-port=%s", testnet.GRPCPort), "--supports-observer=true", fmt.Sprintf("--public-network-address=%s:%s", container.ContainerName, testnet.PublicNetworkPort), @@ -443,7 +443,6 @@ func prepareAccessService(container testnet.ContainerConfig, i int, n int) Servi testnet.GRPCSecurePort, testnet.GRPCWebPort, testnet.RESTPort, - testnet.ExecutionStatePort, testnet.PublicNetworkPort, ) @@ -466,7 +465,7 @@ func prepareObserverService(i int, observerName string, agPublicKey string) Serv fmt.Sprintf("--secure-rpc-addr=%s:%s", observerName, testnet.GRPCSecurePort), fmt.Sprintf("--http-addr=%s:%s", observerName, testnet.GRPCWebPort), fmt.Sprintf("--rest-addr=%s:%s", observerName, testnet.RESTPort), - fmt.Sprintf("--state-stream-addr=%s:%s", observerName, testnet.ExecutionStatePort), + fmt.Sprintf("--state-stream-addr=%s:%s", observerName, testnet.GRPCPort), "--execution-data-dir=/data/execution-data", "--execution-data-sync-enabled=true", "--execution-data-indexing-enabled=true", @@ -479,7 +478,6 @@ func prepareObserverService(i int, observerName string, agPublicKey string) Serv testnet.GRPCSecurePort, testnet.GRPCWebPort, testnet.RESTPort, - testnet.ExecutionStatePort, ) // observer services rely on the access gateway diff --git a/integration/localnet/builder/ports.go b/integration/localnet/builder/ports.go index 995f215e01b..f3b8b581004 100644 --- a/integration/localnet/builder/ports.go +++ b/integration/localnet/builder/ports.go @@ -144,7 +144,6 @@ func (a *PortAllocator) Print() { testnet.GRPCSecurePort, testnet.GRPCWebPort, testnet.RESTPort, - testnet.ExecutionStatePort, testnet.PublicNetworkPort, } { if hostPort, ok := a.exposedPorts[node][containerPort]; ok { @@ -165,8 +164,6 @@ func portName(containerPort string) string { return "GRPC-Web" case testnet.RESTPort: return "REST" - case testnet.ExecutionStatePort: - return "Execution Data" case testnet.AdminPort: return "Admin" case testnet.PublicNetworkPort: diff --git a/integration/migration/accountV2_test.go b/integration/migration/accountV2_test.go new file mode 100644 index 00000000000..beef3f0dcf4 --- /dev/null +++ b/integration/migration/accountV2_test.go @@ -0,0 +1,191 @@ +package migration + +import ( + "fmt" + "testing" + + "github.com/onflow/cadence" + "github.com/onflow/cadence/common" + "github.com/onflow/cadence/encoding/ccf" + sdkcrypto "github.com/onflow/flow-go-sdk/crypto" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/onflow/flow-go/fvm/accountV2Migration" + "github.com/onflow/flow-go/integration/internal/emulator" + "github.com/onflow/flow-go/model/flow" +) + +func TestAccountV2Migration(t *testing.T) { + t.Parallel() + + chain := flow.Emulator.Chain() + serviceAddress := chain.ServiceAddress() + serviceAddressIndex, err := chain.IndexFromAddress(serviceAddress) + require.NoError(t, err) + + accountV2MigrationContractLocation := common.AddressLocation{ + Address: common.Address(serviceAddress), + Name: accountV2Migration.ContractName, + } + migratedEventTypeID := accountV2MigrationContractLocation. + TypeID(nil, accountV2Migration.MigratedEventTypeQualifiedIdentifier) + + storage := emulator.NewMemoryStore() + + newOptions := func(accountStorageFormatV2Enabled bool) []emulator.Option { + return []emulator.Option{ + emulator.WithStorageLimitEnabled(false), + emulator.WithStore(storage), + emulator.WithAccountStorageFormatV2Enabled(accountStorageFormatV2Enabled), + } + } + + // Ensure that the account V2 migration is disabled, + // and the service account is in V1 format after bootstrapping + + blockchain, err := emulator.New(newOptions(false)...) + require.NoError(t, err) + + block, _, err := blockchain.ExecuteAndCommitBlock() + require.NoError(t, err) + + blockEvents, err := blockchain.GetEventsForBlockIDs( + string(migratedEventTypeID), + []flow.Identifier{block.ID()}, + ) + require.NoError(t, err) + require.Len(t, blockEvents, 1) + assert.Empty(t, blockEvents[0].Events) + + checkServiceAccountStorageFormat(t, blockchain, "V1") + + // Enable the storage format V2 migration via system account transaction + + blockchain, err = emulator.New(newOptions(true)...) + require.NoError(t, err) + + batchSize := serviceAddressIndex + 1 + maxAddressIndex := serviceAddressIndex + 1 + + configureAccountV2MigrationParameters(t, blockchain, batchSize, maxAddressIndex) + + block, results, err := blockchain.ExecuteAndCommitBlock() + require.NoError(t, err) + + require.Len(t, results, 1) + assert.NoError(t, results[0].Error) + + blockEvents, err = blockchain.GetEventsForBlockIDs( + string(migratedEventTypeID), + []flow.Identifier{block.ID()}, + ) + require.NoError(t, err) + require.Len(t, blockEvents, 1) + assert.Len(t, blockEvents[0].Events, 1) + + event := blockEvents[0].Events[0] + assert.Equal(t, + flow.EventType(migratedEventTypeID), + event.Type, + ) + + decodedEventPayload, err := ccf.Decode(nil, event.Payload) + require.NoError(t, err) + + require.IsType(t, cadence.Event{}, decodedEventPayload) + + eventFields := decodedEventPayload.(cadence.Composite).FieldsMappedByName() + assert.Equal(t, cadence.UInt64(1), eventFields["addressStartIndex"]) + assert.Equal(t, cadence.UInt64(batchSize), eventFields["count"]) + + // Ensure the service account is in V2 format after the migration + + checkServiceAccountStorageFormat(t, blockchain, "V2") +} + +func sendTransaction(t *testing.T, blockchain *emulator.Blockchain, script string) { + serviceAddress := blockchain.ServiceKey().Address + + tx := flow.NewTransactionBody(). + SetScript([]byte(script)). + SetComputeLimit(9999). + SetProposalKey(serviceAddress, 0, blockchain.ServiceKey().SequenceNumber). + AddAuthorizer(serviceAddress). + SetPayer(serviceAddress) + + serviceKey := blockchain.ServiceKey() + signer, err := sdkcrypto.NewInMemorySigner( + serviceKey.PrivateKey, + serviceKey.HashAlgo, + ) + require.NoError(t, err) + + err = tx.SignEnvelope(serviceAddress, 0, signer.PrivateKey, signer.Hasher) + assert.NoError(t, err) + + err = blockchain.SendTransaction(tx) + require.NoError(t, err) +} + +func configureAccountV2MigrationParameters( + t *testing.T, + blockchain *emulator.Blockchain, + batchSize uint64, + maxAddressIndex uint64, +) { + serviceAddress := blockchain.ServiceKey().Address + + script := fmt.Sprintf( + ` + import AccountV2Migration from %[1]s + + transaction { + prepare(signer: auth(Storage) &Account) { + log("Enabling account V2 migration") + let admin = signer.storage + .borrow<&AccountV2Migration.Admin>( + from: AccountV2Migration.adminStoragePath + ) + ?? panic("missing account V2 migration admin resource") + admin.setBatchSize(%[2]d) + admin.setMaxAddressIndex(%[3]d) + } + } + `, + serviceAddress.HexWithPrefix(), + batchSize, + maxAddressIndex, + ) + sendTransaction(t, blockchain, script) +} + +func executeScript(t *testing.T, blockchain *emulator.Blockchain, script string) { + result, err := blockchain.ExecuteScript([]byte(script), nil) + require.NoError(t, err) + require.NoError(t, result.Error) +} + +func checkServiceAccountStorageFormat( + t *testing.T, + blockchain *emulator.Blockchain, + storageFormatCaseName string, +) { + serviceAddress := blockchain.ServiceKey().Address + + executeScript(t, + blockchain, + fmt.Sprintf( + ` + import AccountV2Migration from %[1]s + + access(all) fun main() { + let storageFormat = AccountV2Migration.getAccountStorageFormat(address: %[1]s) + assert(storageFormat == AccountV2Migration.StorageFormat.%[2]s) + } + `, + serviceAddress.HexWithPrefix(), + storageFormatCaseName, + ), + ) +} diff --git a/integration/testnet/client.go b/integration/testnet/client.go index dc59f19b90b..e1baa005940 100644 --- a/integration/testnet/client.go +++ b/integration/testnet/client.go @@ -6,6 +6,8 @@ import ( "time" "github.com/onflow/flow-go-sdk/templates" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" @@ -39,7 +41,6 @@ type Client struct { // NewClientWithKey returns a new client to an Access API listening at the given // address, using the given account key for signing transactions. func NewClientWithKey(accessAddr string, accountAddr sdk.Address, key sdkcrypto.PrivateKey, chain flow.Chain) (*Client, error) { - flowClient, err := client.NewClient( accessAddr, client.WithGRPCDialOptions( @@ -50,10 +51,14 @@ func NewClientWithKey(accessAddr string, accountAddr sdk.Address, key sdkcrypto. return nil, fmt.Errorf("could not create new flow client: %w", err) } - acc, err := flowClient.GetAccount(context.Background(), accountAddr) + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + + acc, err := getAccount(ctx, flowClient, accountAddr) if err != nil { return nil, fmt.Errorf("could not get the account %v: %w", accountAddr, err) } + accountKey := acc.Keys[0] mySigner, err := crypto.NewInMemorySigner(key, accountKey.HashAlgo) @@ -428,3 +433,27 @@ func (c *Client) GetEventsForBlockIDs( return events, nil } + +func getAccount(ctx context.Context, client *client.Client, address sdk.Address) (*sdk.Account, error) { + header, err := client.GetLatestBlockHeader(ctx, true) + if err != nil { + return nil, fmt.Errorf("could not get latest block header: %w", err) + } + + // when this is run against an Access node with indexing enabled, occasionally the indexed height + // lags behind the sealed height, especially after first starting up (like in a test). + // Retry using the same block until we get the account. + for { + acc, err := client.GetAccountAtBlockHeight(ctx, address, header.Height) + if err == nil { + return acc, nil + } + + switch status.Code(err) { + case codes.OutOfRange, codes.ResourceExhausted: + time.Sleep(100 * time.Millisecond) + continue + } + return nil, fmt.Errorf("could not get the account %v: %w", address, err) + } +} diff --git a/integration/testnet/network.go b/integration/testnet/network.go index a84a3c529b0..78b87e6d3cb 100644 --- a/integration/testnet/network.go +++ b/integration/testnet/network.go @@ -89,6 +89,7 @@ const ( DefaultProfilerDir = "/data/profiler" // GRPCPort is the GRPC API port. + // Use this same port for the ExecutionDataAPI GRPCPort = "9000" // GRPCSecurePort is the secure GRPC API port. GRPCSecurePort = "9001" @@ -100,8 +101,6 @@ const ( MetricsPort = "8080" // AdminPort is the admin server port AdminPort = "9002" - // ExecutionStatePort is the execution state server port - ExecutionStatePort = "9003" // PublicNetworkPort is the access node network port accessible from outside any docker container PublicNetworkPort = "9876" // DebuggerPort is the go debugger port @@ -797,6 +796,7 @@ func (net *FlowNetwork) AddObserver(t *testing.T, conf ObserverConfig) *Containe nodeContainer.exposePort(GRPCPort, testingdock.RandomPort(t)) nodeContainer.AddFlag("rpc-addr", nodeContainer.ContainerAddr(GRPCPort)) + nodeContainer.AddFlag("state-stream-addr", nodeContainer.ContainerAddr(GRPCPort)) nodeContainer.exposePort(GRPCSecurePort, testingdock.RandomPort(t)) nodeContainer.AddFlag("secure-rpc-addr", nodeContainer.ContainerAddr(GRPCSecurePort)) @@ -810,9 +810,6 @@ func (net *FlowNetwork) AddObserver(t *testing.T, conf ObserverConfig) *Containe nodeContainer.exposePort(RESTPort, testingdock.RandomPort(t)) nodeContainer.AddFlag("rest-addr", nodeContainer.ContainerAddr(RESTPort)) - nodeContainer.exposePort(ExecutionStatePort, testingdock.RandomPort(t)) - nodeContainer.AddFlag("state-stream-addr", nodeContainer.ContainerAddr(ExecutionStatePort)) - nodeContainer.opts.HealthCheck = testingdock.HealthCheckCustom(nodeContainer.HealthcheckCallback()) suiteContainer := net.suite.Container(containerOpts) @@ -910,6 +907,7 @@ func (net *FlowNetwork) AddNode(t *testing.T, bootstrapDir string, nodeConf Cont case flow.RoleAccess: nodeContainer.exposePort(GRPCPort, testingdock.RandomPort(t)) nodeContainer.AddFlag("rpc-addr", nodeContainer.ContainerAddr(GRPCPort)) + nodeContainer.AddFlag("state-stream-addr", nodeContainer.ContainerAddr(GRPCPort)) nodeContainer.exposePort(GRPCSecurePort, testingdock.RandomPort(t)) nodeContainer.AddFlag("secure-rpc-addr", nodeContainer.ContainerAddr(GRPCSecurePort)) @@ -920,9 +918,6 @@ func (net *FlowNetwork) AddNode(t *testing.T, bootstrapDir string, nodeConf Cont nodeContainer.exposePort(RESTPort, testingdock.RandomPort(t)) nodeContainer.AddFlag("rest-addr", nodeContainer.ContainerAddr(RESTPort)) - nodeContainer.exposePort(ExecutionStatePort, testingdock.RandomPort(t)) - nodeContainer.AddFlag("state-stream-addr", nodeContainer.ContainerAddr(ExecutionStatePort)) - // uncomment line below to point the access node exclusively to a single collection node // nodeContainer.AddFlag("static-collection-ingress-addr", "collection_1:9000") nodeContainer.AddFlag("collection-ingress-port", GRPCPort) diff --git a/integration/tests/access/cohort3/execution_state_sync_test.go b/integration/tests/access/cohort3/execution_state_sync_test.go index 4ff4e77383e..03995efe478 100644 --- a/integration/tests/access/cohort3/execution_state_sync_test.go +++ b/integration/tests/access/cohort3/execution_state_sync_test.go @@ -5,23 +5,29 @@ import ( "fmt" "path/filepath" "testing" + "time" "github.com/ipfs/go-datastore" badgerds "github.com/ipfs/go-ds-badger2" pebbleds "github.com/ipfs/go-ds-pebble" + sdk "github.com/onflow/flow-go-sdk" + sdkclient "github.com/onflow/flow-go-sdk/access/grpc" + "github.com/onflow/flow/protobuf/go/flow/entities" + "github.com/onflow/flow/protobuf/go/flow/executiondata" "github.com/rs/zerolog" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/stretchr/testify/suite" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + "github.com/onflow/flow-go/engine/common/rpc/convert" "github.com/onflow/flow-go/engine/ghost/client" "github.com/onflow/flow-go/integration/testnet" "github.com/onflow/flow-go/integration/tests/lib" "github.com/onflow/flow-go/model/flow" "github.com/onflow/flow-go/module/blobs" "github.com/onflow/flow-go/module/executiondatasync/execution_data" - "github.com/onflow/flow-go/module/metrics" - storage "github.com/onflow/flow-go/storage/badger" "github.com/onflow/flow-go/utils/unittest" ) @@ -158,62 +164,75 @@ func (s *ExecutionStateSyncSuite) executionStateSyncTest() { blockA := s.BlockState.WaitForHighestFinalizedProgress(s.T(), currentFinalized) s.T().Logf("got block height %v ID %v", blockA.Header.Height, blockA.Header.ID()) - // wait for the requested number of sealed blocks, then pause the network so we can inspect the dbs - s.BlockState.WaitForSealedHeight(s.T(), blockA.Header.Height+runBlocks) - s.net.StopContainers() - - metrics := metrics.NewNoopCollector() - - // start an execution data service using the Access Node's execution data db - an := s.net.ContainerByID(s.bridgeID) - anEds := s.nodeExecutionDataStore(an) - - // setup storage objects needed to get the execution data id - anDB, err := an.DB() - require.NoError(s.T(), err, "could not open db") - - anHeaders := storage.NewHeaders(metrics, anDB) - anResults := storage.NewExecutionResults(metrics, anDB) + // Loop through checkBlocks and verify the execution data was downloaded correctly + an := s.net.ContainerByName(testnet.PrimaryAN) + anClient, err := an.SDKClient() + require.NoError(s.T(), err, "could not get access node testnet client") - // start an execution data service using the Observer Node's execution data db on := s.net.ContainerByName(s.observerName) - onEds := s.nodeExecutionDataStore(on) - - // setup storage objects needed to get the execution data id - onDB, err := on.DB() - require.NoError(s.T(), err, "could not open db") + onClient, err := on.SDKClient() + require.NoError(s.T(), err, "could not get observer testnet client") - onHeaders := storage.NewHeaders(metrics, onDB) - onResults := storage.NewExecutionResults(metrics, onDB) + ctx, cancel := context.WithTimeout(s.ctx, 5*time.Minute) + defer cancel() - // Loop through checkBlocks and verify the execution data was downloaded correctly for i := blockA.Header.Height; i <= blockA.Header.Height+checkBlocks; i++ { - // access node - header, err := anHeaders.ByHeight(i) - require.NoError(s.T(), err, "%s: could not get header", testnet.PrimaryAN) + anBED, err := s.executionDataForHeight(ctx, anClient, i) + require.NoError(s.T(), err, "could not get execution data from AN for height %v", i) + + onBED, err := s.executionDataForHeight(ctx, onClient, i) + require.NoError(s.T(), err, "could not get execution data from ON for height %v", i) - result, err := anResults.ByBlockID(header.ID()) - require.NoError(s.T(), err, "%s: could not get sealed result", testnet.PrimaryAN) + assert.Equal(s.T(), anBED.BlockID, onBED.BlockID) + } +} - ed, err := anEds.Get(s.ctx, result.ExecutionDataID) - if assert.NoError(s.T(), err, "%s: could not get execution data for height %v", testnet.PrimaryAN, i) { - s.T().Logf("%s: got execution data for height %d", testnet.PrimaryAN, i) - assert.Equal(s.T(), header.ID(), ed.BlockID) +// executionDataForHeight returns the execution data for the given height from the given node +// It retries the request until the data is available or the context is canceled +func (s *ExecutionStateSyncSuite) executionDataForHeight(ctx context.Context, nodeClient *sdkclient.Client, height uint64) (*execution_data.BlockExecutionData, error) { + execDataClient := nodeClient.ExecutionDataRPCClient() + + var header *sdk.BlockHeader + s.Require().NoError(retryNotFound(ctx, 200*time.Millisecond, func() error { + var err error + header, err = nodeClient.GetBlockHeaderByHeight(s.ctx, height) + return err + }), "could not get block header for block %d", height) + + var blockED *execution_data.BlockExecutionData + s.Require().NoError(retryNotFound(ctx, 200*time.Millisecond, func() error { + ed, err := execDataClient.GetExecutionDataByBlockID(s.ctx, &executiondata.GetExecutionDataByBlockIDRequest{ + BlockId: header.ID[:], + EventEncodingVersion: entities.EventEncodingVersion_CCF_V0, + }) + if err != nil { + return err } - // observer node - header, err = onHeaders.ByHeight(i) - require.NoError(s.T(), err, "%s: could not get header", testnet.PrimaryON) + blockED, err = convert.MessageToBlockExecutionData(ed.GetBlockExecutionData(), flow.Localnet.Chain()) + s.Require().NoError(err, "could not convert execution data") + + return err + }), "could not get execution data for block %d", height) - result, err = onResults.ByID(result.ID()) - require.NoError(s.T(), err, "%s: could not get sealed result from ON`s storage", testnet.PrimaryON) + return blockED, nil +} - ed, err = onEds.Get(s.ctx, result.ExecutionDataID) - if assert.NoError(s.T(), err, "%s: could not get execution data for height %v", testnet.PrimaryON, i) { - s.T().Logf("%s: got execution data for height %d", testnet.PrimaryON, i) - assert.Equal(s.T(), header.ID(), ed.BlockID) +// retryNotFound retries the given function until it returns an error that is not NotFound or the context is canceled +func retryNotFound(ctx context.Context, delay time.Duration, f func() error) error { + for ctx.Err() == nil { + err := f() + if status.Code(err) == codes.NotFound { + select { + case <-ctx.Done(): + return ctx.Err() + case <-time.After(delay): + } + continue } + return err } + return ctx.Err() } func (s *ExecutionStateSyncSuite) nodeExecutionDataStore(node *testnet.Container) execution_data.ExecutionDataStore { diff --git a/integration/tests/access/cohort4/execution_data_pruning_test.go b/integration/tests/access/cohort4/execution_data_pruning_test.go index 81c830c7a72..1d231a68829 100644 --- a/integration/tests/access/cohort4/execution_data_pruning_test.go +++ b/integration/tests/access/cohort4/execution_data_pruning_test.go @@ -8,13 +8,10 @@ import ( "time" badgerds "github.com/ipfs/go-ds-badger2" + sdk "github.com/onflow/flow-go-sdk" "github.com/rs/zerolog" "github.com/stretchr/testify/require" "github.com/stretchr/testify/suite" - "google.golang.org/grpc" - "google.golang.org/grpc/credentials/insecure" - - sdk "github.com/onflow/flow-go-sdk" "github.com/onflow/flow-go/integration/testnet" "github.com/onflow/flow-go/model/flow" @@ -137,17 +134,6 @@ func (s *ExecutionDataPruningSuite) SetupTest() { s.net.Start(s.ctx) } -// getGRPCClient is the helper func to create an access api client -func (s *ExecutionDataPruningSuite) getGRPCClient(address string) (accessproto.AccessAPIClient, error) { - conn, err := grpc.Dial(address, grpc.WithTransportCredentials(insecure.NewCredentials())) - if err != nil { - return nil, err - } - - client := accessproto.NewAccessAPIClient(conn) - return client, nil -} - // TestHappyPath tests the execution data pruning process in a happy path scenario. // The test follows these steps: // @@ -197,17 +183,17 @@ func (s *ExecutionDataPruningSuite) TestHappyPath() { func (s *ExecutionDataPruningSuite) waitUntilExecutionDataForBlockIndexed(waitingBlockHeight uint64) { observerNode := s.net.ContainerByName(s.observerNodeName) - grpcClient, err := s.getGRPCClient(observerNode.Addr(testnet.GRPCPort)) + sdkClient, err := observerNode.SDKClient() s.Require().NoError(err) // creating execution data api client - client, err := getClient(fmt.Sprintf("localhost:%s", observerNode.Port(testnet.ExecutionStatePort))) - s.Require().NoError(err) + accessClient := sdkClient.RPCClient() + execClient := sdkClient.ExecutionDataRPCClient() // pause until the observer node start indexing blocks, // getting events from 1-nd block to make sure that 1-st block already indexed, and we can start subscribing s.Require().Eventually(func() bool { - _, err := grpcClient.GetEventsForHeightRange(s.ctx, &accessproto.GetEventsForHeightRangeRequest{ + _, err := accessClient.GetEventsForHeightRange(s.ctx, &accessproto.GetEventsForHeightRangeRequest{ Type: sdk.EventAccountCreated, StartHeight: 1, EndHeight: 1, @@ -220,7 +206,7 @@ func (s *ExecutionDataPruningSuite) waitUntilExecutionDataForBlockIndexed(waitin // subscribe on events till waitingBlockHeight to make sure that execution data for block indexed till waitingBlockHeight and pruner // pruned execution data at least once // SubscribeEventsFromStartHeight used as subscription here because we need to make sure that execution data are already indexed - stream, err := client.SubscribeEventsFromStartHeight(s.ctx, &executiondata.SubscribeEventsFromStartHeightRequest{ + stream, err := execClient.SubscribeEventsFromStartHeight(s.ctx, &executiondata.SubscribeEventsFromStartHeightRequest{ EventEncodingVersion: entities.EventEncodingVersion_CCF_V0, Filter: &executiondata.EventFilter{}, HeartbeatInterval: 1, diff --git a/integration/tests/access/cohort4/grpc_state_stream_test.go b/integration/tests/access/cohort4/grpc_state_stream_test.go index 0becfe6e659..9f930702772 100644 --- a/integration/tests/access/cohort4/grpc_state_stream_test.go +++ b/integration/tests/access/cohort4/grpc_state_stream_test.go @@ -9,14 +9,11 @@ import ( "sync" "testing" + jsoncdc "github.com/onflow/cadence/encoding/json" "github.com/rs/zerolog" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/stretchr/testify/suite" - "google.golang.org/grpc" - "google.golang.org/grpc/credentials/insecure" - - jsoncdc "github.com/onflow/cadence/encoding/json" "github.com/onflow/flow-go-sdk/test" @@ -168,17 +165,14 @@ func (s *GrpcStateStreamSuite) Ghost() *client.GhostClient { // TestRestEventStreaming tests gRPC event streaming func (s *GrpcStateStreamSuite) TestHappyPath() { unittest.SkipUnless(s.T(), unittest.TEST_FLAKY, "flaky tests: https://github.com/onflow/flow-go/issues/5825") - testANURL := fmt.Sprintf("localhost:%s", s.net.ContainerByName(testnet.PrimaryAN).Port(testnet.ExecutionStatePort)) - sdkClientTestAN, err := getClient(testANURL) - s.Require().NoError(err) + testAN := s.net.ContainerByName(testnet.PrimaryAN) + sdkClientTestAN := getClient(s.T(), testAN) - controlANURL := fmt.Sprintf("localhost:%s", s.net.ContainerByName("access_2").Port(testnet.ExecutionStatePort)) - sdkClientControlAN, err := getClient(controlANURL) - s.Require().NoError(err) + controlAN := s.net.ContainerByName("access_2") + sdkClientControlAN := getClient(s.T(), controlAN) - testONURL := fmt.Sprintf("localhost:%s", s.net.ContainerByName(testnet.PrimaryON).Port(testnet.ExecutionStatePort)) - sdkClientTestON, err := getClient(testONURL) - s.Require().NoError(err) + testON := s.net.ContainerByName(testnet.PrimaryON) + sdkClientTestON := getClient(s.T(), testON) // get the first block height currentFinalized := s.BlockState.HighestFinalizedHeight() @@ -471,15 +465,10 @@ func compareEvents(t *testing.T, controlData, testData *SubscribeEventsResponse) } } -// TODO: switch to SDK versions once crypto library is fixed to support the latest SDK version - -func getClient(address string) (executiondata.ExecutionDataAPIClient, error) { - conn, err := grpc.Dial(address, grpc.WithTransportCredentials(insecure.NewCredentials())) - if err != nil { - return nil, err - } - - return executiondata.NewExecutionDataAPIClient(conn), nil +func getClient(t *testing.T, node *testnet.Container) executiondata.ExecutionDataAPIClient { + accessClient, err := node.SDKClient() + require.NoError(t, err, "could not get access client") + return accessClient.ExecutionDataRPCClient() } func SubscribeHandler[T any, V any]( diff --git a/integration/tests/epochs/base_suite.go b/integration/tests/epochs/base_suite.go index fc6e3c13710..23737221326 100644 --- a/integration/tests/epochs/base_suite.go +++ b/integration/tests/epochs/base_suite.go @@ -37,6 +37,12 @@ type BaseSuite struct { Client *testnet.Client Ctx context.Context + // these are used for any helper goroutines started for the test + // we need to shut them down before stopping the network, however canceling the network's + // context before stopping causes the testdock shutdown to fail. + HelperCtx context.Context + stopHelpers context.CancelFunc + // Epoch config (lengths in views) StakingAuctionLen uint64 DKGPhaseLen uint64 @@ -61,6 +67,7 @@ func (s *BaseSuite) SetupTest() { require.Greater(s.T(), s.EpochLen, minEpochLength+s.EpochCommitSafetyThreshold, "epoch too short") s.Ctx, s.cancel = context.WithCancel(context.Background()) + s.HelperCtx, s.stopHelpers = context.WithCancel(s.Ctx) s.Log = unittest.LoggerForTest(s.Suite.T(), zerolog.InfoLevel) s.Log.Info().Msg("================> SetupTest") defer func() { @@ -112,7 +119,7 @@ func (s *BaseSuite) SetupTest() { s.Net.Start(s.Ctx) // start tracking blocks - s.Track(s.T(), s.Ctx, s.Ghost()) + s.Track(s.T(), s.HelperCtx, s.Ghost()) // use AN1 for test-related queries - the AN join/leave test will replace AN2 client, err := s.Net.ContainerByName(testnet.PrimaryAN).TestnetClient() @@ -121,11 +128,12 @@ func (s *BaseSuite) SetupTest() { s.Client = client // log network info periodically to aid in debugging future flaky tests - go lib.LogStatusPeriodically(s.T(), s.Ctx, s.Log, s.Client, 5*time.Second) + go lib.LogStatusPeriodically(s.T(), s.HelperCtx, s.Log, s.Client, 5*time.Second) } func (s *BaseSuite) TearDownTest() { s.Log.Info().Msg("================> Start TearDownTest") + s.stopHelpers() // cancel before stopping network to ensure helper goroutines are stopped s.Net.Remove() s.cancel() s.Log.Info().Msg("================> Finish TearDownTest") diff --git a/model/flow/address_test.go b/model/flow/address_test.go index 706ae4f7861..e575ff8ea97 100644 --- a/model/flow/address_test.go +++ b/model/flow/address_test.go @@ -149,7 +149,7 @@ func testAddressConstants(t *testing.T) { assert.Equal(t, address, chain.ServiceAddress()) // check high state values: generation should fail for high value states - state = chain.newAddressGeneratorAtIndex(maxIndex - 1) + state = chain.NewAddressGeneratorAtIndex(maxIndex - 1) _, err = state.NextAddress() assert.NoError(t, err) _, err = state.NextAddress() @@ -200,7 +200,7 @@ func testAddressGeneration(t *testing.T) { // this is only a sanity check of the implementation and not an exhaustive proof if chainID == Mainnet { r := uint64(rand.Intn(maxIndex - loop)) - state = chain.newAddressGeneratorAtIndex(r) + state = chain.NewAddressGeneratorAtIndex(r) for i := 0; i < loop; i++ { address, err := state.NextAddress() require.NoError(t, err) @@ -213,7 +213,7 @@ func testAddressGeneration(t *testing.T) { // All distances between any two addresses must be larger than d. // this is only a sanity check of the implementation and not an exhaustive proof r := uint64(rand.Intn(maxIndex - loop - 1)) - state = chain.newAddressGeneratorAtIndex(r) + state = chain.NewAddressGeneratorAtIndex(r) refAddress, err := state.NextAddress() require.NoError(t, err) for i := 0; i < loop; i++ { @@ -226,7 +226,7 @@ func testAddressGeneration(t *testing.T) { // sanity check of valid account addresses. // All valid addresses must pass IsValid. r = uint64(rand.Intn(maxIndex - loop)) - state = chain.newAddressGeneratorAtIndex(r) + state = chain.NewAddressGeneratorAtIndex(r) for i := 0; i < loop; i++ { address, err := state.NextAddress() require.NoError(t, err) @@ -241,7 +241,7 @@ func testAddressGeneration(t *testing.T) { assert.False(t, check, "account address format should be invalid") r = uint64(rand.Intn(maxIndex - loop)) - state = chain.newAddressGeneratorAtIndex(r) + state = chain.NewAddressGeneratorAtIndex(r) for i := 0; i < loop; i++ { address, err := state.NextAddress() require.NoError(t, err) @@ -271,7 +271,7 @@ func testAddressesIntersection(t *testing.T) { // a valid address in one network must be invalid in all other networks r := uint64(rand.Intn(maxIndex - loop)) - state := chain.newAddressGeneratorAtIndex(r) + state := chain.NewAddressGeneratorAtIndex(r) for k := 0; k < loop; k++ { address, err := state.NextAddress() require.NoError(t, err) @@ -297,7 +297,7 @@ func testAddressesIntersection(t *testing.T) { // build invalid addresses using `invalidCodeWord` and make sure they all // fail the check for all networks r = uint64(rand.Intn(maxIndex - loop)) - state = chain.newAddressGeneratorAtIndex(r) + state = chain.NewAddressGeneratorAtIndex(r) for k := 0; k < loop; k++ { address, err := state.NextAddress() require.NoError(t, err) @@ -328,7 +328,7 @@ func testIndexFromAddress(t *testing.T) { // random valid index r := uint64(rand.Intn(maxIndex)) + 1 // generate the address - address := chain.newAddressGeneratorAtIndex(r).CurrentAddress() + address := chain.NewAddressGeneratorAtIndex(r).CurrentAddress() // extract the index and compare index, err := chain.IndexFromAddress(address) assert.NoError(t, err) // address should be valid diff --git a/model/flow/chain.go b/model/flow/chain.go index 1a17e5a164e..1aeed8313e2 100644 --- a/model/flow/chain.go +++ b/model/flow/chain.go @@ -82,7 +82,7 @@ func (c ChainID) getChainCodeWord() uint64 { } type chainImpl interface { - newAddressGeneratorAtIndex(index uint64) AddressGenerator + NewAddressGeneratorAtIndex(index uint64) AddressGenerator // IsValid returns true if a given address is a valid account address on a given chain, // and false otherwise. // @@ -102,7 +102,7 @@ type chainImpl interface { // where addresses are simply the index of the account. type monotonicImpl struct{} -func (m *monotonicImpl) newAddressGeneratorAtIndex(index uint64) AddressGenerator { +func (m *monotonicImpl) NewAddressGeneratorAtIndex(index uint64) AddressGenerator { return &MonotonicAddressGenerator{ index: index, } @@ -131,7 +131,7 @@ type linearCodeImpl struct { chainID ChainID } -func (l *linearCodeImpl) newAddressGeneratorAtIndex(index uint64) AddressGenerator { +func (l *linearCodeImpl) NewAddressGeneratorAtIndex(index uint64) AddressGenerator { return &linearCodeAddressGenerator{ index: index, chainCodeWord: l.chainID.getChainCodeWord(), @@ -262,6 +262,7 @@ func (c ChainID) String() string { // Chain is the interface for address generation implementations. type Chain interface { NewAddressGenerator() AddressGenerator + NewAddressGeneratorAtIndex(index uint64) AddressGenerator AddressAtIndex(index uint64) (Address, error) ServiceAddress() Address BytesToAddressGenerator(b []byte) AddressGenerator @@ -271,13 +272,12 @@ type Chain interface { ChainID() ChainID // required for tests zeroAddress() Address - newAddressGeneratorAtIndex(index uint64) AddressGenerator } // NewAddressGenerator returns a new AddressGenerator with an // initialized index. func (id *addressedChain) NewAddressGenerator() AddressGenerator { - return id.newAddressGeneratorAtIndex(0) + return id.NewAddressGeneratorAtIndex(0) } // AddressAtIndex returns the index-th generated account address. @@ -285,7 +285,7 @@ func (id *addressedChain) AddressAtIndex(index uint64) (Address, error) { if index > maxIndex { return EmptyAddress, fmt.Errorf("index must be less or equal to %x", maxIndex) } - return id.newAddressGeneratorAtIndex(index).CurrentAddress(), nil + return id.NewAddressGeneratorAtIndex(index).CurrentAddress(), nil } // ServiceAddress returns the root (first) generated account address. @@ -307,7 +307,7 @@ func (id *addressedChain) BytesToAddressGenerator(b []byte) AddressGenerator { bytes := slices.EnsureByteSliceSize(b, addressIndexLength) index := uint48(bytes[:]) - return id.newAddressGeneratorAtIndex(index) + return id.NewAddressGeneratorAtIndex(index) } // ChainID returns the chain ID of the chain. diff --git a/module/block_iterator/creator.go b/module/block_iterator/creator.go index 09278373cf7..05550831e07 100644 --- a/module/block_iterator/creator.go +++ b/module/block_iterator/creator.go @@ -26,7 +26,7 @@ var _ module.IteratorCreator = (*Creator)(nil) // after another to iterate from the root to the latest, and from last iterated to the new latest. func NewCreator( getBlockIDByIndex func(uint64) (blockID flow.Identifier, indexed bool, exception error), - progressStorage storage.ConsumerProgress, + progressStorage storage.ConsumerProgressInitializer, root uint64, latest func() (uint64, error), ) (*Creator, error) { @@ -65,7 +65,7 @@ func (c *Creator) Create() (iter module.BlockIterator, hasNext bool, exception e // from root to the latest (either finalized or sealed) by height. func NewHeightBasedCreator( getBlockIDByHeight func(height uint64) (flow.Identifier, error), - progress storage.ConsumerProgress, + progress storage.ConsumerProgressInitializer, root *flow.Header, latest func() (*flow.Header, error), ) (*Creator, error) { @@ -98,7 +98,7 @@ func NewHeightBasedCreator( // since view has gaps, the iterator will skip views that have no blocks. func NewViewBasedCreator( getBlockIDByView func(view uint64) (blockID flow.Identifier, viewIndexed bool, exception error), - progress storage.ConsumerProgress, + progress storage.ConsumerProgressInitializer, root *flow.Header, latest func() (*flow.Header, error), ) (*Creator, error) { diff --git a/module/block_iterator/creator_test.go b/module/block_iterator/creator_test.go index 61aa58a17a5..f9cc17b0490 100644 --- a/module/block_iterator/creator_test.go +++ b/module/block_iterator/creator_test.go @@ -351,6 +351,9 @@ type mockProgress struct { initialized bool } +var _ storage.ConsumerProgress = (*mockProgress)(nil) +var _ storage.ConsumerProgressInitializer = (*mockProgress)(nil) + func (m *mockProgress) ProcessedIndex() (uint64, error) { if !m.initialized { return 0, fmt.Errorf("processed index not initialized: %w", storage.ErrNotFound) @@ -358,13 +361,13 @@ func (m *mockProgress) ProcessedIndex() (uint64, error) { return m.index, nil } -func (m *mockProgress) InitProcessedIndex(defaultIndex uint64) error { +func (m *mockProgress) Initialize(defaultIndex uint64) (storage.ConsumerProgress, error) { if m.initialized { - return fmt.Errorf("processed index already initialized") + return m, nil } m.index = defaultIndex m.initialized = true - return nil + return m, nil } func (m *mockProgress) SetProcessedIndex(processed uint64) error { diff --git a/module/block_iterator/state.go b/module/block_iterator/state.go index 457169e4fc3..d0bf5337daa 100644 --- a/module/block_iterator/state.go +++ b/module/block_iterator/state.go @@ -1,7 +1,6 @@ package block_iterator import ( - "errors" "fmt" "github.com/onflow/flow-go/module" @@ -16,14 +15,10 @@ type PersistentIteratorState struct { var _ module.IteratorState = (*PersistentIteratorState)(nil) -func NewPersistentIteratorState(store storage.ConsumerProgress, root uint64, latest func() (uint64, error)) (*PersistentIteratorState, error) { - _, err := store.ProcessedIndex() - if errors.Is(err, storage.ErrNotFound) { - next := root + 1 - err = store.InitProcessedIndex(next) - if err != nil { - return nil, fmt.Errorf("failed to init processed index: %w", err) - } +func NewPersistentIteratorState(initializer storage.ConsumerProgressInitializer, root uint64, latest func() (uint64, error)) (*PersistentIteratorState, error) { + store, err := initializer.Initialize(root + 1) + if err != nil { + return nil, fmt.Errorf("failed to init processed index: %w", err) } return &PersistentIteratorState{ diff --git a/module/block_iterator/state_test.go b/module/block_iterator/state_test.go index f60ad325e61..4c9efd0010b 100644 --- a/module/block_iterator/state_test.go +++ b/module/block_iterator/state_test.go @@ -6,7 +6,8 @@ import ( "github.com/cockroachdb/pebble" "github.com/stretchr/testify/require" - storagepebble "github.com/onflow/flow-go/storage/pebble" + "github.com/onflow/flow-go/storage/operation/pebbleimpl" + "github.com/onflow/flow-go/storage/store" "github.com/onflow/flow-go/utils/unittest" ) @@ -19,9 +20,9 @@ func TestProgress(t *testing.T) { return latest, nil } - store := storagepebble.NewConsumerProgress(db, "test") + initializer := store.NewConsumerProgress(pebbleimpl.ToDB(db), "test") - progress, err := NewPersistentIteratorState(store, root, getLatest) + progress, err := NewPersistentIteratorState(initializer, root, getLatest) require.NoError(t, err) // 1. verify initial state should be the next of root diff --git a/module/counters/persistent_strict_monotonic_counter.go b/module/counters/persistent_strict_monotonic_counter.go index caaf7b45919..1ca881d04b6 100644 --- a/module/counters/persistent_strict_monotonic_counter.go +++ b/module/counters/persistent_strict_monotonic_counter.go @@ -20,13 +20,12 @@ type PersistentStrictMonotonicCounter struct { counter StrictMonotonousCounter } -// NewPersistentStrictMonotonicCounter creates a new PersistentStrictMonotonicCounter which inserts the default -// processed index to the storage layer and creates new counter with defaultIndex value. +// NewPersistentStrictMonotonicCounter creates a new PersistentStrictMonotonicCounter. // The consumer progress and associated db entry must not be accessed outside of calls to the returned object, // otherwise the state may become inconsistent. // // No errors are expected during normal operation. -func NewPersistentStrictMonotonicCounter(consumerProgress storage.ConsumerProgress, defaultIndex uint64) (*PersistentStrictMonotonicCounter, error) { +func NewPersistentStrictMonotonicCounter(consumerProgress storage.ConsumerProgress) (*PersistentStrictMonotonicCounter, error) { m := &PersistentStrictMonotonicCounter{ consumerProgress: consumerProgress, } @@ -34,14 +33,7 @@ func NewPersistentStrictMonotonicCounter(consumerProgress storage.ConsumerProgre // sync with storage for the processed index to ensure the consistency value, err := m.consumerProgress.ProcessedIndex() if err != nil { - if !errors.Is(err, storage.ErrNotFound) { - return nil, fmt.Errorf("could not read consumer progress: %w", err) - } - err := m.consumerProgress.InitProcessedIndex(defaultIndex) - if err != nil { - return nil, fmt.Errorf("could not init consumer progress: %w", err) - } - value = defaultIndex + return nil, fmt.Errorf("failed to get processed index: %w", err) } m.counter = NewMonotonousCounter(value) @@ -52,7 +44,7 @@ func NewPersistentStrictMonotonicCounter(consumerProgress storage.ConsumerProgre // Set sets the processed index, ensuring it is strictly monotonically increasing. // // Expected errors during normal operation: -// - codes.ErrIncorrectValue - if stored value is larger than processed. +// - codes.ErrIncorrectValue - if stored value is >= processed (requirement of strict monotonous increase is violated). // - generic error in case of unexpected failure from the database layer or // encoding failure. func (m *PersistentStrictMonotonicCounter) Set(processed uint64) error { diff --git a/module/counters/persistent_strict_monotonic_counter_test.go b/module/counters/persistent_strict_monotonic_counter_test.go index 62a1adedf22..caf9c9c6642 100644 --- a/module/counters/persistent_strict_monotonic_counter_test.go +++ b/module/counters/persistent_strict_monotonic_counter_test.go @@ -8,17 +8,17 @@ import ( "github.com/onflow/flow-go/module" "github.com/onflow/flow-go/module/counters" - bstorage "github.com/onflow/flow-go/storage/badger" + "github.com/onflow/flow-go/storage/operation/badgerimpl" + "github.com/onflow/flow-go/storage/store" "github.com/onflow/flow-go/utils/unittest" ) func TestMonotonicConsumer(t *testing.T) { unittest.RunWithBadgerDB(t, func(db *badger.DB) { var height1 = uint64(1234) - persistentStrictMonotonicCounter, err := counters.NewPersistentStrictMonotonicCounter( - bstorage.NewConsumerProgress(db, module.ConsumeProgressLastFullBlockHeight), - height1, - ) + progress, err := store.NewConsumerProgress(badgerimpl.ToDB(db), module.ConsumeProgressLastFullBlockHeight).Initialize(height1) + require.NoError(t, err) + persistentStrictMonotonicCounter, err := counters.NewPersistentStrictMonotonicCounter(progress) require.NoError(t, err) // check value can be retrieved @@ -40,11 +40,10 @@ func TestMonotonicConsumer(t *testing.T) { actual = persistentStrictMonotonicCounter.Value() require.Equal(t, height2, actual) + progress2, err := store.NewConsumerProgress(badgerimpl.ToDB(db), module.ConsumeProgressLastFullBlockHeight).Initialize(height1) + require.NoError(t, err) // check that new persistent strict monotonic counter has the same value - persistentStrictMonotonicCounter2, err := counters.NewPersistentStrictMonotonicCounter( - bstorage.NewConsumerProgress(db, module.ConsumeProgressLastFullBlockHeight), - height1, - ) + persistentStrictMonotonicCounter2, err := counters.NewPersistentStrictMonotonicCounter(progress2) require.NoError(t, err) // check that the value still the same diff --git a/module/jobqueue/component_consumer.go b/module/jobqueue/component_consumer.go index 1b174e712ad..457aed3f804 100644 --- a/module/jobqueue/component_consumer.go +++ b/module/jobqueue/component_consumer.go @@ -27,7 +27,7 @@ type ComponentConsumer struct { func NewComponentConsumer( log zerolog.Logger, workSignal <-chan struct{}, - progress storage.ConsumerProgress, + progressInitializer storage.ConsumerProgressInitializer, jobs module.Jobs, defaultIndex uint64, processor JobProcessor, // method used to process jobs @@ -48,7 +48,7 @@ func NewComponentConsumer( maxProcessing, ) - consumer, err := NewConsumer(log, jobs, progress, worker, maxProcessing, maxSearchAhead, defaultIndex) + consumer, err := NewConsumer(log, jobs, progressInitializer, worker, maxProcessing, maxSearchAhead, defaultIndex) if err != nil { return nil, err } diff --git a/module/jobqueue/component_consumer_test.go b/module/jobqueue/component_consumer_test.go index de9d13b5981..44d210961c6 100644 --- a/module/jobqueue/component_consumer_test.go +++ b/module/jobqueue/component_consumer_test.go @@ -89,10 +89,13 @@ func (suite *ComponentConsumerSuite) prepareTest( progress.On("ProcessedIndex").Return(suite.defaultIndex, nil) progress.On("SetProcessedIndex", mock.AnythingOfType("uint64")).Return(nil) + progressInitializer := new(storagemock.ConsumerProgressInitializer) + progressInitializer.On("Initialize", mock.AnythingOfType("uint64")).Return(progress, nil) + consumer, err := NewComponentConsumer( zerolog.New(os.Stdout).With().Timestamp().Logger(), workSignal, - progress, + progressInitializer, jobs, suite.defaultIndex, processor, diff --git a/module/jobqueue/consumer.go b/module/jobqueue/consumer.go index 17e309a929c..c20e05c01fa 100644 --- a/module/jobqueue/consumer.go +++ b/module/jobqueue/consumer.go @@ -50,14 +50,19 @@ type Consumer struct { func NewConsumer( log zerolog.Logger, jobs module.Jobs, - progress storage.ConsumerProgress, + progressInitializer storage.ConsumerProgressInitializer, worker Worker, maxProcessing uint64, maxSearchAhead uint64, defaultIndex uint64, ) (*Consumer, error) { - processedIndex, err := readProcessedIndex(log, progress, defaultIndex) + progress, err := progressInitializer.Initialize(defaultIndex) + if err != nil { + return nil, fmt.Errorf("could not initialize processed index: %w", err) + } + + processedIndex, err := progress.ProcessedIndex() if err != nil { return nil, fmt.Errorf("could not read processed index: %w", err) } @@ -84,33 +89,6 @@ func NewConsumer( }, nil } -func readProcessedIndex(log zerolog.Logger, progress storage.ConsumerProgress, defaultIndex uint64) (uint64, error) { - // on startup, sync with storage for the processed index - // to ensure the consistency - processedIndex, err := progress.ProcessedIndex() - if errors.Is(err, storage.ErrNotFound) { - err := progress.InitProcessedIndex(defaultIndex) - if errors.Is(err, storage.ErrAlreadyExists) { - return 0, fmt.Errorf("processed index has already been inited, no effect for the second time. default index: %v", - defaultIndex) - } - - if err != nil { - return 0, fmt.Errorf("could not init processed index: %w", err) - } - - log.Warn().Uint64("processed index", processedIndex). - Msg("processed index not found, initialized.") - return defaultIndex, nil - } - - if err != nil { - return 0, fmt.Errorf("could not read processed index: %w", err) - } - - return processedIndex, nil -} - // Start starts consuming the jobs from the job queue. func (c *Consumer) Start() error { c.mu.Lock() diff --git a/module/jobqueue/consumer_behavior_test.go b/module/jobqueue/consumer_behavior_test.go index 98fc7395377..3f90e2bd623 100644 --- a/module/jobqueue/consumer_behavior_test.go +++ b/module/jobqueue/consumer_behavior_test.go @@ -14,7 +14,8 @@ import ( "github.com/onflow/flow-go/module" "github.com/onflow/flow-go/module/jobqueue" "github.com/onflow/flow-go/storage" - "github.com/onflow/flow-go/storage/badger" + "github.com/onflow/flow-go/storage/operation/badgerimpl" + "github.com/onflow/flow-go/storage/store" "github.com/onflow/flow-go/utils/unittest" ) @@ -469,16 +470,19 @@ func testWorkOnNextAfterFastforward(t *testing.T) { // rebuild a consumer with the dependencies to simulate a restart // jobs need to be reused, since it stores all the jobs reWorker := newMockWorker() - reProgress := badger.NewConsumerProgress(db, ConsumerTag) + reProgress := store.NewConsumerProgress(badgerimpl.ToDB(db), ConsumerTag) reConsumer := newTestConsumer(t, reProgress, j, reWorker, 0, DefaultIndex) - err := reConsumer.Start() + progress, err := reProgress.Initialize(DefaultIndex) + require.NoError(t, err) + + err = reConsumer.Start() require.NoError(t, err) time.Sleep(1 * time.Millisecond) reWorker.AssertCalled(t, []int64{4, 5, 6}) - assertProcessed(t, reProgress, 3) + assertProcessed(t, progress, 3) }) } @@ -560,8 +564,10 @@ func runWithSeatchAhead(t testing.TB, maxSearchAhead uint64, defaultIndex uint64 unittest.RunWithBadgerDB(t, func(db *badgerdb.DB) { jobs := jobqueue.NewMockJobs() worker := newMockWorker() - progress := badger.NewConsumerProgress(db, ConsumerTag) - consumer := newTestConsumer(t, progress, jobs, worker, maxSearchAhead, defaultIndex) + progressInitializer := store.NewConsumerProgress(badgerimpl.ToDB(db), ConsumerTag) + consumer := newTestConsumer(t, progressInitializer, jobs, worker, maxSearchAhead, defaultIndex) + progress, err := progressInitializer.Initialize(defaultIndex) + require.NoError(t, err) runTestWith(consumer, progress, worker, jobs, db) }) } @@ -572,7 +578,7 @@ func assertProcessed(t testing.TB, cp storage.ConsumerProgress, expectProcessed require.Equal(t, expectProcessed, processed) } -func newTestConsumer(t testing.TB, cp storage.ConsumerProgress, jobs module.Jobs, worker jobqueue.Worker, maxSearchAhead uint64, defaultIndex uint64) module.JobConsumer { +func newTestConsumer(t testing.TB, cp storage.ConsumerProgressInitializer, jobs module.Jobs, worker jobqueue.Worker, maxSearchAhead uint64, defaultIndex uint64) module.JobConsumer { log := unittest.Logger().With().Str("module", "consumer").Logger() maxProcessing := uint64(3) c, err := jobqueue.NewConsumer(log, jobs, cp, worker, maxProcessing, maxSearchAhead, defaultIndex) diff --git a/module/jobqueue/consumer_test.go b/module/jobqueue/consumer_test.go index 90db5332f79..4c672d73876 100644 --- a/module/jobqueue/consumer_test.go +++ b/module/jobqueue/consumer_test.go @@ -7,14 +7,14 @@ import ( "testing" "time" - badgerdb "github.com/dgraph-io/badger/v2" "github.com/rs/zerolog" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/onflow/flow-go/module" "github.com/onflow/flow-go/storage" - "github.com/onflow/flow-go/storage/badger" + "github.com/onflow/flow-go/storage/operation/dbtest" + "github.com/onflow/flow-go/storage/store" "github.com/onflow/flow-go/utils/unittest" ) @@ -157,22 +157,16 @@ func TestProcessableJobs(t *testing.T) { // Test after jobs have been processed, the job status are removed to prevent from memory-leak func TestProcessedIndexDeletion(t *testing.T) { - setup := func(t *testing.T, f func(c *Consumer, jobs *MockJobs)) { - unittest.RunWithBadgerDB(t, func(db *badgerdb.DB) { - log := unittest.Logger().With().Str("module", "consumer").Logger() - jobs := NewMockJobs() - progress := badger.NewConsumerProgress(db, "consumer") - worker := newMockWorker() - maxProcessing := uint64(3) - c, err := NewConsumer(log, jobs, progress, worker, maxProcessing, 0, 0) - require.NoError(t, err) - worker.WithConsumer(c) - - f(c, jobs) - }) - } + dbtest.RunWithDB(t, func(t *testing.T, db storage.DB) { + log := unittest.Logger().With().Str("module", "consumer").Logger() + jobs := NewMockJobs() + progressInitializer := store.NewConsumerProgress(db, "consumer") + worker := newMockWorker() + maxProcessing := uint64(3) + c, err := NewConsumer(log, jobs, progressInitializer, worker, maxProcessing, 0, 0) + require.NoError(t, err) + worker.WithConsumer(c) - setup(t, func(c *Consumer, jobs *MockJobs) { require.NoError(t, jobs.PushN(10)) require.NoError(t, c.Start()) @@ -193,22 +187,24 @@ func TestProcessedIndexDeletion(t *testing.T) { func TestCheckBeforeStartIsNoop(t *testing.T) { t.Parallel() - unittest.RunWithBadgerDB(t, func(db *badgerdb.DB) { + dbtest.RunWithDB(t, func(t *testing.T, db storage.DB) { storedProcessedIndex := uint64(100) worker := newMockWorker() - progress := badger.NewConsumerProgress(db, "consumer") - err := progress.InitProcessedIndex(storedProcessedIndex) + progressInitializer := store.NewConsumerProgress(db, "consumer") + progress, err := progressInitializer.Initialize(10) require.NoError(t, err) + // set the processedIndex to a value + require.NoError(t, progress.SetProcessedIndex(storedProcessedIndex)) c, err := NewConsumer( unittest.Logger(), NewMockJobs(), - progress, + progressInitializer, worker, uint64(3), 0, - 10, + 10, // default index is before the stored processedIndex ) require.NoError(t, err) worker.WithConsumer(c) diff --git a/module/state_synchronization/indexer/indexer.go b/module/state_synchronization/indexer/indexer.go index 2de7650a872..db164a2c12d 100644 --- a/module/state_synchronization/indexer/indexer.go +++ b/module/state_synchronization/indexer/indexer.go @@ -70,7 +70,7 @@ func NewIndexer( indexer *IndexerCore, executionCache *cache.ExecutionDataCache, executionDataLatestHeight func() (uint64, error), - processedHeight storage.ConsumerProgress, + processedHeightInitializer storage.ConsumerProgressInitializer, ) (*Indexer, error) { r := &Indexer{ log: log.With().Str("module", "execution_indexer").Logger(), @@ -89,7 +89,7 @@ func NewIndexer( jobConsumer, err := jobqueue.NewComponentConsumer( r.log, r.exeDataNotifier.Channel(), - processedHeight, + processedHeightInitializer, r.exeDataReader, initHeight, r.processExecutionData, diff --git a/module/state_synchronization/indexer/indexer_test.go b/module/state_synchronization/indexer/indexer_test.go index e7ec3bc5055..bcf7e42feb6 100644 --- a/module/state_synchronization/indexer/indexer_test.go +++ b/module/state_synchronization/indexer/indexer_test.go @@ -17,6 +17,7 @@ import ( "github.com/onflow/flow-go/module/executiondatasync/execution_data/mock" "github.com/onflow/flow-go/module/irrecoverable" mempool "github.com/onflow/flow-go/module/mempool/mock" + "github.com/onflow/flow-go/storage" storagemock "github.com/onflow/flow-go/storage/mock" "github.com/onflow/flow-go/utils/unittest" ) @@ -82,7 +83,7 @@ func newIndexerTest(t *testing.T, availableBlocks int, lastIndexedIndex int) *in indexerCoreTest.indexer, exeCache, test.latestHeight, - progress, + &mockProgressInitializer{progress: progress}, ) require.NoError(t, err) @@ -121,6 +122,14 @@ func (w *indexerTest) run(ctx irrecoverable.SignalerContext, reachHeight uint64, unittest.RequireCloseBefore(w.t, w.worker.Done(), testTimeout, "timeout waiting for the consumer to be done") } +type mockProgressInitializer struct { + progress *mockProgress +} + +func (m *mockProgressInitializer) Initialize(defaultIndex uint64) (storage.ConsumerProgress, error) { + return m.progress, nil +} + type mockProgress struct { index *atomic.Uint64 doneIndex *atomic.Uint64 diff --git a/module/state_synchronization/requester/execution_data_requester.go b/module/state_synchronization/requester/execution_data_requester.go index 4ed489371dd..e32d2e10bb9 100644 --- a/module/state_synchronization/requester/execution_data_requester.go +++ b/module/state_synchronization/requester/execution_data_requester.go @@ -145,8 +145,8 @@ func New( edrMetrics module.ExecutionDataRequesterMetrics, downloader execution_data.Downloader, execDataCache *cache.ExecutionDataCache, - processedHeight storage.ConsumerProgress, - processedNotifications storage.ConsumerProgress, + processedHeight storage.ConsumerProgressInitializer, + processedNotifications storage.ConsumerProgressInitializer, state protocol.State, headers storage.Headers, cfg ExecutionDataConfig, diff --git a/module/state_synchronization/requester/execution_data_requester_test.go b/module/state_synchronization/requester/execution_data_requester_test.go index deff90cb240..8b15d1f45ce 100644 --- a/module/state_synchronization/requester/execution_data_requester_test.go +++ b/module/state_synchronization/requester/execution_data_requester_test.go @@ -33,7 +33,8 @@ import ( synctest "github.com/onflow/flow-go/module/state_synchronization/requester/unittest" "github.com/onflow/flow-go/state/protocol" statemock "github.com/onflow/flow-go/state/protocol/mock" - bstorage "github.com/onflow/flow-go/storage/badger" + "github.com/onflow/flow-go/storage/operation/badgerimpl" + "github.com/onflow/flow-go/storage/store" "github.com/onflow/flow-go/utils/unittest" ) @@ -412,8 +413,8 @@ func (suite *ExecutionDataRequesterSuite) prepareRequesterTest(cfg *fetchTestRun cache := cache.NewExecutionDataCache(suite.downloader, headers, seals, results, heroCache) followerDistributor := pubsub.NewFollowerDistributor() - processedHeight := bstorage.NewConsumerProgress(suite.db, module.ConsumeProgressExecutionDataRequesterBlockHeight) - processedNotification := bstorage.NewConsumerProgress(suite.db, module.ConsumeProgressExecutionDataRequesterNotification) + processedHeight := store.NewConsumerProgress(badgerimpl.ToDB(suite.db), module.ConsumeProgressExecutionDataRequesterBlockHeight) + processedNotification := store.NewConsumerProgress(badgerimpl.ToDB(suite.db), module.ConsumeProgressExecutionDataRequesterNotification) edr, err := requester.New( logger, diff --git a/network/p2p/builder.go b/network/p2p/builder.go index 207235f7347..59df7ad8e5f 100644 --- a/network/p2p/builder.go +++ b/network/p2p/builder.go @@ -8,6 +8,7 @@ import ( "github.com/libp2p/go-libp2p/core/host" "github.com/libp2p/go-libp2p/core/network" "github.com/libp2p/go-libp2p/core/peer" + "github.com/libp2p/go-libp2p/core/protocol" "github.com/libp2p/go-libp2p/core/routing" madns "github.com/multiformats/go-multiaddr-dns" "github.com/rs/zerolog" @@ -72,6 +73,10 @@ type GossipSubBuilder interface { // It is NOT recommended to override the default RPC inspector suite factory in production unless you know what you are doing. OverrideDefaultRpcInspectorFactory(GossipSubRpcInspectorFactoryFunc) + // OverrideDefaultValidateQueueSize overrides the default validate queue size of libp2p nodes. + // CAUTION: Be careful setting this to a larger number as it will change the backpressure behavior of the system. + OverrideDefaultValidateQueueSize(int) + // Build creates a new GossipSub pubsub system. // It returns the newly created GossipSub pubsub system and any errors encountered during its creation. // @@ -160,6 +165,10 @@ type NodeBuilder interface { // - NodeBuilder: the node builder OverrideDefaultRpcInspectorFactory(GossipSubRpcInspectorFactoryFunc) NodeBuilder + // OverrideDefaultValidateQueueSize overrides the default validate queue size of libp2p nodes. + // CAUTION: Be careful setting this to a larger number as it will change the backpressure behavior of the system. + OverrideDefaultValidateQueueSize(int) NodeBuilder + // Build creates a new libp2p node. It returns the newly created libp2p node and any errors encountered during its creation. // Args: // none @@ -198,7 +207,8 @@ type NodeConfig struct { // logger used to provide logging Logger zerolog.Logger `validate:"required"` // reference to the libp2p host (https://godoc.org/github.com/libp2p/go-libp2p/core/host) - Host host.Host `validate:"required"` - PeerManager PeerManager - DisallowListCacheCfg *DisallowListCacheConfig `validate:"required"` + Host host.Host `validate:"required"` + PeerManager PeerManager + DisallowListCacheCfg *DisallowListCacheConfig `validate:"required"` + ProtocolPeerCacheList []protocol.ID } diff --git a/network/p2p/builder/gossipsub/gossipSubBuilder.go b/network/p2p/builder/gossipsub/gossipSubBuilder.go index 7877f7d8e15..f4d642f9cd7 100644 --- a/network/p2p/builder/gossipsub/gossipSubBuilder.go +++ b/network/p2p/builder/gossipsub/gossipSubBuilder.go @@ -43,6 +43,7 @@ type Builder struct { idProvider module.IdentityProvider routingSystem routing.Routing gossipSubCfg *p2pconfig.GossipSubParameters + validateQueueSize int } var _ p2p.GossipSubBuilder = (*Builder)(nil) @@ -138,6 +139,12 @@ func (g *Builder) SetRoutingSystem(routingSystem routing.Routing) { g.routingSystem = routingSystem } +// OverrideDefaultValidateQueueSize sets the validate queue size to use for the libp2p pubsub system. +// CAUTION: Be careful setting this to a larger number as it will change the backpressure behavior of the system. +func (g *Builder) OverrideDefaultValidateQueueSize(size int) { + g.validateQueueSize = size +} + // NewGossipSubBuilder returns a new gossipsub builder. // Args: // - logger: the logger of the node. @@ -151,12 +158,14 @@ func (g *Builder) SetRoutingSystem(routingSystem routing.Routing) { // Returns: // - a new gossipsub builder. // Note: the builder is not thread-safe. It should only be used in the main thread. -func NewGossipSubBuilder(logger zerolog.Logger, +func NewGossipSubBuilder( + logger zerolog.Logger, metricsCfg *p2pbuilderconfig.MetricsConfig, gossipSubCfg *p2pconfig.GossipSubParameters, networkType network.NetworkingType, sporkId flow.Identifier, - idProvider module.IdentityProvider) *Builder { + idProvider module.IdentityProvider, +) *Builder { lg := logger.With(). Str("component", "gossipsub"). Str("network-type", networkType.String()). @@ -354,6 +363,10 @@ func (g *Builder) Build(ctx irrecoverable.SignalerContext) (p2p.PubSubAdapter, e gossipSubConfigs.WithTracer(g.gossipSubTracer) } + if g.validateQueueSize > 0 { + gossipSubConfigs.WithValidateQueueSize(g.validateQueueSize) + } + if g.h == nil { return nil, fmt.Errorf("could not create gossipsub: host is nil") } diff --git a/network/p2p/builder/libp2pNodeBuilder.go b/network/p2p/builder/libp2pNodeBuilder.go index 9043ab5f614..60a1ea1bce4 100644 --- a/network/p2p/builder/libp2pNodeBuilder.go +++ b/network/p2p/builder/libp2pNodeBuilder.go @@ -6,16 +6,18 @@ import ( "fmt" "net" - none "github.com/ipfs/boxo/routing/none" "github.com/libp2p/go-libp2p" pubsub "github.com/libp2p/go-libp2p-pubsub" + routinghelpers "github.com/libp2p/go-libp2p-routing-helpers" "github.com/libp2p/go-libp2p/config" "github.com/libp2p/go-libp2p/core/connmgr" "github.com/libp2p/go-libp2p/core/host" "github.com/libp2p/go-libp2p/core/network" + "github.com/libp2p/go-libp2p/core/protocol" "github.com/libp2p/go-libp2p/core/routing" "github.com/libp2p/go-libp2p/core/transport" rcmgr "github.com/libp2p/go-libp2p/p2p/host/resource-manager" + "github.com/libp2p/go-libp2p/p2p/net/swarm" "github.com/libp2p/go-libp2p/p2p/transport/tcp" "github.com/multiformats/go-multiaddr" madns "github.com/multiformats/go-multiaddr-dns" @@ -62,16 +64,17 @@ type LibP2PNodeBuilder struct { metricsConfig *p2pbuilderconfig.MetricsConfig basicResolver madns.BasicResolver - resourceManager network.ResourceManager - resourceManagerCfg *p2pconfig.ResourceManagerConfig - connManager connmgr.ConnManager - connGater p2p.ConnectionGater - routingFactory func(context.Context, host.Host) (routing.Routing, error) - peerManagerConfig *p2pbuilderconfig.PeerManagerConfig - createNode p2p.NodeConstructor - disallowListCacheCfg *p2p.DisallowListCacheConfig - unicastConfig *p2pbuilderconfig.UnicastConfig - networkingType flownet.NetworkingType // whether the node is running in private (staked) or public (unstaked) network + resourceManager network.ResourceManager + resourceManagerCfg *p2pconfig.ResourceManagerConfig + connManager connmgr.ConnManager + connGater p2p.ConnectionGater + routingFactory func(context.Context, host.Host) (routing.Routing, error) + peerManagerConfig *p2pbuilderconfig.PeerManagerConfig + createNode p2p.NodeConstructor + disallowListCacheCfg *p2p.DisallowListCacheConfig + unicastConfig *p2pbuilderconfig.UnicastConfig + networkingType flownet.NetworkingType // whether the node is running in private (staked) or public (unstaked) network + protocolPeerCacheList []protocol.ID } func NewNodeBuilder( @@ -147,6 +150,19 @@ func (builder *LibP2PNodeBuilder) SetRoutingSystem(f func(context.Context, host. return builder } +// OverrideDefaultValidateQueueSize sets the validate queue size to use for the libp2p pubsub system. +// CAUTION: Be careful setting this to a larger number as it will change the backpressure behavior of the system. +func (builder *LibP2PNodeBuilder) OverrideDefaultValidateQueueSize(size int) p2p.NodeBuilder { + builder.gossipSubBuilder.OverrideDefaultValidateQueueSize(size) + return builder +} + +// SetProtocolPeerCacheList sets the protocols to track in the protocol peer cache. +func (builder *LibP2PNodeBuilder) SetProtocolPeerCacheList(protocols ...protocol.ID) p2p.NodeBuilder { + builder.protocolPeerCacheList = protocols + return builder +} + // OverrideGossipSubFactory overrides the default gossipsub factory for the GossipSub protocol. // The purpose of override is to allow the node to provide a custom gossipsub factory for sake of testing or experimentation. // Note: it is not recommended to override the default gossipsub factory in production unless you know what you are doing. @@ -211,7 +227,7 @@ func (builder *LibP2PNodeBuilder) Build() (p2p.LibP2PNode, error) { return nil, fmt.Errorf("could not create resolver: %w", err) } - opts = append(opts, libp2p.MultiaddrResolver(resolver)) + opts = append(opts, libp2p.MultiaddrResolver(swarm.ResolverFromMaDNS{Resolver: resolver})) } if builder.resourceManager != nil { @@ -276,10 +292,11 @@ func (builder *LibP2PNodeBuilder) Build() (p2p.LibP2PNode, error) { Parameters: &p2p.NodeParameters{ EnableProtectedStreams: builder.unicastConfig.EnableStreamProtection, }, - Logger: builder.logger, - Host: h, - PeerManager: peerManager, - DisallowListCacheCfg: builder.disallowListCacheCfg, + Logger: builder.logger, + Host: h, + PeerManager: peerManager, + DisallowListCacheCfg: builder.disallowListCacheCfg, + ProtocolPeerCacheList: builder.protocolPeerCacheList, }) if err != nil { return nil, fmt.Errorf("could not create libp2p node: %w", err) @@ -393,7 +410,7 @@ func defaultLibP2POptions(address string, key fcrypto.PrivateKey) ([]config.Opti // as the 1-k discovery process and the 1-1 messaging both sometimes attempt to open connection to the same target // As of now there is no requirement of client sockets to be a well-known port, so disabling port reuse all together. t := libp2p.Transport(func(u transport.Upgrader) (*tcp.TcpTransport, error) { - return tcp.NewTCPTransport(u, nil, tcp.DisableReuseport()) + return tcp.NewTCPTransport(u, nil, nil, tcp.DisableReuseport()) }) // gather all the options for the libp2p node @@ -487,7 +504,7 @@ func (b *LibP2PNodeBuilder) configureRoutingSystem( } else { // bitswap requires a content routing system. this returns a stub instead of a full DHT b.SetRoutingSystem(func(ctx context.Context, host host.Host) (routing.Routing, error) { - return none.ConstructNilRouting(ctx, host, nil, nil) + return routinghelpers.Null{}, nil }) } } diff --git a/network/p2p/cache.go b/network/p2p/cache.go index 226617c7a6d..99dc1201b2e 100644 --- a/network/p2p/cache.go +++ b/network/p2p/cache.go @@ -18,8 +18,8 @@ type ProtocolPeerCache interface { // RemoveProtocols removes the specified protocols for the given peer from the protocol cache. RemoveProtocols(peerID peer.ID, protocols []protocol.ID) - // GetPeers returns a copy of the set of peers that support the given protocol. - GetPeers(pid protocol.ID) map[peer.ID]struct{} + // GetPeers returns the set of peers that support the given protocol. + GetPeers(pid protocol.ID) peer.IDSlice } // UpdateFunction is a function that adjusts the GossipSub spam record of a peer. diff --git a/network/p2p/mock/gossip_sub_builder.go b/network/p2p/mock/gossip_sub_builder.go index 100e2b815a2..0bc69f8bef3 100644 --- a/network/p2p/mock/gossip_sub_builder.go +++ b/network/p2p/mock/gossip_sub_builder.go @@ -60,6 +60,11 @@ func (_m *GossipSubBuilder) OverrideDefaultRpcInspectorFactory(_a0 p2p.GossipSub _m.Called(_a0) } +// OverrideDefaultValidateQueueSize provides a mock function with given fields: _a0 +func (_m *GossipSubBuilder) OverrideDefaultValidateQueueSize(_a0 int) { + _m.Called(_a0) +} + // SetGossipSubConfigFunc provides a mock function with given fields: _a0 func (_m *GossipSubBuilder) SetGossipSubConfigFunc(_a0 p2p.GossipSubAdapterConfigFunc) { _m.Called(_a0) diff --git a/network/p2p/mock/node_builder.go b/network/p2p/mock/node_builder.go index d4e95cc9946..9436d6aa57e 100644 --- a/network/p2p/mock/node_builder.go +++ b/network/p2p/mock/node_builder.go @@ -77,6 +77,26 @@ func (_m *NodeBuilder) OverrideDefaultRpcInspectorFactory(_a0 p2p.GossipSubRpcIn return r0 } +// OverrideDefaultValidateQueueSize provides a mock function with given fields: _a0 +func (_m *NodeBuilder) OverrideDefaultValidateQueueSize(_a0 int) p2p.NodeBuilder { + ret := _m.Called(_a0) + + if len(ret) == 0 { + panic("no return value specified for OverrideDefaultValidateQueueSize") + } + + var r0 p2p.NodeBuilder + if rf, ok := ret.Get(0).(func(int) p2p.NodeBuilder); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(p2p.NodeBuilder) + } + } + + return r0 +} + // OverrideGossipSubFactory provides a mock function with given fields: _a0, _a1 func (_m *NodeBuilder) OverrideGossipSubFactory(_a0 p2p.GossipSubFactoryFunc, _a1 p2p.GossipSubAdapterConfigFunc) p2p.NodeBuilder { ret := _m.Called(_a0, _a1) diff --git a/network/p2p/mock/protocol_peer_cache.go b/network/p2p/mock/protocol_peer_cache.go index 8b388450df7..f88fe3f5f16 100644 --- a/network/p2p/mock/protocol_peer_cache.go +++ b/network/p2p/mock/protocol_peer_cache.go @@ -21,19 +21,19 @@ func (_m *ProtocolPeerCache) AddProtocols(peerID peer.ID, protocols []protocol.I } // GetPeers provides a mock function with given fields: pid -func (_m *ProtocolPeerCache) GetPeers(pid protocol.ID) map[peer.ID]struct{} { +func (_m *ProtocolPeerCache) GetPeers(pid protocol.ID) peer.IDSlice { ret := _m.Called(pid) if len(ret) == 0 { panic("no return value specified for GetPeers") } - var r0 map[peer.ID]struct{} - if rf, ok := ret.Get(0).(func(protocol.ID) map[peer.ID]struct{}); ok { + var r0 peer.IDSlice + if rf, ok := ret.Get(0).(func(protocol.ID) peer.IDSlice); ok { r0 = rf(pid) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).(map[peer.ID]struct{}) + r0 = ret.Get(0).(peer.IDSlice) } } diff --git a/network/p2p/mock/pub_sub_adapter_config.go b/network/p2p/mock/pub_sub_adapter_config.go index ac339a4683b..f1dfe7dafed 100644 --- a/network/p2p/mock/pub_sub_adapter_config.go +++ b/network/p2p/mock/pub_sub_adapter_config.go @@ -56,6 +56,11 @@ func (_m *PubSubAdapterConfig) WithTracer(t p2p.PubSubTracer) { _m.Called(t) } +// WithValidateQueueSize provides a mock function with given fields: _a0 +func (_m *PubSubAdapterConfig) WithValidateQueueSize(_a0 int) { + _m.Called(_a0) +} + // NewPubSubAdapterConfig creates a new instance of PubSubAdapterConfig. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. // The first argument is typically a *testing.T value. func NewPubSubAdapterConfig(t interface { diff --git a/network/p2p/node/gossipSubAdapter.go b/network/p2p/node/gossipSubAdapter.go index 3ada14efd5c..ee678c5625a 100644 --- a/network/p2p/node/gossipSubAdapter.go +++ b/network/p2p/node/gossipSubAdapter.go @@ -41,11 +41,13 @@ type GossipSubAdapter struct { var _ p2p.PubSubAdapter = (*GossipSubAdapter)(nil) -func NewGossipSubAdapter(ctx context.Context, +func NewGossipSubAdapter( + ctx context.Context, logger zerolog.Logger, h host.Host, cfg p2p.PubSubAdapterConfig, - clusterChangeConsumer p2p.CollectionClusterChangesConsumer) (p2p.PubSubAdapter, error) { + clusterChangeConsumer p2p.CollectionClusterChangesConsumer, +) (p2p.PubSubAdapter, error) { gossipSubConfig, ok := cfg.(*GossipSubAdapterConfig) if !ok { return nil, fmt.Errorf("invalid gossipsub config type: %T", cfg) diff --git a/network/p2p/node/gossipSubAdapterConfig.go b/network/p2p/node/gossipSubAdapterConfig.go index 20d7d94b709..e47ebace309 100644 --- a/network/p2p/node/gossipSubAdapterConfig.go +++ b/network/p2p/node/gossipSubAdapterConfig.go @@ -109,6 +109,12 @@ func (g *GossipSubAdapterConfig) WithPeerGater(topicDeliveryWeights map[string]f g.options = append(g.options, pubsub.WithPeerGater(peerGaterParams)) } +// WithValidateQueueSize overrides the validation queue size from 32 to the given size. +// CAUTION: Be careful setting this to a larger number as it will change the backpressure behavior of the system. +func (g *GossipSubAdapterConfig) WithValidateQueueSize(size int) { + g.options = append(g.options, pubsub.WithValidateQueueSize(size)) +} + // ScoreTracer returns the tracer for the peer score. // Args: // - None diff --git a/network/p2p/node/internal/protocolPeerCache.go b/network/p2p/node/internal/protocolPeerCache.go index 8cfe67220c4..81af4a06538 100644 --- a/network/p2p/node/internal/protocolPeerCache.go +++ b/network/p2p/node/internal/protocolPeerCache.go @@ -10,6 +10,7 @@ import ( "github.com/libp2p/go-libp2p/core/peer" "github.com/libp2p/go-libp2p/core/protocol" "github.com/rs/zerolog" + "golang.org/x/exp/maps" p2plogging "github.com/onflow/flow-go/network/p2p/logging" ) @@ -20,13 +21,26 @@ type ProtocolPeerCache struct { sync.RWMutex } -func NewProtocolPeerCache(logger zerolog.Logger, h host.Host) (*ProtocolPeerCache, error) { +// NewProtocolPeerCache creates a new ProtocolPeerCache instance using the given host and supported protocols +// Only protocols passed in the protocols list will be tracked +func NewProtocolPeerCache(logger zerolog.Logger, h host.Host, protocols []protocol.ID) (*ProtocolPeerCache, error) { + protocolPeers := make(map[protocol.ID]map[peer.ID]struct{}) + for _, pid := range protocols { + protocolPeers[pid] = make(map[peer.ID]struct{}) + } + p := &ProtocolPeerCache{protocolPeers: protocolPeers} + + // If no protocols are passed, this is a noop cache + if len(protocols) == 0 { + return p, nil + } + sub, err := h.EventBus(). Subscribe([]interface{}{new(event.EvtPeerIdentificationCompleted), new(event.EvtPeerProtocolsUpdated)}) if err != nil { return nil, fmt.Errorf("could not subscribe to peer protocol update events: %w", err) } - p := &ProtocolPeerCache{protocolPeers: make(map[protocol.ID]map[peer.ID]struct{})} + h.Network().Notify(&libp2pnet.NotifyBundle{ DisconnectedF: func(n libp2pnet.Network, c libp2pnet.Conn) { peer := c.RemotePeer() @@ -43,11 +57,8 @@ func NewProtocolPeerCache(logger zerolog.Logger, h host.Host) (*ProtocolPeerCach func (p *ProtocolPeerCache) RemovePeer(peerID peer.ID) { p.Lock() defer p.Unlock() - for pid, peers := range p.protocolPeers { + for _, peers := range p.protocolPeers { delete(peers, peerID) - if len(peers) == 0 { - delete(p.protocolPeers, pid) - } } } @@ -55,12 +66,9 @@ func (p *ProtocolPeerCache) AddProtocols(peerID peer.ID, protocols []protocol.ID p.Lock() defer p.Unlock() for _, pid := range protocols { - peers, ok := p.protocolPeers[pid] - if !ok { - peers = make(map[peer.ID]struct{}) - p.protocolPeers[pid] = peers + if peers, ok := p.protocolPeers[pid]; ok { + peers[peerID] = struct{}{} } - peers[peerID] = struct{}{} } } @@ -68,24 +76,22 @@ func (p *ProtocolPeerCache) RemoveProtocols(peerID peer.ID, protocols []protocol p.Lock() defer p.Unlock() for _, pid := range protocols { - peers := p.protocolPeers[pid] - delete(peers, peerID) - if len(peers) == 0 { - delete(p.protocolPeers, pid) + if peers, ok := p.protocolPeers[pid]; ok { + delete(peers, peerID) } } } -func (p *ProtocolPeerCache) GetPeers(pid protocol.ID) map[peer.ID]struct{} { +func (p *ProtocolPeerCache) GetPeers(pid protocol.ID) peer.IDSlice { p.RLock() defer p.RUnlock() - // it is not safe to return a reference to the map, so we make a copy - peersCopy := make(map[peer.ID]struct{}, len(p.protocolPeers[pid])) - for peerID := range p.protocolPeers[pid] { - peersCopy[peerID] = struct{}{} + peers, ok := p.protocolPeers[pid] + if !ok { + return peer.IDSlice{} } - return peersCopy + + return maps.Keys(peers) } func (p *ProtocolPeerCache) consumeSubscription(logger zerolog.Logger, h host.Host, sub event.Subscription) { diff --git a/network/p2p/node/internal/protocolPeerCache_test.go b/network/p2p/node/internal/protocolPeerCache_test.go index ffb7eaf2828..cc6d4202996 100644 --- a/network/p2p/node/internal/protocolPeerCache_test.go +++ b/network/p2p/node/internal/protocolPeerCache_test.go @@ -2,6 +2,7 @@ package internal_test import ( "context" + "slices" "testing" "time" @@ -22,10 +23,15 @@ func TestProtocolPeerCache(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() + p1 := protocol.ID("p1") + p2 := protocol.ID("p2") + p3 := protocol.ID("p3") + // create three hosts, and a pcache for the first + // the cache supports all 3 h1, err := p2pbuilder.DefaultLibP2PHost(unittest.DefaultAddress, unittest.KeyFixture(crypto.ECDSASecp256k1)) require.NoError(t, err) - pcache, err := internal.NewProtocolPeerCache(zerolog.Nop(), h1) + pcache, err := internal.NewProtocolPeerCache(zerolog.Nop(), h1, []protocol.ID{p1, p2, p3}) require.NoError(t, err) h2, err := p2pbuilder.DefaultLibP2PHost(unittest.DefaultAddress, unittest.KeyFixture(crypto.ECDSASecp256k1)) require.NoError(t, err) @@ -33,9 +39,6 @@ func TestProtocolPeerCache(t *testing.T) { require.NoError(t, err) // register each host on a separate protocol - p1 := protocol.ID("p1") - p2 := protocol.ID("p2") - p3 := protocol.ID("p3") noopHandler := func(s network.Stream) {} h1.SetStreamHandler(p1, noopHandler) h2.SetStreamHandler(p2, noopHandler) @@ -50,8 +53,8 @@ func TestProtocolPeerCache(t *testing.T) { assert.Eventually(t, func() bool { peers2 := pcache.GetPeers(p2) peers3 := pcache.GetPeers(p3) - _, ok2 := peers2[h2.ID()] - _, ok3 := peers3[h3.ID()] + ok2 := slices.Contains(peers2, h2.ID()) + ok3 := slices.Contains(peers3, h3.ID()) return len(peers2) == 1 && len(peers3) == 1 && ok2 && ok3 }, 3*time.Second, 50*time.Millisecond) @@ -64,15 +67,16 @@ func TestProtocolPeerCache(t *testing.T) { }, 3*time.Second, 50*time.Millisecond) // add support for p4 on h2 and h3 + // note: pcache does NOT support p4 and should not cache it p4 := protocol.ID("p4") h2.SetStreamHandler(p4, noopHandler) h3.SetStreamHandler(p4, noopHandler) - // check that h1's pcache reflects the change - assert.Eventually(t, func() bool { + // check that h1's pcache never contains p4 + assert.Never(t, func() bool { peers4 := pcache.GetPeers(p4) - _, ok2 := peers4[h2.ID()] - _, ok3 := peers4[h3.ID()] + ok2 := slices.Contains(peers4, h2.ID()) + ok3 := slices.Contains(peers4, h3.ID()) return len(peers4) == 2 && ok2 && ok3 - }, 3*time.Second, 50*time.Millisecond) + }, 1*time.Second, 50*time.Millisecond) } diff --git a/network/p2p/node/libp2pNode.go b/network/p2p/node/libp2pNode.go index c65455c0d88..05069106f86 100644 --- a/network/p2p/node/libp2pNode.go +++ b/network/p2p/node/libp2pNode.go @@ -82,7 +82,7 @@ func NewNode(cfg *p2p.NodeConfig) (*Node, error) { return nil, fmt.Errorf("invalid config: %w", err) } - pCache, err := nodeinternal.NewProtocolPeerCache(cfg.Logger, cfg.Host) + pCache, err := nodeinternal.NewProtocolPeerCache(cfg.Logger, cfg.Host, cfg.ProtocolPeerCacheList) if err != nil { return nil, fmt.Errorf("failed to create protocol peer cache: %w", err) } @@ -182,12 +182,7 @@ func (n *Node) RemovePeer(peerID peer.ID) error { // GetPeersForProtocol returns slice peer IDs for the specified protocol ID. func (n *Node) GetPeersForProtocol(pid protocol.ID) peer.IDSlice { - pMap := n.pCache.GetPeers(pid) - peers := make(peer.IDSlice, 0, len(pMap)) - for p := range pMap { - peers = append(peers, p) - } - return peers + return n.pCache.GetPeers(pid) } // OpenAndWriteOnStream opens a new stream to a peer. The stream is opened to the given peerID diff --git a/network/p2p/node/libp2pNode_test.go b/network/p2p/node/libp2pNode_test.go index d53fabb0e17..04c25e4694a 100644 --- a/network/p2p/node/libp2pNode_test.go +++ b/network/p2p/node/libp2pNode_test.go @@ -265,21 +265,12 @@ func TestCreateStream_SinglePairwiseConnection(t *testing.T) { p2ptest.StartNodes(t, signalerCtx, nodes) defer p2ptest.StopNodes(t, nodes, cancel) - ctxWithTimeout, cancel := context.WithTimeout(ctx, 3*time.Second) - defer cancel() - done := make(chan struct{}) numOfStreamsPerNode := 100 // create large number of streamChan per node per connection to ensure the resource manager does not cause starvation of resources expectedTotalNumOfStreams := 600 // create a number of streamChan concurrently between each node streamChan := make(chan network.Stream, expectedTotalNumOfStreams) - - go createConcurrentStreams(t, ctxWithTimeout, nodes, ids, numOfStreamsPerNode, streamChan, done) - unittest.RequireCloseBefore(t, done, 5*time.Second, "could not create streamChan on time") - require.Len(t, - streamChan, - expectedTotalNumOfStreams, - fmt.Sprintf("expected %d total number of streamChan created got %d", expectedTotalNumOfStreams, len(streamChan))) + createConcurrentStreams(t, ctx, nodes, ids, numOfStreamsPerNode, streamChan, expectedTotalNumOfStreams) // ensure only a single connection exists between all nodes ensureSinglePairwiseConnection(t, nodes) @@ -287,8 +278,18 @@ func TestCreateStream_SinglePairwiseConnection(t *testing.T) { } // createStreams will attempt to create n number of streams concurrently between each combination of node pairs. -func createConcurrentStreams(t *testing.T, ctx context.Context, nodes []p2p.LibP2PNode, ids flow.IdentityList, n int, streams chan network.Stream, done chan struct{}) { - defer close(done) +func createConcurrentStreams(t *testing.T, ctx context.Context, nodes []p2p.LibP2PNode, ids flow.IdentityList, n int, streams chan network.Stream, expectedTotalNumOfStreams int) { + ctx, cancel := context.WithCancel(ctx) + // cancel called below to shutdown all streams + + streamHandler := func(stream network.Stream) error { + streams <- stream + + // wait for the done signal to close the stream + <-ctx.Done() + return nil + } + var wg sync.WaitGroup for _, this := range nodes { for i, other := range nodes { @@ -304,13 +305,7 @@ func createConcurrentStreams(t *testing.T, ctx context.Context, nodes []p2p.LibP wg.Add(1) go func(sender p2p.LibP2PNode) { defer wg.Done() - err := sender.OpenAndWriteOnStream(ctx, pInfo.ID, t.Name(), func(stream network.Stream) error { - streams <- stream - - // wait for the done signal to close the stream - <-ctx.Done() - return nil - }) + err := sender.OpenAndWriteOnStream(ctx, pInfo.ID, t.Name(), streamHandler) require.NoError(t, err) }(this) } @@ -319,7 +314,21 @@ func createConcurrentStreams(t *testing.T, ctx context.Context, nodes []p2p.LibP // in 2 connections 1 created by each node, this happens because we are calling CreateStream concurrently. time.Sleep(500 * time.Millisecond) } - unittest.RequireReturnsBefore(t, wg.Wait, 3*time.Second, "could not create streams on time") + + // pause until all streams are created + require.Eventually(t, func() bool { + return len(streams) >= expectedTotalNumOfStreams + }, 3*time.Second, 10*time.Millisecond, "could not create streams on time") + + require.Len(t, + streams, + expectedTotalNumOfStreams, + fmt.Sprintf("expected %d total number of streamChan created got %d", expectedTotalNumOfStreams, len(streams))) + + // cancel the context to trigger streams to shutdown + cancel() + + unittest.RequireReturnsBefore(t, wg.Wait, 1*time.Second, "could not shutdown streams on time") } // ensureSinglePairwiseConnection ensure each node in the list has exactly one connection to every other node in the list. diff --git a/network/p2p/pubsub.go b/network/p2p/pubsub.go index acc860c6dec..c62cd114216 100644 --- a/network/p2p/pubsub.go +++ b/network/p2p/pubsub.go @@ -85,6 +85,7 @@ type PubSubAdapterConfig interface { WithScoreTracer(tracer PeerScoreTracer) WithRpcInspector(GossipSubRPCInspector) WithPeerGater(topicDeliveryWeights map[string]float64, sourceDecay time.Duration) + WithValidateQueueSize(int) } // GossipSubRPCInspector abstracts the general behavior of an app specific RPC inspector specifically diff --git a/network/p2p/test/fixtures.go b/network/p2p/test/fixtures.go index b765f6a823b..4e40344d5c8 100644 --- a/network/p2p/test/fixtures.go +++ b/network/p2p/test/fixtures.go @@ -73,11 +73,13 @@ func NetworkingKeyFixtures(t *testing.T) crypto.PrivateKey { // NodeFixture is a test fixture that creates a single libp2p node with the given key, spork id, and options. // It returns the node and its identity. -func NodeFixture(t *testing.T, +func NodeFixture( + t *testing.T, sporkID flow.Identifier, dhtPrefix string, idProvider module.IdentityProvider, - opts ...NodeFixtureParameterOption) (p2p.LibP2PNode, flow.Identity) { + opts ...NodeFixtureParameterOption, +) (p2p.LibP2PNode, flow.Identity) { defaultFlowConfig, err := config.DefaultConfig() require.NoError(t, err) @@ -183,6 +185,10 @@ func NodeFixture(t *testing.T, builder.SetConnectionManager(parameters.ConnManager) } + if parameters.ValidateQueueSize > 0 { + builder.OverrideDefaultValidateQueueSize(parameters.ValidateQueueSize) + } + n, err := builder.Build() require.NoError(t, err) @@ -248,6 +254,7 @@ type NodeFixtureParameters struct { GossipSubRpcInspectorFactory p2p.GossipSubRpcInspectorFactoryFunc FlowConfig *config.FlowConfig UnicastRateLimiterDistributor p2p.UnicastRateLimiterDistributor + ValidateQueueSize int } func WithUnicastRateLimitDistributor(distributor p2p.UnicastRateLimiterDistributor) NodeFixtureParameterOption { @@ -381,6 +388,14 @@ func WithUnicastHandlerFunc(handler network.StreamHandler) NodeFixtureParameterO } } +// WithValidateQueueSize sets the size of the validation queue for the node. +// Use this to set a higher value to prevent message loss during tests +func WithValidateQueueSize(size int) NodeFixtureParameterOption { + return func(p *NodeFixtureParameters) { + p.ValidateQueueSize = size + } +} + // PeerManagerConfigFixture is a test fixture that sets the default config for the peer manager. func PeerManagerConfigFixture(opts ...func(*p2pbuilderconfig.PeerManagerConfig)) *p2pbuilderconfig.PeerManagerConfig { cfg := &p2pbuilderconfig.PeerManagerConfig{ diff --git a/network/test/cohort1/network_test.go b/network/test/cohort1/network_test.go index 723df438960..5846167f934 100644 --- a/network/test/cohort1/network_test.go +++ b/network/test/cohort1/network_test.go @@ -25,6 +25,7 @@ import ( "github.com/onflow/flow-go/model/flow/filter" libp2pmessage "github.com/onflow/flow-go/model/libp2p/message" "github.com/onflow/flow-go/model/messages" + "github.com/onflow/flow-go/module/counters" "github.com/onflow/flow-go/module/irrecoverable" "github.com/onflow/flow-go/module/metrics" "github.com/onflow/flow-go/module/observable" @@ -199,7 +200,7 @@ func (suite *NetworkTestSuite) TestUpdateNodeAddresses() { // create a new staked identity ids, libP2PNodes := testutils.LibP2PNodeForNetworkFixture(suite.T(), suite.sporkId, 1) - idProvider := unittest.NewUpdatableIDProvider(ids) + idProvider := unittest.NewUpdatableIDProvider(append(suite.ids, ids...)) networkCfg := testutils.NetworkConfigFixture( suite.T(), *ids[0], @@ -213,10 +214,10 @@ func (suite *NetworkTestSuite) TestUpdateNodeAddresses() { // start up nodes and peer managers testutils.StartNodes(irrecoverableCtx, suite.T(), libP2PNodes) - defer testutils.StopComponents(suite.T(), libP2PNodes, 1*time.Second) + defer testutils.StopComponents(suite.T(), libP2PNodes, 2*time.Second) newNet.Start(irrecoverableCtx) - defer testutils.StopComponents(suite.T(), []network.EngineRegistry{newNet}, 1*time.Second) + defer testutils.StopComponents(suite.T(), []network.EngineRegistry{newNet}, 2*time.Second) unittest.RequireComponentsReadyBefore(suite.T(), 1*time.Second, newNet) idList := flow.IdentityList(append(suite.ids, newId)) @@ -224,25 +225,35 @@ func (suite *NetworkTestSuite) TestUpdateNodeAddresses() { // needed to enable ID translation suite.providers[0].SetIdentities(idList) - // unicast should fail to send because no address is known yet for the new identity - con, err := suite.networks[0].Register(channels.TestNetworkChannel, &mocknetwork.MessageProcessor{}) - require.NoError(suite.T(), err) - err = con.Unicast(&libp2pmessage.TestMessage{ + message := &libp2pmessage.TestMessage{ Text: "TestUpdateNodeAddresses", - }, newId.NodeID) + } + + senderID := suite.ids[0].ID() + senderMessageProcessor := mocknetwork.NewMessageProcessor(suite.T()) + receiverMessageProcessor := mocknetwork.NewMessageProcessor(suite.T()) + receiverMessageProcessor. + On("Process", channels.TestNetworkChannel, senderID, message). + Return(nil). + Maybe() // we may not actually process this message depending on how fast runs + + con, err := suite.networks[0].Register(channels.TestNetworkChannel, senderMessageProcessor) + require.NoError(suite.T(), err) + _, err = newNet.Register(channels.TestNetworkChannel, receiverMessageProcessor) + require.NoError(suite.T(), err) + + // unicast should fail to send because no address is known yet for the new identity + err = con.Unicast(message, newId.NodeID) require.True(suite.T(), strings.Contains(err.Error(), swarm.ErrNoAddresses.Error())) // update the addresses suite.networks[0].UpdateNodeAddresses() // now the message should send successfully - err = con.Unicast(&libp2pmessage.TestMessage{ - Text: "TestUpdateNodeAddresses", - }, newId.NodeID) + err = con.Unicast(message, newId.NodeID) require.NoError(suite.T(), err) cancel() - unittest.RequireComponentsReadyBefore(suite.T(), 1*time.Second, newNet) } func (suite *NetworkTestSuite) TestUnicastRateLimit_Messages() { @@ -469,10 +480,14 @@ func (suite *NetworkTestSuite) TestUnicastRateLimit_Bandwidth() { unittest.RequireComponentsReadyBefore(suite.T(), 1*time.Second, newNet) // registers an engine on the new network so that it can receive messages on the TestNetworkChannel - newEngine := &mocknetwork.MessageProcessor{} + newEngine := mocknetwork.NewMessageProcessor(suite.T()) _, err = newNet.Register(channels.TestNetworkChannel, newEngine) require.NoError(suite.T(), err) - newEngine.On("Process", channels.TestNetworkChannel, suite.ids[0].NodeID, mockery.Anything).Return(nil) + + callCount := counters.NewMonotonousCounter(0) + newEngine.On("Process", channels.TestNetworkChannel, suite.ids[0].NodeID, mockery.Anything).Run(func(args mockery.Arguments) { + _ = callCount.Increment() + }).Return(nil) idList := flow.IdentityList(append(suite.ids, newId)) @@ -489,24 +504,44 @@ func (suite *NetworkTestSuite) TestUnicastRateLimit_Bandwidth() { p2ptest.LetNodesDiscoverEachOther(suite.T(), ctx, []p2p.LibP2PNode{libP2PNodes[0], suite.libP2PNodes[0]}, flow.IdentityList{ids[0], suite.ids[0]}) // create message with about 400bytes (300 random bytes + 100bytes message info) - b := make([]byte, 300) - for i := range b { - b[i] = byte('X') + generate := func(letter rune) string { + b := make([]byte, 300) + for i := range b { + b[i] = byte(letter) + } + return string(b) } + // send 3 messages at once with a size of 400 bytes each. The third message will be rate limited // as it is more than our allowed bandwidth of 1000 bytes. - con0, err := suite.networks[0].Register(channels.TestNetworkChannel, &mocknetwork.MessageProcessor{}) + con0, err := suite.networks[0].Register(channels.TestNetworkChannel, mocknetwork.NewMessageProcessor(suite.T())) require.NoError(suite.T(), err) - for i := 0; i < 3; i++ { - err = con0.Unicast(&libp2pmessage.TestMessage{ - Text: string(b), - }, newId.NodeID) - require.NoError(suite.T(), err) + + err = con0.Unicast(&libp2pmessage.TestMessage{ + Text: generate('A'), + }, newId.NodeID) + require.NoError(suite.T(), err) + + err = con0.Unicast(&libp2pmessage.TestMessage{ + Text: generate('B'), + }, newId.NodeID) + require.NoError(suite.T(), err) + + // this message will be rate limited. The remote node will reset the stream, so depending on how + // quickly the send happens, we may get an error from attempting to close a reset stream + err = con0.Unicast(&libp2pmessage.TestMessage{ + Text: generate('C'), + }, newId.NodeID) + if err != nil { + require.Contains(suite.T(), err.Error(), "stream reset") } // wait for all rate limits before shutting down network unittest.RequireCloseBefore(suite.T(), ch, 100*time.Millisecond, "could not stop on rate limit test ch on time") + // remote node should have received the first 2 messages + assert.Equal(suite.T(), uint64(2), callCount.Value()) + // sleep for 1 seconds to allow connection pruner to prune connections time.Sleep(1 * time.Second) @@ -522,6 +557,10 @@ func (suite *NetworkTestSuite) TestUnicastRateLimit_Bandwidth() { return err == nil }, 5*time.Second, 100*time.Millisecond) + require.Eventually(suite.T(), func() bool { + return callCount.Value() == 3 + }, 1*time.Second, 100*time.Millisecond) + // shutdown our network so that each message can be processed cancel() unittest.RequireComponentsDoneBefore(suite.T(), 5*time.Second, newNet) diff --git a/storage/badger/consumer_progress.go b/storage/badger/consumer_progress.go deleted file mode 100644 index 52855dd60b1..00000000000 --- a/storage/badger/consumer_progress.go +++ /dev/null @@ -1,50 +0,0 @@ -package badger - -import ( - "fmt" - - "github.com/dgraph-io/badger/v2" - - "github.com/onflow/flow-go/storage/badger/operation" -) - -type ConsumerProgress struct { - db *badger.DB - consumer string // to distinguish the consume progress between different consumers -} - -func NewConsumerProgress(db *badger.DB, consumer string) *ConsumerProgress { - return &ConsumerProgress{ - db: db, - consumer: consumer, - } -} - -func (cp *ConsumerProgress) ProcessedIndex() (uint64, error) { - var processed uint64 - err := cp.db.View(operation.RetrieveProcessedIndex(cp.consumer, &processed)) - if err != nil { - return 0, fmt.Errorf("failed to retrieve processed index: %w", err) - } - return processed, nil -} - -// InitProcessedIndex insert the default processed index to the storage layer, can only be done once. -// initialize for the second time will return storage.ErrAlreadyExists -func (cp *ConsumerProgress) InitProcessedIndex(defaultIndex uint64) error { - err := operation.RetryOnConflict(cp.db.Update, operation.InsertProcessedIndex(cp.consumer, defaultIndex)) - if err != nil { - return fmt.Errorf("could not update processed index: %w", err) - } - - return nil -} - -func (cp *ConsumerProgress) SetProcessedIndex(processed uint64) error { - err := operation.RetryOnConflict(cp.db.Update, operation.SetProcessedIndex(cp.consumer, processed)) - if err != nil { - return fmt.Errorf("could not update processed index: %w", err) - } - - return nil -} diff --git a/storage/badger/operation/jobs.go b/storage/badger/operation/jobs.go index 0f9eb3166ad..1bad48f752f 100644 --- a/storage/badger/operation/jobs.go +++ b/storage/badger/operation/jobs.go @@ -27,17 +27,3 @@ func RetrieveJobAtIndex(queue string, index uint64, entity *flow.Identifier) fun func InsertJobAtIndex(queue string, index uint64, entity flow.Identifier) func(*badger.Txn) error { return insert(makePrefix(codeJobQueue, queue, index), entity) } - -// RetrieveProcessedIndex returns the processed index for a job consumer -func RetrieveProcessedIndex(jobName string, processed *uint64) func(*badger.Txn) error { - return retrieve(makePrefix(codeJobConsumerProcessed, jobName), processed) -} - -func InsertProcessedIndex(jobName string, processed uint64) func(*badger.Txn) error { - return insert(makePrefix(codeJobConsumerProcessed, jobName), processed) -} - -// SetProcessedIndex updates the processed index for a job consumer with given index -func SetProcessedIndex(jobName string, processed uint64) func(*badger.Txn) error { - return update(makePrefix(codeJobConsumerProcessed, jobName), processed) -} diff --git a/storage/consumer_progress.go b/storage/consumer_progress.go index bd99926ba32..9655bd8a95c 100644 --- a/storage/consumer_progress.go +++ b/storage/consumer_progress.go @@ -1,13 +1,22 @@ package storage +// ConsumerProgressInitializer is a helper to initialize the consumer progress index in storage +// It prevents the consumer from being used before initialization +type ConsumerProgressInitializer interface { + // Initialize takes a default index and initializes the consumer progress index in storage + // Initialize must be concurrent safe, meaning if called by different modules, should only + // initialize once. + Initialize(defaultIndex uint64) (ConsumerProgress, error) +} + // ConsumerProgress reads and writes the last processed index of the job in the job queue +// It must be created by the ConsumerProgressInitializer, so that it can guarantee +// the ProcessedIndex and SetProcessedIndex methods are safe to use. type ConsumerProgress interface { // read the current processed index + // any error returned are exceptions ProcessedIndex() (uint64, error) - // insert the default processed index to the storage layer, can only be done once. - // initialize for the second time will return storage.ErrAlreadyExists - InitProcessedIndex(defaultIndex uint64) error // update the processed index in the storage layer. - // it will fail if InitProcessedIndex was never called. + // any error returned are exceptions SetProcessedIndex(processed uint64) error } diff --git a/storage/mock/consumer_progress.go b/storage/mock/consumer_progress.go index 591fbd39af7..6a865c61ab2 100644 --- a/storage/mock/consumer_progress.go +++ b/storage/mock/consumer_progress.go @@ -9,24 +9,6 @@ type ConsumerProgress struct { mock.Mock } -// InitProcessedIndex provides a mock function with given fields: defaultIndex -func (_m *ConsumerProgress) InitProcessedIndex(defaultIndex uint64) error { - ret := _m.Called(defaultIndex) - - if len(ret) == 0 { - panic("no return value specified for InitProcessedIndex") - } - - var r0 error - if rf, ok := ret.Get(0).(func(uint64) error); ok { - r0 = rf(defaultIndex) - } else { - r0 = ret.Error(0) - } - - return r0 -} - // ProcessedIndex provides a mock function with given fields: func (_m *ConsumerProgress) ProcessedIndex() (uint64, error) { ret := _m.Called() diff --git a/storage/mock/consumer_progress_initializer.go b/storage/mock/consumer_progress_initializer.go new file mode 100644 index 00000000000..7e88ba01b68 --- /dev/null +++ b/storage/mock/consumer_progress_initializer.go @@ -0,0 +1,57 @@ +// Code generated by mockery v2.43.2. DO NOT EDIT. + +package mock + +import ( + storage "github.com/onflow/flow-go/storage" + mock "github.com/stretchr/testify/mock" +) + +// ConsumerProgressInitializer is an autogenerated mock type for the ConsumerProgressInitializer type +type ConsumerProgressInitializer struct { + mock.Mock +} + +// Initialize provides a mock function with given fields: defaultIndex +func (_m *ConsumerProgressInitializer) Initialize(defaultIndex uint64) (storage.ConsumerProgress, error) { + ret := _m.Called(defaultIndex) + + if len(ret) == 0 { + panic("no return value specified for Initialize") + } + + var r0 storage.ConsumerProgress + var r1 error + if rf, ok := ret.Get(0).(func(uint64) (storage.ConsumerProgress, error)); ok { + return rf(defaultIndex) + } + if rf, ok := ret.Get(0).(func(uint64) storage.ConsumerProgress); ok { + r0 = rf(defaultIndex) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(storage.ConsumerProgress) + } + } + + if rf, ok := ret.Get(1).(func(uint64) error); ok { + r1 = rf(defaultIndex) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// NewConsumerProgressInitializer creates a new instance of ConsumerProgressInitializer. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewConsumerProgressInitializer(t interface { + mock.TestingT + Cleanup(func()) +}) *ConsumerProgressInitializer { + mock := &ConsumerProgressInitializer{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/storage/operation/approvals.go b/storage/operation/approvals.go new file mode 100644 index 00000000000..df38135677b --- /dev/null +++ b/storage/operation/approvals.go @@ -0,0 +1,48 @@ +package operation + +import ( + "github.com/onflow/flow-go/model/flow" + "github.com/onflow/flow-go/storage" +) + +// InsertResultApproval inserts a ResultApproval by ID. +// The same key (`approval.ID()`) necessitates that the value (full `approval`) is +// also identical (otherwise, we would have a successful pre-image attack on our +// cryptographic hash function). Therefore, concurrent calls to this function are safe. +func InsertResultApproval(w storage.Writer, approval *flow.ResultApproval) error { + return UpsertByKey(w, MakePrefix(codeResultApproval, approval.ID()), approval) +} + +// RetrieveResultApproval retrieves an approval by ID. +// Returns `storage.ErrNotFound` if no Approval with the given ID has been stored. +func RetrieveResultApproval(r storage.Reader, approvalID flow.Identifier, approval *flow.ResultApproval) error { + return RetrieveByKey(r, MakePrefix(codeResultApproval, approvalID), approval) +} + +// UnsafeIndexResultApproval inserts a ResultApproval ID keyed by ExecutionResult ID +// and chunk index. +// Unsafe means that it does not check if a different approval is indexed for the same +// chunk, and will overwrite the existing index. +// CAUTION: +// - In general, the Flow protocol requires multiple approvals for the same chunk from different +// verification nodes. In other words, there are multiple different approvals for the same chunk. +// Therefore, this index Executed Chunk ➜ ResultApproval ID is *only safe* to be used by +// Verification Nodes for tracking their own approvals (for the same ExecutionResult, a Verifier +// will always produce the same approval) +// - In order to make sure only one approval is indexed for the chunk, _all calls_ to +// `UnsafeIndexResultApproval` must be synchronized by the higher-logic. Currently, we have the +// convention that `store.ResultApprovals` is the only place that is allowed to call this method. +func UnsafeIndexResultApproval(w storage.Writer, resultID flow.Identifier, chunkIndex uint64, approvalID flow.Identifier) error { + return UpsertByKey(w, MakePrefix(codeIndexResultApprovalByChunk, resultID, chunkIndex), approvalID) +} + +// LookupResultApproval finds a ResultApproval by result ID and chunk index. +// Returns `storage.ErrNotFound` if no Approval for the given key (resultID, chunkIndex) has been stored. +// +// NOTE that the Flow protocol requires multiple approvals for the same chunk from different verification +// nodes. In other words, there are multiple different approvals for the same chunk. Therefore, the index +// Executed Chunk ➜ ResultApproval ID (queried here) is *only safe* to be used by Verification Nodes +// for tracking their own approvals (for the same ExecutionResult, a Verifier will always produce the same approval) +func LookupResultApproval(r storage.Reader, resultID flow.Identifier, chunkIndex uint64, approvalID *flow.Identifier) error { + return RetrieveByKey(r, MakePrefix(codeIndexResultApprovalByChunk, resultID, chunkIndex), approvalID) +} diff --git a/storage/operation/consume_progress.go b/storage/operation/consume_progress.go new file mode 100644 index 00000000000..177f9a79f30 --- /dev/null +++ b/storage/operation/consume_progress.go @@ -0,0 +1,15 @@ +package operation + +import ( + "github.com/onflow/flow-go/storage" +) + +// RetrieveProcessedIndex returns the processed index for a job consumer +func RetrieveProcessedIndex(r storage.Reader, jobName string, processed *uint64) error { + return RetrieveByKey(r, MakePrefix(codeJobConsumerProcessed, jobName), processed) +} + +// SetProcessedIndex updates the processed index for a job consumer with given index +func SetProcessedIndex(w storage.Writer, jobName string, processed uint64) error { + return UpsertByKey(w, MakePrefix(codeJobConsumerProcessed, jobName), processed) +} diff --git a/storage/pebble/consumer_progress.go b/storage/pebble/consumer_progress.go deleted file mode 100644 index 37448bb4b5f..00000000000 --- a/storage/pebble/consumer_progress.go +++ /dev/null @@ -1,50 +0,0 @@ -package pebble - -import ( - "fmt" - - "github.com/cockroachdb/pebble" - - "github.com/onflow/flow-go/storage/pebble/operation" -) - -type ConsumerProgress struct { - db *pebble.DB - consumer string // to distinguish the consume progress between different consumers -} - -func NewConsumerProgress(db *pebble.DB, consumer string) *ConsumerProgress { - return &ConsumerProgress{ - db: db, - consumer: consumer, - } -} - -func (cp *ConsumerProgress) ProcessedIndex() (uint64, error) { - var processed uint64 - err := operation.RetrieveProcessedIndex(cp.consumer, &processed)(cp.db) - if err != nil { - return 0, fmt.Errorf("failed to retrieve processed index: %w", err) - } - return processed, nil -} - -// InitProcessedIndex insert the default processed index to the storage layer, can only be done once. -// initialize for the second time will return storage.ErrAlreadyExists -func (cp *ConsumerProgress) InitProcessedIndex(defaultIndex uint64) error { - err := operation.InsertProcessedIndex(cp.consumer, defaultIndex)(cp.db) - if err != nil { - return fmt.Errorf("could not update processed index: %w", err) - } - - return nil -} - -func (cp *ConsumerProgress) SetProcessedIndex(processed uint64) error { - err := operation.SetProcessedIndex(cp.consumer, processed)(cp.db) - if err != nil { - return fmt.Errorf("could not update processed index: %w", err) - } - - return nil -} diff --git a/storage/pebble/operation/common.go b/storage/pebble/operation/common.go deleted file mode 100644 index ad9e96c2c8b..00000000000 --- a/storage/pebble/operation/common.go +++ /dev/null @@ -1,50 +0,0 @@ -package operation - -import ( - "errors" - - "github.com/cockroachdb/pebble" - "github.com/vmihailenco/msgpack" - - "github.com/onflow/flow-go/module/irrecoverable" - "github.com/onflow/flow-go/storage" -) - -func insert(key []byte, val interface{}) func(pebble.Writer) error { - return func(w pebble.Writer) error { - value, err := msgpack.Marshal(val) - if err != nil { - return irrecoverable.NewExceptionf("failed to encode value: %w", err) - } - - err = w.Set(key, value, nil) - if err != nil { - return irrecoverable.NewExceptionf("failed to store data: %w", err) - } - - return nil - } -} - -func retrieve(key []byte, sc interface{}) func(r pebble.Reader) error { - return func(r pebble.Reader) error { - val, closer, err := r.Get(key) - if err != nil { - return convertNotFoundError(err) - } - defer closer.Close() - - err = msgpack.Unmarshal(val, &sc) - if err != nil { - return irrecoverable.NewExceptionf("failed to decode value: %w", err) - } - return nil - } -} - -func convertNotFoundError(err error) error { - if errors.Is(err, pebble.ErrNotFound) { - return storage.ErrNotFound - } - return err -} diff --git a/storage/pebble/operation/jobs.go b/storage/pebble/operation/jobs.go deleted file mode 100644 index d18d3f39446..00000000000 --- a/storage/pebble/operation/jobs.go +++ /dev/null @@ -1,19 +0,0 @@ -package operation - -import ( - "github.com/cockroachdb/pebble" -) - -// RetrieveProcessedIndex returns the processed index for a job consumer -func RetrieveProcessedIndex(jobName string, processed *uint64) func(pebble.Reader) error { - return retrieve(makePrefix(codeJobConsumerProcessed, jobName), processed) -} - -func InsertProcessedIndex(jobName string, processed uint64) func(pebble.Writer) error { - return insert(makePrefix(codeJobConsumerProcessed, jobName), processed) -} - -// SetProcessedIndex updates the processed index for a job consumer with given index -func SetProcessedIndex(jobName string, processed uint64) func(pebble.Writer) error { - return insert(makePrefix(codeJobConsumerProcessed, jobName), processed) -} diff --git a/storage/store/approvals.go b/storage/store/approvals.go new file mode 100644 index 00000000000..c68a83219c4 --- /dev/null +++ b/storage/store/approvals.go @@ -0,0 +1,129 @@ +package store + +import ( + "errors" + "fmt" + "sync" + + "github.com/onflow/flow-go/model/flow" + "github.com/onflow/flow-go/module" + "github.com/onflow/flow-go/module/metrics" + "github.com/onflow/flow-go/storage" + "github.com/onflow/flow-go/storage/operation" +) + +// ResultApprovals implements persistent storage for result approvals. +// +// CAUTION suitable only for _Verification Nodes_ for persisting their _own_ approvals! +// - In general, the Flow protocol requires multiple approvals for the same chunk from different +// verification nodes. In other words, there are multiple different approvals for the same chunk. +// - Internally, ResultApprovals populates an index from Executed Chunk ➜ ResultApproval. This is +// *only safe* for Verification Nodes when tracking their own approvals (for the same ExecutionResult, +// a Verifier will always produce the same approval) +type ResultApprovals struct { + db storage.DB + cache *Cache[flow.Identifier, *flow.ResultApproval] + indexing *sync.Mutex // preventing concurrent indexing of approvals +} + +var _ storage.ResultApprovals = (*ResultApprovals)(nil) + +func NewResultApprovals(collector module.CacheMetrics, db storage.DB) *ResultApprovals { + store := func(rw storage.ReaderBatchWriter, key flow.Identifier, val *flow.ResultApproval) error { + return operation.InsertResultApproval(rw.Writer(), val) + } + + retrieve := func(r storage.Reader, approvalID flow.Identifier) (*flow.ResultApproval, error) { + var approval flow.ResultApproval + err := operation.RetrieveResultApproval(r, approvalID, &approval) + return &approval, err + } + + return &ResultApprovals{ + db: db, + cache: newCache(collector, metrics.ResourceResultApprovals, + withLimit[flow.Identifier, *flow.ResultApproval](flow.DefaultTransactionExpiry+100), + withStore(store), + withRetrieve(retrieve)), + indexing: new(sync.Mutex), + } +} + +// Store stores a ResultApproval +func (r *ResultApprovals) Store(approval *flow.ResultApproval) error { + return r.db.WithReaderBatchWriter(func(rw storage.ReaderBatchWriter) error { + return r.cache.PutTx(rw, approval.ID(), approval) + }) +} + +// Index indexes a ResultApproval by chunk (ResultID + chunk index). +// This operation is idempotent (repeated calls with the same value are equivalent to +// just calling the method once; still the method succeeds on each call). +// +// CAUTION: the Flow protocol requires multiple approvals for the same chunk from different verification +// nodes. In other words, there are multiple different approvals for the same chunk. Therefore, the index +// Executed Chunk ➜ ResultApproval ID (populated here) is *only safe* to be used by Verification Nodes +// for tracking their own approvals. +func (r *ResultApprovals) Index(resultID flow.Identifier, chunkIndex uint64, approvalID flow.Identifier) error { + // For the same ExecutionResult, a correct Verifier will always produce the same approval. In other words, + // if we have already indexed an approval for the pair (resultID, chunkIndex) we should never overwrite it + // with a _different_ approval. We explicitly enforce that here to prevent state corruption. + // The lock guarantees that no other thread can concurrently update the index. Thereby confirming that no value + // is already stored for the given key (resultID, chunkIndex) and then updating the index (or aborting) is + // synchronized into one atomic operation. + r.indexing.Lock() + defer r.indexing.Unlock() + + err := r.db.WithReaderBatchWriter(func(rw storage.ReaderBatchWriter) error { + var storedApprovalID flow.Identifier + err := operation.LookupResultApproval(rw.GlobalReader(), resultID, chunkIndex, &storedApprovalID) + if err != nil { + if !errors.Is(err, storage.ErrNotFound) { + return fmt.Errorf("could not lookup result approval ID: %w", err) + } + + // no approval found, index the approval + + return operation.UnsafeIndexResultApproval(rw.Writer(), resultID, chunkIndex, approvalID) + } + + // an approval is already indexed, double check if it is the same + // We don't allow indexing multiple approvals per chunk because the + // store is only used within Verification nodes, and it is impossible + // for a Verification node to compute different approvals for the same + // chunk. + + if storedApprovalID != approvalID { + return fmt.Errorf("attempting to store conflicting approval (result: %v, chunk index: %d): storing: %v, stored: %v. %w", + resultID, chunkIndex, approvalID, storedApprovalID, storage.ErrDataMismatch) + } + + return nil + }) + + if err != nil { + return fmt.Errorf("could not index result approval: %w", err) + } + return nil +} + +// ByID retrieves a ResultApproval by its ID +func (r *ResultApprovals) ByID(approvalID flow.Identifier) (*flow.ResultApproval, error) { + val, err := r.cache.Get(r.db.Reader(), approvalID) + if err != nil { + return nil, err + } + return val, nil +} + +// ByChunk retrieves a ResultApproval by result ID and chunk index. The +// ResultApprovals store is only used within a verification node, where it is +// assumed that there is never more than one approval per chunk. +func (r *ResultApprovals) ByChunk(resultID flow.Identifier, chunkIndex uint64) (*flow.ResultApproval, error) { + var approvalID flow.Identifier + err := operation.LookupResultApproval(r.db.Reader(), resultID, chunkIndex, &approvalID) + if err != nil { + return nil, fmt.Errorf("could not lookup result approval ID: %w", err) + } + return r.ByID(approvalID) +} diff --git a/storage/store/approvals_test.go b/storage/store/approvals_test.go new file mode 100644 index 00000000000..05050eda3ff --- /dev/null +++ b/storage/store/approvals_test.go @@ -0,0 +1,131 @@ +package store_test + +import ( + "errors" + "sync" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/onflow/flow-go/module/metrics" + "github.com/onflow/flow-go/storage" + "github.com/onflow/flow-go/storage/operation/dbtest" + "github.com/onflow/flow-go/storage/store" + "github.com/onflow/flow-go/utils/unittest" +) + +func TestApprovalStoreAndRetrieve(t *testing.T) { + dbtest.RunWithDB(t, func(t *testing.T, db storage.DB) { + metrics := metrics.NewNoopCollector() + store := store.NewResultApprovals(metrics, db) + + approval := unittest.ResultApprovalFixture() + err := store.Store(approval) + require.NoError(t, err) + + err = store.Index(approval.Body.ExecutionResultID, approval.Body.ChunkIndex, approval.ID()) + require.NoError(t, err) + + byID, err := store.ByID(approval.ID()) + require.NoError(t, err) + require.Equal(t, approval, byID) + + byChunk, err := store.ByChunk(approval.Body.ExecutionResultID, approval.Body.ChunkIndex) + require.NoError(t, err) + require.Equal(t, approval, byChunk) + }) +} + +func TestApprovalStoreTwice(t *testing.T) { + dbtest.RunWithDB(t, func(t *testing.T, db storage.DB) { + metrics := metrics.NewNoopCollector() + store := store.NewResultApprovals(metrics, db) + + approval := unittest.ResultApprovalFixture() + err := store.Store(approval) + require.NoError(t, err) + + err = store.Index(approval.Body.ExecutionResultID, approval.Body.ChunkIndex, approval.ID()) + require.NoError(t, err) + + err = store.Store(approval) + require.NoError(t, err) + + err = store.Index(approval.Body.ExecutionResultID, approval.Body.ChunkIndex, approval.ID()) + require.NoError(t, err) + }) +} + +func TestApprovalStoreTwoDifferentApprovalsShouldFail(t *testing.T) { + dbtest.RunWithDB(t, func(t *testing.T, db storage.DB) { + metrics := metrics.NewNoopCollector() + store := store.NewResultApprovals(metrics, db) + + approval1 := unittest.ResultApprovalFixture() + approval2 := unittest.ResultApprovalFixture() + + err := store.Store(approval1) + require.NoError(t, err) + + err = store.Index(approval1.Body.ExecutionResultID, approval1.Body.ChunkIndex, approval1.ID()) + require.NoError(t, err) + + // we can store a different approval, but we can't index a different + // approval for the same chunk. + err = store.Store(approval2) + require.NoError(t, err) + + err = store.Index(approval1.Body.ExecutionResultID, approval1.Body.ChunkIndex, approval2.ID()) + require.Error(t, err) + require.True(t, errors.Is(err, storage.ErrDataMismatch)) + }) +} + +// verify that storing and indexing two conflicting approvals concurrently should be impossible; +// we expect that one operations succeeds, the other one should fail +func TestApprovalStoreTwoDifferentApprovalsConcurrently(t *testing.T) { + dbtest.RunWithDB(t, func(t *testing.T, db storage.DB) { + metrics := metrics.NewNoopCollector() + store := store.NewResultApprovals(metrics, db) + + approval1 := unittest.ResultApprovalFixture() + approval2 := unittest.ResultApprovalFixture() + + var wg sync.WaitGroup + wg.Add(2) + + var firstIndexErr, secondIndexErr error + + // First goroutine stores and indexes the first approval. + go func() { + defer wg.Done() + + err := store.Store(approval1) + require.NoError(t, err) + + firstIndexErr = store.Index(approval1.Body.ExecutionResultID, approval1.Body.ChunkIndex, approval1.ID()) + }() + + // Second goroutine stores and tries to index the second approval for the same chunk. + go func() { + defer wg.Done() + + err := store.Store(approval2) + require.NoError(t, err) + + secondIndexErr = store.Index(approval1.Body.ExecutionResultID, approval1.Body.ChunkIndex, approval2.ID()) + }() + + // Wait for both goroutines to finish + wg.Wait() + + // Check that one of the Index operations succeeded and the other failed + if firstIndexErr == nil { + require.Error(t, secondIndexErr) + require.True(t, errors.Is(secondIndexErr, storage.ErrDataMismatch)) + } else { + require.NoError(t, secondIndexErr) + require.True(t, errors.Is(firstIndexErr, storage.ErrDataMismatch)) + } + }) +} diff --git a/storage/store/cache_test.go b/storage/store/cache_test.go new file mode 100644 index 00000000000..1dcee041e11 --- /dev/null +++ b/storage/store/cache_test.go @@ -0,0 +1,174 @@ +package store + +import ( + "fmt" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "go.uber.org/atomic" + + "github.com/onflow/flow-go/model/flow" + "github.com/onflow/flow-go/module/metrics" + "github.com/onflow/flow-go/storage" + "github.com/onflow/flow-go/storage/operation" + "github.com/onflow/flow-go/storage/operation/dbtest" + "github.com/onflow/flow-go/utils/unittest" +) + +// TestCache_Exists tests existence checking items in the cache. +func TestCache_Exists(t *testing.T) { + cache := newCache[flow.Identifier, any](metrics.NewNoopCollector(), "test") + + t.Run("non-existent", func(t *testing.T) { + key := unittest.IdentifierFixture() + exists := cache.IsCached(key) + assert.False(t, exists) + }) + + t.Run("existent", func(t *testing.T) { + key := unittest.IdentifierFixture() + cache.Insert(key, unittest.RandomBytes(128)) + + exists := cache.IsCached(key) + assert.True(t, exists) + }) + + t.Run("removed", func(t *testing.T) { + key := unittest.IdentifierFixture() + // insert, then remove the item + cache.Insert(key, unittest.RandomBytes(128)) + cache.Remove(key) + + exists := cache.IsCached(key) + assert.False(t, exists) + }) +} + +// Test storing an item will be cached, and when cache hit, +// the retrieve function is only called once +func TestCache_CachedHit(t *testing.T) { + dbtest.RunWithDB(t, func(t *testing.T, db storage.DB) { + retrieved := atomic.NewUint64(0) + + store := func(rw storage.ReaderBatchWriter, key flow.Identifier, val []byte) error { + return operation.UpsertByKey(rw.Writer(), key[:], val) + } + retrieve := func(r storage.Reader, key flow.Identifier) ([]byte, error) { + retrieved.Inc() + var val []byte + err := operation.RetrieveByKey(r, key[:], &val) + if err != nil { + return nil, err + } + return val, nil + } + + cache := newCache(metrics.NewNoopCollector(), "test", + withStore(store), + withRetrieve(retrieve), + ) + + key := unittest.IdentifierFixture() + val := unittest.RandomBytes(128) + + // storing the item will cache it + require.NoError(t, db.WithReaderBatchWriter(func(rw storage.ReaderBatchWriter) error { + return cache.PutTx(rw, key, val) + })) + + // retrieving stored item should hit the cache, no db op is called + cached, err := cache.Get(db.Reader(), key) + require.NoError(t, err) + require.Equal(t, val, cached) + require.Equal(t, uint64(0), retrieved.Load()) // no db op + + // removing the cached item + cache.Remove(key) + + // Get the same item, the cached item will miss, and retrieve from db, so db op is called + cached, err = cache.Get(db.Reader(), key) + require.NoError(t, err) + require.Equal(t, val, cached) + require.Equal(t, uint64(1), retrieved.Load()) // hit db + + // Get the same item again, hit cache + _, err = cache.Get(db.Reader(), key) + require.NoError(t, err) + require.Equal(t, uint64(1), retrieved.Load()) // cache hit + + // Query other key will hit db + _, err = cache.Get(db.Reader(), unittest.IdentifierFixture()) + require.ErrorIs(t, err, storage.ErrNotFound) + }) +} + +// Test storage.ErrNotFound is returned when cache is missing +// and is not cached +func TestCache_NotFoundReturned(t *testing.T) { + dbtest.RunWithDB(t, func(t *testing.T, db storage.DB) { + retrieved := atomic.NewUint64(0) + retrieve := func(r storage.Reader, key flow.Identifier) ([]byte, error) { + retrieved.Inc() + return nil, storage.ErrNotFound + } + + cache := newCache(metrics.NewNoopCollector(), "test", + withRetrieve(retrieve), + ) + + // Create a random identifier to use as a key + notExist := unittest.IdentifierFixture() + + // Try to get the non-existent item from the cache + // Assert that the error is storage.ErrNotFound + _, err := cache.Get(db.Reader(), notExist) + require.ErrorIs(t, err, storage.ErrNotFound) + + // Get the item again, this time the cache should not be used + _, err = cache.Get(db.Reader(), notExist) + require.ErrorIs(t, err, storage.ErrNotFound) + require.Equal(t, uint64(2), retrieved.Load()) // retrieved from DB 2 times. + }) +} + +// Test when store return exception error, the key value is not cached, +func TestCache_ExceptionNotCached(t *testing.T) { + dbtest.RunWithDB(t, func(t *testing.T, db storage.DB) { + storeException := fmt.Errorf("storing exception") + stored, retrieved := atomic.NewUint64(0), atomic.NewUint64(0) + + store := func(rw storage.ReaderBatchWriter, key flow.Identifier, val []byte) error { + stored.Inc() + return storeException + } + retrieve := func(r storage.Reader, key flow.Identifier) ([]byte, error) { + retrieved.Inc() + var val []byte + err := operation.RetrieveByKey(r, key[:], &val) + if err != nil { + return nil, err + } + return val, nil + } + + cache := newCache(metrics.NewNoopCollector(), "test", + withStore(store), + withRetrieve(retrieve), + ) + + key := unittest.IdentifierFixture() + val := unittest.RandomBytes(128) + + // store returns exception err + err := db.WithReaderBatchWriter(func(rw storage.ReaderBatchWriter) error { + return cache.PutTx(rw, key, val) + }) + + require.ErrorIs(t, err, storeException) + + // assert key value is not cached + _, err = cache.Get(db.Reader(), key) + require.ErrorIs(t, err, storage.ErrNotFound) + }) +} diff --git a/storage/store/consumer_progress.go b/storage/store/consumer_progress.go new file mode 100644 index 00000000000..aaa331b6173 --- /dev/null +++ b/storage/store/consumer_progress.go @@ -0,0 +1,87 @@ +package store + +import ( + "errors" + "fmt" + "sync" + + "github.com/onflow/flow-go/storage" + "github.com/onflow/flow-go/storage/operation" +) + +// ConsumerProgressInitializer is a helper to initialize the consumer progress index in storage +// It prevents the consumer from being used before initialization +type ConsumerProgressInitializer struct { + initing sync.Mutex + progress *consumerProgress +} + +var _ storage.ConsumerProgressInitializer = (*ConsumerProgressInitializer)(nil) + +func NewConsumerProgress(db storage.DB, consumer string) *ConsumerProgressInitializer { + progress := newConsumerProgress(db, consumer) + return &ConsumerProgressInitializer{ + progress: progress, + } +} + +func (cpi *ConsumerProgressInitializer) Initialize(defaultIndex uint64) (storage.ConsumerProgress, error) { + // making sure only one process is initializing at any time. + cpi.initing.Lock() + defer cpi.initing.Unlock() + + _, err := cpi.progress.ProcessedIndex() + if err != nil { + + // if not initialized, then initialize with default index + if !errors.Is(err, storage.ErrNotFound) { + return nil, fmt.Errorf("could not retrieve processed index: %w", err) + } + + err = cpi.progress.SetProcessedIndex(defaultIndex) + if err != nil { + return nil, fmt.Errorf("could not set processed index: %w", err) + } + } + + return cpi.progress, nil +} + +type consumerProgress struct { + db storage.DB + consumer string // to distinguish the consume progress between different consumers +} + +var _ storage.ConsumerProgress = (*consumerProgress)(nil) + +func newConsumerProgress(db storage.DB, consumer string) *consumerProgress { + return &consumerProgress{ + db: db, + consumer: consumer, + } +} + +// ProcessedIndex returns the processed index for the consumer +// any error would be exception +func (cp *consumerProgress) ProcessedIndex() (uint64, error) { + var processed uint64 + err := operation.RetrieveProcessedIndex(cp.db.Reader(), cp.consumer, &processed) + if err != nil { + return 0, fmt.Errorf("failed to retrieve processed index: %w", err) + } + return processed, nil +} + +// SetProcessedIndex updates the processed index for the consumer +// any error would be exception +// The caller must use ConsumerProgressInitializer to initialize the progress index in storage +func (cp *consumerProgress) SetProcessedIndex(processed uint64) error { + err := cp.db.WithReaderBatchWriter(func(rw storage.ReaderBatchWriter) error { + return operation.SetProcessedIndex(rw.Writer(), cp.consumer, processed) + }) + if err != nil { + return fmt.Errorf("could not update processed index: %w", err) + } + + return nil +} diff --git a/storage/store/consumer_progress_test.go b/storage/store/consumer_progress_test.go new file mode 100644 index 00000000000..1fc70335bf2 --- /dev/null +++ b/storage/store/consumer_progress_test.go @@ -0,0 +1,58 @@ +package store + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/onflow/flow-go/storage" + "github.com/onflow/flow-go/storage/operation/dbtest" +) + +func TestConsumerProgressInitializer(t *testing.T) { + dbtest.RunWithDB(t, func(t *testing.T, db storage.DB) { + const testConsumer = "test_consumer" + + t.Run("Initialize with default index", func(t *testing.T) { + cpi := NewConsumerProgress(db, testConsumer) + progress, err := cpi.Initialize(100) + require.NoError(t, err) + + index, err := progress.ProcessedIndex() + require.NoError(t, err) + assert.Equal(t, uint64(100), index) + }) + + t.Run("Initialize when already initialized", func(t *testing.T) { + cpi := NewConsumerProgress(db, testConsumer) + + // First initialization + _, err := cpi.Initialize(100) + require.NoError(t, err) + + // Second initialization with different index + progress, err := cpi.Initialize(200) + require.NoError(t, err) + + // Should still return the original index + index, err := progress.ProcessedIndex() + require.NoError(t, err) + assert.Equal(t, uint64(100), index) + }) + + t.Run("SetProcessedIndex and ProcessedIndex", func(t *testing.T) { + cpi := NewConsumerProgress(db, testConsumer) + progress, err := cpi.Initialize(100) + require.NoError(t, err) + + err = progress.SetProcessedIndex(150) + require.NoError(t, err) + + index, err := progress.ProcessedIndex() + require.NoError(t, err) + assert.Equal(t, uint64(150), index) + }) + + }) +} diff --git a/utils/unittest/execution_state.go b/utils/unittest/execution_state.go index fb12310e358..6bd6ab30f6e 100644 --- a/utils/unittest/execution_state.go +++ b/utils/unittest/execution_state.go @@ -23,7 +23,7 @@ const ServiceAccountPrivateKeySignAlgo = crypto.ECDSAP256 const ServiceAccountPrivateKeyHashAlgo = hash.SHA2_256 // Pre-calculated state commitment with root account with the above private key -const GenesisStateCommitmentHex = "8a39695626e505a667c1c3d67abab13d30cc6a1a007b4cd6de21c3fbbd51d638" +const GenesisStateCommitmentHex = "e370f6dc1e466bfc066fb06fee6179b5ccc4db676ed1755e4526e8ebb80b9aa3" var GenesisStateCommitment flow.StateCommitment @@ -87,10 +87,10 @@ func genesisCommitHexByChainID(chainID flow.ChainID) string { return GenesisStateCommitmentHex } if chainID == flow.Testnet { - return "6de2175363c8136ce966759fcc7a744d1b7f49d0d4dbf9a39970c82e29430b13" + return "8f7e9d4b33457f6ab3af7249355e20415618f56dc1adf933f1468a817b512713" } if chainID == flow.Sandboxnet { return "e1c08b17f9e5896f03fe28dd37ca396c19b26628161506924fbf785834646ea1" } - return "cf7a9c80987d0d62b6d3c299fe603617a398def464b71ecb841b9de3b53ba395" + return "d8a13b73c9b08d124d07fd571eb6fc0e7989fd70668a2329424bd725d508e519" }