Compare commits
	
		
			No commits in common. "v5" and "v4.0.10-alpha-wip" have entirely different histories.
		
	
	
		
			v5
			...
			v4.0.10-al
		
	
		
							
								
								
									
										10
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								README.md
									
									
									
									
									
								
							| @ -1,6 +1,6 @@ | ||||
| ## ipfs-ethdb | ||||
| 
 | ||||
| [](https://goreportcard.com/report/github.com/cerc-io/ipfs-ethdb) | ||||
| [](https://goreportcard.com/report/github.com/vulcanize/ipfs-ethdb) | ||||
| 
 | ||||
| > go-ethereum ethdb interfaces for Ethereum state data stored in IPFS | ||||
| 
 | ||||
| @ -11,7 +11,7 @@ interfacing with a state database. These interfaces are used to build higher-lev | ||||
| which are used to perform the bulk of state related needs. | ||||
| 
 | ||||
| Ethereum data can be stored on IPFS, standard codecs for Etheruem data are defined in the [go-cid](https://github.com/ipfs/go-cid) library. | ||||
| Using our [statediffing geth client](https://github.com/cerc-io/go-ethereum/releases/tag/v1.9.11-statediff-0.0.2) it is feasible to extract every single | ||||
| Using our [statediffing geth client](https://github.com/vulcanize/go-ethereum/releases/tag/v1.9.11-statediff-0.0.2) it is feasible to extract every single | ||||
| state and storage node and publish it to IPFS. | ||||
| 
 | ||||
| Geth stores state data in leveldb as key-value pairs between the keccak256 hash of the rlp-encoded object and the rlp-encoded object. | ||||
| @ -21,7 +21,7 @@ ethdb interfaces for Ethereum data on IPFS by handling the conversion of a kecca | ||||
| 
 | ||||
| 
 | ||||
| ## Usage | ||||
| To use this module import it and build an ethdb interface around an instance of a [Go IPFS blockservice](https://pkg.go.dev/github.com/ipfs/boxo@v0.19.0/blockservice), you can then | ||||
| To use this module import it and build an ethdb interface around an instance of a [go ipfs blockservice](https://github.com/ipfs/go-blockservice), you can then | ||||
| employ it as you would the usual [leveldb](https://github.com/ethereum/go-ethereum/tree/master/ethdb/leveldb) or [memorydb](https://github.com/ethereum/go-ethereum/tree/master/ethdb/memorydb) ethdbs | ||||
| with some exceptions: the AncientReader, AncientWriter, Compacter, and Iteratee/Iterator interfaces are not functionally complete. | ||||
| 
 | ||||
| @ -46,11 +46,11 @@ import ( | ||||
|     "github.com/ethereum/go-ethereum/common" | ||||
|     "github.com/ethereum/go-ethereum/core/state" | ||||
|     "github.com/ethereum/go-ethereum/trie" | ||||
|     "github.com/ipfs/boxo/blockservice" | ||||
|     "github.com/ipfs/go-blockservice" | ||||
|     "github.com/ipfs/go-ipfs/core" | ||||
|     "github.com/ipfs/go-ipfs/repo/fsrepo" | ||||
|     "github.com/jmoiron/sqlx" | ||||
|     "github.com/cerc-io/ipfs-ethdb/v5" | ||||
|     "github.com/vulcanize/ipfs-ethdb/v4" | ||||
| ) | ||||
| 
 | ||||
| func main() { | ||||
|  | ||||
							
								
								
									
										2
									
								
								batch.go
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								batch.go
									
									
									
									
									
								
							| @ -23,8 +23,8 @@ import ( | ||||
| 	"github.com/ethereum/go-ethereum/common" | ||||
| 	"github.com/ethereum/go-ethereum/ethdb" | ||||
| 	lru "github.com/hashicorp/golang-lru" | ||||
| 	"github.com/ipfs/boxo/blockservice" | ||||
| 	blocks "github.com/ipfs/go-block-format" | ||||
| 	"github.com/ipfs/go-blockservice" | ||||
| ) | ||||
| 
 | ||||
| var ( | ||||
|  | ||||
| @ -25,7 +25,7 @@ import ( | ||||
| 	. "github.com/onsi/ginkgo" | ||||
| 	. "github.com/onsi/gomega" | ||||
| 
 | ||||
| 	ipfsethdb "github.com/cerc-io/ipfs-ethdb/v5" | ||||
| 	ipfsethdb "github.com/cerc-io/ipfs-ethdb/v4" | ||||
| ) | ||||
| 
 | ||||
| var ( | ||||
|  | ||||
							
								
								
									
										16
									
								
								database.go
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								database.go
									
									
									
									
									
								
							| @ -23,7 +23,7 @@ import ( | ||||
| 	"strings" | ||||
| 
 | ||||
| 	"github.com/ethereum/go-ethereum/ethdb" | ||||
| 	"github.com/ipfs/boxo/blockservice" | ||||
| 	"github.com/ipfs/go-blockservice" | ||||
| ) | ||||
| 
 | ||||
| var ( | ||||
| @ -215,9 +215,9 @@ func (d *Database) AncientSize(kind string) (uint64, error) { | ||||
| 
 | ||||
| // AncientRange retrieves all the items in a range, starting from the index 'start'.
 | ||||
| // It will return
 | ||||
| //   - at most 'count' items,
 | ||||
| //   - at least 1 item (even if exceeding the maxBytes), but will otherwise
 | ||||
| //     return as many items as fit into maxBytes.
 | ||||
| //  - at most 'count' items,
 | ||||
| //  - at least 1 item (even if exceeding the maxBytes), but will otherwise
 | ||||
| //   return as many items as fit into maxBytes.
 | ||||
| func (d *Database) AncientRange(kind string, start, count, maxBytes uint64) ([][]byte, error) { | ||||
| 	return nil, errNotSupported | ||||
| } | ||||
| @ -229,14 +229,14 @@ func (d *Database) ReadAncients(fn func(ethdb.AncientReaderOp) error) (err error | ||||
| 
 | ||||
| // TruncateHead satisfies the ethdb.AncientWriter interface.
 | ||||
| // TruncateHead discards all but the first n ancient data from the ancient store.
 | ||||
| func (d *Database) TruncateHead(n uint64) (uint64, error) { | ||||
| 	return 0, errNotSupported | ||||
| func (d *Database) TruncateHead(n uint64) error { | ||||
| 	return errNotSupported | ||||
| } | ||||
| 
 | ||||
| // TruncateTail satisfies the ethdb.AncientWriter interface.
 | ||||
| // TruncateTail discards the first n ancient data from the ancient store.
 | ||||
| func (d *Database) TruncateTail(n uint64) (uint64, error) { | ||||
| 	return 0, errNotSupported | ||||
| func (d *Database) TruncateTail(n uint64) error { | ||||
| 	return errNotSupported | ||||
| } | ||||
| 
 | ||||
| // Sync satisfies the ethdb.AncientWriter interface
 | ||||
|  | ||||
| @ -22,11 +22,11 @@ import ( | ||||
| 	"github.com/ethereum/go-ethereum/core/types" | ||||
| 	"github.com/ethereum/go-ethereum/ethdb" | ||||
| 	"github.com/ethereum/go-ethereum/rlp" | ||||
| 	"github.com/ipfs/boxo/blockservice" | ||||
| 	"github.com/ipfs/go-blockservice" | ||||
| 	. "github.com/onsi/ginkgo" | ||||
| 	. "github.com/onsi/gomega" | ||||
| 
 | ||||
| 	ipfsethdb "github.com/cerc-io/ipfs-ethdb/v5" | ||||
| 	ipfsethdb "github.com/cerc-io/ipfs-ethdb/v4" | ||||
| ) | ||||
| 
 | ||||
| var ( | ||||
|  | ||||
							
								
								
									
										97
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										97
									
								
								go.mod
									
									
									
									
									
								
							| @ -1,73 +1,72 @@ | ||||
| module github.com/cerc-io/ipfs-ethdb/v5 | ||||
| module github.com/cerc-io/ipfs-ethdb/v4 | ||||
| 
 | ||||
| go 1.21 | ||||
| go 1.18 | ||||
| 
 | ||||
| require ( | ||||
| 	github.com/ethereum/go-ethereum v1.13.14 | ||||
| 	github.com/hashicorp/golang-lru v1.0.2 | ||||
| 	github.com/ipfs/boxo v0.19.0 | ||||
| 	github.com/ipfs/go-block-format v0.2.0 | ||||
| 	github.com/ipfs/go-cid v0.4.1 | ||||
| 	github.com/ethereum/go-ethereum v1.10.26 | ||||
| 	github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d | ||||
| 	github.com/ipfs/go-block-format v0.0.3 | ||||
| 	github.com/ipfs/go-blockservice v0.4.0 | ||||
| 	github.com/ipfs/go-cid v0.2.0 | ||||
| 	github.com/ipfs/go-ipfs-blockstore v1.2.0 | ||||
| 	github.com/ipfs/go-ipfs-ds-help v1.1.0 | ||||
| 	github.com/ipfs/go-ipfs-exchange-interface v0.2.0 | ||||
| 	github.com/jmoiron/sqlx v1.3.5 | ||||
| 	github.com/lib/pq v1.10.9 | ||||
| 	github.com/lib/pq v1.10.6 | ||||
| 	github.com/mailgun/groupcache/v2 v2.3.0 | ||||
| 	github.com/multiformats/go-multihash v0.2.3 | ||||
| 	github.com/multiformats/go-multihash v0.1.0 | ||||
| 	github.com/onsi/ginkgo v1.16.5 | ||||
| 	github.com/onsi/gomega v1.19.0 | ||||
| 	github.com/sirupsen/logrus v1.6.0 | ||||
| ) | ||||
| 
 | ||||
| require github.com/btcsuite/btcd/btcec/v2 v2.2.0 // indirect | ||||
| 
 | ||||
| require ( | ||||
| 	github.com/bits-and-blooms/bitset v1.10.0 // indirect | ||||
| 	github.com/btcsuite/btcd/btcec/v2 v2.2.0 // indirect | ||||
| 	github.com/consensys/bavard v0.1.13 // indirect | ||||
| 	github.com/consensys/gnark-crypto v0.12.1 // indirect | ||||
| 	github.com/crate-crypto/go-kzg-4844 v0.7.0 // indirect | ||||
| 	github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect | ||||
| 	github.com/ethereum/c-kzg-4844 v0.4.0 // indirect | ||||
| 	github.com/fsnotify/fsnotify v1.6.0 // indirect | ||||
| 	github.com/go-logr/logr v1.4.1 // indirect | ||||
| 	github.com/btcsuite/btcd v0.22.0-beta // indirect | ||||
| 	github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect | ||||
| 	github.com/fsnotify/fsnotify v1.4.9 // indirect | ||||
| 	github.com/go-logr/logr v1.2.3 // indirect | ||||
| 	github.com/go-logr/stdr v1.2.2 // indirect | ||||
| 	github.com/golang/protobuf v1.5.3 // indirect | ||||
| 	github.com/google/uuid v1.6.0 // indirect | ||||
| 	github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect | ||||
| 	github.com/holiman/uint256 v1.2.4 // indirect | ||||
| 	github.com/gogo/protobuf v1.3.2 // indirect | ||||
| 	github.com/golang/protobuf v1.5.2 // indirect | ||||
| 	github.com/google/uuid v1.2.0 // indirect | ||||
| 	github.com/ipfs/bbloom v0.0.4 // indirect | ||||
| 	github.com/ipfs/go-datastore v0.6.0 // indirect | ||||
| 	github.com/ipfs/go-ipfs-util v0.0.3 // indirect | ||||
| 	github.com/ipfs/go-ipld-format v0.6.0 // indirect | ||||
| 	github.com/ipfs/go-log/v2 v2.5.1 // indirect | ||||
| 	github.com/ipfs/go-datastore v0.5.0 // indirect | ||||
| 	github.com/ipfs/go-ipfs-util v0.0.2 // indirect | ||||
| 	github.com/ipfs/go-ipld-format v0.4.0 // indirect | ||||
| 	github.com/ipfs/go-log v1.0.5 // indirect | ||||
| 	github.com/ipfs/go-log/v2 v2.3.0 // indirect | ||||
| 	github.com/ipfs/go-metrics-interface v0.0.1 // indirect | ||||
| 	github.com/ipfs/go-verifcid v0.0.1 // indirect | ||||
| 	github.com/jbenet/goprocess v0.1.4 // indirect | ||||
| 	github.com/klauspost/cpuid/v2 v2.2.7 // indirect | ||||
| 	github.com/klauspost/cpuid/v2 v2.0.9 // indirect | ||||
| 	github.com/konsorten/go-windows-terminal-sequences v1.0.3 // indirect | ||||
| 	github.com/mattn/go-isatty v0.0.20 // indirect | ||||
| 	github.com/minio/sha256-simd v1.0.1 // indirect | ||||
| 	github.com/mmcloughlin/addchain v0.4.0 // indirect | ||||
| 	github.com/mattn/go-isatty v0.0.13 // indirect | ||||
| 	github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 // indirect | ||||
| 	github.com/minio/sha256-simd v1.0.0 // indirect | ||||
| 	github.com/mr-tron/base58 v1.2.0 // indirect | ||||
| 	github.com/multiformats/go-base32 v0.1.0 // indirect | ||||
| 	github.com/multiformats/go-base36 v0.2.0 // indirect | ||||
| 	github.com/multiformats/go-multibase v0.2.0 // indirect | ||||
| 	github.com/multiformats/go-varint v0.0.7 // indirect | ||||
| 	github.com/multiformats/go-base32 v0.0.3 // indirect | ||||
| 	github.com/multiformats/go-base36 v0.1.0 // indirect | ||||
| 	github.com/multiformats/go-multibase v0.0.3 // indirect | ||||
| 	github.com/multiformats/go-varint v0.0.6 // indirect | ||||
| 	github.com/nxadm/tail v1.4.8 // indirect | ||||
| 	github.com/opentracing/opentracing-go v1.2.0 // indirect | ||||
| 	github.com/segmentio/fasthash v1.0.3 // indirect | ||||
| 	github.com/spaolacci/murmur3 v1.1.0 // indirect | ||||
| 	github.com/supranational/blst v0.3.11 // indirect | ||||
| 	go.opentelemetry.io/otel v1.25.0 // indirect | ||||
| 	go.opentelemetry.io/otel/metric v1.25.0 // indirect | ||||
| 	go.opentelemetry.io/otel/trace v1.25.0 // indirect | ||||
| 	go.uber.org/multierr v1.11.0 // indirect | ||||
| 	go.uber.org/zap v1.27.0 // indirect | ||||
| 	golang.org/x/crypto v0.22.0 // indirect | ||||
| 	golang.org/x/exp v0.0.0-20240103183307-be819d1f06fc // indirect | ||||
| 	golang.org/x/net v0.21.0 // indirect | ||||
| 	golang.org/x/sync v0.6.0 // indirect | ||||
| 	golang.org/x/sys v0.19.0 // indirect | ||||
| 	golang.org/x/text v0.14.0 // indirect | ||||
| 	google.golang.org/protobuf v1.32.0 // indirect | ||||
| 	go.opentelemetry.io/otel v1.7.0 // indirect | ||||
| 	go.opentelemetry.io/otel/trace v1.7.0 // indirect | ||||
| 	go.uber.org/atomic v1.7.0 // indirect | ||||
| 	go.uber.org/multierr v1.6.0 // indirect | ||||
| 	go.uber.org/zap v1.16.0 // indirect | ||||
| 	golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90 // indirect | ||||
| 	golang.org/x/net v0.0.0-20220607020251-c690dde0001d // indirect | ||||
| 	golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a // indirect | ||||
| 	golang.org/x/text v0.3.7 // indirect | ||||
| 	google.golang.org/protobuf v1.26.0 // indirect | ||||
| 	gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect | ||||
| 	gopkg.in/yaml.v2 v2.4.0 // indirect | ||||
| 	lukechampine.com/blake3 v1.2.2 // indirect | ||||
| 	rsc.io/tmplfunc v0.0.3 // indirect | ||||
| 	lukechampine.com/blake3 v1.1.6 // indirect | ||||
| ) | ||||
| 
 | ||||
| replace github.com/ethereum/go-ethereum v1.10.26 => github.com/cerc-io/go-ethereum v1.10.26-statediff-4.2.2-alpha | ||||
|  | ||||
							
								
								
									
										372
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										372
									
								
								go.sum
									
									
									
									
									
								
							| @ -1,72 +1,48 @@ | ||||
| github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= | ||||
| github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= | ||||
| github.com/DataDog/zstd v1.4.5 h1:EndNeuB0l9syBZhut0wns3gV1hL8zX8LIu6ZiVHWLIQ= | ||||
| github.com/DataDog/zstd v1.4.5/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= | ||||
| github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA= | ||||
| github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= | ||||
| github.com/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bwt3uRKnkZU40= | ||||
| github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= | ||||
| github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= | ||||
| github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= | ||||
| github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= | ||||
| github.com/bits-and-blooms/bitset v1.10.0 h1:ePXTeiPEazB5+opbv5fr8umg2R/1NlzgDsyepwsSr88= | ||||
| github.com/bits-and-blooms/bitset v1.10.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= | ||||
| github.com/VictoriaMetrics/fastcache v1.6.0 h1:C/3Oi3EiBCqufydp1neRZkqcwmEiuRT9c3fqvvgKm5o= | ||||
| github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= | ||||
| github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= | ||||
| github.com/btcsuite/btcd v0.22.0-beta h1:LTDpDKUM5EeOFBPM8IXpinEcmZ6FWfNZbE3lfrfdnWo= | ||||
| github.com/btcsuite/btcd v0.22.0-beta/go.mod h1:9n5ntfhhHQBIhUvlhDvD3Qg6fRUj4jkN0VB8L8svzOA= | ||||
| github.com/btcsuite/btcd/btcec/v2 v2.2.0 h1:fzn1qaOt32TuLjFlkzYSsBC35Q3KUjT1SwPxiMSCF5k= | ||||
| 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/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= | ||||
| github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= | ||||
| github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= | ||||
| github.com/cockroachdb/errors v1.8.1 h1:A5+txlVZfOqFBDa4mGz2bUWSp0aHElvHX2bKkdbQu+Y= | ||||
| github.com/cockroachdb/errors v1.8.1/go.mod h1:qGwQn6JmZ+oMjuLwjWzUNqblqk0xl4CVV3SQbGwK7Ac= | ||||
| github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f h1:o/kfcElHqOiXqcou5a3rIlMc7oJbMQkeLk0VQJ7zgqY= | ||||
| github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= | ||||
| github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 h1:aPEJyR4rPBvDmeyi+l/FS/VtA00IWvjeFvjen1m1l1A= | ||||
| github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593/go.mod h1:6hk1eMY/u5t+Cf18q5lFMUA1Rc+Sm5I6Ra1QuPyxXCo= | ||||
| github.com/cockroachdb/redact v1.0.8 h1:8QG/764wK+vmEYoOlfobpe12EQcS81ukx/a4hdVMxNw= | ||||
| github.com/cockroachdb/redact v1.0.8/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= | ||||
| github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2 h1:IKgmqgMQlVJIZj19CdocBeSfSaiCbEBZGKODaixqtHM= | ||||
| github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2/go.mod h1:8BT+cPK6xvFOcRlk0R8eg+OTkcqI6baNH4xAkpiYVvQ= | ||||
| github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= | ||||
| github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= | ||||
| github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= | ||||
| github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= | ||||
| github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= | ||||
| github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= | ||||
| github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233 h1:d28BXYi+wUpz1KBmiF9bWrjEMacUEREV6MBi2ODnrfQ= | ||||
| github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233/go.mod h1:geZJZH3SzKCqnz5VT0q/DyIG/tvu/dZk+VIfXicupJs= | ||||
| github.com/crate-crypto/go-kzg-4844 v0.7.0 h1:C0vgZRk4q4EZ/JgPfzuSoxdCq3C3mOZMBShovmncxvA= | ||||
| github.com/crate-crypto/go-kzg-4844 v0.7.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= | ||||
| github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= | ||||
| github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= | ||||
| github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce/go.mod h1:0DVlHczLPewLcPGEIeUEzfOJhqGPQ0mJJRDBtD307+o= | ||||
| github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= | ||||
| github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= | ||||
| github.com/btcsuite/goleveldb v1.0.0/go.mod h1:QiK9vBlgftBg6rWQIj6wFzbPfRjiykIEhBH4obrXJ/I= | ||||
| github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= | ||||
| github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= | ||||
| github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= | ||||
| github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= | ||||
| github.com/cerc-io/go-ethereum v1.10.26-statediff-4.2.2-alpha h1:gesMZEbNU+fcAMctITi+KO/AK80YdTq6TVB5lb4EfnU= | ||||
| github.com/cerc-io/go-ethereum v1.10.26-statediff-4.2.2-alpha/go.mod h1:lKBVBWksSwBDR/5D9CAxaGQzDPIS3ueWb6idy7X1Shg= | ||||
| github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= | ||||
| github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= | ||||
| github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= | ||||
| github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= | ||||
| github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= | ||||
| github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= | ||||
| github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= | ||||
| github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etlyjdBU4sfcs2WYQMs= | ||||
| github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= | ||||
| github.com/ethereum/c-kzg-4844 v0.4.0 h1:3MS1s4JtA868KpJxroZoepdV0ZKBp3u/O5HcZ7R3nlY= | ||||
| github.com/ethereum/c-kzg-4844 v0.4.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= | ||||
| github.com/ethereum/go-ethereum v1.13.14 h1:EwiY3FZP94derMCIam1iW4HFVrSgIcpsu0HwTQtm6CQ= | ||||
| github.com/ethereum/go-ethereum v1.13.14/go.mod h1:TN8ZiHrdJwSe8Cb6x+p0hs5CxhJZPbqB7hHkaUXcmIU= | ||||
| github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= | ||||
| github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= | ||||
| github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 h1:YLtO71vCjJRCBcrPMtQ9nqBsqpA1m5sE92cU+pd5Mcc= | ||||
| github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= | ||||
| github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= | ||||
| github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= | ||||
| github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= | ||||
| github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= | ||||
| 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-verkle v0.1.1-0.20231031103413-a67434b50f46 h1:BAIP2GihuqhwdILrV+7GJel5lyPV3u1+PgzrWLc0TkE= | ||||
| github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46/go.mod h1:QNpY22eby74jVhqH4WhDLDwxc/vqsern6pW+u2kbkpc= | ||||
| github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= | ||||
| github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= | ||||
| github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= | ||||
| github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= | ||||
| github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= | ||||
| 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.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= | ||||
| github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= | ||||
| github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= | ||||
| github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= | ||||
| github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= | ||||
| github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= | ||||
| github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= | ||||
| github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= | ||||
| github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= | ||||
| github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= | ||||
| github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= | ||||
| github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= | ||||
| github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= | ||||
| github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= | ||||
| github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= | ||||
| @ -78,158 +54,155 @@ github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:W | ||||
| github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= | ||||
| github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= | ||||
| github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= | ||||
| github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= | ||||
| github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= | ||||
| github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= | ||||
| github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= | ||||
| github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= | ||||
| github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= | ||||
| github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= | ||||
| github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= | ||||
| github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= | ||||
| github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= | ||||
| github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= | ||||
| github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= | ||||
| github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= | ||||
| github.com/google/pprof v0.0.0-20231229205709-960ae82b1e42 h1:dHLYa5D8/Ta0aLR2XcPsrkpAgGeFs6thhMcQK0oQ0n8= | ||||
| github.com/google/pprof v0.0.0-20231229205709-960ae82b1e42/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik= | ||||
| github.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o= | ||||
| github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= | ||||
| github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= | ||||
| github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= | ||||
| github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= | ||||
| github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= | ||||
| github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= | ||||
| github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= | ||||
| github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= | ||||
| github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= | ||||
| github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= | ||||
| github.com/holiman/uint256 v1.2.4 h1:jUc4Nk8fm9jZabQuqr2JzednajVmBpC+oiTiXZJEApU= | ||||
| github.com/holiman/uint256 v1.2.4/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= | ||||
| github.com/google/uuid v1.2.0 h1:qJYtXnJRWmpe7m/3XlyhrsLrEURqHRM2kxzoxXqyUDs= | ||||
| github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= | ||||
| 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/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= | ||||
| github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d h1:dg1dEPuWpEqDnvIw251EVy4zlP8gWbsGj4BsUKCRpYs= | ||||
| github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= | ||||
| github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= | ||||
| github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs= | ||||
| github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0= | ||||
| github.com/ipfs/boxo v0.19.0 h1:UbX9FBJQF19ACLqRZOgdEla6jR/sC4H1O+iGE0NToXA= | ||||
| github.com/ipfs/boxo v0.19.0/go.mod h1:V5gJzbIMwKEXrg3IdvAxIdF7UPgU4RsXmNGS8MQ/0D4= | ||||
| github.com/ipfs/go-block-format v0.2.0 h1:ZqrkxBA2ICbDRbK8KJs/u0O3dlp6gmAuuXUJNiW1Ycs= | ||||
| github.com/ipfs/go-block-format v0.2.0/go.mod h1:+jpL11nFx5A/SPpsoBn6Bzkra/zaArfSmsknbPMYgzM= | ||||
| github.com/ipfs/go-block-format v0.0.2/go.mod h1:AWR46JfpcObNfg3ok2JHDUfdiHRgWhJgCQF+KIgOPJY= | ||||
| github.com/ipfs/go-block-format v0.0.3 h1:r8t66QstRp/pd/or4dpnbVfXT5Gt7lOqRvC+/dDTpMc= | ||||
| github.com/ipfs/go-block-format v0.0.3/go.mod h1:4LmD4ZUw0mhO+JSKdpWwrzATiEfM7WWgQ8H5l6P8MVk= | ||||
| github.com/ipfs/go-blockservice v0.4.0 h1:7MUijAW5SqdsqEW/EhnNFRJXVF8mGU5aGhZ3CQaCWbY= | ||||
| github.com/ipfs/go-blockservice v0.4.0/go.mod h1:kRjO3wlGW9mS1aKuiCeGhx9K1DagQ10ACpVO59qgAx4= | ||||
| github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= | ||||
| github.com/ipfs/go-cid v0.0.2/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= | ||||
| github.com/ipfs/go-cid v0.0.5/go.mod h1:plgt+Y5MnOey4vO4UlUazGqdbEXuFYitED67FexhXog= | ||||
| github.com/ipfs/go-cid v0.4.1 h1:A/T3qGvxi4kpKWWcPC/PgbvDA2bjVLO7n4UeVwnbs/s= | ||||
| github.com/ipfs/go-cid v0.4.1/go.mod h1:uQHwDeX4c6CtyrFwdqyhpNcxVewur1M7l7fNU7LKwZk= | ||||
| github.com/ipfs/go-cid v0.0.7/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I= | ||||
| github.com/ipfs/go-cid v0.2.0 h1:01JTiihFq9en9Vz0lc0VDWvZe/uBonGpzo4THP0vcQ0= | ||||
| github.com/ipfs/go-cid v0.2.0/go.mod h1:P+HXFDF4CVhaVayiEb4wkAy7zBHxBwsJyt0Y5U6MLro= | ||||
| github.com/ipfs/go-datastore v0.5.0 h1:rQicVCEacWyk4JZ6G5bD9TKR7lZEG1MWcG7UdWYrFAU= | ||||
| github.com/ipfs/go-datastore v0.5.0/go.mod h1:9zhEApYMTl17C8YDp7JmU7sQZi2/wqiYh73hakZ90Bk= | ||||
| github.com/ipfs/go-datastore v0.6.0 h1:JKyz+Gvz1QEZw0LsX1IBn+JFCJQH4SJVFtM4uWU0Myk= | ||||
| github.com/ipfs/go-datastore v0.6.0/go.mod h1:rt5M3nNbSO/8q1t4LNkLyUwRs8HupMeN/8O4Vn9YAT8= | ||||
| github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk= | ||||
| github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps= | ||||
| github.com/ipfs/go-ipfs-blockstore v1.2.0 h1:n3WTeJ4LdICWs/0VSfjHrlqpPpl6MZ+ySd3j8qz0ykw= | ||||
| github.com/ipfs/go-ipfs-blockstore v1.2.0/go.mod h1:eh8eTFLiINYNSNawfZOC7HOxNTxpB1PFuA5E1m/7exE= | ||||
| github.com/ipfs/go-ipfs-blocksutil v0.0.1 h1:Eh/H4pc1hsvhzsQoMEP3Bke/aW5P5rVM1IWFJMcGIPQ= | ||||
| github.com/ipfs/go-ipfs-blocksutil v0.0.1/go.mod h1:Yq4M86uIOmxmGPUHv/uI7uKqZNtLb449gwKqXjIsnRk= | ||||
| github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= | ||||
| github.com/ipfs/go-ipfs-ds-help v1.1.0 h1:yLE2w9RAsl31LtfMt91tRZcrx+e61O5mDxFRR994w4Q= | ||||
| github.com/ipfs/go-ipfs-ds-help v1.1.0/go.mod h1:YR5+6EaebOhfcqVCyqemItCLthrpVNot+rsOU/5IatU= | ||||
| github.com/ipfs/go-ipfs-util v0.0.3 h1:2RFdGez6bu2ZlZdI+rWfIdbQb1KudQp3VGwPtdNCmE0= | ||||
| github.com/ipfs/go-ipfs-util v0.0.3/go.mod h1:LHzG1a0Ig4G+iZ26UUOMjHd+lfM84LZCrn17xAKWBvs= | ||||
| github.com/ipfs/go-ipld-format v0.6.0 h1:VEJlA2kQ3LqFSIm5Vu6eIlSxD/Ze90xtc4Meten1F5U= | ||||
| github.com/ipfs/go-ipld-format v0.6.0/go.mod h1:g4QVMTn3marU3qXchwjpKPKgJv+zF+OlaKMyhJ4LHPg= | ||||
| github.com/ipfs/go-log/v2 v2.5.1 h1:1XdUzF7048prq4aBjDQQ4SL5RxftpRGdXhNRwKSAlcY= | ||||
| github.com/ipfs/go-log/v2 v2.5.1/go.mod h1:prSpmC1Gpllc9UYWxDiZDreBYw7zp4Iqp1kOLU9U5UI= | ||||
| github.com/ipfs/go-ipfs-exchange-interface v0.2.0 h1:8lMSJmKogZYNo2jjhUs0izT+dck05pqUw4mWNW9Pw6Y= | ||||
| github.com/ipfs/go-ipfs-exchange-interface v0.2.0/go.mod h1:z6+RhJuDQbqKguVyslSOuVDhqF9JtTrO3eptSAiW2/Y= | ||||
| github.com/ipfs/go-ipfs-exchange-offline v0.3.0 h1:c/Dg8GDPzixGd0MC8Jh6mjOwU57uYokgWRFidfvEkuA= | ||||
| github.com/ipfs/go-ipfs-util v0.0.1/go.mod h1:spsl5z8KUnrve+73pOhSVZND1SIxPW5RyBCNzQxlJBc= | ||||
| github.com/ipfs/go-ipfs-util v0.0.2 h1:59Sswnk1MFaiq+VcaknX7aYEyGyGDAA73ilhEK2POp8= | ||||
| github.com/ipfs/go-ipfs-util v0.0.2/go.mod h1:CbPtkWJzjLdEcezDns2XYaehFVNXG9zrdrtMecczcsQ= | ||||
| github.com/ipfs/go-ipld-format v0.3.0/go.mod h1:co/SdBE8h99968X0hViiw1MNlh6fvxxnHpvVLnH7jSM= | ||||
| github.com/ipfs/go-ipld-format v0.4.0 h1:yqJSaJftjmjc9jEOFYlpkwOLVKv68OD27jFLlSghBlQ= | ||||
| github.com/ipfs/go-ipld-format v0.4.0/go.mod h1:co/SdBE8h99968X0hViiw1MNlh6fvxxnHpvVLnH7jSM= | ||||
| github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM= | ||||
| github.com/ipfs/go-log v1.0.5 h1:2dOuUCB1Z7uoczMWgAyDck5JLb72zHzrMnGnCNNbvY8= | ||||
| github.com/ipfs/go-log v1.0.5/go.mod h1:j0b8ZoR+7+R99LD9jZ6+AJsrzkPbSXbZfGakb5JPtIo= | ||||
| github.com/ipfs/go-log/v2 v2.1.3/go.mod h1:/8d0SH3Su5Ooc31QlL1WysJhvyOTDCjcCZ9Axpmri6g= | ||||
| github.com/ipfs/go-log/v2 v2.3.0 h1:31Re/cPqFHpsRHgyVwjWADPoF0otB1WrjTy8ZFYwEZU= | ||||
| github.com/ipfs/go-log/v2 v2.3.0/go.mod h1:QqGoj30OTpnKaG/LKTGTxoP2mmQtjVMEnK72gynbe/g= | ||||
| github.com/ipfs/go-metrics-interface v0.0.1 h1:j+cpbjYvu4R8zbleSs36gvB7jR+wsL2fGD6n0jO4kdg= | ||||
| github.com/ipfs/go-metrics-interface v0.0.1/go.mod h1:6s6euYU4zowdslK0GKHmqaIZ3j/b/tL7HTWtJ4VPgWY= | ||||
| github.com/ipfs/go-verifcid v0.0.1 h1:m2HI7zIuR5TFyQ1b79Da5N9dnnCP1vcu2QqawmWlK2E= | ||||
| github.com/ipfs/go-verifcid v0.0.1/go.mod h1:5Hrva5KBeIog4A+UpqlaIU+DEstipcJYQQZc0g37pY0= | ||||
| github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA= | ||||
| 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 v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= | ||||
| github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= | ||||
| github.com/jmoiron/sqlx v1.3.5 h1:vFFPA71p1o5gAeqtEAwLU4dnX2napprKtHr7PYIcN3g= | ||||
| github.com/jmoiron/sqlx v1.3.5/go.mod h1:nRVWtLre0KfCLJvgxzCsLVMogSvQ1zNJtpYr2Ccp0mQ= | ||||
| github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= | ||||
| github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= | ||||
| github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= | ||||
| github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= | ||||
| github.com/klauspost/compress v1.17.4 h1:Ej5ixsIri7BrIjBkRZLTo6ghwrEtHFk7ijlczPW4fZ4= | ||||
| github.com/klauspost/compress v1.17.4/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM= | ||||
| github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM= | ||||
| github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= | ||||
| github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= | ||||
| github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= | ||||
| github.com/klauspost/cpuid/v2 v2.0.9 h1:lgaqFMSdTdQYdZ04uHyN2d/eKdOMyi2YLSvlQIBFYa4= | ||||
| github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= | ||||
| github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8= | ||||
| github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= | ||||
| github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= | ||||
| github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs= | ||||
| github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= | ||||
| github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= | ||||
| github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= | ||||
| github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= | ||||
| github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= | ||||
| github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= | ||||
| github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= | ||||
| github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= | ||||
| github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= | ||||
| github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= | ||||
| github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= | ||||
| github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= | ||||
| github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= | ||||
| github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= | ||||
| github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= | ||||
| github.com/lib/pq v1.10.6 h1:jbk+ZieJ0D7EVGJYpL9QTz7/YW6UHbmdnZWYyK5cdBs= | ||||
| github.com/lib/pq v1.10.6/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= | ||||
| github.com/mailgun/groupcache/v2 v2.3.0 h1:/Usq3VewXa8t+afFaUAY7g8N9cRNqBT5nDhECYwLcd8= | ||||
| github.com/mailgun/groupcache/v2 v2.3.0/go.mod h1:tH8aMaTRIjFMJsmJ9p7Y5HGBj9hV/J9rKQ+/3dIXzNU= | ||||
| github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= | ||||
| github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= | ||||
| github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= | ||||
| github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= | ||||
| github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= | ||||
| github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= | ||||
| github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= | ||||
| github.com/mattn/go-isatty v0.0.13 h1:qdl+GuBjcsKKDco5BsxPJlId98mSWNKqYA+Co0SC1yA= | ||||
| github.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= | ||||
| github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= | ||||
| github.com/mattn/go-sqlite3 v1.14.6 h1:dNPt6NO46WmLVt2DLNpwczCmdV5boIZ6g/tlDrlRUbg= | ||||
| github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= | ||||
| github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= | ||||
| github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg= | ||||
| github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k= | ||||
| github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0OXOcUbGjvZxxijuBwbbmlSxLiuofa+g= | ||||
| github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= | ||||
| github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= | ||||
| github.com/minio/sha256-simd v0.1.1-0.20190913151208-6de447530771/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= | ||||
| github.com/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dzMM= | ||||
| github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5xJjtbRSN8= | ||||
| github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= | ||||
| github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= | ||||
| github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= | ||||
| 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/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= | ||||
| github.com/mr-tron/base58 v1.1.3/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= | ||||
| github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o= | ||||
| github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= | ||||
| github.com/multiformats/go-base32 v0.0.3 h1:tw5+NhuwaOjJCC5Pp82QuXbrmLzWg7uxlMFp8Nq/kkI= | ||||
| github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= | ||||
| github.com/multiformats/go-base32 v0.1.0 h1:pVx9xoSPqEIQG8o+UbAe7DNi51oej1NtK+aGkbLYxPE= | ||||
| github.com/multiformats/go-base32 v0.1.0/go.mod h1:Kj3tFY6zNr+ABYMqeUNeGvkIC/UYgtWibDcT0rExnbI= | ||||
| github.com/multiformats/go-base36 v0.2.0 h1:lFsAbNOGeKtuKozrtBsAkSVhv1p9D0/qedU9rQyccr0= | ||||
| github.com/multiformats/go-base36 v0.2.0/go.mod h1:qvnKE++v+2MWCfePClUEjE78Z7P2a1UV0xHgWc0hkp4= | ||||
| github.com/multiformats/go-base36 v0.1.0 h1:JR6TyF7JjGd3m6FbLU2cOxhC0Li8z8dLNGQ89tUg4F4= | ||||
| github.com/multiformats/go-base36 v0.1.0/go.mod h1:kFGE83c6s80PklsHO9sRn2NCoffoRdUUOENyW/Vv6sM= | ||||
| github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= | ||||
| github.com/multiformats/go-multibase v0.2.0 h1:isdYCVLvksgWlMW9OZRYJEa9pZETFivncJHmHnnd87g= | ||||
| github.com/multiformats/go-multibase v0.2.0/go.mod h1:bFBZX4lKCA/2lyOFSAoKH5SS6oPyjtnzK/XTFDPkNuk= | ||||
| github.com/multiformats/go-multibase v0.0.3 h1:l/B6bJDQjvQ5G52jw4QGSYeOTZoAwIO77RblWplfIqk= | ||||
| github.com/multiformats/go-multibase v0.0.3/go.mod h1:5+1R4eQrT3PkYZ24C3W2Ue2tPwIdYQD509ZjSb5y9Oc= | ||||
| github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= | ||||
| github.com/multiformats/go-multihash v0.0.13/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= | ||||
| github.com/multiformats/go-multihash v0.2.3 h1:7Lyc8XfX/IY2jWb/gI7JP+o7JEq9hOa7BFvVU9RSh+U= | ||||
| github.com/multiformats/go-multihash v0.2.3/go.mod h1:dXgKXCXjBzdscBLk9JkjINiEsCKRVch90MdaGiKsvSM= | ||||
| github.com/multiformats/go-multihash v0.0.14/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= | ||||
| github.com/multiformats/go-multihash v0.1.0 h1:CgAgwqk3//SVEw3T+6DqI4mWMyRuDwZtOWcJT0q9+EA= | ||||
| github.com/multiformats/go-multihash v0.1.0/go.mod h1:RJlXsxt6vHGaia+S8We0ErjhojtKzPP2AH4+kYM7k84= | ||||
| github.com/multiformats/go-varint v0.0.5/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= | ||||
| github.com/multiformats/go-varint v0.0.7 h1:sWSGR+f/eu5ABZA2ZpYKBILXTTs9JWpdEM/nEGOHFS8= | ||||
| github.com/multiformats/go-varint v0.0.7/go.mod h1:r8PUYw/fD/SjBCiKOoDlGF6QawOELpZAu9eioSos/OU= | ||||
| github.com/multiformats/go-varint v0.0.6 h1:gk85QWKxh3TazbLxED/NlDVv8+q+ReFJk7Y2W/KhfNY= | ||||
| github.com/multiformats/go-varint v0.0.6/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= | ||||
| github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= | ||||
| github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= | ||||
| github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= | ||||
| github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= | ||||
| github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= | ||||
| github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= | ||||
| github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= | ||||
| github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= | ||||
| github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= | ||||
| github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= | ||||
| github.com/onsi/ginkgo/v2 v2.13.2 h1:Bi2gGVkfn6gQcjNjZJVO8Gf0FHzMPf2phUei9tejVMs= | ||||
| github.com/onsi/ginkgo/v2 v2.13.2/go.mod h1:XStQ8QcGwLyF4HdfcZB8SFOS/MWCgDuXMSBe6zrvLgM= | ||||
| github.com/onsi/ginkgo/v2 v2.1.3 h1:e/3Cwtogj0HA+25nMP1jCMDIf8RtRYbGwGGuBIFztkc= | ||||
| github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= | ||||
| github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= | ||||
| github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= | ||||
| github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= | ||||
| github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= | ||||
| github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= | ||||
| github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= | ||||
| github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= | ||||
| github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= | ||||
| github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= | ||||
| github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= | ||||
| github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= | ||||
| github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= | ||||
| github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= | ||||
| github.com/prometheus/client_golang v1.18.0 h1:HzFfmkOzH5Q8L8G+kSJKUx5dtG87sewO+FoDDqP5Tbk= | ||||
| github.com/prometheus/client_golang v1.18.0/go.mod h1:T+GXkCk5wSJyOqMIzVgvvjFDlkOQntgjkJWKrN5txjA= | ||||
| github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw= | ||||
| github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= | ||||
| github.com/prometheus/common v0.45.0 h1:2BGz0eBc2hdMDLnO/8n0jeB3oPrt2D08CekT0lneoxM= | ||||
| github.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY= | ||||
| github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= | ||||
| github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= | ||||
| github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= | ||||
| github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= | ||||
| github.com/prometheus/tsdb v0.10.0 h1:If5rVCMTp6W2SiRAQFlbpJNgVlgMEd+U2GZckwK38ic= | ||||
| github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= | ||||
| github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= | ||||
| github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= | ||||
| github.com/segmentio/fasthash v1.0.3 h1:EI9+KE1EwvMLBWwjpRDc+fEM+prwxDYbslddQGtrmhM= | ||||
| github.com/segmentio/fasthash v1.0.3/go.mod h1:waKX8l2N8yckOgmSsXJi7x1ZfdKZ4x7KRMzBtS3oedY= | ||||
| github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible h1:Bn1aCHHRnjv4Bl16T8rcaFjYSrGrIZvpiGO6P3Q4GpU= | ||||
| github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= | ||||
| github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= | ||||
| github.com/sirupsen/logrus v1.6.0 h1:UBcNElsrwanuuMsnGSlYmtmgbb23qDR5dG+6X6Oo89I= | ||||
| github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= | ||||
| github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= | ||||
| @ -237,105 +210,101 @@ github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2 | ||||
| github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= | ||||
| github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= | ||||
| github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= | ||||
| github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= | ||||
| github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= | ||||
| github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= | ||||
| 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/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY= | ||||
| github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= | ||||
| github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= | ||||
| github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= | ||||
| github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= | ||||
| github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= | ||||
| github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= | ||||
| github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= | ||||
| github.com/tklauser/go-sysconf v0.3.5 h1:uu3Xl4nkLzQfXNsWn15rPc/HQCJKObbt1dKJeWp3vU4= | ||||
| github.com/tklauser/numcpus v0.2.2 h1:oyhllyrScuYI6g+h/zUvNXNp1wy7x8qQy3t/piefldA= | ||||
| github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc/go.mod h1:bopw91TMyo8J3tvftk8xmU2kPmlrt4nScJQZU2hE5EM= | ||||
| github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= | ||||
| github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= | ||||
| github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= | ||||
| go.opentelemetry.io/otel v1.25.0 h1:gldB5FfhRl7OJQbUHt/8s0a7cE8fbsPAtdpRaApKy4k= | ||||
| go.opentelemetry.io/otel v1.25.0/go.mod h1:Wa2ds5NOXEMkCmUou1WA7ZBfLTHWIsp034OVD7AO+Vg= | ||||
| go.opentelemetry.io/otel/metric v1.25.0 h1:LUKbS7ArpFL/I2jJHdJcqMGxkRdxpPHE0VU/D4NuEwA= | ||||
| go.opentelemetry.io/otel/metric v1.25.0/go.mod h1:rkDLUSd2lC5lq2dFNrX9LGAbINP5B7WBkC78RXCpH5s= | ||||
| go.opentelemetry.io/otel/trace v1.25.0 h1:tqukZGLwQYRIFtSQM2u2+yfMVTgGVeqRLPUYx1Dq6RM= | ||||
| go.opentelemetry.io/otel/trace v1.25.0/go.mod h1:hCCs70XM/ljO+BeQkyFnbK28SBIJ/Emuha+ccrCRT7I= | ||||
| github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg= | ||||
| 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/trace v1.7.0 h1:O37Iogk1lEkMRXewVtZ1BBTVn5JEp8GrJvP92bJqC6o= | ||||
| go.opentelemetry.io/otel/trace v1.7.0/go.mod h1:fzLSB9nqR2eXzxPXb2JW9IKE+ScyXA48yyE4TNvoHqU= | ||||
| go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= | ||||
| go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= | ||||
| go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= | ||||
| go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= | ||||
| go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= | ||||
| go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= | ||||
| go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= | ||||
| go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= | ||||
| go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= | ||||
| go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= | ||||
| go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= | ||||
| go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= | ||||
| go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= | ||||
| go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= | ||||
| go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= | ||||
| go.uber.org/zap v1.16.0 h1:uFRZXykJGK9lLY4HtgSw44DnIcAM+kRBP7x5m+NpAOM= | ||||
| go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= | ||||
| golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= | ||||
| golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= | ||||
| golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= | ||||
| golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= | ||||
| golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= | ||||
| golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= | ||||
| golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= | ||||
| golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= | ||||
| golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= | ||||
| golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= | ||||
| golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= | ||||
| golang.org/x/exp v0.0.0-20240103183307-be819d1f06fc h1:ao2WRsKSzW6KuUY9IWPwWahcHCgR0s52IfwutMfEbdM= | ||||
| golang.org/x/exp v0.0.0-20240103183307-be819d1f06fc/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI= | ||||
| golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= | ||||
| golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90 h1:Y/gsMcFOcR+6S6f3YeMKl5g+dZMEWqcz5Czj/GWYbkM= | ||||
| golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= | ||||
| golang.org/x/lint v0.0.0-20190930215403-16217165b5de h1:5hukYrvBGR8/eNkX5mdUezrA6JiaEZDtJb9Ei+1LlBs= | ||||
| golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= | ||||
| golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= | ||||
| golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= | ||||
| golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= | ||||
| golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= | ||||
| golang.org/x/mod v0.6.0-dev.0.20211013180041-c96bc1413d57 h1:LQmS1nU0twXLA96Kt7U9qtHJEbBk3z6Q0V4UXjZkpr4= | ||||
| golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | ||||
| golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | ||||
| golang.org/x/net v0.0.0-20190227160552-c95aed5357e7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | ||||
| golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= | ||||
| golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= | ||||
| golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= | ||||
| golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= | ||||
| golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= | ||||
| golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= | ||||
| golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= | ||||
| golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= | ||||
| golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= | ||||
| golang.org/x/net v0.0.0-20220607020251-c690dde0001d h1:4SFsTMi4UahlKoloni7L4eYzhFRifURQLw+yv0QDCx8= | ||||
| golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= | ||||
| golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||
| golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||
| golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||
| golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||
| golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||
| golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= | ||||
| golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= | ||||
| golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/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= | ||||
| golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | ||||
| golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o= | ||||
| golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= | ||||
| golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= | ||||
| golang.org/x/sys v0.0.0-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a h1:dGzPydgVsqGcTRVwiLJ1jVbufYwmzD3LfVPLKsKg+0k= | ||||
| golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= | ||||
| golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= | ||||
| golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= | ||||
| golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= | ||||
| golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= | ||||
| golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= | ||||
| golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= | ||||
| golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | ||||
| golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | ||||
| golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= | ||||
| golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= | ||||
| golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= | ||||
| golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= | ||||
| golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= | ||||
| golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= | ||||
| golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= | ||||
| golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= | ||||
| golang.org/x/tools v0.16.1 h1:TLyB3WofjdOEepBHAU20JdNC1Zbg87elYofWYAY5oZA= | ||||
| golang.org/x/tools v0.16.1/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0= | ||||
| golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= | ||||
| golang.org/x/tools v0.1.8-0.20211029000441-d6a9af8af023 h1:0c3L82FDQ5rt1bjTBlchS8t6RQ6299/+5bWMnRLh+uI= | ||||
| golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | ||||
| golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | ||||
| golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | ||||
| golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | ||||
| golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df h1:5Pf6pFKu98ODmgnpvkJ3kFUOQGGLIzLIkbzUHp47618= | ||||
| 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= | ||||
| google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= | ||||
| @ -343,30 +312,25 @@ google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miE | ||||
| google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= | ||||
| google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= | ||||
| google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= | ||||
| google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk= | ||||
| google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= | ||||
| google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= | ||||
| google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= | ||||
| 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 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= | ||||
| gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= | ||||
| gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= | ||||
| gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= | ||||
| gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= | ||||
| gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= | ||||
| gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= | ||||
| gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= | ||||
| gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= | ||||
| 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.3.0/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= | ||||
| gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= | ||||
| honnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM= | ||||
| honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= | ||||
| lukechampine.com/blake3 v1.2.2 h1:wEAbSg0IVU4ih44CVlpMqMZMpzr5hf/6aqodLlevd/w= | ||||
| lukechampine.com/blake3 v1.2.2/go.mod h1:0OFRp7fBtAylGVCO40o87sbupkyIGgbpv1+M1k1LM6k= | ||||
| rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= | ||||
| rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= | ||||
| lukechampine.com/blake3 v1.1.6 h1:H3cROdztr7RCfoaTpGZFQsrqvweFLrqS73j7L7cmR5c= | ||||
| lukechampine.com/blake3 v1.1.6/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R78LA= | ||||
|  | ||||
| @ -20,7 +20,7 @@ import ( | ||||
| 	"context" | ||||
| 
 | ||||
| 	"github.com/ethereum/go-ethereum/ethdb" | ||||
| 	"github.com/ipfs/boxo/blockservice" | ||||
| 	"github.com/ipfs/go-blockservice" | ||||
| ) | ||||
| 
 | ||||
| var _ ethdb.Iterator = &Iterator{} | ||||
|  | ||||
| @ -20,11 +20,11 @@ import ( | ||||
| 	"context" | ||||
| 	"errors" | ||||
| 
 | ||||
| 	"github.com/ipfs/boxo/blockservice" | ||||
| 	"github.com/ipfs/boxo/blockstore" | ||||
| 	"github.com/ipfs/boxo/exchange" | ||||
| 	blocks "github.com/ipfs/go-block-format" | ||||
| 	"github.com/ipfs/go-blockservice" | ||||
| 	"github.com/ipfs/go-cid" | ||||
| 	blockstore "github.com/ipfs/go-ipfs-blockstore" | ||||
| 	exchange "github.com/ipfs/go-ipfs-exchange-interface" | ||||
| ) | ||||
| 
 | ||||
| var ( | ||||
|  | ||||
| @ -20,8 +20,6 @@ import ( | ||||
| 	"math/big" | ||||
| 	"time" | ||||
| 
 | ||||
| 	"github.com/cerc-io/ipfs-ethdb/v5/postgres/shared" | ||||
| 
 | ||||
| 	"github.com/ethereum/go-ethereum/core/types" | ||||
| 	"github.com/ethereum/go-ethereum/ethdb" | ||||
| 	"github.com/ethereum/go-ethereum/rlp" | ||||
| @ -29,7 +27,7 @@ import ( | ||||
| 	. "github.com/onsi/ginkgo" | ||||
| 	. "github.com/onsi/gomega" | ||||
| 
 | ||||
| 	pgipfsethdb "github.com/cerc-io/ipfs-ethdb/v5/postgres/v1" | ||||
| 	pgipfsethdb "github.com/cerc-io/ipfs-ethdb/v4/postgres" | ||||
| ) | ||||
| 
 | ||||
| var ( | ||||
| @ -41,7 +39,7 @@ var ( | ||||
| 
 | ||||
| var _ = Describe("Batch", func() { | ||||
| 	BeforeEach(func() { | ||||
| 		db, err = shared.TestDB() | ||||
| 		db, err = pgipfsethdb.TestDB() | ||||
| 		Expect(err).ToNot(HaveOccurred()) | ||||
| 
 | ||||
| 		cacheConfig := pgipfsethdb.CacheConfig{ | ||||
| @ -60,7 +58,7 @@ var _ = Describe("Batch", func() { | ||||
| 	}) | ||||
| 	AfterEach(func() { | ||||
| 		groupcache.DeregisterGroup("db") | ||||
| 		err = shared.ResetTestDB(db) | ||||
| 		err = pgipfsethdb.ResetTestDB(db) | ||||
| 		Expect(err).ToNot(HaveOccurred()) | ||||
| 	}) | ||||
| 
 | ||||
| @ -35,17 +35,11 @@ import ( | ||||
| var errNotSupported = errors.New("this operation is not supported") | ||||
| 
 | ||||
| var ( | ||||
| 	hasPgStr    = "SELECT exists(select 1 from ipld.blocks WHERE key = $1 LIMIT 1)" | ||||
| 	getPgStr    = "SELECT data FROM ipld.blocks WHERE key = $1 LIMIT 1" | ||||
| 	putPgStr    = "INSERT INTO ipld.blocks (key, data, block_number) VALUES ($1, $2, $3) ON CONFLICT DO NOTHING" | ||||
| 	deletePgStr = "DELETE FROM ipld.blocks WHERE key = $1" | ||||
| 	hasPgStr    = "SELECT exists(select 1 from public.blocks WHERE key = $1 LIMIT 1)" | ||||
| 	getPgStr    = "SELECT data FROM public.blocks WHERE key = $1 LIMIT 1" | ||||
| 	putPgStr    = "INSERT INTO public.blocks (key, data, block_number) VALUES ($1, $2, $3) ON CONFLICT DO NOTHING" | ||||
| 	deletePgStr = "DELETE FROM public.blocks WHERE key = $1" | ||||
| 	dbSizePgStr = "SELECT pg_database_size(current_database())" | ||||
| 
 | ||||
| 	DefaultCacheConfig = CacheConfig{ | ||||
| 		Name:           "db", | ||||
| 		Size:           3000000, // 3MB
 | ||||
| 		ExpiryDuration: time.Hour, | ||||
| 	} | ||||
| ) | ||||
| 
 | ||||
| var _ ethdb.Database = &Database{} | ||||
| @ -319,9 +313,9 @@ func (d *Database) AncientSize(kind string) (uint64, error) { | ||||
| 
 | ||||
| // AncientRange retrieves all the items in a range, starting from the index 'start'.
 | ||||
| // It will return
 | ||||
| //   - at most 'count' items,
 | ||||
| //   - at least 1 item (even if exceeding the maxBytes), but will otherwise
 | ||||
| //     return as many items as fit into maxBytes.
 | ||||
| //  - at most 'count' items,
 | ||||
| //  - at least 1 item (even if exceeding the maxBytes), but will otherwise
 | ||||
| //   return as many items as fit into maxBytes.
 | ||||
| func (d *Database) AncientRange(kind string, start, count, maxBytes uint64) ([][]byte, error) { | ||||
| 	return nil, errNotSupported | ||||
| } | ||||
| @ -333,14 +327,14 @@ func (d *Database) ReadAncients(fn func(ethdb.AncientReaderOp) error) (err error | ||||
| 
 | ||||
| // TruncateHead satisfies the ethdb.AncientWriter interface.
 | ||||
| // TruncateHead discards all but the first n ancient data from the ancient store.
 | ||||
| func (d *Database) TruncateHead(n uint64) (uint64, error) { | ||||
| 	return 0, errNotSupported | ||||
| func (d *Database) TruncateHead(n uint64) error { | ||||
| 	return errNotSupported | ||||
| } | ||||
| 
 | ||||
| // TruncateTail satisfies the ethdb.AncientWriter interface.
 | ||||
| // TruncateTail discards the first n ancient data from the ancient store.
 | ||||
| func (d *Database) TruncateTail(n uint64) (uint64, error) { | ||||
| 	return 0, errNotSupported | ||||
| func (d *Database) TruncateTail(n uint64) error { | ||||
| 	return errNotSupported | ||||
| } | ||||
| 
 | ||||
| // Sync satisfies the ethdb.AncientWriter interface
 | ||||
| @ -20,8 +20,6 @@ import ( | ||||
| 	"math/big" | ||||
| 	"time" | ||||
| 
 | ||||
| 	"github.com/cerc-io/ipfs-ethdb/v5/postgres/shared" | ||||
| 
 | ||||
| 	"github.com/ethereum/go-ethereum/core/types" | ||||
| 	"github.com/ethereum/go-ethereum/ethdb" | ||||
| 	"github.com/ethereum/go-ethereum/rlp" | ||||
| @ -30,7 +28,7 @@ import ( | ||||
| 	. "github.com/onsi/ginkgo" | ||||
| 	. "github.com/onsi/gomega" | ||||
| 
 | ||||
| 	pgipfsethdb "github.com/cerc-io/ipfs-ethdb/v5/postgres/v1" | ||||
| 	pgipfsethdb "github.com/cerc-io/ipfs-ethdb/v4/postgres" | ||||
| ) | ||||
| 
 | ||||
| var ( | ||||
| @ -46,7 +44,7 @@ var ( | ||||
| 
 | ||||
| var _ = Describe("Database", func() { | ||||
| 	BeforeEach(func() { | ||||
| 		db, err = shared.TestDB() | ||||
| 		db, err = pgipfsethdb.TestDB() | ||||
| 		Expect(err).ToNot(HaveOccurred()) | ||||
| 
 | ||||
| 		cacheConfig := pgipfsethdb.CacheConfig{ | ||||
| @ -63,9 +61,7 @@ var _ = Describe("Database", func() { | ||||
| 	}) | ||||
| 	AfterEach(func() { | ||||
| 		groupcache.DeregisterGroup("db") | ||||
| 		err = shared.ResetTestDB(db) | ||||
| 		Expect(err).ToNot(HaveOccurred()) | ||||
| 		err = db.Close() | ||||
| 		err = pgipfsethdb.ResetTestDB(db) | ||||
| 		Expect(err).ToNot(HaveOccurred()) | ||||
| 	}) | ||||
| 
 | ||||
| @ -76,7 +72,7 @@ var _ = Describe("Database", func() { | ||||
| 			Expect(has).ToNot(BeTrue()) | ||||
| 		}) | ||||
| 		It("returns true if a key-pair exists in the db", func() { | ||||
| 			_, err = db.Exec("INSERT into ipld.blocks (key, data, block_number) VALUES ($1, $2, $3)", testMhKey, testValue, testBlockNumber.Uint64()) | ||||
| 			_, err = db.Exec("INSERT into public.blocks (key, data, block_number) VALUES ($1, $2, $3)", testMhKey, testValue, testBlockNumber.Uint64()) | ||||
| 			Expect(err).ToNot(HaveOccurred()) | ||||
| 			has, err := database.Has(testEthKey) | ||||
| 			Expect(err).ToNot(HaveOccurred()) | ||||
| @ -91,7 +87,7 @@ var _ = Describe("Database", func() { | ||||
| 			Expect(err.Error()).To(ContainSubstring("sql: no rows in result set")) | ||||
| 		}) | ||||
| 		It("returns the value associated with the key, if the pair exists", func() { | ||||
| 			_, err = db.Exec("INSERT into ipld.blocks (key, data, block_number) VALUES ($1, $2, $3)", testMhKey, testValue, testBlockNumber.Uint64()) | ||||
| 			_, err = db.Exec("INSERT into public.blocks (key, data, block_number) VALUES ($1, $2, $3)", testMhKey, testValue, testBlockNumber.Uint64()) | ||||
| 			Expect(err).ToNot(HaveOccurred()) | ||||
| 			val, err := database.Get(testEthKey) | ||||
| 			Expect(err).ToNot(HaveOccurred()) | ||||
| @ -1,6 +1,6 @@ | ||||
| ## ipfs-ethdb | ||||
| 
 | ||||
| IPFS has been [extended](https://github.com/cerc-io/go-ipfs/releases/tag/v0.4.22-alpha) to [use Postgres](https://github.com/cerc-io/go-ipfs-config/releases/tag/v0.0.8-alpha) as a backing [datastore](https://github.com/ipfs/go-ds-sql/tree/master/postgres). | ||||
| IPFS has been [extended](https://github.com/vulcanize/go-ipfs/releases/tag/v0.4.22-alpha) to [use Postgres](https://github.com/vulcanize/go-ipfs-config/releases/tag/v0.0.8-alpha) as a backing [datastore](https://github.com/ipfs/go-ds-sql/tree/master/postgres). | ||||
| Interfacing directly with the IPFS-backing Postgres database has some advantages over using the blockservice interface. | ||||
| Namely, batching of IPFS writes with other Postgres writes and avoiding lock contention on the ipfs repository (lockfile located at the `IPFS_PATH`). | ||||
| The downside is that we forgo the block-exchange capabilities of the blockservice, and are only able to fetch data contained in the local datastore. | ||||
| @ -18,11 +18,11 @@ import ( | ||||
|     "github.com/ethereum/go-ethereum/core/state" | ||||
|     "github.com/ethereum/go-ethereum/trie" | ||||
|     "github.com/jmoiron/sqlx" | ||||
|     "github.com/cerc-io/ipfs-ethdb/v5/postgres/v1" | ||||
|     "github.com/vulcanize/ipfs-ethdb/v4/postgres" | ||||
| ) | ||||
| 
 | ||||
| func main() { | ||||
|     connectStr := "postgresql://vdbm:password@localhost:8077/cerc_testing?sslmode=disable" | ||||
|     connectStr := "postgresql://localhost:5432/vulcanize_testing?sslmode=disable" | ||||
|     db, _ := sqlx.Connect("postgres", connectStr) | ||||
| 
 | ||||
|     kvs := pgipfsethdb.NewKeyValueStore(db) | ||||
| @ -31,11 +31,7 @@ func main() { | ||||
|     trieNodeIterator := t.NodeIterator([]byte{}) | ||||
|     // do stuff with trie node iterator | ||||
| 
 | ||||
|     database := pgipfsethdb.NewDatabase(db, pgipfsethdb.CacheConfig{ | ||||
| 		Name:           "db", | ||||
| 		Size:           3000000, // 3MB | ||||
| 		ExpiryDuration: time.Hour, | ||||
| 	}) | ||||
|     database := pgipfsethdb.NewDatabase(db) | ||||
|     stateDatabase := state.NewDatabase(database) | ||||
|     stateDB, _ := state.New(common.Hash{}, stateDatabase, nil) | ||||
|     stateDBNodeIterator := state.NewNodeIterator(stateDB) | ||||
|  | ||||
| @ -1,42 +0,0 @@ | ||||
| // VulcanizeDB
 | ||||
| // Copyright © 2023 Vulcanize
 | ||||
| 
 | ||||
| // This program is free software: you can redistribute it and/or modify
 | ||||
| // it under the terms of the GNU Affero General Public License as published by
 | ||||
| // the Free Software Foundation, either version 3 of the License, or
 | ||||
| // (at your option) any later version.
 | ||||
| 
 | ||||
| // This program is distributed in the hope that it will be useful,
 | ||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of
 | ||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | ||||
| // GNU Affero General Public License for more details.
 | ||||
| 
 | ||||
| // You should have received a copy of the GNU Affero General Public License
 | ||||
| // along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | ||||
| 
 | ||||
| package shared | ||||
| 
 | ||||
| import ( | ||||
| 	"github.com/jmoiron/sqlx" | ||||
| ) | ||||
| 
 | ||||
| /* | ||||
| 	Hostname:     "localhost", | ||||
| 	Port:         8077, | ||||
| 	DatabaseName: "cerc_testing", | ||||
| 	Username:     "vdbm", | ||||
| 	Password:     "password", | ||||
| */ | ||||
| // TestDB connect to the testing database
 | ||||
| // it assumes the database has the IPFS ipld.blocks table present
 | ||||
| // DO NOT use a production db for the test db, as it will remove all contents of the ipld.blocks table
 | ||||
| func TestDB() (*sqlx.DB, error) { | ||||
| 	connectStr := "postgresql://vdbm:password@localhost:8077/cerc_testing?sslmode=disable" | ||||
| 	return sqlx.Connect("postgres", connectStr) | ||||
| } | ||||
| 
 | ||||
| // ResetTestDB drops all rows in the test db ipld.blocks table
 | ||||
| func ResetTestDB(db *sqlx.DB) error { | ||||
| 	_, err := db.Exec("TRUNCATE ipld.blocks CASCADE") | ||||
| 	return err | ||||
| } | ||||
| @ -17,8 +17,9 @@ | ||||
| package pgipfsethdb | ||||
| 
 | ||||
| import ( | ||||
| 	blockstore "github.com/ipfs/boxo/blockstore" | ||||
| 	blockstore "github.com/ipfs/go-ipfs-blockstore" | ||||
| 	dshelp "github.com/ipfs/go-ipfs-ds-help" | ||||
| 	"github.com/jmoiron/sqlx" | ||||
| 	_ "github.com/lib/pq" //postgres driver
 | ||||
| 	"github.com/multiformats/go-multihash" | ||||
| ) | ||||
| @ -32,3 +33,17 @@ func MultihashKeyFromKeccak256(h []byte) (string, error) { | ||||
| 	dbKey := dshelp.MultihashToDsKey(mh) | ||||
| 	return blockstore.BlockPrefix.String() + dbKey.String(), nil | ||||
| } | ||||
| 
 | ||||
| // TestDB connect to the testing database
 | ||||
| // it assumes the database has the IPFS public.blocks table present
 | ||||
| // DO NOT use a production db for the test db, as it will remove all contents of the public.blocks table
 | ||||
| func TestDB() (*sqlx.DB, error) { | ||||
| 	connectStr := "postgresql://localhost:5432/vulcanize_testing?sslmode=disable" | ||||
| 	return sqlx.Connect("postgres", connectStr) | ||||
| } | ||||
| 
 | ||||
| // ResetTestDB drops all rows in the test db public.blocks table
 | ||||
| func ResetTestDB(db *sqlx.DB) error { | ||||
| 	_, err := db.Exec("TRUNCATE public.blocks CASCADE") | ||||
| 	return err | ||||
| } | ||||
| @ -1,117 +0,0 @@ | ||||
| // VulcanizeDB
 | ||||
| // Copyright © 2020 Vulcanize
 | ||||
| 
 | ||||
| // This program is free software: you can redistribute it and/or modify
 | ||||
| // it under the terms of the GNU Affero General Public License as published by
 | ||||
| // the Free Software Foundation, either version 3 of the License, or
 | ||||
| // (at your option) any later version.
 | ||||
| 
 | ||||
| // This program is distributed in the hope that it will be useful,
 | ||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of
 | ||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | ||||
| // GNU Affero General Public License for more details.
 | ||||
| 
 | ||||
| // You should have received a copy of the GNU Affero General Public License
 | ||||
| // along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | ||||
| 
 | ||||
| package pgipfsethdb | ||||
| 
 | ||||
| import ( | ||||
| 	"math/big" | ||||
| 
 | ||||
| 	"github.com/ipfs/go-cid" | ||||
| 
 | ||||
| 	"github.com/ethereum/go-ethereum/ethdb" | ||||
| 	"github.com/jmoiron/sqlx" | ||||
| ) | ||||
| 
 | ||||
| var _ ethdb.Batch = &Batch{} | ||||
| 
 | ||||
| // Batch is the type that satisfies the ethdb.Batch interface for PG-IPFS Ethereum data using a direct Postgres connection
 | ||||
| type Batch struct { | ||||
| 	db        *sqlx.DB | ||||
| 	tx        *sqlx.Tx | ||||
| 	valueSize int | ||||
| 
 | ||||
| 	blockNumber *big.Int | ||||
| } | ||||
| 
 | ||||
| // NewBatch returns a ethdb.Batch interface for PG-IPFS
 | ||||
| func NewBatch(db *sqlx.DB, tx *sqlx.Tx, blockNumber *big.Int) ethdb.Batch { | ||||
| 	b := &Batch{ | ||||
| 		db:          db, | ||||
| 		tx:          tx, | ||||
| 		blockNumber: blockNumber, | ||||
| 	} | ||||
| 	if tx == nil { | ||||
| 		b.Reset() | ||||
| 	} | ||||
| 	return b | ||||
| } | ||||
| 
 | ||||
| // Put satisfies the ethdb.Batch interface
 | ||||
| // Put inserts the given value into the key-value data store
 | ||||
| // Key is expected to be a fully formulated cid key
 | ||||
| // TODO: note, now that we expected a cid we could route to the "cids" tables based on prefix instead of to ipld.blocks
 | ||||
| // but is it better to handle this routing here, or use a completely different interface since we already have to refactor
 | ||||
| // at levels above this package in order to pass in cids instead of raw keccak256 hashes
 | ||||
| func (b *Batch) Put(cidBytes []byte, value []byte) (err error) { | ||||
| 	// cast and resolve strings from cid.Cast
 | ||||
| 	// this will assert that we have a correctly formatted CID
 | ||||
| 	// and will handle the different string encodings for v0 and v1 CIDs
 | ||||
| 	// (note that this v0 vs v1 is different from the blockstore v0 vs v1)
 | ||||
| 	c, err := cid.Cast(cidBytes) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	if _, err = b.tx.Exec(putPgStr, c.String(), value, b.blockNumber.Uint64()); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	b.valueSize += len(value) | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // Delete satisfies the ethdb.Batch interface
 | ||||
| // Delete removes the key from the key-value data store
 | ||||
| func (b *Batch) Delete(cidBytes []byte) (err error) { | ||||
| 	c, err := cid.Cast(cidBytes) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	_, err = b.tx.Exec(deletePgStr, c.String()) | ||||
| 	return err | ||||
| } | ||||
| 
 | ||||
| // ValueSize satisfies the ethdb.Batch interface
 | ||||
| // ValueSize retrieves the amount of data queued up for writing
 | ||||
| // The returned value is the total byte length of all data queued to write
 | ||||
| func (b *Batch) ValueSize() int { | ||||
| 	return b.valueSize | ||||
| } | ||||
| 
 | ||||
| // Write satisfies the ethdb.Batch interface
 | ||||
| // Write flushes any accumulated data to disk
 | ||||
| func (b *Batch) Write() error { | ||||
| 	if b.tx == nil { | ||||
| 		return nil | ||||
| 	} | ||||
| 	return b.tx.Commit() | ||||
| } | ||||
| 
 | ||||
| // Replay satisfies the ethdb.Batch interface
 | ||||
| // Replay replays the batch contents
 | ||||
| func (b *Batch) Replay(w ethdb.KeyValueWriter) error { | ||||
| 	return errNotSupported | ||||
| } | ||||
| 
 | ||||
| // Reset satisfies the ethdb.Batch interface
 | ||||
| // Reset resets the batch for reuse
 | ||||
| // This should be called after every write
 | ||||
| func (b *Batch) Reset() { | ||||
| 	var err error | ||||
| 	b.tx, err = b.db.Beginx() | ||||
| 	if err != nil { | ||||
| 		panic(err) | ||||
| 	} | ||||
| 	b.valueSize = 0 | ||||
| } | ||||
| @ -1,138 +0,0 @@ | ||||
| // VulcanizeDB
 | ||||
| // Copyright © 2019 Vulcanize
 | ||||
| 
 | ||||
| // This program is free software: you can redistribute it and/or modify
 | ||||
| // it under the terms of the GNU Affero General Public License as published by
 | ||||
| // the Free Software Foundation, either version 3 of the License, or
 | ||||
| // (at your option) any later version.
 | ||||
| 
 | ||||
| // This program is distributed in the hope that it will be useful,
 | ||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of
 | ||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | ||||
| // GNU Affero General Public License for more details.
 | ||||
| 
 | ||||
| // You should have received a copy of the GNU Affero General Public License
 | ||||
| // along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | ||||
| 
 | ||||
| package pgipfsethdb_test | ||||
| 
 | ||||
| import ( | ||||
| 	"math/big" | ||||
| 	"time" | ||||
| 
 | ||||
| 	"github.com/cerc-io/ipfs-ethdb/v5/postgres/shared" | ||||
| 
 | ||||
| 	"github.com/ipfs/go-cid" | ||||
| 
 | ||||
| 	"github.com/ethereum/go-ethereum/core/types" | ||||
| 	"github.com/ethereum/go-ethereum/ethdb" | ||||
| 	"github.com/ethereum/go-ethereum/rlp" | ||||
| 	"github.com/mailgun/groupcache/v2" | ||||
| 	. "github.com/onsi/ginkgo" | ||||
| 	. "github.com/onsi/gomega" | ||||
| 
 | ||||
| 	pgipfsethdb "github.com/cerc-io/ipfs-ethdb/v5/postgres/v0" | ||||
| ) | ||||
| 
 | ||||
| var ( | ||||
| 	batch         ethdb.Batch | ||||
| 	testHeader2   = types.Header{Number: big.NewInt(2)} | ||||
| 	testValue2, _ = rlp.EncodeToBytes(testHeader2) | ||||
| 	testEthKey2   = testHeader2.Hash().Bytes() | ||||
| 	testCID2, _   = pgipfsethdb.CIDFromKeccak256(testEthKey2, cid.EthBlock) | ||||
| ) | ||||
| 
 | ||||
| var _ = Describe("Batch", func() { | ||||
| 	BeforeEach(func() { | ||||
| 		db, err = shared.TestDB() | ||||
| 		Expect(err).ToNot(HaveOccurred()) | ||||
| 
 | ||||
| 		cacheConfig := pgipfsethdb.CacheConfig{ | ||||
| 			Name:           "db", | ||||
| 			Size:           3000000, // 3MB
 | ||||
| 			ExpiryDuration: time.Hour, | ||||
| 		} | ||||
| 
 | ||||
| 		database = pgipfsethdb.NewDatabase(db, cacheConfig) | ||||
| 
 | ||||
| 		databaseWithBlock, ok := database.(*pgipfsethdb.Database) | ||||
| 		Expect(ok).To(BeTrue()) | ||||
| 		(*databaseWithBlock).BlockNumber = testBlockNumber | ||||
| 
 | ||||
| 		batch = database.NewBatch() | ||||
| 	}) | ||||
| 	AfterEach(func() { | ||||
| 		groupcache.DeregisterGroup("db") | ||||
| 		err = shared.ResetTestDB(db) | ||||
| 		Expect(err).ToNot(HaveOccurred()) | ||||
| 	}) | ||||
| 
 | ||||
| 	Describe("Put/Write", func() { | ||||
| 		It("adds the key-value pair to the batch", func() { | ||||
| 			_, err = database.Get(testCID.Bytes()) | ||||
| 			Expect(err).To(HaveOccurred()) | ||||
| 			Expect(err.Error()).To(ContainSubstring("sql: no rows in result set")) | ||||
| 			_, err = database.Get(testCID2.Bytes()) | ||||
| 			Expect(err).To(HaveOccurred()) | ||||
| 			Expect(err.Error()).To(ContainSubstring("sql: no rows in result set")) | ||||
| 
 | ||||
| 			err = batch.Put(testCID.Bytes(), testValue) | ||||
| 			Expect(err).ToNot(HaveOccurred()) | ||||
| 			err = batch.Put(testCID2.Bytes(), testValue2) | ||||
| 			Expect(err).ToNot(HaveOccurred()) | ||||
| 			err = batch.Write() | ||||
| 			Expect(err).ToNot(HaveOccurred()) | ||||
| 
 | ||||
| 			val, err := database.Get(testCID.Bytes()) | ||||
| 			Expect(err).ToNot(HaveOccurred()) | ||||
| 			Expect(val).To(Equal(testValue)) | ||||
| 			val2, err := database.Get(testCID2.Bytes()) | ||||
| 			Expect(err).ToNot(HaveOccurred()) | ||||
| 			Expect(val2).To(Equal(testValue2)) | ||||
| 		}) | ||||
| 	}) | ||||
| 
 | ||||
| 	Describe("Delete/Reset/Write", func() { | ||||
| 		It("deletes the key-value pair in the batch", func() { | ||||
| 			err = batch.Put(testCID.Bytes(), testValue) | ||||
| 			Expect(err).ToNot(HaveOccurred()) | ||||
| 			err = batch.Put(testCID2.Bytes(), testValue2) | ||||
| 			Expect(err).ToNot(HaveOccurred()) | ||||
| 			err = batch.Write() | ||||
| 			Expect(err).ToNot(HaveOccurred()) | ||||
| 
 | ||||
| 			batch.Reset() | ||||
| 			err = batch.Delete(testCID.Bytes()) | ||||
| 			Expect(err).ToNot(HaveOccurred()) | ||||
| 			err = batch.Delete(testCID2.Bytes()) | ||||
| 			Expect(err).ToNot(HaveOccurred()) | ||||
| 			err = batch.Write() | ||||
| 			Expect(err).ToNot(HaveOccurred()) | ||||
| 
 | ||||
| 			_, err = database.Get(testCID.Bytes()) | ||||
| 			Expect(err).To(HaveOccurred()) | ||||
| 			Expect(err.Error()).To(ContainSubstring("sql: no rows in result set")) | ||||
| 			_, err = database.Get(testCID2.Bytes()) | ||||
| 			Expect(err).To(HaveOccurred()) | ||||
| 			Expect(err.Error()).To(ContainSubstring("sql: no rows in result set")) | ||||
| 		}) | ||||
| 	}) | ||||
| 
 | ||||
| 	Describe("ValueSize/Reset", func() { | ||||
| 		It("returns the size of data in the batch queued for write", func() { | ||||
| 			err = batch.Put(testCID.Bytes(), testValue) | ||||
| 			Expect(err).ToNot(HaveOccurred()) | ||||
| 			err = batch.Put(testCID2.Bytes(), testValue2) | ||||
| 			Expect(err).ToNot(HaveOccurred()) | ||||
| 			err = batch.Write() | ||||
| 			Expect(err).ToNot(HaveOccurred()) | ||||
| 
 | ||||
| 			size := batch.ValueSize() | ||||
| 			Expect(size).To(Equal(len(testValue) + len(testValue2))) | ||||
| 
 | ||||
| 			batch.Reset() | ||||
| 			size = batch.ValueSize() | ||||
| 			Expect(size).To(Equal(0)) | ||||
| 		}) | ||||
| 	}) | ||||
| }) | ||||
| @ -1,365 +0,0 @@ | ||||
| // VulcanizeDB
 | ||||
| // Copyright © 2020 Vulcanize
 | ||||
| 
 | ||||
| // This program is free software: you can redistribute it and/or modify
 | ||||
| // it under the terms of the GNU Affero General Public License as published by
 | ||||
| // the Free Software Foundation, either version 3 of the License, or
 | ||||
| // (at your option) any later version.
 | ||||
| 
 | ||||
| // This program is distributed in the hope that it will be useful,
 | ||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of
 | ||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | ||||
| // GNU Affero General Public License for more details.
 | ||||
| 
 | ||||
| // You should have received a copy of the GNU Affero General Public License
 | ||||
| // along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | ||||
| 
 | ||||
| package pgipfsethdb | ||||
| 
 | ||||
| import ( | ||||
| 	"context" | ||||
| 	"database/sql" | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"math/big" | ||||
| 	"strconv" | ||||
| 	"strings" | ||||
| 	"time" | ||||
| 
 | ||||
| 	"github.com/ipfs/go-cid" | ||||
| 
 | ||||
| 	"github.com/ethereum/go-ethereum/ethdb" | ||||
| 	"github.com/jmoiron/sqlx" | ||||
| 	"github.com/mailgun/groupcache/v2" | ||||
| 	log "github.com/sirupsen/logrus" | ||||
| ) | ||||
| 
 | ||||
| var errNotSupported = errors.New("this operation is not supported") | ||||
| 
 | ||||
| var ( | ||||
| 	hasPgStr    = "SELECT exists(select 1 from ipld.blocks WHERE key = $1 LIMIT 1)" | ||||
| 	getPgStr    = "SELECT data FROM ipld.blocks WHERE key = $1 LIMIT 1" | ||||
| 	putPgStr    = "INSERT INTO ipld.blocks (key, data, block_number) VALUES ($1, $2, $3) ON CONFLICT DO NOTHING" | ||||
| 	deletePgStr = "DELETE FROM ipld.blocks WHERE key = $1" | ||||
| 	dbSizePgStr = "SELECT pg_database_size(current_database())" | ||||
| ) | ||||
| 
 | ||||
| var _ ethdb.Database = &Database{} | ||||
| 
 | ||||
| // Database is the type that satisfies the ethdb.Database and ethdb.KeyValueStore interfaces for PG-IPFS Ethereum data using a direct Postgres connection
 | ||||
| type Database struct { | ||||
| 	db    *sqlx.DB | ||||
| 	cache *groupcache.Group | ||||
| 
 | ||||
| 	BlockNumber *big.Int | ||||
| } | ||||
| 
 | ||||
| func (d *Database) ModifyAncients(f func(ethdb.AncientWriteOp) error) (int64, error) { | ||||
| 	return 0, errNotSupported | ||||
| } | ||||
| 
 | ||||
| type CacheConfig struct { | ||||
| 	Name           string | ||||
| 	Size           int | ||||
| 	ExpiryDuration time.Duration | ||||
| } | ||||
| 
 | ||||
| // NewKeyValueStore returns a ethdb.KeyValueStore interface for PG-IPFS
 | ||||
| func NewKeyValueStore(db *sqlx.DB, cacheConfig CacheConfig) ethdb.KeyValueStore { | ||||
| 	database := Database{db: db} | ||||
| 	database.InitCache(cacheConfig) | ||||
| 
 | ||||
| 	return &database | ||||
| } | ||||
| 
 | ||||
| // NewDatabase returns a ethdb.Database interface for PG-IPFS
 | ||||
| func NewDatabase(db *sqlx.DB, cacheConfig CacheConfig) ethdb.Database { | ||||
| 	database := Database{db: db} | ||||
| 	database.InitCache(cacheConfig) | ||||
| 
 | ||||
| 	return &database | ||||
| } | ||||
| 
 | ||||
| func (d *Database) InitCache(cacheConfig CacheConfig) { | ||||
| 	d.cache = groupcache.NewGroup(cacheConfig.Name, int64(cacheConfig.Size), groupcache.GetterFunc( | ||||
| 		func(_ context.Context, id string, dest groupcache.Sink) error { | ||||
| 			val, err := d.dbGet(id) | ||||
| 
 | ||||
| 			if err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 
 | ||||
| 			// Set the value in the groupcache, with expiry
 | ||||
| 			if err := dest.SetBytes(val, time.Now().Add(cacheConfig.ExpiryDuration)); err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 
 | ||||
| 			return nil | ||||
| 		}, | ||||
| 	)) | ||||
| } | ||||
| 
 | ||||
| func (d *Database) GetCacheStats() groupcache.Stats { | ||||
| 	return d.cache.Stats | ||||
| } | ||||
| 
 | ||||
| // Has satisfies the ethdb.KeyValueReader interface
 | ||||
| // Has retrieves if a cid is present in the key-value data store
 | ||||
| func (d *Database) Has(cidBytes []byte) (bool, error) { | ||||
| 	c, err := cid.Cast(cidBytes) | ||||
| 	if err != nil { | ||||
| 		return false, err | ||||
| 	} | ||||
| 	var exists bool | ||||
| 	return exists, d.db.Get(&exists, hasPgStr, c.String()) | ||||
| } | ||||
| 
 | ||||
| // Get retrieves the given key if it's present in the key-value data store
 | ||||
| func (d *Database) dbGet(key string) ([]byte, error) { | ||||
| 	var data []byte | ||||
| 	err := d.db.Get(&data, getPgStr, key) | ||||
| 	if err == sql.ErrNoRows { | ||||
| 		log.Warn("Database miss for key ", key) | ||||
| 	} | ||||
| 
 | ||||
| 	return data, err | ||||
| } | ||||
| 
 | ||||
| // Get satisfies the ethdb.KeyValueReader interface
 | ||||
| // Get retrieves the given cid if it's present in the key-value data store
 | ||||
| func (d *Database) Get(cidBytes []byte) ([]byte, error) { | ||||
| 	c, err := cid.Cast(cidBytes) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 
 | ||||
| 	ctx, cancel := context.WithTimeout(context.Background(), time.Millisecond*500) | ||||
| 	defer cancel() | ||||
| 
 | ||||
| 	var data []byte | ||||
| 	return data, d.cache.Get(ctx, c.String(), groupcache.AllocatingByteSliceSink(&data)) | ||||
| } | ||||
| 
 | ||||
| // Put satisfies the ethdb.KeyValueWriter interface
 | ||||
| // Put inserts the given value into the key-value data store
 | ||||
| // Key is expected to be a fully formulated cis of value
 | ||||
| func (d *Database) Put(cidBytes []byte, value []byte) error { | ||||
| 	c, err := cid.Cast(cidBytes) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	_, err = d.db.Exec(putPgStr, c.String(), value, d.BlockNumber.Uint64()) | ||||
| 	return err | ||||
| } | ||||
| 
 | ||||
| // Delete satisfies the ethdb.KeyValueWriter interface
 | ||||
| // Delete removes the cid from the key-value data store
 | ||||
| func (d *Database) Delete(cidBytes []byte) error { | ||||
| 	c, err := cid.Cast(cidBytes) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	cidString := c.String() | ||||
| 
 | ||||
| 	_, err = d.db.Exec(deletePgStr, cidString) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 
 | ||||
| 	// Remove from cache.
 | ||||
| 	ctx, cancel := context.WithTimeout(context.Background(), time.Millisecond*500) | ||||
| 	defer cancel() | ||||
| 	err = d.cache.Remove(ctx, cidString) | ||||
| 
 | ||||
| 	return err | ||||
| } | ||||
| 
 | ||||
| // DatabaseProperty enum type
 | ||||
| type DatabaseProperty int | ||||
| 
 | ||||
| const ( | ||||
| 	Unknown DatabaseProperty = iota | ||||
| 	Size | ||||
| 	Idle | ||||
| 	InUse | ||||
| 	MaxIdleClosed | ||||
| 	MaxLifetimeClosed | ||||
| 	MaxOpenConnections | ||||
| 	OpenConnections | ||||
| 	WaitCount | ||||
| 	WaitDuration | ||||
| ) | ||||
| 
 | ||||
| // DatabasePropertyFromString helper function
 | ||||
| func DatabasePropertyFromString(property string) (DatabaseProperty, error) { | ||||
| 	switch strings.ToLower(property) { | ||||
| 	case "size": | ||||
| 		return Size, nil | ||||
| 	case "idle": | ||||
| 		return Idle, nil | ||||
| 	case "inuse": | ||||
| 		return InUse, nil | ||||
| 	case "maxidleclosed": | ||||
| 		return MaxIdleClosed, nil | ||||
| 	case "maxlifetimeclosed": | ||||
| 		return MaxLifetimeClosed, nil | ||||
| 	case "maxopenconnections": | ||||
| 		return MaxOpenConnections, nil | ||||
| 	case "openconnections": | ||||
| 		return OpenConnections, nil | ||||
| 	case "waitcount": | ||||
| 		return WaitCount, nil | ||||
| 	case "waitduration": | ||||
| 		return WaitDuration, nil | ||||
| 	default: | ||||
| 		return Unknown, fmt.Errorf("unknown database property") | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // Stat satisfies the ethdb.Stater interface
 | ||||
| // Stat returns a particular internal stat of the database
 | ||||
| func (d *Database) Stat(property string) (string, error) { | ||||
| 	prop, err := DatabasePropertyFromString(property) | ||||
| 	if err != nil { | ||||
| 		return "", err | ||||
| 	} | ||||
| 	switch prop { | ||||
| 	case Size: | ||||
| 		var byteSize string | ||||
| 		return byteSize, d.db.Get(&byteSize, dbSizePgStr) | ||||
| 	case Idle: | ||||
| 		return strconv.Itoa(d.db.Stats().Idle), nil | ||||
| 	case InUse: | ||||
| 		return strconv.Itoa(d.db.Stats().InUse), nil | ||||
| 	case MaxIdleClosed: | ||||
| 		return strconv.FormatInt(d.db.Stats().MaxIdleClosed, 10), nil | ||||
| 	case MaxLifetimeClosed: | ||||
| 		return strconv.FormatInt(d.db.Stats().MaxLifetimeClosed, 10), nil | ||||
| 	case MaxOpenConnections: | ||||
| 		return strconv.Itoa(d.db.Stats().MaxOpenConnections), nil | ||||
| 	case OpenConnections: | ||||
| 		return strconv.Itoa(d.db.Stats().OpenConnections), nil | ||||
| 	case WaitCount: | ||||
| 		return strconv.FormatInt(d.db.Stats().WaitCount, 10), nil | ||||
| 	case WaitDuration: | ||||
| 		return d.db.Stats().WaitDuration.String(), nil | ||||
| 	default: | ||||
| 		return "", fmt.Errorf("unhandled database property") | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // Compact satisfies the ethdb.Compacter interface
 | ||||
| // Compact flattens the underlying data store for the given key range
 | ||||
| func (d *Database) Compact(start []byte, limit []byte) error { | ||||
| 	return errNotSupported | ||||
| } | ||||
| 
 | ||||
| // NewBatch satisfies the ethdb.Batcher interface
 | ||||
| // NewBatch creates a write-only database that buffers changes to its host db
 | ||||
| // until a final write is called
 | ||||
| func (d *Database) NewBatch() ethdb.Batch { | ||||
| 	return NewBatch(d.db, nil, d.BlockNumber) | ||||
| } | ||||
| 
 | ||||
| // NewBatchWithSize satisfies the ethdb.Batcher interface.
 | ||||
| // NewBatchWithSize creates a write-only database batch with pre-allocated buffer.
 | ||||
| func (d *Database) NewBatchWithSize(size int) ethdb.Batch { | ||||
| 	return NewBatch(d.db, nil, d.BlockNumber) | ||||
| } | ||||
| 
 | ||||
| // NewIterator satisfies the ethdb.Iteratee interface
 | ||||
| // it creates a binary-alphabetical iterator over a subset
 | ||||
| // of database content with a particular key prefix, starting at a particular
 | ||||
| // initial key (or after, if it does not exist).
 | ||||
| //
 | ||||
| // Note: This method assumes that the prefix is NOT part of the start, so there's
 | ||||
| // no need for the caller to prepend the prefix to the start
 | ||||
| func (d *Database) NewIterator(prefix []byte, start []byte) ethdb.Iterator { | ||||
| 	return NewIterator(start, prefix, d.db) | ||||
| } | ||||
| 
 | ||||
| // Close satisfies the io.Closer interface.
 | ||||
| // Close closes the db connection and deregisters from groupcache.
 | ||||
| func (d *Database) Close() error { | ||||
| 	groupcache.DeregisterGroup(d.cache.Name()) | ||||
| 	return d.db.DB.Close() | ||||
| } | ||||
| 
 | ||||
| // HasAncient satisfies the ethdb.AncientReader interface
 | ||||
| // HasAncient returns an indicator whether the specified data exists in the ancient store
 | ||||
| func (d *Database) HasAncient(kind string, number uint64) (bool, error) { | ||||
| 	return false, errNotSupported | ||||
| } | ||||
| 
 | ||||
| // Ancient satisfies the ethdb.AncientReader interface
 | ||||
| // Ancient retrieves an ancient binary blob from the append-only immutable files
 | ||||
| func (d *Database) Ancient(kind string, number uint64) ([]byte, error) { | ||||
| 	return nil, errNotSupported | ||||
| } | ||||
| 
 | ||||
| // Ancients satisfies the ethdb.AncientReader interface
 | ||||
| // Ancients returns the ancient item numbers in the ancient store
 | ||||
| func (d *Database) Ancients() (uint64, error) { | ||||
| 	return 0, errNotSupported | ||||
| } | ||||
| 
 | ||||
| // Tail satisfies the ethdb.AncientReader interface.
 | ||||
| // Tail returns the number of first stored item in the freezer.
 | ||||
| func (d *Database) Tail() (uint64, error) { | ||||
| 	return 0, errNotSupported | ||||
| } | ||||
| 
 | ||||
| // AncientSize satisfies the ethdb.AncientReader interface
 | ||||
| // AncientSize returns the ancient size of the specified category
 | ||||
| func (d *Database) AncientSize(kind string) (uint64, error) { | ||||
| 	return 0, errNotSupported | ||||
| } | ||||
| 
 | ||||
| // AncientRange retrieves all the items in a range, starting from the index 'start'.
 | ||||
| // It will return
 | ||||
| //   - at most 'count' items,
 | ||||
| //   - at least 1 item (even if exceeding the maxBytes), but will otherwise
 | ||||
| //     return as many items as fit into maxBytes.
 | ||||
| func (d *Database) AncientRange(kind string, start, count, maxBytes uint64) ([][]byte, error) { | ||||
| 	return nil, errNotSupported | ||||
| } | ||||
| 
 | ||||
| // ReadAncients applies the provided AncientReader function
 | ||||
| func (d *Database) ReadAncients(fn func(ethdb.AncientReaderOp) error) (err error) { | ||||
| 	return errNotSupported | ||||
| } | ||||
| 
 | ||||
| // TruncateHead satisfies the ethdb.AncientWriter interface.
 | ||||
| // TruncateHead discards all but the first n ancient data from the ancient store.
 | ||||
| func (d *Database) TruncateHead(n uint64) (uint64, error) { | ||||
| 	return 0, errNotSupported | ||||
| } | ||||
| 
 | ||||
| // TruncateTail satisfies the ethdb.AncientWriter interface.
 | ||||
| // TruncateTail discards the first n ancient data from the ancient store.
 | ||||
| func (d *Database) TruncateTail(n uint64) (uint64, error) { | ||||
| 	return 0, errNotSupported | ||||
| } | ||||
| 
 | ||||
| // Sync satisfies the ethdb.AncientWriter interface
 | ||||
| // Sync flushes all in-memory ancient store data to disk
 | ||||
| func (d *Database) Sync() error { | ||||
| 	return errNotSupported | ||||
| } | ||||
| 
 | ||||
| // MigrateTable satisfies the ethdb.AncientWriter interface.
 | ||||
| // MigrateTable processes and migrates entries of a given table to a new format.
 | ||||
| func (d *Database) MigrateTable(string, func([]byte) ([]byte, error)) error { | ||||
| 	return errNotSupported | ||||
| } | ||||
| 
 | ||||
| // NewSnapshot satisfies the ethdb.Snapshotter interface.
 | ||||
| // NewSnapshot creates a database snapshot based on the current state.
 | ||||
| func (d *Database) NewSnapshot() (ethdb.Snapshot, error) { | ||||
| 	return nil, errNotSupported | ||||
| } | ||||
| 
 | ||||
| // AncientDatadir returns an error as we don't have a backing chain freezer.
 | ||||
| func (d *Database) AncientDatadir() (string, error) { | ||||
| 	return "", errNotSupported | ||||
| } | ||||
| @ -1,133 +0,0 @@ | ||||
| // VulcanizeDB
 | ||||
| // Copyright © 2019 Vulcanize
 | ||||
| 
 | ||||
| // This program is free software: you can redistribute it and/or modify
 | ||||
| // it under the terms of the GNU Affero General Public License as published by
 | ||||
| // the Free Software Foundation, either version 3 of the License, or
 | ||||
| // (at your option) any later version.
 | ||||
| 
 | ||||
| // This program is distributed in the hope that it will be useful,
 | ||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of
 | ||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | ||||
| // GNU Affero General Public License for more details.
 | ||||
| 
 | ||||
| // You should have received a copy of the GNU Affero General Public License
 | ||||
| // along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | ||||
| 
 | ||||
| package pgipfsethdb_test | ||||
| 
 | ||||
| import ( | ||||
| 	"math/big" | ||||
| 	"time" | ||||
| 
 | ||||
| 	"github.com/cerc-io/ipfs-ethdb/v5/postgres/shared" | ||||
| 
 | ||||
| 	"github.com/ipfs/go-cid" | ||||
| 
 | ||||
| 	"github.com/ethereum/go-ethereum/core/types" | ||||
| 	"github.com/ethereum/go-ethereum/ethdb" | ||||
| 	"github.com/ethereum/go-ethereum/rlp" | ||||
| 	"github.com/jmoiron/sqlx" | ||||
| 	"github.com/mailgun/groupcache/v2" | ||||
| 	. "github.com/onsi/ginkgo" | ||||
| 	. "github.com/onsi/gomega" | ||||
| 
 | ||||
| 	pgipfsethdb "github.com/cerc-io/ipfs-ethdb/v5/postgres/v0" | ||||
| ) | ||||
| 
 | ||||
| var ( | ||||
| 	database        ethdb.Database | ||||
| 	db              *sqlx.DB | ||||
| 	err             error | ||||
| 	testBlockNumber = big.NewInt(1337) | ||||
| 	testHeader      = types.Header{Number: testBlockNumber} | ||||
| 	testValue, _    = rlp.EncodeToBytes(testHeader) | ||||
| 	testEthKey      = testHeader.Hash().Bytes() | ||||
| 	testCID, _      = pgipfsethdb.CIDFromKeccak256(testEthKey, cid.EthBlock) | ||||
| ) | ||||
| 
 | ||||
| var _ = Describe("Database", func() { | ||||
| 	BeforeEach(func() { | ||||
| 		db, err = shared.TestDB() | ||||
| 		Expect(err).ToNot(HaveOccurred()) | ||||
| 
 | ||||
| 		cacheConfig := pgipfsethdb.CacheConfig{ | ||||
| 			Name:           "db", | ||||
| 			Size:           3000000, // 3MB
 | ||||
| 			ExpiryDuration: time.Hour, | ||||
| 		} | ||||
| 
 | ||||
| 		database = pgipfsethdb.NewDatabase(db, cacheConfig) | ||||
| 
 | ||||
| 		databaseWithBlock, ok := database.(*pgipfsethdb.Database) | ||||
| 		Expect(ok).To(BeTrue()) | ||||
| 		(*databaseWithBlock).BlockNumber = testBlockNumber | ||||
| 	}) | ||||
| 	AfterEach(func() { | ||||
| 		groupcache.DeregisterGroup("db") | ||||
| 		err = shared.ResetTestDB(db) | ||||
| 		Expect(err).ToNot(HaveOccurred()) | ||||
| 		err = db.Close() | ||||
| 		Expect(err).ToNot(HaveOccurred()) | ||||
| 	}) | ||||
| 
 | ||||
| 	Describe("Has", func() { | ||||
| 		It("returns false if a key-pair doesn't exist in the db", func() { | ||||
| 			has, err := database.Has(testCID.Bytes()) | ||||
| 			Expect(err).ToNot(HaveOccurred()) | ||||
| 			Expect(has).ToNot(BeTrue()) | ||||
| 		}) | ||||
| 		It("returns true if a key-pair exists in the db", func() { | ||||
| 			_, err = db.Exec("INSERT into ipld.blocks (key, data, block_number) VALUES ($1, $2, $3)", testCID.String(), testValue, testBlockNumber.Uint64()) | ||||
| 			Expect(err).ToNot(HaveOccurred()) | ||||
| 			has, err := database.Has(testCID.Bytes()) | ||||
| 			Expect(err).ToNot(HaveOccurred()) | ||||
| 			Expect(has).To(BeTrue()) | ||||
| 		}) | ||||
| 	}) | ||||
| 
 | ||||
| 	Describe("Get", func() { | ||||
| 		It("throws an err if the key-pair doesn't exist in the db", func() { | ||||
| 			_, err = database.Get(testCID.Bytes()) | ||||
| 			Expect(err).To(HaveOccurred()) | ||||
| 			Expect(err.Error()).To(ContainSubstring("sql: no rows in result set")) | ||||
| 		}) | ||||
| 		It("returns the value associated with the key, if the pair exists", func() { | ||||
| 			_, err = db.Exec("INSERT into ipld.blocks (key, data, block_number) VALUES ($1, $2, $3)", testCID.String(), testValue, testBlockNumber.Uint64()) | ||||
| 			Expect(err).ToNot(HaveOccurred()) | ||||
| 			val, err := database.Get(testCID.Bytes()) | ||||
| 			Expect(err).ToNot(HaveOccurred()) | ||||
| 			Expect(val).To(Equal(testValue)) | ||||
| 		}) | ||||
| 	}) | ||||
| 
 | ||||
| 	Describe("Put", func() { | ||||
| 		It("persists the key-value pair in the database", func() { | ||||
| 			_, err = database.Get(testCID.Bytes()) | ||||
| 			Expect(err).To(HaveOccurred()) | ||||
| 			Expect(err.Error()).To(ContainSubstring("sql: no rows in result set")) | ||||
| 
 | ||||
| 			err = database.Put(testCID.Bytes(), testValue) | ||||
| 			Expect(err).ToNot(HaveOccurred()) | ||||
| 			val, err := database.Get(testCID.Bytes()) | ||||
| 			Expect(err).ToNot(HaveOccurred()) | ||||
| 			Expect(val).To(Equal(testValue)) | ||||
| 		}) | ||||
| 	}) | ||||
| 
 | ||||
| 	Describe("Delete", func() { | ||||
| 		It("removes the key-value pair from the database", func() { | ||||
| 			err = database.Put(testCID.Bytes(), testValue) | ||||
| 			Expect(err).ToNot(HaveOccurred()) | ||||
| 			val, err := database.Get(testCID.Bytes()) | ||||
| 			Expect(err).ToNot(HaveOccurred()) | ||||
| 			Expect(val).To(Equal(testValue)) | ||||
| 
 | ||||
| 			err = database.Delete(testCID.Bytes()) | ||||
| 			Expect(err).ToNot(HaveOccurred()) | ||||
| 			_, err = database.Get(testCID.Bytes()) | ||||
| 			Expect(err).To(HaveOccurred()) | ||||
| 			Expect(err.Error()).To(ContainSubstring("sql: no rows in result set")) | ||||
| 		}) | ||||
| 	}) | ||||
| }) | ||||
| @ -1,91 +0,0 @@ | ||||
| // VulcanizeDB
 | ||||
| // Copyright © 2020 Vulcanize
 | ||||
| 
 | ||||
| // This program is free software: you can redistribute it and/or modify
 | ||||
| // it under the terms of the GNU Affero General Public License as published by
 | ||||
| // the Free Software Foundation, either version 3 of the License, or
 | ||||
| // (at your option) any later version.
 | ||||
| 
 | ||||
| // This program is distributed in the hope that it will be useful,
 | ||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of
 | ||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | ||||
| // GNU Affero General Public License for more details.
 | ||||
| 
 | ||||
| // You should have received a copy of the GNU Affero General Public License
 | ||||
| // along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | ||||
| 
 | ||||
| package pgipfsethdb | ||||
| 
 | ||||
| import ( | ||||
| 	"github.com/ethereum/go-ethereum/ethdb" | ||||
| 	"github.com/ipfs/go-cid" | ||||
| 	"github.com/jmoiron/sqlx" | ||||
| ) | ||||
| 
 | ||||
| var _ ethdb.Iterator = &Iterator{} | ||||
| 
 | ||||
| // Iterator is the type that satisfies the ethdb.Iterator interface for PG-IPFS Ethereum data using a direct Postgres connection
 | ||||
| // Iteratee interface is used in Geth for various tests, trie/sync_bloom.go (for fast sync),
 | ||||
| // rawdb.InspectDatabase, and the new core/state/snapshot features.
 | ||||
| // This should not be confused with trie.NodeIterator or state.NodeIteraor (which can be constructed
 | ||||
| // from the ethdb.KeyValueStoreand ethdb.Database interfaces)
 | ||||
| type Iterator struct { | ||||
| 	db                 *sqlx.DB | ||||
| 	currentKey, prefix []byte | ||||
| 	err                error | ||||
| } | ||||
| 
 | ||||
| // NewIterator returns an ethdb.Iterator interface for PG-IPFS
 | ||||
| func NewIterator(start, prefix []byte, db *sqlx.DB) ethdb.Iterator { | ||||
| 	return &Iterator{ | ||||
| 		db:         db, | ||||
| 		prefix:     prefix, | ||||
| 		currentKey: start, | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // Next satisfies the ethdb.Iterator interface
 | ||||
| // Next moves the iterator to the next key/value pair
 | ||||
| // It returns whether the iterator is exhausted
 | ||||
| func (i *Iterator) Next() bool { | ||||
| 	// this is complicated by the ipfs db keys not being the keccak256 hashes
 | ||||
| 	// go-ethereum usage of this method expects the iteration to occur over keccak256 keys
 | ||||
| 	panic("implement me: Next") | ||||
| } | ||||
| 
 | ||||
| // Error satisfies the ethdb.Iterator interface
 | ||||
| // Error returns any accumulated error
 | ||||
| // Exhausting all the key/value pairs is not considered to be an error
 | ||||
| func (i *Iterator) Error() error { | ||||
| 	return i.err | ||||
| } | ||||
| 
 | ||||
| // Key satisfies the ethdb.Iterator interface
 | ||||
| // Key returns the key of the current key/value pair, or nil if done
 | ||||
| // The caller should not modify the contents of the returned slice
 | ||||
| // and its contents may change on the next call to Next
 | ||||
| func (i *Iterator) Key() []byte { | ||||
| 	return i.currentKey | ||||
| } | ||||
| 
 | ||||
| // Value satisfies the ethdb.Iterator interface
 | ||||
| // Value returns the value of the current key/value pair, or nil if done
 | ||||
| // The caller should not modify the contents of the returned slice
 | ||||
| // and its contents may change on the next call to Next
 | ||||
| func (i *Iterator) Value() []byte { | ||||
| 	c, err := cid.Cast(i.currentKey) | ||||
| 	if err != nil { | ||||
| 		i.err = err | ||||
| 		return nil | ||||
| 	} | ||||
| 	var data []byte | ||||
| 	i.err = i.db.Get(&data, getPgStr, c) | ||||
| 	return data | ||||
| } | ||||
| 
 | ||||
| // Release satisfies the ethdb.Iterator interface
 | ||||
| // Release releases associated resources
 | ||||
| // Release should always succeed and can be called multiple times without causing error
 | ||||
| func (i *Iterator) Release() { | ||||
| 	i.db.Close() | ||||
| } | ||||
| @ -1,32 +0,0 @@ | ||||
| // VulcanizeDB
 | ||||
| // Copyright © 2019 Vulcanize
 | ||||
| 
 | ||||
| // This program is free software: you can redistribute it and/or modify
 | ||||
| // it under the terms of the GNU Affero General Public License as published by
 | ||||
| // the Free Software Foundation, either version 3 of the License, or
 | ||||
| // (at your option) any later version.
 | ||||
| 
 | ||||
| // This program is distributed in the hope that it will be useful,
 | ||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of
 | ||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | ||||
| // GNU Affero General Public License for more details.
 | ||||
| 
 | ||||
| // You should have received a copy of the GNU Affero General Public License
 | ||||
| // along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | ||||
| 
 | ||||
| package pgipfsethdb | ||||
| 
 | ||||
| import ( | ||||
| 	"github.com/ipfs/go-cid" | ||||
| 	_ "github.com/lib/pq" //postgres driver
 | ||||
| 	"github.com/multiformats/go-multihash" | ||||
| ) | ||||
| 
 | ||||
| // CIDFromKeccak256 converts keccak256 hash bytes into a v1 cid
 | ||||
| func CIDFromKeccak256(hash []byte, codecType uint64) (cid.Cid, error) { | ||||
| 	mh, err := multihash.Encode(hash, multihash.KECCAK_256) | ||||
| 	if err != nil { | ||||
| 		return cid.Cid{}, err | ||||
| 	} | ||||
| 	return cid.NewCidV1(codecType, mh), nil | ||||
| } | ||||
| @ -1,29 +0,0 @@ | ||||
| // VulcanizeDB
 | ||||
| // Copyright © 2019 Vulcanize
 | ||||
| 
 | ||||
| // This program is free software: you can redistribute it and/or modify
 | ||||
| // it under the terms of the GNU Affero General Public License as published by
 | ||||
| // the Free Software Foundation, either version 3 of the License, or
 | ||||
| // (at your option) any later version.
 | ||||
| 
 | ||||
| // This program is distributed in the hope that it will be useful,
 | ||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of
 | ||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | ||||
| // GNU Affero General Public License for more details.
 | ||||
| 
 | ||||
| // You should have received a copy of the GNU Affero General Public License
 | ||||
| // along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | ||||
| 
 | ||||
| package pgipfsethdb_test | ||||
| 
 | ||||
| import ( | ||||
| 	"testing" | ||||
| 
 | ||||
| 	. "github.com/onsi/ginkgo" | ||||
| 	. "github.com/onsi/gomega" | ||||
| ) | ||||
| 
 | ||||
| func TestPGIPFSETHDB(t *testing.T) { | ||||
| 	RegisterFailHandler(Fail) | ||||
| 	RunSpecs(t, "PG-IPFS ethdb test") | ||||
| } | ||||
							
								
								
									
										2
									
								
								util.go
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								util.go
									
									
									
									
									
								
							| @ -29,7 +29,7 @@ func Keccak256ToCid(h []byte, codec uint64) (cid.Cid, error) { | ||||
| 	if err != nil { | ||||
| 		return cid.Cid{}, err | ||||
| 	} | ||||
| 	return cid.NewCidV1(codec, buf), nil | ||||
| 	return cid.NewCidV1(codec, multihash.Multihash(buf)), nil | ||||
| } | ||||
| 
 | ||||
| // NewBlock takes a keccak256 hash key and the rlp []byte value it was derived from and creates an ipfs block object
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user