Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/streamingfast/substreams-sink-kv
Substreams KV sink
https://github.com/streamingfast/substreams-sink-kv
Last synced: about 15 hours ago
JSON representation
Substreams KV sink
- Host: GitHub
- URL: https://github.com/streamingfast/substreams-sink-kv
- Owner: streamingfast
- License: apache-2.0
- Created: 2023-01-05T21:19:37.000Z (almost 2 years ago)
- Default Branch: develop
- Last Pushed: 2024-07-16T18:34:27.000Z (4 months ago)
- Last Synced: 2024-08-03T23:18:01.126Z (3 months ago)
- Language: Go
- Size: 1.56 MB
- Stars: 2
- Watchers: 3
- Forks: 5
- Open Issues: 6
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE
Awesome Lists containing this project
- awesome-substreams - KVOperations - [`sf.substreams.sink.kv.v1`](https://github.com/streamingfast/substreams-sink-kv/blob/develop/proto/substreams/sink/kv/v1/kv.proto) (Protobuf / Sinks)
README
# Substreams key-value service Sink
A [Substreams _sink_](https://substreams.streamingfast.io/developers-guide/sink-targets) to pipe data from a [Substreams](https://substreams.streamingfast.io) endpoint into a key-value store and serve queries through either:
- [Connect-Web protocol](https://connect.build/docs/introduction) (gRPC-compatible) via the `GenericService`
- a User defined WASM query service## Requirements
##### WasmEdge
Learn about WasmEdge from its [Quick Start Guide](https://wasmedge.org/book/en/quick_start/install.html), or simply run the following to install.
```bash
curl -sSf https://raw.githubusercontent.com/WasmEdge/WasmEdge/master/utils/install.sh | bash -s -- --version 0.11.2
```## Install
Get from the [Releases tab](https://github.com/streamingfast/substreams-sink-kv/releases), or from source:
```bash
go install -v github.com/streamingfast/substreams-sink-kv/cmd/substreams-sink-kv@latest
```## Running
The `substreams-sink-kv` binary offers two mode of operations:
- `inject`: Runs a Substreams and pipes the data into a key-value store
- `serve`: Serves data through a query service: `GenericService` or `WASMQueryService`You can run `substreams-sink-kv` solely in `inject` or `serve` mode or both.
> **Note** To connect to Substreams you will need an authentication token, follow this [guide](https://substreams.streamingfast.io/reference-and-specs/authentication) to obtain one.
```bash
# Inject Mode
substreams-sink-kv inject mainnet.eth.streamingfast.io:443# Serve Mode
substreams-sink-kv serve --listen-addr=":9000"# Inject and Serve Mode
substreams-sink-kv inject mainnet.eth.streamingfast.io:443 --listen-addr=":9000"
```## Query Service
The Query Service is an API that allows you to consume data from your sinked key-value. There are 2 types of Query Services:
- Generic Service
- Wasm Query Servicethe `sink` block of your Substreams manifest defines and configures which one to use
```yaml
specVersion: v0.1.0
package:
name: "your_substreams_to_sink"
version: v0.0.1...
sink:
module: kv_out
type: sf.substreams.sink.kv.v1.WASMQueryService
config:
wasmQueryModule: "@@./blockmeta_wasm_query/blockmeta_wasm_query.wasm"
grpcService: "eth.service.v1.Blockmeta"
```breaking down the `sink` block we get the following:
- **module**: The name of the module that will be used to sink the key-value store. The module should be of kind `map` with an output type of [`sf.substreams.sink.kv.v1.KVOperations`](https://github.com/streamingfast/substreams-sink-kv/blob/main/proto/substreams/sink/kv/v1/kv.proto)
- **type**: Support to types currently:
- [`sf.substreams.sink.kv.v1.WASMQueryService`](./proto/substreams/sink/kv/v1/services.proto)
- [`sf.substreams.sink.kv.v1.GenericService`](./proto/substreams/sink/kv/v1/services.proto)
- **config**: a key-value structure that matches the attributes of the Proto object for the given `type` selected above> **_NOTE:_** the `@@` notation will read the path and inject the content of the file in bytes, while the `@` notation will dump the file content in ascii
### Generic Service
The Generic Query service is a [Connect-Web protocol](https://connect.build/docs/introduction) (gRPC-compatible). It exposes a browser and gRPC-compatible APIs. The API is defined in `protobuf` [here](./proto/substreams/sink/kv/v1/read.proto).
You can find a detailed example with documentation [here](./examples/generic-service)
### WASM Query Service
The wasm query service is a user-defined gRPC API that is backed by WASM code, which has access to underlying key-value store.
You can find a detailed example with documentation [here](./examples/wasm-query-service)
## Contributing
Refer to the [general StreamingFast contribution guide](https://github.com/streamingfast/streamingfast/blob/master/CONTRIBUTING.md).
### WasmEdge
Bumping `github.com/second-state/WasmEdge-go` to a newer version requires matching WasmEdge version. For example `github.com/second-state/[email protected]` requires [WasmEdge 0.11.2](https://github.com/WasmEdge/WasmEdge/releases/tag/0.11.2).
If a new version of [WasmEdge](https://github.com/WasmEdge/WasmEdge), it requires also modifying the [./devel/docker/Dockerfile.goreleaser](./devel/docker/Dockerfile.goreleaser) file so it pulls dependencies required for building using the correct version. Testing the build can be done using by first building the Docker image via `./devel/docker/push.sh` and then running:
```bash
docker run --rm -it -v `pwd`:/work -w /work goreleaser-wasmedge:v1.20.3 release --snapshot --clean --skip-validate
```Manual Golang compilation within the docker image can be done with:
```bash
docker run --rm -it -v `pwd`:/work -w /work --entrypoint bash goreleaser-wasmedge:v1.20.3
cd /work
# Adjust CC, CXX, C_INCLUDE_PATH, LIBRARY_PATH and GOOS/GOARCH according to .goreleaser.yaml file
CGO_ENABLED=1 CC=oa64-clang CXX=oa64-clang++ GOOS=darwin GOARCH=arm64 C_INCLUDE_PATH=/usr/local/osxcross/include/arm64 LIBRARY_PATH="/usr/local/osxcross/lib/arm64" go build -trimpath -mod=readonly -ldflags="-s -w" -o /work/substreams-sink-kv-cross-compiled ./cmd/substreams-sink-kv/
```## `kvdb` tool
You can inspect badger files written by this tool with:
```
go install github.com/streamingfast/kvdb/cmd/kvdb@develop
```## License
[Apache 2.0](https://github.com/streamingfast/substreams/blob/develop/LICENSE/README.md).