Skip to content

Commit

Permalink
feat: add index provider
Browse files Browse the repository at this point in the history
  • Loading branch information
simlecode committed Jul 17, 2024
1 parent 59102cb commit 0c02960
Show file tree
Hide file tree
Showing 10 changed files with 1,209 additions and 124 deletions.
3 changes: 3 additions & 0 deletions cmd/droplet/run.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import (
"github.com/ipfs-force-community/droplet/v2/config"
"github.com/ipfs-force-community/droplet/v2/dagstore"
"github.com/ipfs-force-community/droplet/v2/fundmgr"
"github.com/ipfs-force-community/droplet/v2/indexprovider"
"github.com/ipfs-force-community/droplet/v2/metrics"
"github.com/ipfs-force-community/droplet/v2/minermgr"
"github.com/ipfs-force-community/droplet/v2/models"
Expand Down Expand Up @@ -253,6 +254,8 @@ func runDaemon(cctx *cli.Context) error {
storageprovider.StorageProviderOpts(cfg),
retrievalprovider.RetrievalProviderOpts(cfg),

indexprovider.IndexProviderOpts,

func(s *builder.Settings) error {
s.Invokes[ExtractApiKey] = builder.InvokeOption{
Priority: 10,
Expand Down
91 changes: 91 additions & 0 deletions config/common.go
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,75 @@ type Signer struct {
Token string
}

type IndexProviderConfig struct {
// Enable set whether to enable indexing announcement to the network and expose endpoints that
// allow indexer nodes to process announcements. Enabled by default.
Enable bool

// EntriesCacheCapacity sets the maximum capacity to use for caching the indexing advertisement
// entries. Defaults to 1024 if not specified. The cache is evicted using LRU policy. The
// maximum storage used by the cache is a factor of EntriesCacheCapacity, EntriesChunkSize and
// the length of multihashes being advertised. For example, advertising 128-bit long multihashes
// with the default EntriesCacheCapacity, and EntriesChunkSize means the cache size can grow to
// 256MiB when full.
EntriesCacheCapacity int

// EntriesChunkSize sets the maximum number of multihashes to include in a single entries chunk.
// Defaults to 16384 if not specified. Note that chunks are chained together for indexing
// advertisements that include more multihashes than the configured EntriesChunkSize.
EntriesChunkSize int

// TopicName sets the topic name on which the changes to the advertised content are announced.
// If not explicitly specified, the topic name is automatically inferred from the network name
// in following format: '/indexer/ingest/<network-name>'
// Defaults to empty, which implies the topic name is inferred from network name.
TopicName string

// PurgeCacheOnStart sets whether to clear any cached entries chunks when the provider engine
// starts. By default, the cache is rehydrated from previously cached entries stored in
// datastore if any is present.
PurgeCacheOnStart bool

// The network indexer host that the web UI should link to for published announcements
WebHost string

Announce IndexProviderAnnounceConfig

HttpPublisher IndexProviderHttpPublisherConfig

// Set this to true to use the legacy data-transfer/graphsync publisher.
// This should only be used as a temporary fall-back if publishing ipnisync
// over libp2p or HTTP is not working, and publishing over
// data-transfer/graphsync was previously working.
DataTransferPublisher bool
}

type IndexProviderAnnounceConfig struct {
// Make a direct announcement to a list of indexing nodes over http.
// Note that announcements are already made over pubsub regardless
// of this setting.
AnnounceOverHttp bool

// The list of URLs of indexing nodes to announce to.
DirectAnnounceURLs []string
}

type IndexProviderHttpPublisherConfig struct {
// If enabled, requests are served over HTTP instead of libp2p.
Enabled bool
// Set the public hostname / IP for the index provider listener.
// eg "82.129.73.111"
// This is usually the same as the for the boost node.
PublicHostname string
// Set the port on which to listen for index provider requests over HTTP.
// Note that this port must be open on the firewall.
Port int
// Set this to true to publish HTTP over libp2p in addition to plain HTTP,
// Otherwise, the publisher will publish content advertisements using only
// plain HTTP if Enabled is true.
WithLibp2p bool
}

// ProviderConfig is common config for provider
type ProviderConfig struct {
// When enabled, the miner can accept online deals
Expand Down Expand Up @@ -123,6 +192,8 @@ type ProviderConfig struct {
// The public multi-address for retrieving deals with droplet.
// Note: Must be in multiaddr format, eg /ip4/127.0.0.1/tcp/41235/http
HTTPRetrievalMultiaddr string

IndexProvider IndexProviderConfig
}

func defaultProviderConfig() *ProviderConfig {
Expand Down Expand Up @@ -159,5 +230,25 @@ func defaultProviderConfig() *ProviderConfig {
MaxPublishDealsFee: types.FIL(types.NewInt(0)),
MaxMarketBalanceAddFee: types.FIL(types.NewInt(0)),
HTTPRetrievalMultiaddr: "",

IndexProvider: IndexProviderConfig{
Enable: false,
EntriesCacheCapacity: 1024,
EntriesChunkSize: 16384,
TopicName: "",
PurgeCacheOnStart: false,
WebHost: "cid.contact",
Announce: IndexProviderAnnounceConfig{
AnnounceOverHttp: true,
DirectAnnounceURLs: []string{"https://cid.contact/ingest/announce"},
},
HttpPublisher: IndexProviderHttpPublisherConfig{
Enabled: true,
PublicHostname: "",
Port: 0,
WithLibp2p: true,
},
DataTransferPublisher: true,
},
}
}
93 changes: 53 additions & 40 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ require (
github.com/chzyer/readline v1.5.1
github.com/docker/go-units v0.5.0
github.com/etherlabsio/healthcheck/v2 v2.0.0
github.com/fatih/color v1.15.0
github.com/fatih/color v1.16.0
github.com/filecoin-project/dagstore v0.6.0
github.com/filecoin-project/go-address v1.1.0
github.com/filecoin-project/go-bitfield v0.2.4
Expand Down Expand Up @@ -42,15 +42,15 @@ require (
github.com/ipfs-force-community/sophon-gateway v1.16.0-rc1
github.com/ipfs-force-community/sophon-messager v1.16.0-rc1
github.com/ipfs-force-community/venus-common-utils v0.0.0-20220217030526-e5e4c6bc14f7
github.com/ipfs/boxo v0.20.0
github.com/ipfs/boxo v0.21.0
github.com/ipfs/go-blockservice v0.5.2
github.com/ipfs/go-cid v0.4.1
github.com/ipfs/go-cidutil v0.1.0
github.com/ipfs/go-datastore v0.6.0
github.com/ipfs/go-ds-badger2 v0.1.3
github.com/ipfs/go-ds-leveldb v0.5.0
github.com/ipfs/go-ds-measure v0.2.0
github.com/ipfs/go-graphsync v0.16.0
github.com/ipfs/go-graphsync v0.17.0
github.com/ipfs/go-ipfs-blocksutil v0.0.1
github.com/ipfs/go-ipfs-chunker v0.0.5
github.com/ipfs/go-ipfs-exchange-offline v0.3.0
Expand All @@ -67,23 +67,23 @@ require (
github.com/ipld/go-codec-dagpb v1.6.0
github.com/ipld/go-ipld-prime v0.21.0
github.com/ipld/go-ipld-selector-text-lite v0.0.1
github.com/libp2p/go-libp2p v0.35.0
github.com/libp2p/go-libp2p v0.35.2
github.com/libp2p/go-maddr-filter v0.1.0
github.com/mitchellh/go-homedir v1.1.0
github.com/multiformats/go-multiaddr v0.12.4
github.com/multiformats/go-multiaddr v0.13.0
github.com/multiformats/go-multibase v0.2.0
github.com/multiformats/go-multihash v0.2.3
github.com/multiformats/go-varint v0.0.7
github.com/pkg/errors v0.9.1
github.com/stretchr/testify v1.9.0
github.com/strikesecurity/strikememongo v0.2.4
github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7
github.com/urfave/cli/v2 v2.25.7
github.com/whyrusleeping/cbor-gen v0.1.1
github.com/urfave/cli/v2 v2.27.2
github.com/whyrusleeping/cbor-gen v0.1.2
github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7
go.mongodb.org/mongo-driver v1.8.4
go.opencensus.io v0.24.0
go.uber.org/fx v1.21.1
go.uber.org/fx v1.22.1
go.uber.org/multierr v1.11.0
golang.org/x/sync v0.7.0
golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028
Expand All @@ -93,10 +93,21 @@ require (
)

require (
github.com/filecoin-project/go-f3 v0.0.3-0.20240702063402-d48771055cf4 // indirect
github.com/gammazero/channelqueue v0.2.1 // indirect
github.com/gammazero/deque v0.2.1 // indirect
github.com/go-task/slim-sprig/v3 v3.0.0 // indirect
github.com/hashicorp/go-cleanhttp v0.5.2 // indirect
github.com/hashicorp/go-retryablehttp v0.7.7 // indirect
github.com/libp2p/go-cidranger v1.1.0 // indirect
github.com/libp2p/go-libp2p-kad-dht v0.25.2 // indirect
github.com/libp2p/go-libp2p-kbucket v0.6.3 // indirect
github.com/libp2p/go-libp2p-record v0.2.0 // indirect
github.com/libp2p/go-libp2p-routing-helpers v0.7.3 // indirect
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
github.com/pion/datachannel v1.5.6 // indirect
github.com/pion/dtls/v2 v2.2.11 // indirect
github.com/pion/ice/v2 v2.3.24 // indirect
github.com/pion/ice/v2 v2.3.25 // indirect
github.com/pion/interceptor v0.1.29 // indirect
github.com/pion/logging v0.2.2 // indirect
github.com/pion/mdns v0.0.12 // indirect
Expand All @@ -109,8 +120,10 @@ require (
github.com/pion/stun v0.6.1 // indirect
github.com/pion/transport/v2 v2.2.5 // indirect
github.com/pion/turn/v2 v2.1.6 // indirect
github.com/pion/webrtc/v3 v3.2.40 // indirect
github.com/pion/webrtc/v3 v3.2.42 // indirect
github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1 // indirect
go.uber.org/mock v0.4.0 // indirect
gonum.org/v1/gonum v0.15.0 // indirect
)

require (
Expand Down Expand Up @@ -142,7 +155,7 @@ require (
github.com/dgraph-io/ristretto v0.1.1 // indirect
github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 // indirect
github.com/dustin/go-humanize v1.0.1 // indirect
github.com/elastic/gosigar v0.14.2 // indirect
github.com/elastic/gosigar v0.14.3 // indirect
github.com/filecoin-project/filecoin-ffi v0.30.4-0.20220519234331-bfd1f5f9fe38 // indirect
github.com/filecoin-project/go-amt-ipld/v2 v2.1.1-0.20201006184820-924ee87a1349 // indirect
github.com/filecoin-project/go-amt-ipld/v3 v3.1.0 // indirect
Expand All @@ -159,13 +172,13 @@ require (
github.com/flynn/noise v1.1.0 // indirect
github.com/francoispqt/gojay v1.2.13 // indirect
github.com/fsnotify/fsnotify v1.6.0 // indirect
github.com/gabriel-vasile/mimetype v1.4.3 // indirect
github.com/gabriel-vasile/mimetype v1.4.4 // indirect
github.com/gbrlsnchs/jwt/v3 v3.0.1 // indirect
github.com/gin-contrib/sse v0.1.0 // indirect
github.com/gin-gonic/gin v1.9.1 // indirect
github.com/go-kit/log v0.2.1 // indirect
github.com/go-logfmt/logfmt v0.6.0 // indirect
github.com/go-logr/logr v1.4.1 // indirect
github.com/go-logr/logr v1.4.2 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
github.com/go-playground/locales v0.14.1 // indirect
github.com/go-playground/universal-translator v0.18.1 // indirect
Expand All @@ -184,8 +197,8 @@ require (
github.com/golang/snappy v0.0.4 // indirect
github.com/google/flatbuffers v23.5.26+incompatible // indirect
github.com/google/gopacket v1.1.19 // indirect
github.com/google/pprof v0.0.0-20240509144519-723abb6459b7 // indirect
github.com/gorilla/websocket v1.5.1 // indirect
github.com/google/pprof v0.0.0-20240618054019-d3b898a103f8 // indirect
github.com/gorilla/websocket v1.5.3 // indirect
github.com/hannahhoward/cbor-gen-for v0.0.0-20230214144701-5d17c9d5243c // indirect
github.com/hashicorp/errwrap v1.1.0 // indirect
github.com/hashicorp/golang-lru v1.0.2 // indirect
Expand All @@ -211,10 +224,10 @@ require (
github.com/ipfs/go-peertaskqueue v0.8.1 // indirect
github.com/ipfs/go-unixfsnode v1.9.0 // indirect
github.com/ipfs/go-verifcid v0.0.3 // indirect
github.com/ipld/go-ipld-adl-hamt v0.0.0-20220616142416-9004dbd839e0 // indirect
github.com/ipld/go-ipld-adl-hamt v0.0.0-20240322071803-376decb85801 // indirect
github.com/ipld/go-trustless-utils v0.4.1 // indirect
github.com/ipni/go-libipni v0.5.2 // indirect
github.com/ipni/index-provider v0.14.2 // indirect
github.com/ipni/go-libipni v0.6.9
github.com/ipni/index-provider v0.15.4
github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52 // indirect
github.com/jackpal/go-nat-pmp v1.0.2 // indirect
github.com/jbenet/go-random v0.0.0-20190219211222-123a90aedc0c // indirect
Expand All @@ -225,14 +238,14 @@ require (
github.com/jmespath/go-jmespath v0.4.0 // indirect
github.com/jpillora/backoff v1.0.0 // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/klauspost/compress v1.17.8 // indirect
github.com/klauspost/cpuid/v2 v2.2.7 // indirect
github.com/klauspost/compress v1.17.9 // indirect
github.com/klauspost/cpuid/v2 v2.2.8 // indirect
github.com/koron/go-ssdp v0.0.4 // indirect
github.com/leodido/go-urn v1.2.4 // indirect
github.com/libp2p/go-buffer-pool v0.1.0 // indirect
github.com/libp2p/go-flow-metrics v0.1.0 // indirect
github.com/libp2p/go-libp2p-asn-util v0.4.1 // indirect
github.com/libp2p/go-libp2p-pubsub v0.11.0 // indirect
github.com/libp2p/go-libp2p-pubsub v0.11.0
github.com/libp2p/go-msgio v0.3.0 // indirect
github.com/libp2p/go-nat v0.2.0 // indirect
github.com/libp2p/go-netroute v0.2.1 // indirect
Expand All @@ -244,7 +257,7 @@ require (
github.com/mattn/go-colorable v0.1.13 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/mattn/go-sqlite3 v1.14.22 // indirect
github.com/miekg/dns v1.1.59 // indirect
github.com/miekg/dns v1.1.61 // indirect
github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b // indirect
github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc // indirect
github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 // indirect
Expand All @@ -259,7 +272,7 @@ require (
github.com/multiformats/go-multiaddr-fmt v0.1.0 // indirect
github.com/multiformats/go-multicodec v0.9.0 // indirect
github.com/multiformats/go-multistream v0.5.0 // indirect
github.com/onsi/ginkgo/v2 v2.17.3 // indirect
github.com/onsi/ginkgo/v2 v2.19.0 // indirect
github.com/opencontainers/runtime-spec v1.2.0 // indirect
github.com/opentracing/opentracing-go v1.2.0 // indirect
github.com/patrickmn/go-cache v2.1.0+incompatible // indirect
Expand All @@ -272,11 +285,11 @@ require (
github.com/polydawn/refmt v0.89.0 // indirect
github.com/prometheus/client_golang v1.19.1 // indirect
github.com/prometheus/client_model v0.6.1 // indirect
github.com/prometheus/common v0.53.0 // indirect
github.com/prometheus/procfs v0.15.0 // indirect
github.com/prometheus/common v0.55.0 // indirect
github.com/prometheus/procfs v0.15.1 // indirect
github.com/prometheus/statsd_exporter v0.23.0 // indirect
github.com/quic-go/qpack v0.4.0 // indirect
github.com/quic-go/quic-go v0.44.0 // indirect
github.com/quic-go/quic-go v0.45.0 // indirect
github.com/quic-go/webtransport-go v0.8.0 // indirect
github.com/raulk/clock v1.1.0 // indirect
github.com/raulk/go-watchdog v1.3.0 // indirect
Expand All @@ -300,29 +313,29 @@ require (
github.com/xdg-go/stringprep v1.0.3 // indirect
github.com/xrash/smetrics v0.0.0-20240312152122-5f08fbb34913 // indirect
github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect
go.opentelemetry.io/otel v1.26.0 // indirect
go.opentelemetry.io/otel v1.28.0 // indirect
go.opentelemetry.io/otel/bridge/opencensus v0.39.0 // indirect
go.opentelemetry.io/otel/exporters/jaeger v1.14.0 // indirect
go.opentelemetry.io/otel/metric v1.26.0 // indirect
go.opentelemetry.io/otel/sdk v1.26.0 // indirect
go.opentelemetry.io/otel/sdk/metric v0.39.0 // indirect
go.opentelemetry.io/otel/trace v1.26.0 // indirect
go.opentelemetry.io/otel/metric v1.28.0 // indirect
go.opentelemetry.io/otel/sdk v1.28.0 // indirect
go.opentelemetry.io/otel/sdk/metric v1.28.0 // indirect
go.opentelemetry.io/otel/trace v1.28.0 // indirect
go.uber.org/atomic v1.11.0 // indirect
go.uber.org/dig v1.17.1 // indirect
go.uber.org/zap v1.27.0
go4.org v0.0.0-20230225012048-214862532bf5 // indirect
golang.org/x/arch v0.3.0 // indirect
golang.org/x/crypto v0.23.0 // indirect
golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842
golang.org/x/mod v0.17.0 // indirect
golang.org/x/net v0.25.0 // indirect
golang.org/x/sys v0.20.0 // indirect
golang.org/x/term v0.20.0 // indirect
golang.org/x/text v0.15.0 // indirect
golang.org/x/crypto v0.24.0 // indirect
golang.org/x/exp v0.0.0-20240613232115-7f521ea00fb8
golang.org/x/mod v0.18.0 // indirect
golang.org/x/net v0.26.0 // indirect
golang.org/x/sys v0.21.0 // indirect
golang.org/x/term v0.21.0 // indirect
golang.org/x/text v0.16.0 // indirect
golang.org/x/time v0.5.0 // indirect
golang.org/x/tools v0.21.0 // indirect
golang.org/x/tools v0.22.0 // indirect
google.golang.org/api v0.155.0 // indirect
google.golang.org/protobuf v1.34.1 // indirect
google.golang.org/protobuf v1.34.2 // indirect
gopkg.in/ini.v1 v1.66.6 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
Expand Down
Loading

0 comments on commit 0c02960

Please sign in to comment.