diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 61124289..40d3670f 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -170,7 +170,7 @@ jobs: echo "Building for ${GOOS}/${GOARCH} with GOOS=$GOOS, GOARCH=$GOARCH" echo "Excluding CUDA. Use the 'cuda' build tag to include it." - go build -o "build/lilypad-${GOOS}-${GOARCH}-cpu" -v -ldflags="-X 'github.com/lilypad-tech/lilypad/cmd/lilypad.version=${{ needs.release.outputs.tag_name }}' -X 'github.com/lilypad-tech/lilypad/cmd/lilypad.commitSHA=${{ needs.release.outputs.sha }}'" + go build -o "build/lilypad-${GOOS}-${GOARCH}-cpu" -v -ldflags="-X 'github.com/lilypad-tech/lilypad/pkg/system.Version=${{ needs.release.outputs.tag_name }}' -X 'github.com/lilypad-tech/lilypad/pkg/system.CommitSHA=${{ needs.release.outputs.sha }}'" echo "-------------- OS: ${GOOS} : Arch: ${GOARCH} ---------- done" @@ -206,7 +206,7 @@ jobs: echo "CUDA_HOME: $CUDA_HOME" echo "LD_LIBRARY_PATH: $LD_LIBRARY_PATH" - go build -o "build/lilypad-${GOOS}-${GOARCH}-gpu" -v -tags cuda -ldflags="-X 'github.com/lilypad-tech/lilypad/cmd/lilypad.version=${{ needs.release.outputs.tag_name }}' -X 'github.com/lilypad-tech/lilypad/cmd/lilypad.commitSHA=${{ needs.release.outputs.sha }}'" + go build -o "build/lilypad-${GOOS}-${GOARCH}-gpu" -v -tags cuda -ldflags="-X 'github.com/lilypad-tech/lilypad/pkg/system.Version=${{ needs.release.outputs.tag_name }}' -X 'github.com/lilypad-tech/lilypad/pkg/system.CommitSHA=${{ needs.release.outputs.sha }}'" echo "-------------- OS: ${GOOS} : Arch: ${GOARCH} ---------- done" diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index d1e8c054..e0e2c94b 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -27,7 +27,20 @@ jobs: run: ./stack compose-init - name: Run stack + env: + DISABLE_TELEMETRY: true run: ./stack compose-up -d - name: Run tests + env: + LOG_LEVEL: debug run: ./stack integration-tests + + - name: Display resource provider logs + run: docker logs resource-provider + + - name: Display solver logs + run: docker logs solver + + - name: Display chain logs + run: docker logs chain diff --git a/cmd/lilypad/resource-provider.go b/cmd/lilypad/resource-provider.go index 02cda777..d6b8a5cf 100644 --- a/cmd/lilypad/resource-provider.go +++ b/cmd/lilypad/resource-provider.go @@ -1,6 +1,8 @@ package lilypad import ( + "fmt" + "github.com/lilypad-tech/lilypad/pkg/executor/bacalhau" optionsfactory "github.com/lilypad-tech/lilypad/pkg/options" "github.com/lilypad-tech/lilypad/pkg/resourceprovider" @@ -24,7 +26,7 @@ func newResourceProviderCmd() *cobra.Command { if err != nil { return err } - return runResourceProvider(cmd, options) + return runResourceProvider(cmd, options, network) }, } @@ -33,7 +35,7 @@ func newResourceProviderCmd() *cobra.Command { return resourceProviderCmd } -func runResourceProvider(cmd *cobra.Command, options resourceprovider.ResourceProviderOptions) error { +func runResourceProvider(cmd *cobra.Command, options resourceprovider.ResourceProviderOptions, network string) error { commandCtx := system.NewCommandContext(cmd) defer commandCtx.Cleanup() @@ -47,7 +49,22 @@ func runResourceProvider(cmd *cobra.Command, options resourceprovider.ResourcePr return err } - resourceProviderService, err := resourceprovider.NewResourceProvider(options, web3SDK, executor) + tc := system.TelemetryConfig{ + TelemetryURL: options.Telemetry.URL, + TelemetryToken: options.Telemetry.Token, + Enabled: !options.Telemetry.Disable, + Service: system.ResourceProviderService, + Network: network, + Address: web3SDK.GetAddress().String(), + GPU: system.GetGPUInfo(), + } + telemetry, err := system.SetupOTelSDK(commandCtx.Ctx, tc) + if err != nil { + fmt.Printf("failed to setup opentelemetry: %s", err) + } + commandCtx.Cm.RegisterCallbackWithContext(telemetry.Shutdown) + + resourceProviderService, err := resourceprovider.NewResourceProvider(options, web3SDK, executor, telemetry) if err != nil { return err } diff --git a/cmd/lilypad/root.go b/cmd/lilypad/root.go index 48038777..e8999d54 100644 --- a/cmd/lilypad/root.go +++ b/cmd/lilypad/root.go @@ -5,6 +5,7 @@ import ( "fmt" "os" + "github.com/lilypad-tech/lilypad/pkg/system" "github.com/spf13/cobra" ) @@ -19,7 +20,7 @@ func NewRootCmd() *cobra.Command { RootCmd := &cobra.Command{ Use: getCommandLineExecutable(), Short: "Lilypad", - Long: fmt.Sprintf("Lilypad: %s \nCommit: %s \n", version, commitSHA), + Long: fmt.Sprintf("Lilypad: %s \nCommit: %s \n", system.Version, system.CommitSHA), } var network string diff --git a/cmd/lilypad/run.go b/cmd/lilypad/run.go index c4e64446..1fd460e7 100644 --- a/cmd/lilypad/run.go +++ b/cmd/lilypad/run.go @@ -46,18 +46,18 @@ func runJob(cmd *cobra.Command, options jobcreator.JobCreatorOptions) error { c := color.New(color.FgCyan).Add(color.Bold) header := ` ⠀⠀⠀⠀⠀⠀⣀⣤⣤⢠⣤⣀⠀⠀⠀⠀⠀ -⠀⠀⠀⠀⢴⣿⣿⣿⣿⢸⣿⡟⠀⠀⠀⠀⠀ ██╗ ██╗██╗ ██╗ ██╗██████╗ █████╗ ██████╗ +⠀⠀⠀⠀⢴⣿⣿⣿⣿⢸⣿⡟⠀⠀⠀⠀⠀ ██╗ ██╗██╗ ██╗ ██╗██████╗ █████╗ ██████╗ ⠀⠀⣰⣿⣦⡙⢿⣿⣿⢸⡿⠀⠀⠀⠀⢀⠀ ██║ ██║██║ ╚██╗ ██╔╝██╔══██╗██╔══██╗██╔══██╗ ⠀⢰⣿⣿⣿⣿⣦⡙⣿⢸⠁⢀⣠⣴⣾⣿⡆ ██║ ██║██║ ╚████╔╝ ██████╔╝███████║██║ ██║ ⠀⣛⣛⣛⣛⣛⣛⣛⠈⠀⣚⣛⣛⣛⣛⣛⣛ ██║ ██║██║ ╚██╔╝ ██╔═══╝ ██╔══██║██║ ██║ ⠀⢹⣿⣿⣿⣿⠟⣡⣿⢸⣮⡻⣿⣿⣿⣿⡏ ███████╗██║███████╗██║ ██║ ██║ ██║██████╔╝ ⠀⠀⢻⣿⡟⣩⣾⣿⣿⢸⣿⣿⣌⠻⣿⡟⠀ ╚══════╝╚═╝╚══════╝╚═╝ ╚═╝ ╚═╝ ╚═╝╚═════╝ v2 -⠀⠀⠀⠉⢾⣿⣿⣿⣿⢸⣿⣿⣿⡷⠈⠀⠀ +⠀⠀⠀⠉⢾⣿⣿⣿⣿⢸⣿⣿⣿⡷⠈⠀⠀ ⠀⠀⠀⠀⠀⠈⠙⠛⠛⠘⠛⠋⠁⠀ ⠀⠀⠀ Decentralized Compute Network https://lilypad.tech ` - if version != "" { - header = strings.Replace(header, "v2", version, 1) + if system.Version != "" { + header = strings.Replace(header, "v2", system.Version, 1) } c.Print(header) @@ -92,6 +92,7 @@ func runJob(cmd *cobra.Command, options jobcreator.JobCreatorOptions) error { fmt.Println(err.Error()) os.Exit(1) } + commandCtx := system.NewCommandContext(cmd) defer commandCtx.Cleanup() result, err := jobcreator.RunJob(commandCtx, options, func(evOffer data.JobOfferContainer) { diff --git a/cmd/lilypad/version.go b/cmd/lilypad/version.go index 1d4ceaab..907bda04 100644 --- a/cmd/lilypad/version.go +++ b/cmd/lilypad/version.go @@ -9,9 +9,6 @@ import ( "github.com/lilypad-tech/lilypad/pkg/system" ) -var version string -var commitSHA string - const goBinaryURL = "https://github.com/lilypad-tech/lilypad/releases/" func newVersionCmd() *cobra.Command { @@ -36,14 +33,14 @@ func runVersion(cmd *cobra.Command) error { commandCtx := system.NewCommandContext(cmd) defer commandCtx.Cleanup() - if version == "" { + if system.Version == "" { fmt.Printf("version not found: download the latest binary from %s", goBinaryURL) // unnecessary help shows up when returned as error, so shortciruting here return nil } - fmt.Printf("Lilypad: %s\n", version) - fmt.Printf("Commit: %s\n", commitSHA) + fmt.Printf("Lilypad: %s\n", system.Version) + fmt.Printf("Commit: %s\n", system.CommitSHA) // TODO: suggest updating to the latest version if the current version is not the latest version diff --git a/docker/docker-compose.dev.yml b/docker/docker-compose.dev.yml index 6bc10feb..97e5fa93 100644 --- a/docker/docker-compose.dev.yml +++ b/docker/docker-compose.dev.yml @@ -101,6 +101,7 @@ services: - WEB3_PRIVATE_KEY=${RESOURCE_PROVIDER_PRIVATE_KEY} - BACALHAU_SERVE_IPFS_PATH=/tmp/lilypad/data/ipfs - LOG_LEVEL=debug + - DISABLE_TELEMETRY=${DISABLE_TELEMETRY} volumes: chain-data: bacalhau-data: diff --git a/docker/resource-provider/Dockerfile b/docker/resource-provider/Dockerfile index 191d9a76..9972b8ee 100644 --- a/docker/resource-provider/Dockerfile +++ b/docker/resource-provider/Dockerfile @@ -8,6 +8,7 @@ ARG NETWORK=testnet ENV LOG_LEVEL=info ENV BACALHAU_API_HOST="localhost" ENV WEB3_PRIVATE_KEY="" +ENV DISABLE_TELEMETRY=false # Install necessary dependencies RUN apt update && apt install -y wget bash && apt clean @@ -46,7 +47,7 @@ RUN echo "#!/bin/bash" >> run # Launch Bacalhau RUN echo "/usr/local/bin/bacalhau serve --node-type compute,requester --peer none --private-internal-ipfs=false --job-selection-accept-networked &" >> run # Launch Lilypad -RUN echo "/usr/local/bin/lilypad resource-provider --network ${NETWORK} --disable-pow ${DISABLE_POW} &" >> run +RUN echo "/usr/local/bin/lilypad resource-provider --network ${NETWORK} --disable-pow=${DISABLE_POW} --disable-telemetry=${DISABLE_TELEMETRY} &" >> run RUN echo "wait -n" >> run RUN chmod +x run diff --git a/go.mod b/go.mod index 3147da44..b4a88915 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/lilypad-tech/lilypad -go 1.20 +go 1.22 require ( github.com/BurntSushi/toml v0.3.1 @@ -8,7 +8,7 @@ require ( github.com/ethereum/go-ethereum v1.13.4 github.com/fatih/color v1.15.0 github.com/go-git/go-git/v5 v5.10.0 - github.com/google/uuid v1.3.0 + github.com/google/uuid v1.6.0 github.com/gorilla/mux v1.8.0 github.com/gorilla/websocket v1.5.0 github.com/hashicorp/go-retryablehttp v0.7.4 @@ -18,7 +18,7 @@ require ( github.com/pkg/errors v0.9.1 github.com/rs/zerolog v1.31.0 github.com/spf13/cobra v1.7.0 - github.com/stretchr/testify v1.8.4 + github.com/stretchr/testify v1.9.0 github.com/theckman/yacspin v0.13.12 gorgonia.org/cu v0.9.7-0.20240623234718-3cd40db700e9 k8s.io/apimachinery v0.28.3 @@ -32,6 +32,7 @@ require ( github.com/acomagu/bufpipe v1.0.4 // indirect github.com/bits-and-blooms/bitset v1.7.0 // indirect github.com/btcsuite/btcd/btcec/v2 v2.2.0 // indirect + github.com/cenkalti/backoff/v4 v4.3.0 // indirect github.com/cloudflare/circl v1.3.3 // indirect github.com/consensys/bavard v0.1.13 // indirect github.com/consensys/gnark-crypto v0.12.1 // indirect @@ -42,14 +43,16 @@ require ( github.com/emirpasic/gods v1.18.1 // indirect github.com/ethereum/c-kzg-4844 v0.3.1 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect + github.com/ghodss/yaml v1.0.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-logr/logr v1.2.4 // 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.2.5 // indirect + github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-stack/stack v1.8.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/golang-lru v0.5.4 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect @@ -70,6 +73,8 @@ require ( github.com/ipfs/go-verifcid v0.0.1 // indirect github.com/ipld/go-codec-dagpb v1.6.0 // indirect github.com/ipld/go-ipld-prime v0.20.0 // indirect + github.com/jaypipes/ghw v0.12.0 // indirect + github.com/jaypipes/pcidb v1.0.0 // indirect github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect github.com/jbenet/goprocess v0.1.4 // indirect github.com/kevinburke/ssh_config v1.2.0 // indirect @@ -78,6 +83,7 @@ require ( github.com/mattn/go-isatty v0.0.19 // indirect github.com/mattn/go-runewidth v0.0.13 // indirect github.com/minio/sha256-simd v1.0.0 // indirect + github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/mmcloughlin/addchain v0.4.0 // indirect github.com/mr-tron/base58 v1.2.0 // indirect github.com/multiformats/go-base32 v0.0.4 // indirect @@ -99,21 +105,34 @@ require ( github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect github.com/xanzy/ssh-agent v0.3.3 // indirect - go.opentelemetry.io/otel v1.7.0 // indirect - go.opentelemetry.io/otel/trace v1.7.0 // indirect + go.opentelemetry.io/otel v1.28.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.28.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.28.0 // indirect + go.opentelemetry.io/otel/metric v1.28.0 // indirect + go.opentelemetry.io/otel/sdk v1.28.0 // indirect + go.opentelemetry.io/otel/trace v1.28.0 // indirect + go.opentelemetry.io/proto/otlp v1.3.1 // indirect go.uber.org/atomic v1.10.0 // indirect go.uber.org/multierr v1.8.0 // indirect go.uber.org/zap v1.22.0 // indirect - golang.org/x/crypto v0.14.0 // indirect + golang.org/x/crypto v0.24.0 // indirect golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect - golang.org/x/mod v0.12.0 // indirect - golang.org/x/net v0.17.0 // indirect - golang.org/x/sync v0.3.0 // indirect - golang.org/x/sys v0.13.0 // indirect - golang.org/x/tools v0.13.0 // indirect - google.golang.org/protobuf v1.30.0 // indirect + golang.org/x/mod v0.17.0 // indirect + golang.org/x/net v0.26.0 // indirect + golang.org/x/sync v0.7.0 // indirect + golang.org/x/sys v0.21.0 // indirect + golang.org/x/text v0.16.0 // indirect + golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20240730163845-b1a4ccb954bf // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240730163845-b1a4ccb954bf // indirect + google.golang.org/grpc v1.64.1 // indirect + google.golang.org/protobuf v1.34.2 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect + howett.net/plist v1.0.0 // indirect lukechampine.com/blake3 v1.1.7 // indirect rsc.io/tmplfunc v0.0.3 // indirect ) diff --git a/go.sum b/go.sum index 16fb13c4..d09d2815 100644 --- a/go.sum +++ b/go.sum @@ -30,6 +30,8 @@ github.com/btcsuite/btcd/btcec/v2 v2.2.0 h1:fzn1qaOt32TuLjFlkzYSsBC35Q3KUjT1SwPx github.com/btcsuite/btcd/btcec/v2 v2.2.0/go.mod h1:U7MHm051Al6XmscBQ0BoNydpOTsFAn707034b5nY8zU= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= +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/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= @@ -94,6 +96,8 @@ github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0X github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff h1:tY80oXqGNY4FhTFhk+o9oFHGINQ/+vhlm8HFzi6znCI= +github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gliderlabs/ssh v0.3.5 h1:OcaySEmAQJgyYcArR+gGGTHCyE7nvhEMTlYY+Dp8CpY= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic= @@ -106,10 +110,14 @@ github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbV github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +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 h1:t4MGB5xEDZvXI+0rMjjsfBsD7yAgp/s9ZDkL1JndXwY= github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= @@ -158,6 +166,8 @@ 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.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/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/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= github.com/gorgonia/bindgen v0.0.0-20180812032444-09626750019e/go.mod h1:YzKk63P9jQHkwAo2rXHBv02yPxDzoQT2cBV0x5bGV/8= github.com/gorgonia/bindgen v0.0.0-20210223094355-432cd89e7765/go.mod h1:BLHSe436vhQKRfm6wxJgebeK4fDY+ER/8jV3vVH9yYU= @@ -165,6 +175,8 @@ github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= 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/grpc-ecosystem/grpc-gateway/v2 v2.20.0 h1:bkypFPDjIYGfCYD5mRBvpqxfYX1YCS1PXdKYWi8FsN0= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0/go.mod h1:P+Lt/0by1T8bfcF3z737NnSbmxQAppXMRziHUxPOC8k= github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfmKFJ6tItnhQ67kU= github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48= github.com/hashicorp/go-bexpr v0.1.10 h1:9kuI5PFotCboP3dkDYFr/wi0gg0QVbSNz5oFRpxn4uE= @@ -242,11 +254,16 @@ github.com/ipld/go-codec-dagpb v1.6.0/go.mod h1:ANzFhfP2uMJxRBr8CE+WQWs5UsNa0pYt github.com/ipld/go-ipld-prime v0.20.0 h1:Ud3VwE9ClxpO2LkCYP7vWPc0Fo+dYdYzgxUJZ3uRG4g= github.com/ipld/go-ipld-prime v0.20.0/go.mod h1:PzqZ/ZR981eKbgdr3y2DJYeD/8bgMawdGVlJDE8kK+M= github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= +github.com/jaypipes/ghw v0.12.0 h1:xU2/MDJfWmBhJnujHY9qwXQLs3DBsf0/Xa9vECY0Tho= +github.com/jaypipes/ghw v0.12.0/go.mod h1:jeJGbkRB2lL3/gxYzNYzEDETV1ZJ56OKr+CSeSEym+g= +github.com/jaypipes/pcidb v1.0.0 h1:vtZIfkiCUE42oYbJS0TAq9XSfSmcsgo9IdxSm9qzYU8= +github.com/jaypipes/pcidb v1.0.0/go.mod h1:TnYUvqhPBzCKnH34KrIX22kAeEbDCSRJ9cqLRCuNDfk= github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= github.com/jbenet/goprocess v0.1.4 h1:DRGOFReOMqqDNXwW70QkacFW0YN9QnwLV0Vqk+3oU0o= github.com/jbenet/goprocess v0.1.4/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= +github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jtolds/gls v4.2.1+incompatible h1:fSuqC+Gmlu6l/ZYAoZzx2pyucC8Xza35fpRVWLVmUEE= github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4= @@ -303,6 +320,8 @@ github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16/go.mod h1:2FMWW+ github.com/minio/sha256-simd v0.1.1-0.20190913151208-6de447530771/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g= github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag= github.com/mitchellh/pointerstructure v1.2.0 h1:O+i9nHnXS3l/9Wu7r4NrEdwA2VFTicjUEN1uBnDo34A= github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= @@ -394,6 +413,8 @@ 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.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= @@ -418,8 +439,26 @@ github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1 github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.opentelemetry.io/otel v1.7.0 h1:Z2lA3Tdch0iDcrhJXDIlC94XE+bxok1F9B+4Lz/lGsM= go.opentelemetry.io/otel v1.7.0/go.mod h1:5BdUoMIz5WEs0vt0CUEMtSSaTSHBBVwrhnz7+nrD5xk= +go.opentelemetry.io/otel v1.28.0 h1:/SqNcYk+idO0CxKEUOtKQClMK/MimZihKYMruSMViUo= +go.opentelemetry.io/otel v1.28.0/go.mod h1:q68ijF8Fc8CnMHKyzqL6akLO46ePnjkgfIMIjUIX9z4= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0 h1:3Q/xZUyC1BBkualc9ROb4G8qkH90LXEIICcs5zv1OYY= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0/go.mod h1:s75jGIWA9OfCMzF0xr+ZgfrB5FEbbV7UuYo32ahUiFI= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0 h1:R3X6ZXmNPRR8ul6i3WgFURCHzaXjHdm0karRG/+dj3s= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0/go.mod h1:QWFXnDavXWwMx2EEcZsf3yxgEKAqsxQ+Syjp+seyInw= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.28.0 h1:j9+03ymgYhPKmeXGk5Zu+cIZOlVzd9Zv7QIiyItjFBU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.28.0/go.mod h1:Y5+XiUG4Emn1hTfciPzGPJaSI+RpDts6BnCIir0SLqk= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.28.0 h1:EVSnY9JbEEW92bEkIYOVMw4q1WJxIAGoFTrtYOzWuRQ= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.28.0/go.mod h1:Ea1N1QQryNXpCD0I1fdLibBAIpQuBkznMmkdKrapk1Y= +go.opentelemetry.io/otel/metric v1.28.0 h1:f0HGvSl1KRAU1DLgLGFjrwVyismPlnuU6JD6bOeuA5Q= +go.opentelemetry.io/otel/metric v1.28.0/go.mod h1:Fb1eVBFZmLVTMb6PPohq3TO9IIhUisDsbJoL/+uQW4s= +go.opentelemetry.io/otel/sdk v1.28.0 h1:b9d7hIry8yZsgtbmM0DKyPWMMUMlK9NEKuIG4aBqWyE= +go.opentelemetry.io/otel/sdk v1.28.0/go.mod h1:oYj7ClPUA7Iw3m+r7GeEjz0qckQRJK2B8zjcZEfu7Pg= go.opentelemetry.io/otel/trace v1.7.0 h1:O37Iogk1lEkMRXewVtZ1BBTVn5JEp8GrJvP92bJqC6o= go.opentelemetry.io/otel/trace v1.7.0/go.mod h1:fzLSB9nqR2eXzxPXb2JW9IKE+ScyXA48yyE4TNvoHqU= +go.opentelemetry.io/otel/trace v1.28.0 h1:GhQ9cUuQGmNDd5BTCP2dAvv75RdMxEfTmYejp+lkx9g= +go.opentelemetry.io/otel/trace v1.28.0/go.mod h1:jPyXzNPg6da9+38HEwElrQiHlVMTnVfM3/yv2OlIHaI= +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.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= @@ -448,6 +487,8 @@ golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2Uz golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/crypto v0.24.0 h1:mnl8DM0o513X8fdIkmyFE/5hTYxbwYOjDS/+rK6qpRI= +golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20181106170214-d68db9428509/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -471,6 +512,7 @@ golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91 golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= 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= @@ -491,6 +533,8 @@ golang.org/x/net v0.6.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.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +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/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= 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= @@ -502,6 +546,8 @@ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190219092855-153ac476189d/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -538,6 +584,8 @@ 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.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= +golang.org/x/sys v0.21.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.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= @@ -552,6 +600,8 @@ 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.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= +golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= +golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -574,6 +624,7 @@ golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ= golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= 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= @@ -593,12 +644,19 @@ google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoA google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200911024640-645f7a48b24f h1:Yv4xsIx7HZOoyUGSJ2ksDyWE2qIBXROsZKt2ny3hCGM= google.golang.org/genproto v0.0.0-20200911024640-645f7a48b24f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto/googleapis/api v0.0.0-20240730163845-b1a4ccb954bf h1:GillM0Ef0pkZPIB+5iO6SDK+4T9pf6TpaYR6ICD5rVE= +google.golang.org/genproto/googleapis/api v0.0.0-20240730163845-b1a4ccb954bf/go.mod h1:OFMYQFHJ4TM3JRlWDZhJbZfra2uqc3WLBZiaaqP4DtU= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240730163845-b1a4ccb954bf h1:liao9UHurZLtiEwBgT9LMOnKYsHze6eA6w1KQCMVN2Q= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240730163845-b1a4ccb954bf/go.mod h1:Ue6ibwXGpU+dqIcODieyLOcgj7z8+IcskoNIgZxtrFY= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= 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.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +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/cmd/protoc-gen-go-grpc v0.0.0-20200910201057-6591123024b3/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= @@ -613,6 +671,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.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= google.golang.org/protobuf v1.30.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= 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= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -622,10 +682,12 @@ gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= +gopkg.in/yaml.v1 v1.0.0-20140924161607-9f9df34309c0/go.mod h1:WDnlLJ4WF5VGsH/HVa3CI79GS0ol3YnhVnKP89i0kNg= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= @@ -648,6 +710,8 @@ gorgonia.org/vecf64 v0.9.0/go.mod h1:hp7IOWCnRiVQKON73kkC/AUMtEXyf9kGlVrtPQ9ccVA honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +howett.net/plist v1.0.0 h1:7CrbWYbPPO/PyNy38b2EB/+gYbjCe2DXBxgtOOZbSQM= +howett.net/plist v1.0.0/go.mod h1:lqaXoTrLY4hg8tnEzNru53gicrbv7rrk+2xJA/7hw9g= k8s.io/apimachinery v0.28.3 h1:B1wYx8txOaCQG0HmYF6nbpU8dg6HvA06x5tEffvOe7A= k8s.io/apimachinery v0.28.3/go.mod h1:uQTKmIqs+rAYaq+DFaoD2X7pcjLOqbQX2AOiO0nIpb8= lukechampine.com/blake3 v1.1.7 h1:GgRMhmdsuK8+ii6UZFDL8Nb+VyMwadAgcJyfYHxG6n0= diff --git a/hardhat/.openzeppelin/unknown-412346.json b/hardhat/.openzeppelin/unknown-412346.json deleted file mode 100644 index 93036c9a..00000000 --- a/hardhat/.openzeppelin/unknown-412346.json +++ /dev/null @@ -1,259 +0,0 @@ -{ - "manifestVersion": "3.2", - "admin": { - "address": "0xeF31027350Be2c7439C1b0BE022d49421488b72C", - "txHash": "0x79060f478f53b37dbb09c0d2289e70c06ccdbb63978ef5fdce17c2ebcc6f1429" - }, - "proxies": [ - { - "address": "0x12Bcb546bC60fF39F1Adfc7cE4605d5Bd6a6A876", - "txHash": "0x9022e86a6002ce49d3c1d31e05106686d8abd23d70a913c6d0e717fb46bc7e00", - "kind": "transparent" - } - ], - "impls": { - "2fd905ca8e6c89f7922d3c38962d4cf3205f6bee5797b13e6d5d9618bec33b4d": { - "address": "0xC66AB83418C20A65C3f8e83B3d11c8C3a6097b6F", - "txHash": "0xe1121a288fa303432e878bc3eb4d0cf34c9862886e8ebd5d1282cdfb9f9ffc5d", - "layout": { - "solcVersion": "0.8.21", - "storage": [ - { - "label": "_initialized", - "offset": 0, - "slot": "0", - "type": "t_uint8", - "contract": "Initializable", - "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:63", - "retypedFrom": "bool" - }, - { - "label": "_initializing", - "offset": 1, - "slot": "0", - "type": "t_bool", - "contract": "Initializable", - "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:68" - }, - { - "label": "__gap", - "offset": 0, - "slot": "1", - "type": "t_array(t_uint256)50_storage", - "contract": "ContextUpgradeable", - "src": "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol:36" - }, - { - "label": "_owner", - "offset": 0, - "slot": "51", - "type": "t_address", - "contract": "OwnableUpgradeable", - "src": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:22" - }, - { - "label": "__gap", - "offset": 0, - "slot": "52", - "type": "t_array(t_uint256)49_storage", - "contract": "OwnableUpgradeable", - "src": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:94" - }, - { - "label": "targetDifficulty", - "offset": 0, - "slot": "101", - "type": "t_uint256", - "contract": "LilypadPow", - "src": "contracts/LilypadPow.sol:29" - }, - { - "label": "powSubmissions", - "offset": 0, - "slot": "102", - "type": "t_mapping(t_address,t_array(t_struct(POWSubmission)4860_storage)dyn_storage)", - "contract": "LilypadPow", - "src": "contracts/LilypadPow.sol:31" - }, - { - "label": "miners", - "offset": 0, - "slot": "103", - "type": "t_array(t_address)dyn_storage", - "contract": "LilypadPow", - "src": "contracts/LilypadPow.sol:32" - }, - { - "label": "lastChallenges", - "offset": 0, - "slot": "104", - "type": "t_mapping(t_address,t_struct(Challenge)4869_storage)", - "contract": "LilypadPow", - "src": "contracts/LilypadPow.sol:34" - }, - { - "label": "validProofs", - "offset": 0, - "slot": "105", - "type": "t_uint256", - "contract": "LilypadPow", - "src": "contracts/LilypadPow.sol:35" - }, - { - "label": "startTime", - "offset": 0, - "slot": "106", - "type": "t_uint256", - "contract": "LilypadPow", - "src": "contracts/LilypadPow.sol:36" - }, - { - "label": "window_start", - "offset": 0, - "slot": "107", - "type": "t_uint256", - "contract": "LilypadPow", - "src": "contracts/LilypadPow.sol:38" - }, - { - "label": "window_end", - "offset": 0, - "slot": "108", - "type": "t_uint256", - "contract": "LilypadPow", - "src": "contracts/LilypadPow.sol:39" - } - ], - "types": { - "t_address": { - "label": "address", - "numberOfBytes": "20" - }, - "t_array(t_address)dyn_storage": { - "label": "address[]", - "numberOfBytes": "32" - }, - "t_array(t_struct(POWSubmission)4860_storage)dyn_storage": { - "label": "struct LilypadPow.POWSubmission[]", - "numberOfBytes": "32" - }, - "t_array(t_uint256)49_storage": { - "label": "uint256[49]", - "numberOfBytes": "1568" - }, - "t_array(t_uint256)50_storage": { - "label": "uint256[50]", - "numberOfBytes": "1600" - }, - "t_bool": { - "label": "bool", - "numberOfBytes": "1" - }, - "t_bytes32": { - "label": "bytes32", - "numberOfBytes": "32" - }, - "t_mapping(t_address,t_array(t_struct(POWSubmission)4860_storage)dyn_storage)": { - "label": "mapping(address => struct LilypadPow.POWSubmission[])", - "numberOfBytes": "32" - }, - "t_mapping(t_address,t_struct(Challenge)4869_storage)": { - "label": "mapping(address => struct LilypadPow.Challenge)", - "numberOfBytes": "32" - }, - "t_string_storage": { - "label": "string", - "numberOfBytes": "32" - }, - "t_struct(Challenge)4869_storage": { - "label": "struct LilypadPow.Challenge", - "members": [ - { - "label": "challenge", - "type": "t_bytes32", - "offset": 0, - "slot": "0" - }, - { - "label": "difficulty", - "type": "t_uint256", - "offset": 0, - "slot": "1" - }, - { - "label": "nodeId", - "type": "t_string_storage", - "offset": 0, - "slot": "2" - }, - { - "label": "timestamp", - "type": "t_uint256", - "offset": 0, - "slot": "3" - } - ], - "numberOfBytes": "128" - }, - "t_struct(POWSubmission)4860_storage": { - "label": "struct LilypadPow.POWSubmission", - "members": [ - { - "label": "walletAddress", - "type": "t_address", - "offset": 0, - "slot": "0" - }, - { - "label": "nodeId", - "type": "t_string_storage", - "offset": 0, - "slot": "1" - }, - { - "label": "nonce", - "type": "t_uint256", - "offset": 0, - "slot": "2" - }, - { - "label": "start_timestamp", - "type": "t_uint256", - "offset": 0, - "slot": "3" - }, - { - "label": "complete_timestamp", - "type": "t_uint256", - "offset": 0, - "slot": "4" - }, - { - "label": "challenge", - "type": "t_bytes32", - "offset": 0, - "slot": "5" - }, - { - "label": "difficulty", - "type": "t_uint256", - "offset": 0, - "slot": "6" - } - ], - "numberOfBytes": "224" - }, - "t_uint256": { - "label": "uint256", - "numberOfBytes": "32" - }, - "t_uint8": { - "label": "uint8", - "numberOfBytes": "1" - } - }, - "namespaces": {} - } - } - } -} diff --git a/hardhat/.openzeppelin/unknown-421614.json b/hardhat/.openzeppelin/unknown-421614.json deleted file mode 100644 index a29c59c2..00000000 --- a/hardhat/.openzeppelin/unknown-421614.json +++ /dev/null @@ -1,502 +0,0 @@ -{ - "manifestVersion": "3.2", - "admin": { - "address": "0xf5Db1EA8FD013B5D9a4aaa47C43d1b8fC1Fd17B3", - "txHash": "0x57828f1bdd3928b1d497b130251a2584e8d1c5126990cf7dcd623c7edbdbb361" - }, - "proxies": [ - { - "address": "0x8B852BA45293d6dd51B10c57625C6c5f25ADFB40", - "txHash": "0x47ed0dd076df491482d0931e3e03e13a0a5f5e12f481b90f01660d1d2cd1765c", - "kind": "transparent" - } - ], - "impls": { - "b72a8f0f1d7c34ed0fff57355af290961c35fc0962d5577598be935e46ab56cd": { - "address": "0x17D65A5625caC9743FA69975632ecb622986e4A3", - "txHash": "0x8d39b5a7db706b6c9912b29d58f3d1928d4fecfdfa4f3f8045caa721028f6576", - "layout": { - "solcVersion": "0.8.21", - "storage": [ - { - "label": "_initialized", - "offset": 0, - "slot": "0", - "type": "t_uint8", - "contract": "Initializable", - "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:63", - "retypedFrom": "bool" - }, - { - "label": "_initializing", - "offset": 1, - "slot": "0", - "type": "t_bool", - "contract": "Initializable", - "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:68" - }, - { - "label": "__gap", - "offset": 0, - "slot": "1", - "type": "t_array(t_uint256)50_storage", - "contract": "ContextUpgradeable", - "src": "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol:36" - }, - { - "label": "_owner", - "offset": 0, - "slot": "51", - "type": "t_address", - "contract": "OwnableUpgradeable", - "src": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:22" - }, - { - "label": "__gap", - "offset": 0, - "slot": "52", - "type": "t_array(t_uint256)49_storage", - "contract": "OwnableUpgradeable", - "src": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:94" - }, - { - "label": "targetDifficulty", - "offset": 0, - "slot": "101", - "type": "t_uint256", - "contract": "LilypadPow", - "src": "contracts/LilypadPow.sol:29" - }, - { - "label": "powSubmissions", - "offset": 0, - "slot": "102", - "type": "t_mapping(t_address,t_array(t_struct(POWSubmission)695_storage)dyn_storage)", - "contract": "LilypadPow", - "src": "contracts/LilypadPow.sol:31" - }, - { - "label": "miners", - "offset": 0, - "slot": "103", - "type": "t_array(t_address)dyn_storage", - "contract": "LilypadPow", - "src": "contracts/LilypadPow.sol:32" - }, - { - "label": "lastChallenges", - "offset": 0, - "slot": "104", - "type": "t_mapping(t_address,t_struct(Challenge)704_storage)", - "contract": "LilypadPow", - "src": "contracts/LilypadPow.sol:34" - }, - { - "label": "validProofs", - "offset": 0, - "slot": "105", - "type": "t_uint256", - "contract": "LilypadPow", - "src": "contracts/LilypadPow.sol:35" - }, - { - "label": "startTime", - "offset": 0, - "slot": "106", - "type": "t_uint256", - "contract": "LilypadPow", - "src": "contracts/LilypadPow.sol:36" - }, - { - "label": "window_start", - "offset": 0, - "slot": "107", - "type": "t_uint256", - "contract": "LilypadPow", - "src": "contracts/LilypadPow.sol:38" - }, - { - "label": "window_end", - "offset": 0, - "slot": "108", - "type": "t_uint256", - "contract": "LilypadPow", - "src": "contracts/LilypadPow.sol:39" - } - ], - "types": { - "t_address": { - "label": "address", - "numberOfBytes": "20" - }, - "t_array(t_address)dyn_storage": { - "label": "address[]", - "numberOfBytes": "32" - }, - "t_array(t_struct(POWSubmission)695_storage)dyn_storage": { - "label": "struct LilypadPow.POWSubmission[]", - "numberOfBytes": "32" - }, - "t_array(t_uint256)49_storage": { - "label": "uint256[49]", - "numberOfBytes": "1568" - }, - "t_array(t_uint256)50_storage": { - "label": "uint256[50]", - "numberOfBytes": "1600" - }, - "t_bool": { - "label": "bool", - "numberOfBytes": "1" - }, - "t_bytes32": { - "label": "bytes32", - "numberOfBytes": "32" - }, - "t_mapping(t_address,t_array(t_struct(POWSubmission)695_storage)dyn_storage)": { - "label": "mapping(address => struct LilypadPow.POWSubmission[])", - "numberOfBytes": "32" - }, - "t_mapping(t_address,t_struct(Challenge)704_storage)": { - "label": "mapping(address => struct LilypadPow.Challenge)", - "numberOfBytes": "32" - }, - "t_string_storage": { - "label": "string", - "numberOfBytes": "32" - }, - "t_struct(Challenge)704_storage": { - "label": "struct LilypadPow.Challenge", - "members": [ - { - "label": "challenge", - "type": "t_bytes32", - "offset": 0, - "slot": "0" - }, - { - "label": "difficulty", - "type": "t_uint256", - "offset": 0, - "slot": "1" - }, - { - "label": "nodeId", - "type": "t_string_storage", - "offset": 0, - "slot": "2" - }, - { - "label": "timestamp", - "type": "t_uint256", - "offset": 0, - "slot": "3" - } - ], - "numberOfBytes": "128" - }, - "t_struct(POWSubmission)695_storage": { - "label": "struct LilypadPow.POWSubmission", - "members": [ - { - "label": "walletAddress", - "type": "t_address", - "offset": 0, - "slot": "0" - }, - { - "label": "nodeId", - "type": "t_string_storage", - "offset": 0, - "slot": "1" - }, - { - "label": "nonce", - "type": "t_uint256", - "offset": 0, - "slot": "2" - }, - { - "label": "start_timestamp", - "type": "t_uint256", - "offset": 0, - "slot": "3" - }, - { - "label": "complete_timestamp", - "type": "t_uint256", - "offset": 0, - "slot": "4" - }, - { - "label": "challenge", - "type": "t_bytes32", - "offset": 0, - "slot": "5" - }, - { - "label": "difficulty", - "type": "t_uint256", - "offset": 0, - "slot": "6" - } - ], - "numberOfBytes": "224" - }, - "t_uint256": { - "label": "uint256", - "numberOfBytes": "32" - }, - "t_uint8": { - "label": "uint8", - "numberOfBytes": "1" - } - }, - "namespaces": {} - } - }, - "2fd905ca8e6c89f7922d3c38962d4cf3205f6bee5797b13e6d5d9618bec33b4d": { - "address": "0x28457503e9F43A050d421d06B70c7a490F361c46", - "txHash": "0xa3fbbaa4df33f7a47674b0ef6f37e0a4c819682ac78f498f4102f966c5fbfa87", - "layout": { - "solcVersion": "0.8.21", - "storage": [ - { - "label": "_initialized", - "offset": 0, - "slot": "0", - "type": "t_uint8", - "contract": "Initializable", - "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:63", - "retypedFrom": "bool" - }, - { - "label": "_initializing", - "offset": 1, - "slot": "0", - "type": "t_bool", - "contract": "Initializable", - "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:68" - }, - { - "label": "__gap", - "offset": 0, - "slot": "1", - "type": "t_array(t_uint256)50_storage", - "contract": "ContextUpgradeable", - "src": "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol:36" - }, - { - "label": "_owner", - "offset": 0, - "slot": "51", - "type": "t_address", - "contract": "OwnableUpgradeable", - "src": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:22" - }, - { - "label": "__gap", - "offset": 0, - "slot": "52", - "type": "t_array(t_uint256)49_storage", - "contract": "OwnableUpgradeable", - "src": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:94" - }, - { - "label": "targetDifficulty", - "offset": 0, - "slot": "101", - "type": "t_uint256", - "contract": "LilypadPow", - "src": "contracts/LilypadPow.sol:29" - }, - { - "label": "powSubmissions", - "offset": 0, - "slot": "102", - "type": "t_mapping(t_address,t_array(t_struct(POWSubmission)4860_storage)dyn_storage)", - "contract": "LilypadPow", - "src": "contracts/LilypadPow.sol:31" - }, - { - "label": "miners", - "offset": 0, - "slot": "103", - "type": "t_array(t_address)dyn_storage", - "contract": "LilypadPow", - "src": "contracts/LilypadPow.sol:32" - }, - { - "label": "lastChallenges", - "offset": 0, - "slot": "104", - "type": "t_mapping(t_address,t_struct(Challenge)4869_storage)", - "contract": "LilypadPow", - "src": "contracts/LilypadPow.sol:34" - }, - { - "label": "validProofs", - "offset": 0, - "slot": "105", - "type": "t_uint256", - "contract": "LilypadPow", - "src": "contracts/LilypadPow.sol:35" - }, - { - "label": "startTime", - "offset": 0, - "slot": "106", - "type": "t_uint256", - "contract": "LilypadPow", - "src": "contracts/LilypadPow.sol:36" - }, - { - "label": "window_start", - "offset": 0, - "slot": "107", - "type": "t_uint256", - "contract": "LilypadPow", - "src": "contracts/LilypadPow.sol:38" - }, - { - "label": "window_end", - "offset": 0, - "slot": "108", - "type": "t_uint256", - "contract": "LilypadPow", - "src": "contracts/LilypadPow.sol:39" - } - ], - "types": { - "t_address": { - "label": "address", - "numberOfBytes": "20" - }, - "t_array(t_address)dyn_storage": { - "label": "address[]", - "numberOfBytes": "32" - }, - "t_array(t_struct(POWSubmission)4860_storage)dyn_storage": { - "label": "struct LilypadPow.POWSubmission[]", - "numberOfBytes": "32" - }, - "t_array(t_uint256)49_storage": { - "label": "uint256[49]", - "numberOfBytes": "1568" - }, - "t_array(t_uint256)50_storage": { - "label": "uint256[50]", - "numberOfBytes": "1600" - }, - "t_bool": { - "label": "bool", - "numberOfBytes": "1" - }, - "t_bytes32": { - "label": "bytes32", - "numberOfBytes": "32" - }, - "t_mapping(t_address,t_array(t_struct(POWSubmission)4860_storage)dyn_storage)": { - "label": "mapping(address => struct LilypadPow.POWSubmission[])", - "numberOfBytes": "32" - }, - "t_mapping(t_address,t_struct(Challenge)4869_storage)": { - "label": "mapping(address => struct LilypadPow.Challenge)", - "numberOfBytes": "32" - }, - "t_string_storage": { - "label": "string", - "numberOfBytes": "32" - }, - "t_struct(Challenge)4869_storage": { - "label": "struct LilypadPow.Challenge", - "members": [ - { - "label": "challenge", - "type": "t_bytes32", - "offset": 0, - "slot": "0" - }, - { - "label": "difficulty", - "type": "t_uint256", - "offset": 0, - "slot": "1" - }, - { - "label": "nodeId", - "type": "t_string_storage", - "offset": 0, - "slot": "2" - }, - { - "label": "timestamp", - "type": "t_uint256", - "offset": 0, - "slot": "3" - } - ], - "numberOfBytes": "128" - }, - "t_struct(POWSubmission)4860_storage": { - "label": "struct LilypadPow.POWSubmission", - "members": [ - { - "label": "walletAddress", - "type": "t_address", - "offset": 0, - "slot": "0" - }, - { - "label": "nodeId", - "type": "t_string_storage", - "offset": 0, - "slot": "1" - }, - { - "label": "nonce", - "type": "t_uint256", - "offset": 0, - "slot": "2" - }, - { - "label": "start_timestamp", - "type": "t_uint256", - "offset": 0, - "slot": "3" - }, - { - "label": "complete_timestamp", - "type": "t_uint256", - "offset": 0, - "slot": "4" - }, - { - "label": "challenge", - "type": "t_bytes32", - "offset": 0, - "slot": "5" - }, - { - "label": "difficulty", - "type": "t_uint256", - "offset": 0, - "slot": "6" - } - ], - "numberOfBytes": "224" - }, - "t_uint256": { - "label": "uint256", - "numberOfBytes": "32" - }, - "t_uint8": { - "label": "uint8", - "numberOfBytes": "1" - } - }, - "namespaces": {} - } - } - } -} diff --git a/pkg/jobcreator/run.go b/pkg/jobcreator/run.go index 1ca59767..ad9b4cfc 100644 --- a/pkg/jobcreator/run.go +++ b/pkg/jobcreator/run.go @@ -46,8 +46,10 @@ func RunJob( jobOfferContainer, err := jobCreatorService.AddJobOffer(offer) if err != nil { + jobCreatorService.controller.log.Error("failed to add job offer", err) return nil, err } + jobCreatorService.controller.log.Debug("job offer ID", jobOfferContainer.ID) updateChan := make(chan data.JobOfferContainer) diff --git a/pkg/options/config.go b/pkg/options/config.go index 1d994c76..9426b072 100644 --- a/pkg/options/config.go +++ b/pkg/options/config.go @@ -7,6 +7,7 @@ import ( "github.com/BurntSushi/toml" "github.com/lilypad-tech/lilypad/pkg/data" + "github.com/lilypad-tech/lilypad/pkg/system" "github.com/lilypad-tech/lilypad/pkg/web3" ) @@ -14,8 +15,9 @@ import ( var fs embed.FS type Config struct { - Web3 web3.Web3Options `toml:"web3"` - ServiceConfig data.ServiceConfig `toml:"services"` + Web3 web3.Web3Options `toml:"web3"` + ServiceConfig data.ServiceConfig `toml:"services"` + TelemetryOptions system.TelemetryOptions `toml:"telemetry"` } // TODO(bgins) Check for user-defined config files diff --git a/pkg/options/configs/dev.toml b/pkg/options/configs/dev.toml index 0001e39b..8dc2f92c 100644 --- a/pkg/options/configs/dev.toml +++ b/pkg/options/configs/dev.toml @@ -15,4 +15,6 @@ mediation_address = "0x0B306BF915C4d645ff596e518fAf3F9669b97016" jobcreator_address = "0x9A9f2CCfdE556A7E9Ff0848998Aa4a0CFD8863AE" pow_address = "0x4ed7c70F96B99c776995fB64377f0d4aB3B0e1C1" - +[telemetry] +url = "http://localhost:8500" +token = "eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJhdXRob3JpemVkIjp0cnVlLCJ1c2VyIjoicmVzb3VyY2UtcHJvdmlkZXIifQ.n36M_ngwC4XPQ_pEkkWAnPiOinnx6-0VO1v_WgCTUEERD7b_p9KHCU6SY5bUdFh5UXRZHAhc1gfyc7rjAnmeDQ" diff --git a/pkg/options/configs/devnet.toml b/pkg/options/configs/devnet.toml index f27717f6..1ac9c185 100644 --- a/pkg/options/configs/devnet.toml +++ b/pkg/options/configs/devnet.toml @@ -14,3 +14,7 @@ token_address = "0x5FbDB2315678afecb367f032d93F642f64180aa3" mediation_address = "0x2279B7A0a67DB372996a5FaB50D91eAA73d2eBe6" jobcreator_address = "0x610178dA211FEF7D417bC0e6FeD39F05609AD788" pow_address = "0x4ed7c70F96B99c776995fB64377f0d4aB3B0e1C1" + +[telemetry] +url = "https://observe.lilypad.tech" +token = "eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJhdXRob3JpemVkIjp0cnVlLCJ1c2VyIjoicmVzb3VyY2UtcHJvdmlkZXIifQ.n36M_ngwC4XPQ_pEkkWAnPiOinnx6-0VO1v_WgCTUEERD7b_p9KHCU6SY5bUdFh5UXRZHAhc1gfyc7rjAnmeDQ" diff --git a/pkg/options/configs/testnet.toml b/pkg/options/configs/testnet.toml index 9df0cb9b..baba3cc4 100644 --- a/pkg/options/configs/testnet.toml +++ b/pkg/options/configs/testnet.toml @@ -13,4 +13,8 @@ users_address = "0x90ed1AC9c74B9340468134F8c669BA1169A11c58" token_address = "0x0352485f8a3cB6d305875FaC0C40ef01e0C06535" mediation_address = "0xD1377D4617CD634426A8b595507fd2045A2DFB03" jobcreator_address = "0xDBA89e33EFE2eD227c04CB31356EFdE618d4953F" -pow_address = "0x8B852BA45293d6dd51B10c57625C6c5f25ADFB40" \ No newline at end of file +pow_address = "0x8B852BA45293d6dd51B10c57625C6c5f25ADFB40" + +[telemetry] +url = "https://observe.lilypad.tech" +token = "eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJhdXRob3JpemVkIjp0cnVlLCJ1c2VyIjoicmVzb3VyY2UtcHJvdmlkZXIifQ.n36M_ngwC4XPQ_pEkkWAnPiOinnx6-0VO1v_WgCTUEERD7b_p9KHCU6SY5bUdFh5UXRZHAhc1gfyc7rjAnmeDQ" diff --git a/pkg/options/otel.go b/pkg/options/otel.go new file mode 100644 index 00000000..5fc2d86e --- /dev/null +++ b/pkg/options/otel.go @@ -0,0 +1,60 @@ +package options + +import ( + "fmt" + + "github.com/lilypad-tech/lilypad/pkg/system" + "github.com/rs/zerolog/log" + "github.com/spf13/cobra" +) + +func GetDefaultTelemetryOptions() system.TelemetryOptions { + return system.TelemetryOptions{ + URL: GetDefaultServeOptionString("TELEMETRY_URL", ""), + Token: GetDefaultServeOptionString("TELEMETRY_TOKEN", ""), + Disable: GetDefaultServeOptionBool("DISABLE_TELEMETRY", false), + } +} + +func AddTelemetryCliFlags(cmd *cobra.Command, telemetryOptions *system.TelemetryOptions) { + cmd.PersistentFlags().StringVar( + &telemetryOptions.URL, "telemetry-url", telemetryOptions.URL, + `The telemetry endpoint to connect to (TELEMETRY_URL)`, + ) + cmd.PersistentFlags().StringVar( + &telemetryOptions.Token, "telemetry-token", telemetryOptions.Token, + `The token to auth with telemetry service (TELEMETRY_TOKEN)`, + ) + cmd.PersistentFlags().BoolVar( + &telemetryOptions.Disable, "disable-telemetry", telemetryOptions.Disable, + `Disable telemetry (DISABLE_TELEMETRY)`, + ) +} + +func ProcessTelemetryOptions(options system.TelemetryOptions, network string) (system.TelemetryOptions, error) { + config, err := getConfig(network) + if err != nil { + log.Error().Msgf("failed to load config for network %s: ", err) + return options, err + } + + // Apply configs when environment variables or command line options are not used + if options.URL == "" { + options.URL = config.TelemetryOptions.URL + } + if options.Token == "" { + options.Token = config.TelemetryOptions.Token + } + + return options, nil +} + +func CheckTelemetryOptions(options system.TelemetryOptions) error { + if len(options.URL) == 0 { + return fmt.Errorf("No telemetry endpoint specified - please use TELEMETRY_URL or --telemetry-url") + } + if len(options.Token) == 0 { + return fmt.Errorf("No telemetry token specified - please use TELEMETRY_TOKEN or --telemetry-token") + } + return nil +} diff --git a/pkg/options/resource-provider.go b/pkg/options/resource-provider.go index a63569fb..b4703938 100644 --- a/pkg/options/resource-provider.go +++ b/pkg/options/resource-provider.go @@ -12,10 +12,11 @@ import ( func NewResourceProviderOptions() resourceprovider.ResourceProviderOptions { options := resourceprovider.ResourceProviderOptions{ - Bacalhau: GetDefaultBacalhauOptions(), - Offers: GetDefaultResourceProviderOfferOptions(), - Web3: GetDefaultWeb3Options(), - Pow: GetDefaultResourceProviderPowOptions(), + Bacalhau: GetDefaultBacalhauOptions(), + Offers: GetDefaultResourceProviderOfferOptions(), + Web3: GetDefaultWeb3Options(), + Pow: GetDefaultResourceProviderPowOptions(), + Telemetry: GetDefaultTelemetryOptions(), } options.Web3.Service = system.ResourceProviderService return options @@ -116,6 +117,7 @@ func AddResourceProviderCliFlags(cmd *cobra.Command, options *resourceprovider.R AddWeb3CliFlags(cmd, &options.Web3) AddResourceProviderOfferCliFlags(cmd, &options.Offers) AddResourceProviderPowCliFlags(cmd, &options.Pow) + AddTelemetryCliFlags(cmd, &options.Telemetry) } func AddPowSignalCliFlags(cmd *cobra.Command, options *PowSignalOptions) { @@ -163,6 +165,10 @@ func CheckResourceProviderOptions(options resourceprovider.ResourceProviderOptio if err != nil { return err } + err = CheckTelemetryOptions(options.Telemetry) + if err != nil { + return err + } return nil } @@ -194,5 +200,10 @@ func ProcessResourceProviderOptions(options resourceprovider.ResourceProviderOpt return options, err } options.Web3 = newWeb3Options + newTelemetryOptions, err := ProcessTelemetryOptions(options.Telemetry, network) + if err != nil { + return options, err + } + options.Telemetry = newTelemetryOptions return options, CheckResourceProviderOptions(options) } diff --git a/pkg/resourceprovider/controller.go b/pkg/resourceprovider/controller.go index 87d8645c..53d73d0b 100644 --- a/pkg/resourceprovider/controller.go +++ b/pkg/resourceprovider/controller.go @@ -15,16 +15,20 @@ import ( "github.com/lilypad-tech/lilypad/pkg/system" "github.com/lilypad-tech/lilypad/pkg/web3" "github.com/lilypad-tech/lilypad/pkg/web3/bindings/storage" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/codes" + "go.opentelemetry.io/otel/trace" ) type ResourceProviderController struct { - solverClient *solver.SolverClient - options ResourceProviderOptions - web3SDK *web3.Web3SDK - web3Events *web3.EventChannels - loop *system.ControlLoop - log *system.ServiceLogger - executor executor.Executor + solverClient *solver.SolverClient + options ResourceProviderOptions + web3SDK *web3.Web3SDK + web3Events *web3.EventChannels + loop *system.ControlLoop + log *system.ServiceLogger + tracerProvider trace.TracerProvider + executor executor.Executor // keep track of which jobs are running // this is because no remote state will change // whilst we are actually running a job @@ -42,6 +46,7 @@ func NewResourceProviderController( options ResourceProviderOptions, web3SDK *web3.Web3SDK, executor executor.Executor, + telemetry system.Telemetry, ) (*ResourceProviderController, error) { // we know the address of the solver but what is it's url? solverUrl, err := web3SDK.GetSolverUrl(options.Offers.Services.Solver) @@ -61,13 +66,14 @@ func NewResourceProviderController( } controller := &ResourceProviderController{ - solverClient: solverClient, - options: options, - web3SDK: web3SDK, - web3Events: web3.NewEventChannels(), - log: system.NewServiceLogger(system.ResourceProviderService), - executor: executor, - runningJobs: map[string]bool{}, + solverClient: solverClient, + options: options, + web3SDK: web3SDK, + web3Events: web3.NewEventChannels(), + log: system.NewServiceLogger(system.ResourceProviderService), + tracerProvider: telemetry.TracerProvider, + executor: executor, + runningJobs: map[string]bool{}, } return controller, nil } @@ -151,7 +157,7 @@ func (controller *ResourceProviderController) Start(ctx context.Context, cm *sys ctx, CONTROL_LOOP_INTERVAL, func() error { - err := controller.solve() + err := controller.solve(ctx) if err != nil { errorChan <- err } @@ -180,7 +186,7 @@ func (controller *ResourceProviderController) Start(ctx context.Context, cm *sys * */ -func (controller *ResourceProviderController) solve() error { +func (controller *ResourceProviderController) solve(ctx context.Context) error { controller.log.Debug("solving", "") // if the solver does not know about resource offers @@ -198,7 +204,7 @@ func (controller *ResourceProviderController) solve() error { } // if there are jobs that have had both sides agree then we should run the job - err = controller.runJobs() + err = controller.runJobs(ctx) if err != nil { return err } @@ -359,7 +365,7 @@ func (controller *ResourceProviderController) agreeToDeals() error { * */ -func (controller *ResourceProviderController) runJobs() error { +func (controller *ResourceProviderController) runJobs(ctx context.Context) error { agreedDeals, err := controller.solverClient.GetDealsWithFilter( store.GetDealsQuery{ ResourceProvider: controller.web3SDK.GetAddress().String(), @@ -395,7 +401,7 @@ func (controller *ResourceProviderController) runJobs() error { controller.runningJobs[dealContainer.ID] = true }() - go controller.runJob(dealContainer) + go controller.runJob(ctx, dealContainer) } return err @@ -404,37 +410,70 @@ func (controller *ResourceProviderController) runJobs() error { // this is run in it's own go-routine // we've already updated controller.runningJobs so we know this will only // run once -func (controller *ResourceProviderController) runJob(deal data.DealContainer) { +func (controller *ResourceProviderController) runJob(ctx context.Context, deal data.DealContainer) { controller.log.Info("run job", deal) + controller.log.Info("deal ID", deal.Deal.ID) + + // Start run job trace + service := system.ResourceProviderService + ctx, span := controller.tracerProvider.Tracer(system.GetOTelServiceName(service)).Start(ctx, "run_job", + trace.WithAttributes(attribute.String("deal.id", deal.ID)), + trace.WithAttributes(attribute.String("deal.job_creator", deal.JobCreator)), + trace.WithAttributes(attribute.String("deal.resource_provider", deal.ResourceProvider)), + trace.WithAttributes(attribute.String("deal.job_offer.id", deal.Deal.JobOffer.ID)), + trace.WithAttributes(attribute.String("deal.job_offer.module.repo", deal.Deal.JobOffer.Module.Repo)), + trace.WithAttributes(attribute.String("deal.job_offer.module.hash", deal.Deal.JobOffer.Module.Hash)), + trace.WithAttributes(attribute.String("deal.resource_offer.id", deal.Deal.ResourceOffer.ID)), + ) + defer span.End() + + // When telemetry is disabled we use a Noop tracing provider, + // which does not export. We only log the trace ID when we are + // sending the trace somehwere. + if controller.options.Telemetry.Disable == false { + controller.log.Debug("starting job trace with trace ID", span.SpanContext().TraceID()) + } + + span.AddEvent("start") result := data.Result{ DealID: deal.ID, Error: "", } err := func() error { controller.log.Info("loading module", "") + span.AddEvent("module.load") module, err := module.LoadModule(deal.Deal.JobOffer.Module, deal.Deal.JobOffer.Inputs) if err != nil { + span.SetStatus(codes.Error, "load module failed") + span.RecordError(err) return fmt.Errorf("error loading module: %s", err.Error()) } controller.log.Info("module loaded", module) + span.AddEvent("module.loaded") + + span.AddEvent("executor.job.start") executorResult, err := controller.executor.RunJob(deal, *module) if err != nil { controller.log.Error("error running job", err) + span.SetStatus(codes.Error, "job execution failed") + span.RecordError(err) return fmt.Errorf("error running job: %s", err.Error()) } result.InstructionCount = uint64(executorResult.InstructionCount) result.DataID = executorResult.ResultsCID controller.log.Info("got result", result) + span.AddEvent("executor.job.complete") controller.log.Info(fmt.Sprintf("uploading results: %s %s %s", deal.ID, executorResult.ResultsDir, executorResult.ResultsCID), executorResult.ResultsDir) - + span.AddEvent("solver.files.upload") response, err := controller.solverClient.UploadResultFiles(deal.ID, executorResult.ResultsDir) - if err != nil { - // Log the response body in debug mode controller.log.Debug("[debug] error uploading results. response was ", response) + span.SetStatus(codes.Error, "upload results failed") + span.RecordError(err) return fmt.Errorf("error uploading results: %s", err.Error()) } + span.AddEvent("solver.files.uploaded", trace.WithAttributes(attribute.String("result.deal.id", result.DealID))) return nil }() @@ -448,6 +487,7 @@ func (controller *ResourceProviderController) runJob(deal data.DealContainer) { // the tarball of the results has been uploaded // now let's post the result data itself to the solver // then we will post the results on-chain + span.AddEvent("solver.result.add") createdResult, err := controller.solverClient.AddResult(result) if err != nil { // TODO: what should we do here? @@ -455,9 +495,13 @@ func (controller *ResourceProviderController) runJob(deal data.DealContainer) { // and the JC can claim a refund // but it's not really the fault of the RP that the solver refused to upload the results controller.log.Error("error posting result", err) + span.SetStatus(codes.Error, "add result to solver failed") + span.RecordError(err) return } + span.AddEvent("solver.result.added", trace.WithAttributes(attribute.String("result.id", createdResult.ID))) + span.AddEvent("chain.result.add") txHash, err := controller.web3SDK.AddResult( deal.Deal.ID, createdResult.ID, @@ -466,9 +510,13 @@ func (controller *ResourceProviderController) runJob(deal data.DealContainer) { ) if err != nil { controller.log.Error("error calling add result tx for job", err) + span.SetStatus(codes.Error, "add result to chain failed") + span.RecordError(err) return } + span.AddEvent("chain.result.added", trace.WithAttributes(attribute.String("txHash", txHash))) + span.AddEvent("solver.transaction_hash.add") _, err = controller.solverClient.UpdateTransactionsResourceProvider(deal.ID, data.DealTransactionsResourceProvider{ AddResult: txHash, }) @@ -477,6 +525,11 @@ func (controller *ResourceProviderController) runJob(deal data.DealContainer) { // some will be retryable - otherwise will be fatal // we need a way to exit a job loop as a baseline controller.log.Error("error adding add result tx hash for deal", err) + span.SetStatus(codes.Error, "add transcation hash to chain failed") + span.RecordError(err) return } + span.AddEvent("solver.transaction_hash.added") + + span.AddEvent("done") } diff --git a/pkg/resourceprovider/resourceprovider.go b/pkg/resourceprovider/resourceprovider.go index 56518e9b..dbfe4cf4 100644 --- a/pkg/resourceprovider/resourceprovider.go +++ b/pkg/resourceprovider/resourceprovider.go @@ -65,10 +65,11 @@ type ResourceProviderPowOptions struct { } type ResourceProviderOptions struct { - Bacalhau bacalhau.BacalhauExecutorOptions - Offers ResourceProviderOfferOptions - Web3 web3.Web3Options - Pow ResourceProviderPowOptions + Bacalhau bacalhau.BacalhauExecutorOptions + Offers ResourceProviderOfferOptions + Web3 web3.Web3Options + Pow ResourceProviderPowOptions + Telemetry system.TelemetryOptions } type ResourceProvider struct { @@ -81,8 +82,9 @@ func NewResourceProvider( options ResourceProviderOptions, web3SDK *web3.Web3SDK, executor executor.Executor, + telemetry system.Telemetry, ) (*ResourceProvider, error) { - controller, err := NewResourceProviderController(options, web3SDK, executor) + controller, err := NewResourceProviderController(options, web3SDK, executor, telemetry) if err != nil { return nil, err } diff --git a/pkg/system/context.go b/pkg/system/context.go index af5c179c..b0e8f641 100644 --- a/pkg/system/context.go +++ b/pkg/system/context.go @@ -20,6 +20,7 @@ type CommandContext struct { func NewSystemContext(ctx context.Context) *CommandContext { SetupLogging() + cm := NewCleanupManager() ctx, cancel := signal.NotifyContext(ctx, os.Interrupt) return &CommandContext{ @@ -52,6 +53,7 @@ func NewTestingContext() *CommandContext { // Finally, exit the program. os.Exit(0) }() + return NewSystemContext(context.Background()) } diff --git a/pkg/system/gpu.go b/pkg/system/gpu.go new file mode 100644 index 00000000..b35bd5f6 --- /dev/null +++ b/pkg/system/gpu.go @@ -0,0 +1,22 @@ +package system + +import ( + "github.com/jaypipes/ghw" + "github.com/rs/zerolog/log" +) + +func GetGPUInfo() []string { + gpu, err := ghw.GPU() + if err != nil { + log.Warn().Msgf("failed to get GPU info: %s", err) + } + + var gpu_info []string + if gpu != nil { + for _, card := range gpu.GraphicsCards { + gpu_info = append(gpu_info, card.String()) + } + } + + return gpu_info +} diff --git a/pkg/system/otel.go b/pkg/system/otel.go new file mode 100644 index 00000000..7f7afaa7 --- /dev/null +++ b/pkg/system/otel.go @@ -0,0 +1,156 @@ +package system + +import ( + "context" + "errors" + "fmt" + "net/url" + "runtime" + "strings" + + "github.com/rs/zerolog/log" + "go.opentelemetry.io/otel" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/exporters/otlp/otlptrace" + "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp" + "go.opentelemetry.io/otel/propagation" + "go.opentelemetry.io/otel/sdk/resource" + "go.opentelemetry.io/otel/sdk/trace" + semconv "go.opentelemetry.io/otel/semconv/v1.4.0" +) + +type Telemetry struct { + TracerProvider *trace.TracerProvider + Shutdown func(context.Context) error +} + +type TelemetryOptions struct { + URL string `json:"url" toml:"url"` + Token string `json:"token" toml:"token"` + Disable bool +} + +type TelemetryConfig struct { + TelemetryURL string + TelemetryToken string + Enabled bool + Service Service + Network string + Address string + GPU []string +} + +func SetupOTelSDK(ctx context.Context, config TelemetryConfig) (telemetry Telemetry, err error) { + var shutdownFuncs []func(context.Context) error + + // Call registered cleanup handlers, calling each + // cleanup handler once and joining error results. + Shutdown := func(ctx context.Context) error { + var err error + for _, fn := range shutdownFuncs { + err = errors.Join(err, fn(ctx)) + } + shutdownFuncs = nil + return err + } + + // On error, call shutdown for cleanup and return all errors. + handleErr := func(inErr error) { + err = errors.Join(inErr, Shutdown(ctx)) + } + + // Set up propagator + prop := newPropagator() + otel.SetTextMapPropagator(prop) + + // Set up tracer provider. + var TracerProvider *trace.TracerProvider + if config.Enabled { + TracerProvider, err = newTracerProvider(ctx, config) + if err != nil { + handleErr(err) + return Telemetry{ + TracerProvider, + Shutdown, + }, err + } + shutdownFuncs = append(shutdownFuncs, TracerProvider.Shutdown) + } else { + // TODO(bgins) Investigate a better Noop provider + TracerProvider = trace.NewTracerProvider() + } + + // TODO(bgins) Add meter and logger providers + + return Telemetry{TracerProvider, Shutdown}, nil +} + +func newPropagator() propagation.TextMapPropagator { + return propagation.NewCompositeTextMapPropagator( + propagation.TraceContext{}, + propagation.Baggage{}, + ) +} + +func newTracerProvider(ctx context.Context, config TelemetryConfig) (*trace.TracerProvider, error) { + exporter, err := newTracerExporter(ctx, config) + if err != nil { + log.Error().Msgf("failed to configure trace exporter: %v", err) + return nil, err + } + + // Set resource with global attributes + resource := resource.NewWithAttributes( + semconv.SchemaURL, + semconv.ServiceNameKey.String(GetOTelServiceName(config.Service)), + semconv.ServiceVersionKey.String(Version), + attribute.String("system.os", runtime.GOOS), + attribute.String("system.arch", runtime.GOARCH), + attribute.StringSlice("system.gpu", config.GPU), + attribute.String("chain.network", config.Network), + attribute.String("chain.address", config.Address), + ) + + // Set tracer provider + provider := trace.NewTracerProvider( + trace.WithBatcher(exporter), + trace.WithResource(resource), + ) + + return provider, nil +} + +func newTracerExporter(ctx context.Context, config TelemetryConfig) (*otlptrace.Exporter, error) { + headers := map[string]string{"Authorization": fmt.Sprintf("Bearer %s", config.TelemetryToken)} + url, err := url.ParseRequestURI(config.TelemetryURL) + if err != nil { + return nil, fmt.Errorf("unable to parse telemetry URL: %s", err) + } + + var exporter *otlptrace.Exporter + if url.Scheme == "https" { + exporter, err = otlptracehttp.New(ctx, + otlptracehttp.WithHeaders(headers), + otlptracehttp.WithEndpointURL(config.TelemetryURL), + ) + if err != nil { + return nil, err + } + } else { + exporter, err = otlptracehttp.New(ctx, + otlptracehttp.WithHeaders(headers), + otlptracehttp.WithEndpointURL(config.TelemetryURL), + otlptracehttp.WithInsecure(), + ) + if err != nil { + return nil, err + } + } + + return exporter, nil +} + +// Convert service names to use standardized OTel underscores +func GetOTelServiceName(service Service) string { + return strings.Replace(string(service), "-", "_", -1) +} diff --git a/pkg/system/otel_test.go b/pkg/system/otel_test.go new file mode 100644 index 00000000..3b26adbf --- /dev/null +++ b/pkg/system/otel_test.go @@ -0,0 +1,40 @@ +package system + +import "testing" + +func TestGetOTelServiceName(t *testing.T) { + tests := map[string]struct { + input Service + expected string + }{ + "solver": { + input: SolverService, + expected: "solver", + }, + "resource-provider": { + input: ResourceProviderService, + expected: "resource_provider", + }, + "job-creator": { + input: JobCreatorService, + expected: "job_creator", + }, + "mediator": { + input: MediatorService, + expected: "mediator", + }, + "default": { + input: DefaultService, + expected: "default", + }, + } + + for name, test := range tests { + t.Run(name, func(t *testing.T) { + t.Parallel() + if result, expected := GetOTelServiceName(test.input), test.expected; result != expected { + t.Fatalf("GetOTelServiceName(%v) returned %q; expected %q", test.input, result, expected) + } + }) + } +} diff --git a/pkg/system/version.go b/pkg/system/version.go new file mode 100644 index 00000000..7054c045 --- /dev/null +++ b/pkg/system/version.go @@ -0,0 +1,4 @@ +package system + +var Version string +var CommitSHA string diff --git a/pkg/web3/sdk.go b/pkg/web3/sdk.go index e3e8c657..2cc19bc4 100644 --- a/pkg/web3/sdk.go +++ b/pkg/web3/sdk.go @@ -192,8 +192,10 @@ func NewContracts( } func NewContractSDK(options Web3Options) (*Web3SDK, error) { - // write to console - log.Debug().Msgf("NewContractSDK: %+v", options) + displayOpts := options + displayOpts.PrivateKey = "*********" + log.Debug().Msgf("NewContractSDK: %+v", displayOpts) + client, err := ethclient.Dial(options.RpcURL) if err != nil { return nil, err @@ -218,14 +220,18 @@ func NewContractSDK(options Web3Options) (*Web3SDK, error) { if err != nil { return nil, err } - return &Web3SDK{ + + web3SDK := &Web3SDK{ PrivateKey: privateKey, Options: options, Client: client, CallOpts: callOpts, TransactOpts: transactOpts, Contracts: contracts, - }, nil + } + log.Debug().Msgf("Public Address: %s", web3SDK.GetAddress()) + + return web3SDK, nil } func (sdk *Web3SDK) getBlockNumber() (uint64, error) { diff --git a/stack b/stack index c7e3331b..8acf51cf 100755 --- a/stack +++ b/stack @@ -6,10 +6,11 @@ DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" OS_ARCH=$(uname -m | awk '{if ($0 ~ /arm64|aarch64/) print "arm64"; else if ($0 ~ /x86_64|amd64/) print "amd64"; else print "unsupported_arch"}') ############################################################################ -# docker compose +# docker compose ############################################################################ function compose-env() { export ADMIN_ADDRESS=${@:-"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"} + export DISABLE_TELEMETRY=false } function compose-init() {