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 | ## 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 | > 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. | 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. | 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. | 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. | 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 | ## 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 | 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. | 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/common" | ||||||
|     "github.com/ethereum/go-ethereum/core/state" |     "github.com/ethereum/go-ethereum/core/state" | ||||||
|     "github.com/ethereum/go-ethereum/trie" |     "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/core" | ||||||
|     "github.com/ipfs/go-ipfs/repo/fsrepo" |     "github.com/ipfs/go-ipfs/repo/fsrepo" | ||||||
|     "github.com/jmoiron/sqlx" |     "github.com/jmoiron/sqlx" | ||||||
|     "github.com/cerc-io/ipfs-ethdb/v5" |     "github.com/vulcanize/ipfs-ethdb/v4" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| func main() { | func main() { | ||||||
|  | |||||||
							
								
								
									
										2
									
								
								batch.go
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								batch.go
									
									
									
									
									
								
							| @ -23,8 +23,8 @@ import ( | |||||||
| 	"github.com/ethereum/go-ethereum/common" | 	"github.com/ethereum/go-ethereum/common" | ||||||
| 	"github.com/ethereum/go-ethereum/ethdb" | 	"github.com/ethereum/go-ethereum/ethdb" | ||||||
| 	lru "github.com/hashicorp/golang-lru" | 	lru "github.com/hashicorp/golang-lru" | ||||||
| 	"github.com/ipfs/boxo/blockservice" |  | ||||||
| 	blocks "github.com/ipfs/go-block-format" | 	blocks "github.com/ipfs/go-block-format" | ||||||
|  | 	"github.com/ipfs/go-blockservice" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| var ( | var ( | ||||||
|  | |||||||
| @ -25,7 +25,7 @@ import ( | |||||||
| 	. "github.com/onsi/ginkgo" | 	. "github.com/onsi/ginkgo" | ||||||
| 	. "github.com/onsi/gomega" | 	. "github.com/onsi/gomega" | ||||||
| 
 | 
 | ||||||
| 	ipfsethdb "github.com/cerc-io/ipfs-ethdb/v5" | 	ipfsethdb "github.com/cerc-io/ipfs-ethdb/v4" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| var ( | var ( | ||||||
|  | |||||||
							
								
								
									
										16
									
								
								database.go
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								database.go
									
									
									
									
									
								
							| @ -23,7 +23,7 @@ import ( | |||||||
| 	"strings" | 	"strings" | ||||||
| 
 | 
 | ||||||
| 	"github.com/ethereum/go-ethereum/ethdb" | 	"github.com/ethereum/go-ethereum/ethdb" | ||||||
| 	"github.com/ipfs/boxo/blockservice" | 	"github.com/ipfs/go-blockservice" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| var ( | 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'.
 | // AncientRange retrieves all the items in a range, starting from the index 'start'.
 | ||||||
| // It will return
 | // It will return
 | ||||||
| //   - at most 'count' items,
 | //  - at most 'count' items,
 | ||||||
| //   - at least 1 item (even if exceeding the maxBytes), but will otherwise
 | //  - at least 1 item (even if exceeding the maxBytes), but will otherwise
 | ||||||
| //     return as many items as fit into maxBytes.
 | //   return as many items as fit into maxBytes.
 | ||||||
| func (d *Database) AncientRange(kind string, start, count, maxBytes uint64) ([][]byte, error) { | func (d *Database) AncientRange(kind string, start, count, maxBytes uint64) ([][]byte, error) { | ||||||
| 	return nil, errNotSupported | 	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 satisfies the ethdb.AncientWriter interface.
 | ||||||
| // TruncateHead discards all but the first n ancient data from the ancient store.
 | // TruncateHead discards all but the first n ancient data from the ancient store.
 | ||||||
| func (d *Database) TruncateHead(n uint64) (uint64, error) { | func (d *Database) TruncateHead(n uint64) error { | ||||||
| 	return 0, errNotSupported | 	return errNotSupported | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // TruncateTail satisfies the ethdb.AncientWriter interface.
 | // TruncateTail satisfies the ethdb.AncientWriter interface.
 | ||||||
| // TruncateTail discards the first n ancient data from the ancient store.
 | // TruncateTail discards the first n ancient data from the ancient store.
 | ||||||
| func (d *Database) TruncateTail(n uint64) (uint64, error) { | func (d *Database) TruncateTail(n uint64) error { | ||||||
| 	return 0, errNotSupported | 	return errNotSupported | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // Sync satisfies the ethdb.AncientWriter interface
 | // Sync satisfies the ethdb.AncientWriter interface
 | ||||||
|  | |||||||
| @ -22,11 +22,11 @@ import ( | |||||||
| 	"github.com/ethereum/go-ethereum/core/types" | 	"github.com/ethereum/go-ethereum/core/types" | ||||||
| 	"github.com/ethereum/go-ethereum/ethdb" | 	"github.com/ethereum/go-ethereum/ethdb" | ||||||
| 	"github.com/ethereum/go-ethereum/rlp" | 	"github.com/ethereum/go-ethereum/rlp" | ||||||
| 	"github.com/ipfs/boxo/blockservice" | 	"github.com/ipfs/go-blockservice" | ||||||
| 	. "github.com/onsi/ginkgo" | 	. "github.com/onsi/ginkgo" | ||||||
| 	. "github.com/onsi/gomega" | 	. "github.com/onsi/gomega" | ||||||
| 
 | 
 | ||||||
| 	ipfsethdb "github.com/cerc-io/ipfs-ethdb/v5" | 	ipfsethdb "github.com/cerc-io/ipfs-ethdb/v4" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| var ( | 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 ( | require ( | ||||||
| 	github.com/ethereum/go-ethereum v1.13.14 | 	github.com/ethereum/go-ethereum v1.10.26 | ||||||
| 	github.com/hashicorp/golang-lru v1.0.2 | 	github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d | ||||||
| 	github.com/ipfs/boxo v0.19.0 | 	github.com/ipfs/go-block-format v0.0.3 | ||||||
| 	github.com/ipfs/go-block-format v0.2.0 | 	github.com/ipfs/go-blockservice v0.4.0 | ||||||
| 	github.com/ipfs/go-cid v0.4.1 | 	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-ds-help v1.1.0 | ||||||
|  | 	github.com/ipfs/go-ipfs-exchange-interface v0.2.0 | ||||||
| 	github.com/jmoiron/sqlx v1.3.5 | 	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/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/ginkgo v1.16.5 | ||||||
| 	github.com/onsi/gomega v1.19.0 | 	github.com/onsi/gomega v1.19.0 | ||||||
| 	github.com/sirupsen/logrus v1.6.0 | 	github.com/sirupsen/logrus v1.6.0 | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
|  | require github.com/btcsuite/btcd/btcec/v2 v2.2.0 // indirect | ||||||
|  | 
 | ||||||
| require ( | require ( | ||||||
| 	github.com/bits-and-blooms/bitset v1.10.0 // indirect | 	github.com/btcsuite/btcd v0.22.0-beta // indirect | ||||||
| 	github.com/btcsuite/btcd/btcec/v2 v2.2.0 // indirect | 	github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect | ||||||
| 	github.com/consensys/bavard v0.1.13 // indirect | 	github.com/fsnotify/fsnotify v1.4.9 // indirect | ||||||
| 	github.com/consensys/gnark-crypto v0.12.1 // indirect | 	github.com/go-logr/logr v1.2.3 // 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/go-logr/stdr v1.2.2 // indirect | 	github.com/go-logr/stdr v1.2.2 // indirect | ||||||
| 	github.com/golang/protobuf v1.5.3 // indirect | 	github.com/gogo/protobuf v1.3.2 // indirect | ||||||
| 	github.com/google/uuid v1.6.0 // indirect | 	github.com/golang/protobuf v1.5.2 // indirect | ||||||
| 	github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect | 	github.com/google/uuid v1.2.0 // indirect | ||||||
| 	github.com/holiman/uint256 v1.2.4 // indirect |  | ||||||
| 	github.com/ipfs/bbloom v0.0.4 // indirect | 	github.com/ipfs/bbloom v0.0.4 // indirect | ||||||
| 	github.com/ipfs/go-datastore v0.6.0 // indirect | 	github.com/ipfs/go-datastore v0.5.0 // indirect | ||||||
| 	github.com/ipfs/go-ipfs-util v0.0.3 // indirect | 	github.com/ipfs/go-ipfs-util v0.0.2 // indirect | ||||||
| 	github.com/ipfs/go-ipld-format v0.6.0 // indirect | 	github.com/ipfs/go-ipld-format v0.4.0 // indirect | ||||||
| 	github.com/ipfs/go-log/v2 v2.5.1 // 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-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/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/konsorten/go-windows-terminal-sequences v1.0.3 // indirect | ||||||
| 	github.com/mattn/go-isatty v0.0.20 // indirect | 	github.com/mattn/go-isatty v0.0.13 // indirect | ||||||
| 	github.com/minio/sha256-simd v1.0.1 // indirect | 	github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 // indirect | ||||||
| 	github.com/mmcloughlin/addchain v0.4.0 // indirect | 	github.com/minio/sha256-simd v1.0.0 // indirect | ||||||
| 	github.com/mr-tron/base58 v1.2.0 // indirect | 	github.com/mr-tron/base58 v1.2.0 // indirect | ||||||
| 	github.com/multiformats/go-base32 v0.1.0 // indirect | 	github.com/multiformats/go-base32 v0.0.3 // indirect | ||||||
| 	github.com/multiformats/go-base36 v0.2.0 // indirect | 	github.com/multiformats/go-base36 v0.1.0 // indirect | ||||||
| 	github.com/multiformats/go-multibase v0.2.0 // indirect | 	github.com/multiformats/go-multibase v0.0.3 // indirect | ||||||
| 	github.com/multiformats/go-varint v0.0.7 // indirect | 	github.com/multiformats/go-varint v0.0.6 // indirect | ||||||
| 	github.com/nxadm/tail v1.4.8 // 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/segmentio/fasthash v1.0.3 // indirect | ||||||
| 	github.com/spaolacci/murmur3 v1.1.0 // indirect | 	github.com/spaolacci/murmur3 v1.1.0 // indirect | ||||||
| 	github.com/supranational/blst v0.3.11 // indirect | 	go.opentelemetry.io/otel v1.7.0 // indirect | ||||||
| 	go.opentelemetry.io/otel v1.25.0 // indirect | 	go.opentelemetry.io/otel/trace v1.7.0 // indirect | ||||||
| 	go.opentelemetry.io/otel/metric v1.25.0 // indirect | 	go.uber.org/atomic v1.7.0 // indirect | ||||||
| 	go.opentelemetry.io/otel/trace v1.25.0 // indirect | 	go.uber.org/multierr v1.6.0 // indirect | ||||||
| 	go.uber.org/multierr v1.11.0 // indirect | 	go.uber.org/zap v1.16.0 // indirect | ||||||
| 	go.uber.org/zap v1.27.0 // indirect | 	golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90 // indirect | ||||||
| 	golang.org/x/crypto v0.22.0 // indirect | 	golang.org/x/net v0.0.0-20220607020251-c690dde0001d // indirect | ||||||
| 	golang.org/x/exp v0.0.0-20240103183307-be819d1f06fc // indirect | 	golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a // indirect | ||||||
| 	golang.org/x/net v0.21.0 // indirect | 	golang.org/x/text v0.3.7 // indirect | ||||||
| 	golang.org/x/sync v0.6.0 // indirect | 	google.golang.org/protobuf v1.26.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 |  | ||||||
| 	gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect | 	gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect | ||||||
| 	gopkg.in/yaml.v2 v2.4.0 // indirect | 	gopkg.in/yaml.v2 v2.4.0 // indirect | ||||||
| 	lukechampine.com/blake3 v1.2.2 // indirect | 	lukechampine.com/blake3 v1.1.6 // indirect | ||||||
| 	rsc.io/tmplfunc v0.0.3 // 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/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= | ||||||
| github.com/DataDog/zstd v1.4.5 h1:EndNeuB0l9syBZhut0wns3gV1hL8zX8LIu6ZiVHWLIQ= | github.com/VictoriaMetrics/fastcache v1.6.0 h1:C/3Oi3EiBCqufydp1neRZkqcwmEiuRT9c3fqvvgKm5o= | ||||||
| github.com/DataDog/zstd v1.4.5/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= | github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= | ||||||
| github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA= | github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= | ||||||
| github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= | github.com/btcsuite/btcd v0.22.0-beta h1:LTDpDKUM5EeOFBPM8IXpinEcmZ6FWfNZbE3lfrfdnWo= | ||||||
| github.com/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bwt3uRKnkZU40= | github.com/btcsuite/btcd v0.22.0-beta/go.mod h1:9n5ntfhhHQBIhUvlhDvD3Qg6fRUj4jkN0VB8L8svzOA= | ||||||
| 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/btcsuite/btcd/btcec/v2 v2.2.0 h1:fzn1qaOt32TuLjFlkzYSsBC35Q3KUjT1SwPxiMSCF5k= | 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/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/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= | ||||||
| github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= | github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= | ||||||
| github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= | github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce/go.mod h1:0DVlHczLPewLcPGEIeUEzfOJhqGPQ0mJJRDBtD307+o= | ||||||
| github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= | github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= | ||||||
| github.com/cockroachdb/errors v1.8.1 h1:A5+txlVZfOqFBDa4mGz2bUWSp0aHElvHX2bKkdbQu+Y= | github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= | ||||||
| github.com/cockroachdb/errors v1.8.1/go.mod h1:qGwQn6JmZ+oMjuLwjWzUNqblqk0xl4CVV3SQbGwK7Ac= | github.com/btcsuite/goleveldb v1.0.0/go.mod h1:QiK9vBlgftBg6rWQIj6wFzbPfRjiykIEhBH4obrXJ/I= | ||||||
| github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f h1:o/kfcElHqOiXqcou5a3rIlMc7oJbMQkeLk0VQJ7zgqY= | github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= | ||||||
| github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= | github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= | ||||||
| github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 h1:aPEJyR4rPBvDmeyi+l/FS/VtA00IWvjeFvjen1m1l1A= | github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= | ||||||
| github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593/go.mod h1:6hk1eMY/u5t+Cf18q5lFMUA1Rc+Sm5I6Ra1QuPyxXCo= | github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= | ||||||
| github.com/cockroachdb/redact v1.0.8 h1:8QG/764wK+vmEYoOlfobpe12EQcS81ukx/a4hdVMxNw= | github.com/cerc-io/go-ethereum v1.10.26-statediff-4.2.2-alpha h1:gesMZEbNU+fcAMctITi+KO/AK80YdTq6TVB5lb4EfnU= | ||||||
| github.com/cockroachdb/redact v1.0.8/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= | github.com/cerc-io/go-ethereum v1.10.26-statediff-4.2.2-alpha/go.mod h1:lKBVBWksSwBDR/5D9CAxaGQzDPIS3ueWb6idy7X1Shg= | ||||||
| github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2 h1:IKgmqgMQlVJIZj19CdocBeSfSaiCbEBZGKODaixqtHM= | github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= | ||||||
| github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2/go.mod h1:8BT+cPK6xvFOcRlk0R8eg+OTkcqI6baNH4xAkpiYVvQ= | github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= | ||||||
| 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/davecgh/go-spew v1.1.0/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 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= | ||||||
| github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= | 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.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= | ||||||
| github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= | github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= | ||||||
| github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etlyjdBU4sfcs2WYQMs= | github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 h1:YLtO71vCjJRCBcrPMtQ9nqBsqpA1m5sE92cU+pd5Mcc= | ||||||
| github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= | github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= | ||||||
| github.com/ethereum/c-kzg-4844 v0.4.0 h1:3MS1s4JtA868KpJxroZoepdV0ZKBp3u/O5HcZ7R3nlY= | github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= | ||||||
| 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/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= | 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.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.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= | ||||||
| github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= | github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= | ||||||
| github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= | 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 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= | ||||||
| github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= | 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.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= | ||||||
| github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= |  | ||||||
| github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= | 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-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-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= | ||||||
| github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= | github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= | ||||||
| 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.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= | github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= | ||||||
| github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= | github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= | ||||||
| github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= | 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.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= | ||||||
| github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= | 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.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= | ||||||
| github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= | github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= | ||||||
| github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= | github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= | ||||||
| github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= | github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= | ||||||
| github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= |  | ||||||
| github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= | 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.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.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.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.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o= | ||||||
| github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= | github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= | ||||||
| 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/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= | 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.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.2.0 h1:qJYtXnJRWmpe7m/3XlyhrsLrEURqHRM2kxzoxXqyUDs= | ||||||
| github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= | github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= | ||||||
| github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= | github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfmKFJ6tItnhQ67kU= | ||||||
| github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= | github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48= | ||||||
| github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= | github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= | ||||||
| github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= | github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d h1:dg1dEPuWpEqDnvIw251EVy4zlP8gWbsGj4BsUKCRpYs= | ||||||
| github.com/holiman/uint256 v1.2.4 h1:jUc4Nk8fm9jZabQuqr2JzednajVmBpC+oiTiXZJEApU= | github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= | ||||||
| github.com/holiman/uint256 v1.2.4/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= |  | ||||||
| github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= | 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 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs= | ||||||
| github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0= | 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/go-block-format v0.0.2/go.mod h1:AWR46JfpcObNfg3ok2JHDUfdiHRgWhJgCQF+KIgOPJY= | ||||||
| github.com/ipfs/boxo v0.19.0/go.mod h1:V5gJzbIMwKEXrg3IdvAxIdF7UPgU4RsXmNGS8MQ/0D4= | github.com/ipfs/go-block-format v0.0.3 h1:r8t66QstRp/pd/or4dpnbVfXT5Gt7lOqRvC+/dDTpMc= | ||||||
| github.com/ipfs/go-block-format v0.2.0 h1:ZqrkxBA2ICbDRbK8KJs/u0O3dlp6gmAuuXUJNiW1Ycs= | github.com/ipfs/go-block-format v0.0.3/go.mod h1:4LmD4ZUw0mhO+JSKdpWwrzATiEfM7WWgQ8H5l6P8MVk= | ||||||
| github.com/ipfs/go-block-format v0.2.0/go.mod h1:+jpL11nFx5A/SPpsoBn6Bzkra/zaArfSmsknbPMYgzM= | 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.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.0.7/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I= | ||||||
| github.com/ipfs/go-cid v0.4.1/go.mod h1:uQHwDeX4c6CtyrFwdqyhpNcxVewur1M7l7fNU7LKwZk= | 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.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 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk= | ||||||
| github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps= | 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 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-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 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-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-exchange-interface v0.2.0 h1:8lMSJmKogZYNo2jjhUs0izT+dck05pqUw4mWNW9Pw6Y= | ||||||
| github.com/ipfs/go-ipfs-util v0.0.3/go.mod h1:LHzG1a0Ig4G+iZ26UUOMjHd+lfM84LZCrn17xAKWBvs= | github.com/ipfs/go-ipfs-exchange-interface v0.2.0/go.mod h1:z6+RhJuDQbqKguVyslSOuVDhqF9JtTrO3eptSAiW2/Y= | ||||||
| github.com/ipfs/go-ipld-format v0.6.0 h1:VEJlA2kQ3LqFSIm5Vu6eIlSxD/Ze90xtc4Meten1F5U= | github.com/ipfs/go-ipfs-exchange-offline v0.3.0 h1:c/Dg8GDPzixGd0MC8Jh6mjOwU57uYokgWRFidfvEkuA= | ||||||
| github.com/ipfs/go-ipld-format v0.6.0/go.mod h1:g4QVMTn3marU3qXchwjpKPKgJv+zF+OlaKMyhJ4LHPg= | github.com/ipfs/go-ipfs-util v0.0.1/go.mod h1:spsl5z8KUnrve+73pOhSVZND1SIxPW5RyBCNzQxlJBc= | ||||||
| github.com/ipfs/go-log/v2 v2.5.1 h1:1XdUzF7048prq4aBjDQQ4SL5RxftpRGdXhNRwKSAlcY= | github.com/ipfs/go-ipfs-util v0.0.2 h1:59Sswnk1MFaiq+VcaknX7aYEyGyGDAA73ilhEK2POp8= | ||||||
| github.com/ipfs/go-log/v2 v2.5.1/go.mod h1:prSpmC1Gpllc9UYWxDiZDreBYw7zp4Iqp1kOLU9U5UI= | 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 h1:j+cpbjYvu4R8zbleSs36gvB7jR+wsL2fGD6n0jO4kdg= | ||||||
| github.com/ipfs/go-metrics-interface v0.0.1/go.mod h1:6s6euYU4zowdslK0GKHmqaIZ3j/b/tL7HTWtJ4VPgWY= | 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/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 h1:DRGOFReOMqqDNXwW70QkacFW0YN9QnwLV0Vqk+3oU0o= | ||||||
| github.com/jbenet/goprocess v0.1.4/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= | 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 h1:vFFPA71p1o5gAeqtEAwLU4dnX2napprKtHr7PYIcN3g= | ||||||
| github.com/jmoiron/sqlx v1.3.5/go.mod h1:nRVWtLre0KfCLJvgxzCsLVMogSvQ1zNJtpYr2Ccp0mQ= | 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/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= | ||||||
| github.com/klauspost/compress v1.17.4 h1:Ej5ixsIri7BrIjBkRZLTo6ghwrEtHFk7ijlczPW4fZ4= | github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= | ||||||
| github.com/klauspost/compress v1.17.4/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM= | github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= | ||||||
| github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM= | github.com/klauspost/cpuid/v2 v2.0.9 h1:lgaqFMSdTdQYdZ04uHyN2d/eKdOMyi2YLSvlQIBFYa4= | ||||||
| github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= | 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 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8= | ||||||
| github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= | github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= | ||||||
| github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= | 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.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/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.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.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.6 h1:jbk+ZieJ0D7EVGJYpL9QTz7/YW6UHbmdnZWYyK5cdBs= | ||||||
| github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= | 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 h1:/Usq3VewXa8t+afFaUAY7g8N9cRNqBT5nDhECYwLcd8= | ||||||
| github.com/mailgun/groupcache/v2 v2.3.0/go.mod h1:tH8aMaTRIjFMJsmJ9p7Y5HGBj9hV/J9rKQ+/3dIXzNU= | 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-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= | ||||||
| github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= | github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= | ||||||
| github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= | github.com/mattn/go-isatty v0.0.13 h1:qdl+GuBjcsKKDco5BsxPJlId98mSWNKqYA+Co0SC1yA= | ||||||
| github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= | github.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= | ||||||
| github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= | 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 h1:dNPt6NO46WmLVt2DLNpwczCmdV5boIZ6g/tlDrlRUbg= | ||||||
| github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= | 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/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0OXOcUbGjvZxxijuBwbbmlSxLiuofa+g= | ||||||
| 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/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= | 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 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.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g= | ||||||
| github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5xJjtbRSN8= | github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= | ||||||
| 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/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= | 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.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 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o= | ||||||
| github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= | 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.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= | ||||||
| github.com/multiformats/go-base32 v0.1.0 h1:pVx9xoSPqEIQG8o+UbAe7DNi51oej1NtK+aGkbLYxPE= | github.com/multiformats/go-base36 v0.1.0 h1:JR6TyF7JjGd3m6FbLU2cOxhC0Li8z8dLNGQ89tUg4F4= | ||||||
| github.com/multiformats/go-base32 v0.1.0/go.mod h1:Kj3tFY6zNr+ABYMqeUNeGvkIC/UYgtWibDcT0rExnbI= | github.com/multiformats/go-base36 v0.1.0/go.mod h1:kFGE83c6s80PklsHO9sRn2NCoffoRdUUOENyW/Vv6sM= | ||||||
| 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-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= | 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.0.3 h1:l/B6bJDQjvQ5G52jw4QGSYeOTZoAwIO77RblWplfIqk= | ||||||
| github.com/multiformats/go-multibase v0.2.0/go.mod h1:bFBZX4lKCA/2lyOFSAoKH5SS6oPyjtnzK/XTFDPkNuk= | 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.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.0.14/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= | ||||||
| github.com/multiformats/go-multihash v0.2.3/go.mod h1:dXgKXCXjBzdscBLk9JkjINiEsCKRVch90MdaGiKsvSM= | 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.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.6 h1:gk85QWKxh3TazbLxED/NlDVv8+q+ReFJk7Y2W/KhfNY= | ||||||
| github.com/multiformats/go-varint v0.0.7/go.mod h1:r8PUYw/fD/SjBCiKOoDlGF6QawOELpZAu9eioSos/OU= | 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.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= | ||||||
| github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= | github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= | ||||||
| github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= | github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= | ||||||
| github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= | 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.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.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= | ||||||
| github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= | 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 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.1.3 h1:e/3Cwtogj0HA+25nMP1jCMDIf8RtRYbGwGGuBIFztkc= | ||||||
| github.com/onsi/ginkgo/v2 v2.13.2/go.mod h1:XStQ8QcGwLyF4HdfcZB8SFOS/MWCgDuXMSBe6zrvLgM= | 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.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.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 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= | ||||||
| github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= | 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.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= | ||||||
| github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= | 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 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= | ||||||
| github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= | 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/tsdb v0.10.0 h1:If5rVCMTp6W2SiRAQFlbpJNgVlgMEd+U2GZckwK38ic= | ||||||
| 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/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= | 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 h1:EI9+KE1EwvMLBWwjpRDc+fEM+prwxDYbslddQGtrmhM= | ||||||
| github.com/segmentio/fasthash v1.0.3/go.mod h1:waKX8l2N8yckOgmSsXJi7x1ZfdKZ4x7KRMzBtS3oedY= | 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.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= | ||||||
| github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= |  | ||||||
| github.com/sirupsen/logrus v1.6.0 h1:UBcNElsrwanuuMsnGSlYmtmgbb23qDR5dG+6X6Oo89I= | github.com/sirupsen/logrus v1.6.0 h1:UBcNElsrwanuuMsnGSlYmtmgbb23qDR5dG+6X6Oo89I= | ||||||
| github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= | github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= | ||||||
| github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= | 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/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.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= | ||||||
| github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= | 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.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.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY= | ||||||
| github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= | github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= | ||||||
| github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= |  | ||||||
| github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= |  | ||||||
| github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= |  | ||||||
| github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= | 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.5 h1:uu3Xl4nkLzQfXNsWn15rPc/HQCJKObbt1dKJeWp3vU4= | ||||||
| github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= | github.com/tklauser/numcpus v0.2.2 h1:oyhllyrScuYI6g+h/zUvNXNp1wy7x8qQy3t/piefldA= | ||||||
| github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= | github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc/go.mod h1:bopw91TMyo8J3tvftk8xmU2kPmlrt4nScJQZU2hE5EM= | ||||||
| github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= | github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= | ||||||
| github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= |  | ||||||
| github.com/yuin/goldmark v1.2.1/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= | github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg= | ||||||
| go.opentelemetry.io/otel v1.25.0 h1:gldB5FfhRl7OJQbUHt/8s0a7cE8fbsPAtdpRaApKy4k= | go.opentelemetry.io/otel v1.7.0 h1:Z2lA3Tdch0iDcrhJXDIlC94XE+bxok1F9B+4Lz/lGsM= | ||||||
| go.opentelemetry.io/otel v1.25.0/go.mod h1:Wa2ds5NOXEMkCmUou1WA7ZBfLTHWIsp034OVD7AO+Vg= | go.opentelemetry.io/otel v1.7.0/go.mod h1:5BdUoMIz5WEs0vt0CUEMtSSaTSHBBVwrhnz7+nrD5xk= | ||||||
| go.opentelemetry.io/otel/metric v1.25.0 h1:LUKbS7ArpFL/I2jJHdJcqMGxkRdxpPHE0VU/D4NuEwA= | go.opentelemetry.io/otel/trace v1.7.0 h1:O37Iogk1lEkMRXewVtZ1BBTVn5JEp8GrJvP92bJqC6o= | ||||||
| go.opentelemetry.io/otel/metric v1.25.0/go.mod h1:rkDLUSd2lC5lq2dFNrX9LGAbINP5B7WBkC78RXCpH5s= | go.opentelemetry.io/otel/trace v1.7.0/go.mod h1:fzLSB9nqR2eXzxPXb2JW9IKE+ScyXA48yyE4TNvoHqU= | ||||||
| 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= |  | ||||||
| go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= | 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/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.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.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/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.16.0 h1:uFRZXykJGK9lLY4HtgSw44DnIcAM+kRBP7x5m+NpAOM= | ||||||
| go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= | go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= | ||||||
| go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= | 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-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-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-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-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.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= | ||||||
| golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= | golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= | ||||||
| golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= | golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90 h1:Y/gsMcFOcR+6S6f3YeMKl5g+dZMEWqcz5Czj/GWYbkM= | ||||||
| golang.org/x/exp v0.0.0-20240103183307-be819d1f06fc h1:ao2WRsKSzW6KuUY9IWPwWahcHCgR0s52IfwutMfEbdM= | golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= | ||||||
| golang.org/x/exp v0.0.0-20240103183307-be819d1f06fc/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI= | 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/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.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.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-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-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-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-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-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-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.0.0-20220607020251-c690dde0001d h1:4SFsTMi4UahlKoloni7L4eYzhFRifURQLw+yv0QDCx8= | ||||||
| golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= | golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= | ||||||
| golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= |  | ||||||
| golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | 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-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-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-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-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-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-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-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-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-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-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-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-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-20210309074719-68d13333faf2/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-20220520151302-bc2c85ada10a h1:dGzPydgVsqGcTRVwiLJ1jVbufYwmzD3LfVPLKsKg+0k= | ||||||
| golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||||
| golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= | ||||||
| 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/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= | ||||||
| golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= | 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.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= | ||||||
| golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= | 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-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-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-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-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-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-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.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= | ||||||
| golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= | golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= | ||||||
| golang.org/x/tools v0.16.1 h1:TLyB3WofjdOEepBHAU20JdNC1Zbg87elYofWYAY5oZA= | golang.org/x/tools v0.1.8-0.20211029000441-d6a9af8af023 h1:0c3L82FDQ5rt1bjTBlchS8t6RQ6299/+5bWMnRLh+uI= | ||||||
| golang.org/x/tools v0.16.1/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0= |  | ||||||
| golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | 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-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-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-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-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-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= | ||||||
| google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= | 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.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= | ||||||
| google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= | 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-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.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 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-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-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/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= | ||||||
| gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= | 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 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= | ||||||
| gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= | 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.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.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.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 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= | ||||||
| gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= | 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-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 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= | 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.1.6 h1:H3cROdztr7RCfoaTpGZFQsrqvweFLrqS73j7L7cmR5c= | ||||||
| lukechampine.com/blake3 v1.2.2/go.mod h1:0OFRp7fBtAylGVCO40o87sbupkyIGgbpv1+M1k1LM6k= | lukechampine.com/blake3 v1.1.6/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R78LA= | ||||||
| rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= |  | ||||||
| rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= |  | ||||||
|  | |||||||
| @ -20,7 +20,7 @@ import ( | |||||||
| 	"context" | 	"context" | ||||||
| 
 | 
 | ||||||
| 	"github.com/ethereum/go-ethereum/ethdb" | 	"github.com/ethereum/go-ethereum/ethdb" | ||||||
| 	"github.com/ipfs/boxo/blockservice" | 	"github.com/ipfs/go-blockservice" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| var _ ethdb.Iterator = &Iterator{} | var _ ethdb.Iterator = &Iterator{} | ||||||
|  | |||||||
| @ -20,11 +20,11 @@ import ( | |||||||
| 	"context" | 	"context" | ||||||
| 	"errors" | 	"errors" | ||||||
| 
 | 
 | ||||||
| 	"github.com/ipfs/boxo/blockservice" |  | ||||||
| 	"github.com/ipfs/boxo/blockstore" |  | ||||||
| 	"github.com/ipfs/boxo/exchange" |  | ||||||
| 	blocks "github.com/ipfs/go-block-format" | 	blocks "github.com/ipfs/go-block-format" | ||||||
|  | 	"github.com/ipfs/go-blockservice" | ||||||
| 	"github.com/ipfs/go-cid" | 	"github.com/ipfs/go-cid" | ||||||
|  | 	blockstore "github.com/ipfs/go-ipfs-blockstore" | ||||||
|  | 	exchange "github.com/ipfs/go-ipfs-exchange-interface" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| var ( | var ( | ||||||
|  | |||||||
| @ -20,8 +20,6 @@ import ( | |||||||
| 	"math/big" | 	"math/big" | ||||||
| 	"time" | 	"time" | ||||||
| 
 | 
 | ||||||
| 	"github.com/cerc-io/ipfs-ethdb/v5/postgres/shared" |  | ||||||
| 
 |  | ||||||
| 	"github.com/ethereum/go-ethereum/core/types" | 	"github.com/ethereum/go-ethereum/core/types" | ||||||
| 	"github.com/ethereum/go-ethereum/ethdb" | 	"github.com/ethereum/go-ethereum/ethdb" | ||||||
| 	"github.com/ethereum/go-ethereum/rlp" | 	"github.com/ethereum/go-ethereum/rlp" | ||||||
| @ -29,7 +27,7 @@ import ( | |||||||
| 	. "github.com/onsi/ginkgo" | 	. "github.com/onsi/ginkgo" | ||||||
| 	. "github.com/onsi/gomega" | 	. "github.com/onsi/gomega" | ||||||
| 
 | 
 | ||||||
| 	pgipfsethdb "github.com/cerc-io/ipfs-ethdb/v5/postgres/v1" | 	pgipfsethdb "github.com/cerc-io/ipfs-ethdb/v4/postgres" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| var ( | var ( | ||||||
| @ -41,7 +39,7 @@ var ( | |||||||
| 
 | 
 | ||||||
| var _ = Describe("Batch", func() { | var _ = Describe("Batch", func() { | ||||||
| 	BeforeEach(func() { | 	BeforeEach(func() { | ||||||
| 		db, err = shared.TestDB() | 		db, err = pgipfsethdb.TestDB() | ||||||
| 		Expect(err).ToNot(HaveOccurred()) | 		Expect(err).ToNot(HaveOccurred()) | ||||||
| 
 | 
 | ||||||
| 		cacheConfig := pgipfsethdb.CacheConfig{ | 		cacheConfig := pgipfsethdb.CacheConfig{ | ||||||
| @ -60,7 +58,7 @@ var _ = Describe("Batch", func() { | |||||||
| 	}) | 	}) | ||||||
| 	AfterEach(func() { | 	AfterEach(func() { | ||||||
| 		groupcache.DeregisterGroup("db") | 		groupcache.DeregisterGroup("db") | ||||||
| 		err = shared.ResetTestDB(db) | 		err = pgipfsethdb.ResetTestDB(db) | ||||||
| 		Expect(err).ToNot(HaveOccurred()) | 		Expect(err).ToNot(HaveOccurred()) | ||||||
| 	}) | 	}) | ||||||
| 
 | 
 | ||||||
| @ -35,17 +35,11 @@ import ( | |||||||
| var errNotSupported = errors.New("this operation is not supported") | var errNotSupported = errors.New("this operation is not supported") | ||||||
| 
 | 
 | ||||||
| var ( | var ( | ||||||
| 	hasPgStr    = "SELECT exists(select 1 from ipld.blocks WHERE key = $1 LIMIT 1)" | 	hasPgStr    = "SELECT exists(select 1 from public.blocks WHERE key = $1 LIMIT 1)" | ||||||
| 	getPgStr    = "SELECT data FROM ipld.blocks WHERE key = $1 LIMIT 1" | 	getPgStr    = "SELECT data FROM public.blocks WHERE key = $1 LIMIT 1" | ||||||
| 	putPgStr    = "INSERT INTO ipld.blocks (key, data, block_number) VALUES ($1, $2, $3) ON CONFLICT DO NOTHING" | 	putPgStr    = "INSERT INTO public.blocks (key, data, block_number) VALUES ($1, $2, $3) ON CONFLICT DO NOTHING" | ||||||
| 	deletePgStr = "DELETE FROM ipld.blocks WHERE key = $1" | 	deletePgStr = "DELETE FROM public.blocks WHERE key = $1" | ||||||
| 	dbSizePgStr = "SELECT pg_database_size(current_database())" | 	dbSizePgStr = "SELECT pg_database_size(current_database())" | ||||||
| 
 |  | ||||||
| 	DefaultCacheConfig = CacheConfig{ |  | ||||||
| 		Name:           "db", |  | ||||||
| 		Size:           3000000, // 3MB
 |  | ||||||
| 		ExpiryDuration: time.Hour, |  | ||||||
| 	} |  | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| var _ ethdb.Database = &Database{} | 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'.
 | // AncientRange retrieves all the items in a range, starting from the index 'start'.
 | ||||||
| // It will return
 | // It will return
 | ||||||
| //   - at most 'count' items,
 | //  - at most 'count' items,
 | ||||||
| //   - at least 1 item (even if exceeding the maxBytes), but will otherwise
 | //  - at least 1 item (even if exceeding the maxBytes), but will otherwise
 | ||||||
| //     return as many items as fit into maxBytes.
 | //   return as many items as fit into maxBytes.
 | ||||||
| func (d *Database) AncientRange(kind string, start, count, maxBytes uint64) ([][]byte, error) { | func (d *Database) AncientRange(kind string, start, count, maxBytes uint64) ([][]byte, error) { | ||||||
| 	return nil, errNotSupported | 	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 satisfies the ethdb.AncientWriter interface.
 | ||||||
| // TruncateHead discards all but the first n ancient data from the ancient store.
 | // TruncateHead discards all but the first n ancient data from the ancient store.
 | ||||||
| func (d *Database) TruncateHead(n uint64) (uint64, error) { | func (d *Database) TruncateHead(n uint64) error { | ||||||
| 	return 0, errNotSupported | 	return errNotSupported | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // TruncateTail satisfies the ethdb.AncientWriter interface.
 | // TruncateTail satisfies the ethdb.AncientWriter interface.
 | ||||||
| // TruncateTail discards the first n ancient data from the ancient store.
 | // TruncateTail discards the first n ancient data from the ancient store.
 | ||||||
| func (d *Database) TruncateTail(n uint64) (uint64, error) { | func (d *Database) TruncateTail(n uint64) error { | ||||||
| 	return 0, errNotSupported | 	return errNotSupported | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // Sync satisfies the ethdb.AncientWriter interface
 | // Sync satisfies the ethdb.AncientWriter interface
 | ||||||
| @ -20,8 +20,6 @@ import ( | |||||||
| 	"math/big" | 	"math/big" | ||||||
| 	"time" | 	"time" | ||||||
| 
 | 
 | ||||||
| 	"github.com/cerc-io/ipfs-ethdb/v5/postgres/shared" |  | ||||||
| 
 |  | ||||||
| 	"github.com/ethereum/go-ethereum/core/types" | 	"github.com/ethereum/go-ethereum/core/types" | ||||||
| 	"github.com/ethereum/go-ethereum/ethdb" | 	"github.com/ethereum/go-ethereum/ethdb" | ||||||
| 	"github.com/ethereum/go-ethereum/rlp" | 	"github.com/ethereum/go-ethereum/rlp" | ||||||
| @ -30,7 +28,7 @@ import ( | |||||||
| 	. "github.com/onsi/ginkgo" | 	. "github.com/onsi/ginkgo" | ||||||
| 	. "github.com/onsi/gomega" | 	. "github.com/onsi/gomega" | ||||||
| 
 | 
 | ||||||
| 	pgipfsethdb "github.com/cerc-io/ipfs-ethdb/v5/postgres/v1" | 	pgipfsethdb "github.com/cerc-io/ipfs-ethdb/v4/postgres" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| var ( | var ( | ||||||
| @ -46,7 +44,7 @@ var ( | |||||||
| 
 | 
 | ||||||
| var _ = Describe("Database", func() { | var _ = Describe("Database", func() { | ||||||
| 	BeforeEach(func() { | 	BeforeEach(func() { | ||||||
| 		db, err = shared.TestDB() | 		db, err = pgipfsethdb.TestDB() | ||||||
| 		Expect(err).ToNot(HaveOccurred()) | 		Expect(err).ToNot(HaveOccurred()) | ||||||
| 
 | 
 | ||||||
| 		cacheConfig := pgipfsethdb.CacheConfig{ | 		cacheConfig := pgipfsethdb.CacheConfig{ | ||||||
| @ -63,9 +61,7 @@ var _ = Describe("Database", func() { | |||||||
| 	}) | 	}) | ||||||
| 	AfterEach(func() { | 	AfterEach(func() { | ||||||
| 		groupcache.DeregisterGroup("db") | 		groupcache.DeregisterGroup("db") | ||||||
| 		err = shared.ResetTestDB(db) | 		err = pgipfsethdb.ResetTestDB(db) | ||||||
| 		Expect(err).ToNot(HaveOccurred()) |  | ||||||
| 		err = db.Close() |  | ||||||
| 		Expect(err).ToNot(HaveOccurred()) | 		Expect(err).ToNot(HaveOccurred()) | ||||||
| 	}) | 	}) | ||||||
| 
 | 
 | ||||||
| @ -76,7 +72,7 @@ var _ = Describe("Database", func() { | |||||||
| 			Expect(has).ToNot(BeTrue()) | 			Expect(has).ToNot(BeTrue()) | ||||||
| 		}) | 		}) | ||||||
| 		It("returns true if a key-pair exists in the db", func() { | 		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()) | 			Expect(err).ToNot(HaveOccurred()) | ||||||
| 			has, err := database.Has(testEthKey) | 			has, err := database.Has(testEthKey) | ||||||
| 			Expect(err).ToNot(HaveOccurred()) | 			Expect(err).ToNot(HaveOccurred()) | ||||||
| @ -91,7 +87,7 @@ var _ = Describe("Database", func() { | |||||||
| 			Expect(err.Error()).To(ContainSubstring("sql: no rows in result set")) | 			Expect(err.Error()).To(ContainSubstring("sql: no rows in result set")) | ||||||
| 		}) | 		}) | ||||||
| 		It("returns the value associated with the key, if the pair exists", func() { | 		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()) | 			Expect(err).ToNot(HaveOccurred()) | ||||||
| 			val, err := database.Get(testEthKey) | 			val, err := database.Get(testEthKey) | ||||||
| 			Expect(err).ToNot(HaveOccurred()) | 			Expect(err).ToNot(HaveOccurred()) | ||||||
| @ -1,6 +1,6 @@ | |||||||
| ## ipfs-ethdb | ## 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. | 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`). | 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. | 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/core/state" | ||||||
|     "github.com/ethereum/go-ethereum/trie" |     "github.com/ethereum/go-ethereum/trie" | ||||||
|     "github.com/jmoiron/sqlx" |     "github.com/jmoiron/sqlx" | ||||||
|     "github.com/cerc-io/ipfs-ethdb/v5/postgres/v1" |     "github.com/vulcanize/ipfs-ethdb/v4/postgres" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| func main() { | 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) |     db, _ := sqlx.Connect("postgres", connectStr) | ||||||
| 
 | 
 | ||||||
|     kvs := pgipfsethdb.NewKeyValueStore(db) |     kvs := pgipfsethdb.NewKeyValueStore(db) | ||||||
| @ -31,11 +31,7 @@ func main() { | |||||||
|     trieNodeIterator := t.NodeIterator([]byte{}) |     trieNodeIterator := t.NodeIterator([]byte{}) | ||||||
|     // do stuff with trie node iterator |     // do stuff with trie node iterator | ||||||
| 
 | 
 | ||||||
|     database := pgipfsethdb.NewDatabase(db, pgipfsethdb.CacheConfig{ |     database := pgipfsethdb.NewDatabase(db) | ||||||
| 		Name:           "db", |  | ||||||
| 		Size:           3000000, // 3MB |  | ||||||
| 		ExpiryDuration: time.Hour, |  | ||||||
| 	}) |  | ||||||
|     stateDatabase := state.NewDatabase(database) |     stateDatabase := state.NewDatabase(database) | ||||||
|     stateDB, _ := state.New(common.Hash{}, stateDatabase, nil) |     stateDB, _ := state.New(common.Hash{}, stateDatabase, nil) | ||||||
|     stateDBNodeIterator := state.NewNodeIterator(stateDB) |     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 | package pgipfsethdb | ||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
| 	blockstore "github.com/ipfs/boxo/blockstore" | 	blockstore "github.com/ipfs/go-ipfs-blockstore" | ||||||
| 	dshelp "github.com/ipfs/go-ipfs-ds-help" | 	dshelp "github.com/ipfs/go-ipfs-ds-help" | ||||||
|  | 	"github.com/jmoiron/sqlx" | ||||||
| 	_ "github.com/lib/pq" //postgres driver
 | 	_ "github.com/lib/pq" //postgres driver
 | ||||||
| 	"github.com/multiformats/go-multihash" | 	"github.com/multiformats/go-multihash" | ||||||
| ) | ) | ||||||
| @ -32,3 +33,17 @@ func MultihashKeyFromKeccak256(h []byte) (string, error) { | |||||||
| 	dbKey := dshelp.MultihashToDsKey(mh) | 	dbKey := dshelp.MultihashToDsKey(mh) | ||||||
| 	return blockstore.BlockPrefix.String() + dbKey.String(), nil | 	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 { | 	if err != nil { | ||||||
| 		return cid.Cid{}, err | 		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
 | // 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