Skip to content

Commit 9384d90

Browse files
authored
feat: Add Blockstore support (#85)
## Relevant issue(s) Resolves #84 ## Description Adds IPFS Blockstore support.
1 parent 2e78898 commit 9384d90

6 files changed

Lines changed: 477 additions & 2 deletions

File tree

Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,5 +67,6 @@ tidy:
6767
(cd ./memory && go mod tidy)
6868
(cd ./namespace && go mod tidy)
6969
(cd ./badger && go mod tidy)
70+
(cd ./blockstore && go mod tidy)
7071
(cd ./test && go mod tidy)
7172
go mod tidy

blockstore/blockstore.go

Lines changed: 179 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,179 @@
1+
// Licensed under the Apache License, Version 2.0 (the "License");
2+
// you may not use this file except in compliance with the License.
3+
// You may obtain a copy of the License at
4+
//
5+
// http://www.apache.org/licenses/LICENSE-2.0
6+
//
7+
// Unless required by applicable law or agreed to in writing, software
8+
// distributed under the License is distributed on an "AS IS" BASIS,
9+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10+
// See the License for the specific language governing permissions and
11+
// limitations under the License.
12+
13+
package blockstore
14+
15+
import (
16+
"context"
17+
"errors"
18+
19+
"github.com/ipfs/boxo/blockstore"
20+
blocks "github.com/ipfs/go-block-format"
21+
"github.com/ipfs/go-cid"
22+
dsq "github.com/ipfs/go-datastore/query"
23+
ipld "github.com/ipfs/go-ipld-format"
24+
25+
"github.com/sourcenetwork/corekv"
26+
"github.com/sourcenetwork/corelog"
27+
)
28+
29+
var (
30+
log = corelog.NewLogger("blockstore")
31+
)
32+
33+
// NewBlockstore returns an IPFS Blockstore implementation
34+
// using the provided corekv backend.
35+
func NewBlockstore(store corekv.ReaderWriter) *Blockstore {
36+
return &Blockstore{
37+
store: store,
38+
}
39+
}
40+
41+
type Blockstore struct {
42+
store corekv.ReaderWriter
43+
44+
rehash bool
45+
}
46+
47+
var _ blockstore.Blockstore = (*Blockstore)(nil)
48+
49+
// HashOnRead enables or disables rehashing of blocks on read.
50+
func (bs *Blockstore) HashOnRead(enabled bool) {
51+
bs.rehash = enabled
52+
}
53+
54+
// Get returns a block from the blockstore.
55+
func (bs *Blockstore) Get(ctx context.Context, k cid.Cid) (blocks.Block, error) {
56+
if !k.Defined() {
57+
return nil, ipld.ErrNotFound{Cid: k}
58+
}
59+
bdata, err := bs.store.Get(ctx, k.Bytes())
60+
if errors.Is(err, corekv.ErrNotFound) {
61+
return nil, ipld.ErrNotFound{Cid: k}
62+
}
63+
if err != nil {
64+
return nil, err
65+
}
66+
if bs.rehash {
67+
rbcid, err := k.Prefix().Sum(bdata)
68+
if err != nil {
69+
return nil, err
70+
}
71+
72+
if !rbcid.Equals(k) {
73+
return nil, ErrHashMismatch
74+
}
75+
76+
return blocks.NewBlockWithCid(bdata, rbcid)
77+
}
78+
return blocks.NewBlockWithCid(bdata, k)
79+
}
80+
81+
// Put stores a block to the blockstore.
82+
func (bs *Blockstore) Put(ctx context.Context, block blocks.Block) error {
83+
k := block.Cid().Bytes()
84+
85+
// Has is cheaper than Set, so see if we already have it
86+
exists, err := bs.store.Has(ctx, k)
87+
if err == nil && exists {
88+
return nil // already stored.
89+
}
90+
91+
return bs.store.Set(ctx, k, block.RawData())
92+
}
93+
94+
// PutMany stores multiple blocks to the blockstore.
95+
func (bs *Blockstore) PutMany(ctx context.Context, blocks []blocks.Block) error {
96+
for _, b := range blocks {
97+
k := b.Cid().Bytes()
98+
exists, err := bs.store.Has(ctx, k)
99+
if err == nil && exists {
100+
continue
101+
}
102+
103+
err = bs.store.Set(ctx, k, b.RawData())
104+
if err != nil {
105+
return err
106+
}
107+
}
108+
return nil
109+
}
110+
111+
// Has returns whether a block is stored in the blockstore.
112+
func (bs *Blockstore) Has(ctx context.Context, k cid.Cid) (bool, error) {
113+
return bs.store.Has(ctx, k.Bytes())
114+
}
115+
116+
// GetSize returns the size of a block in the blockstore.
117+
func (bs *Blockstore) GetSize(ctx context.Context, k cid.Cid) (int, error) {
118+
buf, err := bs.store.Get(ctx, k.Bytes())
119+
if errors.Is(err, corekv.ErrNotFound) {
120+
return -1, ipld.ErrNotFound{Cid: k}
121+
}
122+
return len(buf), err
123+
}
124+
125+
// DeleteBlock removes a block from the blockstore.
126+
func (bs *Blockstore) DeleteBlock(ctx context.Context, k cid.Cid) error {
127+
return bs.store.Delete(ctx, k.Bytes())
128+
}
129+
130+
// AllKeysChan runs a query for keys from the blockstore.
131+
//
132+
// AllKeysChan respects context.
133+
//
134+
// TODO this is very simplistic, in the future, take dsq.Query as a param?
135+
func (bs *Blockstore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error) {
136+
// KeysOnly, because that would be _a lot_ of data.
137+
iter, err := bs.store.Iterator(ctx, corekv.IterOptions{
138+
KeysOnly: true,
139+
})
140+
if err != nil {
141+
return nil, err
142+
}
143+
144+
output := make(chan cid.Cid, dsq.KeysOnlyBufSize)
145+
go func() {
146+
defer func() {
147+
//nolint:errcheck
148+
iter.Close() // ensure exit (signals early exit, too)
149+
close(output)
150+
}()
151+
152+
for {
153+
hasNext, err := iter.Next()
154+
if err != nil {
155+
log.ErrorContextE(ctx, "Error iterating through keys", err)
156+
break
157+
}
158+
159+
if !hasNext {
160+
break
161+
}
162+
163+
key := iter.Key()
164+
k, err := cid.Cast(key)
165+
if err != nil {
166+
log.ErrorContextE(ctx, "Error parsing key from binary", err)
167+
continue
168+
}
169+
170+
select {
171+
case <-ctx.Done():
172+
return
173+
case output <- k:
174+
}
175+
}
176+
}()
177+
178+
return output, nil
179+
}

blockstore/errors.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package blockstore
2+
3+
import "errors"
4+
5+
var (
6+
// ErrHashMismatch is an error returned when the hash of a block is different than expected.
7+
ErrHashMismatch = errors.New("block in storage has different hash than requested")
8+
)

blockstore/go.mod

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
module github.com/sourcenetwork/corekv/blockstore
2+
3+
go 1.24.6
4+
5+
require (
6+
github.com/ipfs/boxo v0.34.0
7+
github.com/ipfs/go-block-format v0.2.2
8+
github.com/ipfs/go-cid v0.5.0
9+
github.com/ipfs/go-datastore v0.8.3
10+
github.com/ipfs/go-ipld-format v0.6.2
11+
github.com/sourcenetwork/corekv v0.0.0
12+
github.com/sourcenetwork/corelog v0.0.8
13+
)
14+
15+
require (
16+
github.com/Jorropo/jsync v1.0.1 // indirect
17+
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0 // indirect
18+
github.com/go-logr/logr v1.4.3 // indirect
19+
github.com/go-logr/stdr v1.2.2 // indirect
20+
github.com/google/uuid v1.6.0 // indirect
21+
github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect
22+
github.com/ipfs/bbloom v0.0.4 // indirect
23+
github.com/ipfs/go-log/v2 v2.8.1 // indirect
24+
github.com/ipfs/go-metrics-interface v0.3.0 // indirect
25+
github.com/klauspost/cpuid/v2 v2.3.0 // indirect
26+
github.com/libp2p/go-buffer-pool v0.1.0 // indirect
27+
github.com/libp2p/go-libp2p v0.43.0 // indirect
28+
github.com/libp2p/go-libp2p-record v0.3.1 // indirect
29+
github.com/libp2p/go-libp2p-routing-helpers v0.7.5 // indirect
30+
github.com/lmittmann/tint v1.0.4 // indirect
31+
github.com/mattn/go-isatty v0.0.20 // indirect
32+
github.com/minio/sha256-simd v1.0.1 // indirect
33+
github.com/mr-tron/base58 v1.2.0 // indirect
34+
github.com/multiformats/go-base32 v0.1.0 // indirect
35+
github.com/multiformats/go-base36 v0.2.0 // indirect
36+
github.com/multiformats/go-multiaddr v0.16.1 // indirect
37+
github.com/multiformats/go-multibase v0.2.0 // indirect
38+
github.com/multiformats/go-multicodec v0.9.2 // indirect
39+
github.com/multiformats/go-multihash v0.2.3 // indirect
40+
github.com/multiformats/go-varint v0.0.7 // indirect
41+
github.com/spaolacci/murmur3 v1.1.0 // indirect
42+
go.opentelemetry.io/auto/sdk v1.1.0 // indirect
43+
go.opentelemetry.io/otel v1.37.0 // indirect
44+
go.opentelemetry.io/otel/metric v1.37.0 // indirect
45+
go.opentelemetry.io/otel/trace v1.37.0 // indirect
46+
go.uber.org/multierr v1.11.0 // indirect
47+
go.uber.org/zap v1.27.0 // indirect
48+
golang.org/x/crypto v0.41.0 // indirect
49+
golang.org/x/exp v0.0.0-20250813145105-42675adae3e6 // indirect
50+
golang.org/x/sys v0.35.0 // indirect
51+
golang.org/x/term v0.34.0 // indirect
52+
google.golang.org/protobuf v1.36.7 // indirect
53+
lukechampine.com/blake3 v1.4.1 // indirect
54+
)
55+
56+
replace github.com/sourcenetwork/corekv v0.0.0 => ./..

blockstore/go.sum

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
github.com/Jorropo/jsync v1.0.1 h1:6HgRolFZnsdfzRUj+ImB9og1JYOxQoReSywkHOGSaUU=
2+
github.com/Jorropo/jsync v1.0.1/go.mod h1:jCOZj3vrBCri3bSU3ErUYvevKlnbssrXeCivybS5ABQ=
3+
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
4+
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
5+
github.com/decred/dcrd/crypto/blake256 v1.1.0 h1:zPMNGQCm0g4QTY27fOCorQW7EryeQ/U0x++OzVrdms8=
6+
github.com/decred/dcrd/crypto/blake256 v1.1.0/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo=
7+
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0 h1:NMZiJj8QnKe1LgsbDayM4UoHwbvwDRwnI3hwNaAHRnc=
8+
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0/go.mod h1:ZXNYxsqcloTdSy/rNShjYzMhyjf0LaoftYK0p+A3h40=
9+
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
10+
github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=
11+
github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
12+
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
13+
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
14+
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
15+
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
16+
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
17+
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
18+
github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k=
19+
github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM=
20+
github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
21+
github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
22+
github.com/ipfs/boxo v0.34.0 h1:pMP9bAsTs4xVh8R0ZmxIWviV7kjDa60U24QrlGgHb1g=
23+
github.com/ipfs/boxo v0.34.0/go.mod h1:kzdH/ewDybtO3+M8MCVkpwnIIc/d2VISX95DFrY4vQA=
24+
github.com/ipfs/go-block-format v0.2.2 h1:uecCTgRwDIXyZPgYspaLXoMiMmxQpSx2aq34eNc4YvQ=
25+
github.com/ipfs/go-block-format v0.2.2/go.mod h1:vmuefuWU6b+9kIU0vZJgpiJt1yicQz9baHXE8qR+KB8=
26+
github.com/ipfs/go-cid v0.5.0 h1:goEKKhaGm0ul11IHA7I6p1GmKz8kEYniqFopaB5Otwg=
27+
github.com/ipfs/go-cid v0.5.0/go.mod h1:0L7vmeNXpQpUS9vt+yEARkJ8rOg43DF3iPgn4GIN0mk=
28+
github.com/ipfs/go-datastore v0.8.3 h1:z391GsQyGKUIUof2tPoaZVeDknbt7fNHs6Gqjcw5Jo4=
29+
github.com/ipfs/go-datastore v0.8.3/go.mod h1:raxQ/CreIy9L6MxT71ItfMX12/ASN6EhXJoUFjICQ2M=
30+
github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk=
31+
github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps=
32+
github.com/ipfs/go-ipld-format v0.6.2 h1:bPZQ+A05ol0b3lsJSl0bLvwbuQ+HQbSsdGTy4xtYUkU=
33+
github.com/ipfs/go-ipld-format v0.6.2/go.mod h1:nni2xFdHKx5lxvXJ6brt/pndtGxKAE+FPR1rg4jTkyk=
34+
github.com/ipfs/go-log/v2 v2.8.1 h1:Y/X36z7ASoLJaYIJAL4xITXgwf7RVeqb1+/25aq/Xk0=
35+
github.com/ipfs/go-log/v2 v2.8.1/go.mod h1:NyhTBcZmh2Y55eWVjOeKf8M7e4pnJYM3yDZNxQBWEEY=
36+
github.com/ipfs/go-metrics-interface v0.3.0 h1:YwG7/Cy4R94mYDUuwsBfeziJCVm9pBMJ6q/JR9V40TU=
37+
github.com/ipfs/go-metrics-interface v0.3.0/go.mod h1:OxxQjZDGocXVdyTPocns6cOLwHieqej/jos7H4POwoY=
38+
github.com/ipfs/go-test v0.2.2 h1:1yjYyfbdt1w93lVzde6JZ2einh3DIV40at4rVoyEcE8=
39+
github.com/ipfs/go-test v0.2.2/go.mod h1:cmLisgVwkdRCnKu/CFZOk2DdhOcwghr5GsHeqwexoRA=
40+
github.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzhA9Y=
41+
github.com/klauspost/cpuid/v2 v2.3.0/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0=
42+
github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8=
43+
github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg=
44+
github.com/libp2p/go-libp2p v0.43.0 h1:b2bg2cRNmY4HpLK8VHYQXLX2d3iND95OjodLFymvqXU=
45+
github.com/libp2p/go-libp2p v0.43.0/go.mod h1:IiSqAXDyP2sWH+J2gs43pNmB/y4FOi2XQPbsb+8qvzc=
46+
github.com/libp2p/go-libp2p-record v0.3.1 h1:cly48Xi5GjNw5Wq+7gmjfBiG9HCzQVkiZOUZ8kUl+Fg=
47+
github.com/libp2p/go-libp2p-record v0.3.1/go.mod h1:T8itUkLcWQLCYMqtX7Th6r7SexyUJpIyPgks757td/E=
48+
github.com/libp2p/go-libp2p-routing-helpers v0.7.5 h1:HdwZj9NKovMx0vqq6YNPTh6aaNzey5zHD7HeLJtq6fI=
49+
github.com/libp2p/go-libp2p-routing-helpers v0.7.5/go.mod h1:3YaxrwP0OBPDD7my3D0KxfR89FlcX/IEbxDEDfAmj98=
50+
github.com/lmittmann/tint v1.0.4 h1:LeYihpJ9hyGvE0w+K2okPTGUdVLfng1+nDNVR4vWISc=
51+
github.com/lmittmann/tint v1.0.4/go.mod h1:HIS3gSy7qNwGCj+5oRjAutErFBl4BzdQP6cJZ0NfMwE=
52+
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
53+
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
54+
github.com/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dzMM=
55+
github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5xJjtbRSN8=
56+
github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o=
57+
github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc=
58+
github.com/multiformats/go-base32 v0.1.0 h1:pVx9xoSPqEIQG8o+UbAe7DNi51oej1NtK+aGkbLYxPE=
59+
github.com/multiformats/go-base32 v0.1.0/go.mod h1:Kj3tFY6zNr+ABYMqeUNeGvkIC/UYgtWibDcT0rExnbI=
60+
github.com/multiformats/go-base36 v0.2.0 h1:lFsAbNOGeKtuKozrtBsAkSVhv1p9D0/qedU9rQyccr0=
61+
github.com/multiformats/go-base36 v0.2.0/go.mod h1:qvnKE++v+2MWCfePClUEjE78Z7P2a1UV0xHgWc0hkp4=
62+
github.com/multiformats/go-multiaddr v0.16.1 h1:fgJ0Pitow+wWXzN9do+1b8Pyjmo8m5WhGfzpL82MpCw=
63+
github.com/multiformats/go-multiaddr v0.16.1/go.mod h1:JSVUmXDjsVFiW7RjIFMP7+Ev+h1DTbiJgVeTV/tcmP0=
64+
github.com/multiformats/go-multibase v0.2.0 h1:isdYCVLvksgWlMW9OZRYJEa9pZETFivncJHmHnnd87g=
65+
github.com/multiformats/go-multibase v0.2.0/go.mod h1:bFBZX4lKCA/2lyOFSAoKH5SS6oPyjtnzK/XTFDPkNuk=
66+
github.com/multiformats/go-multicodec v0.9.2 h1:YrlXCuqxjqm3bXl+vBq5LKz5pz4mvAsugdqy78k0pXQ=
67+
github.com/multiformats/go-multicodec v0.9.2/go.mod h1:LLWNMtyV5ithSBUo3vFIMaeDy+h3EbkMTek1m+Fybbo=
68+
github.com/multiformats/go-multihash v0.2.3 h1:7Lyc8XfX/IY2jWb/gI7JP+o7JEq9hOa7BFvVU9RSh+U=
69+
github.com/multiformats/go-multihash v0.2.3/go.mod h1:dXgKXCXjBzdscBLk9JkjINiEsCKRVch90MdaGiKsvSM=
70+
github.com/multiformats/go-varint v0.0.7 h1:sWSGR+f/eu5ABZA2ZpYKBILXTTs9JWpdEM/nEGOHFS8=
71+
github.com/multiformats/go-varint v0.0.7/go.mod h1:r8PUYw/fD/SjBCiKOoDlGF6QawOELpZAu9eioSos/OU=
72+
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
73+
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
74+
github.com/sourcenetwork/corelog v0.0.8 h1:jCo0mFBpWrfhUCGzzN3uUtPGyQv3jnITdPO1s2ME3RY=
75+
github.com/sourcenetwork/corelog v0.0.8/go.mod h1:cMabHgs3kARgYTQeQYSOmaGGP8XMU6sZrHd8LFrL3zA=
76+
github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI=
77+
github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
78+
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
79+
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
80+
go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=
81+
go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
82+
go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ=
83+
go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I=
84+
go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE=
85+
go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E=
86+
go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4=
87+
go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0=
88+
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
89+
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
90+
go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
91+
go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
92+
go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
93+
go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
94+
golang.org/x/crypto v0.41.0 h1:WKYxWedPGCTVVl5+WHSSrOBT0O8lx32+zxmHxijgXp4=
95+
golang.org/x/crypto v0.41.0/go.mod h1:pO5AFd7FA68rFak7rOAGVuygIISepHftHnr8dr6+sUc=
96+
golang.org/x/exp v0.0.0-20250813145105-42675adae3e6 h1:SbTAbRFnd5kjQXbczszQ0hdk3ctwYf3qBNH9jIsGclE=
97+
golang.org/x/exp v0.0.0-20250813145105-42675adae3e6/go.mod h1:4QTo5u+SEIbbKW1RacMZq1YEfOBqeXa19JeshGi+zc4=
98+
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
99+
golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI=
100+
golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
101+
golang.org/x/term v0.34.0 h1:O/2T7POpk0ZZ7MAzMeWFSg6S5IpWd/RXDlM9hgM3DR4=
102+
golang.org/x/term v0.34.0/go.mod h1:5jC53AEywhIVebHgPVeg0mj8OD3VO9OzclacVrqpaAw=
103+
google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A=
104+
google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=
105+
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
106+
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
107+
lukechampine.com/blake3 v1.4.1 h1:I3Smz7gso8w4/TunLKec6K2fn+kyKtDxr/xcQEN84Wg=
108+
lukechampine.com/blake3 v1.4.1/go.mod h1:QFosUxmjB8mnrWFSNwKmvxHpfY72bmD2tQ0kBMM3kwo=

0 commit comments

Comments
 (0)