-
Notifications
You must be signed in to change notification settings - Fork 30
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
document additional service #2799
Conversation
WalkthroughThe recent updates introduce Changes
Poem
Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media? TipsChatThere are 3 ways to chat with CodeRabbit:
Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (invoked as PR comments)
Additionally, you can add CodeRabbit Configration File (
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
PR Summary
- Added comprehensive Scribe service documentation
- Updated GitHub link in navbar to correct repository
2 file(s) reviewed, 1 comment(s)
Edit PR Review Bot Settings
Deploying sanguine-fe with Cloudflare Pages
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 3
Review details
Configuration used: .coderabbit.yaml
Review profile: CHILL
Files selected for processing (2)
- docs/bridge/docs/Services/Scribe.md (1 hunks)
- docs/bridge/docusaurus.config.ts (1 hunks)
Files skipped from review due to trivial changes (1)
- docs/bridge/docusaurus.config.ts
Additional context used
LanguageTool
docs/bridge/docs/Services/Scribe.md
[misspelling] ~8-~8: This word is normally spelled as one.
Context: ...abel: Scribe --- # Scribe Scribe is a multi-chain indexing service designed to store logs...(EN_COMPOUNDS_MULTI_CHAIN)
[style] ~23-~23: Three successive sentences begin with the same word. Consider rewording the sentence or use a thesaurus to find a synonym.
Context: ...ching and storing blockchain data. 2. Scribe Server: Provides a GraphQL API for qu...(ENGLISH_WORD_REPEAT_BEGINNING_RULE)
[uncategorized] ~92-~92: Loose punctuation mark.
Context: ...uration parameters include: -rpc_url
: The omnirpc url to use for querying cha...(UNLIKELY_OPENING_PUNCTUATION)
[uncategorized] ~93-~93: Loose punctuation mark.
Context: ...here. -chains
: List of chains to index, including chai...(UNLIKELY_OPENING_PUNCTUATION)
[uncategorized] ~95-~95: Loose punctuation mark.
Context: ...he ID of the chain. -get_logs_range
: The number of blocks to request in a si...(UNLIKELY_OPENING_PUNCTUATION)
[uncategorized] ~96-~96: Loose punctuation mark.
Context: ...gsrequest. -
get_logs_batch_amount: The number of
getLogs` requests to inc...(UNLIKELY_OPENING_PUNCTUATION)
[uncategorized] ~97-~97: Loose punctuation mark.
Context: ...a batch request. -store_concurrency
: The number of goroutines to use when st...(UNLIKELY_OPENING_PUNCTUATION)
[uncategorized] ~98-~98: Loose punctuation mark.
Context: ...toring data. -concurrency_threshold
: The maximum number of blocks from the h...(UNLIKELY_OPENING_PUNCTUATION)
[uncategorized] ~99-~99: Loose punctuation mark.
Context: ...s) are allowed. -livefill_threshold
: Number of blocks away from the head to ...(UNLIKELY_OPENING_PUNCTUATION)
[uncategorized] ~100-~100: Loose punctuation mark.
Context: ... start livefilling. -livefill_range
: Range in which thegetLogs
request fo...(UNLIKELY_OPENING_PUNCTUATION)
[uncategorized] ~101-~101: Loose punctuation mark.
Context: ...equesting. -livefill_flush_interval
: The interval in which the unconfirmed l...(UNLIKELY_OPENING_PUNCTUATION)
[uncategorized] ~102-~102: Loose punctuation mark.
Context: ...ble will be flushed. -confirmations
: The number of blocks from the head that...(UNLIKELY_OPENING_PUNCTUATION)
[uncategorized] ~103-~103: Loose punctuation mark.
Context: ...ill indexer will begin). -contracts
: List of contracts to index per chain, i...(UNLIKELY_OPENING_PUNCTUATION)
[uncategorized] ~105-~105: Loose punctuation mark.
Context: ...ess of the contract. -start_block
: Block to start indexing the contract fr...(UNLIKELY_OPENING_PUNCTUATION)
Markdownlint
docs/bridge/docs/Services/Scribe.md
41-41: Expected: 1; Actual: 2
Multiple consecutive blank lines(MD012, no-multiple-blanks)
71-71: Expected: fenced; Actual: indented
Code block style(MD046, code-block-style)
Additional comments not posted (4)
docs/bridge/docs/Services/Scribe.md (4)
1-8
: Header and Introduction: Well-defined and clear.The sidebar configuration and introductory description are appropriately set up, providing clear entry points and context for the Scribe service.
Tools
LanguageTool
[misspelling] ~8-~8: This word is normally spelled as one.
Context: ...abel: Scribe --- # Scribe Scribe is a multi-chain indexing service designed to store logs...(EN_COMPOUNDS_MULTI_CHAIN)
10-16
: Key Features Section: Comprehensive and well-presented.The features of the Scribe service are well-detailed, enhancing understanding of its capabilities.
107-116
: API Section: Concise and informative.The API section provides clear examples and descriptions, facilitating easy integration and usage of the Scribe service.
118-120
: Observability Section: Brief but informative.The observability features are succinctly described, providing essential information on tracing and metrics.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
PR Summary
(updates since last review)
- Added comprehensive documentation for Scribe service
- Detailed features and architecture of Scribe
- Included usage instructions and configuration details
- Provided API usage information
- Updated sidebar link in documentation to GitHub repository
1 file(s) reviewed, no comment(s)
Edit PR Review Bot Settings
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 3
Review details
Configuration used: .coderabbit.yaml
Review profile: CHILL
Files selected for processing (1)
- docs/bridge/docs/Services/Scribe.md (1 hunks)
Additional context used
LanguageTool
docs/bridge/docs/Services/Scribe.md
[misspelling] ~8-~8: This word is normally spelled as one.
Context: ...abel: Scribe --- # Scribe Scribe is a multi-chain indexing service designed to store logs...(EN_COMPOUNDS_MULTI_CHAIN)
[style] ~23-~23: Three successive sentences begin with the same word. Consider rewording the sentence or use a thesaurus to find a synonym.
Context: ...ching and storing blockchain data. 2. Scribe Server: Provides a GraphQL API for qu...(ENGLISH_WORD_REPEAT_BEGINNING_RULE)
[uncategorized] ~46-~46: Possible missing comma found.
Context: ...scribe. ### Running the Components To start the Scribe indexer: ```bash ./scribe -...(AI_HYDRA_LEO_MISSING_COMMA)
[uncategorized] ~92-~92: Loose punctuation mark.
Context: ...uration parameters include: -rpc_url
: The omnirpc url to use for querying cha...(UNLIKELY_OPENING_PUNCTUATION)
[uncategorized] ~93-~93: Loose punctuation mark.
Context: ...here. -chains
: List of chains to index, including chai...(UNLIKELY_OPENING_PUNCTUATION)
[uncategorized] ~95-~95: Loose punctuation mark.
Context: ...he ID of the chain. -get_logs_range
: The number of blocks to request in a si...(UNLIKELY_OPENING_PUNCTUATION)
[uncategorized] ~96-~96: Loose punctuation mark.
Context: ...gsrequest. -
get_logs_batch_amount: The number of
getLogs` requests to inc...(UNLIKELY_OPENING_PUNCTUATION)
[uncategorized] ~97-~97: Loose punctuation mark.
Context: ...a batch request. -store_concurrency
: The number of goroutines to use when st...(UNLIKELY_OPENING_PUNCTUATION)
[uncategorized] ~98-~98: Loose punctuation mark.
Context: ...toring data. -concurrency_threshold
: The maximum number of blocks from the h...(UNLIKELY_OPENING_PUNCTUATION)
[uncategorized] ~99-~99: Loose punctuation mark.
Context: ...s) are allowed. -livefill_threshold
: Number of blocks away from the head to ...(UNLIKELY_OPENING_PUNCTUATION)
[uncategorized] ~100-~100: Loose punctuation mark.
Context: ... start livefilling. -livefill_range
: Range in which thegetLogs
request fo...(UNLIKELY_OPENING_PUNCTUATION)
[uncategorized] ~101-~101: Loose punctuation mark.
Context: ...equesting. -livefill_flush_interval
: The interval in which the unconfirmed l...(UNLIKELY_OPENING_PUNCTUATION)
[uncategorized] ~102-~102: Loose punctuation mark.
Context: ...ble will be flushed. -confirmations
: The number of blocks from the head that...(UNLIKELY_OPENING_PUNCTUATION)
[uncategorized] ~103-~103: Loose punctuation mark.
Context: ...ill indexer will begin). -contracts
: List of contracts to index per chain, i...(UNLIKELY_OPENING_PUNCTUATION)
[uncategorized] ~105-~105: Loose punctuation mark.
Context: ...ess of the contract. -start_block
: Block to start indexing the contract fr...(UNLIKELY_OPENING_PUNCTUATION)
Markdownlint
docs/bridge/docs/Services/Scribe.md
41-41: Expected: 1; Actual: 2
Multiple consecutive blank lines(MD012, no-multiple-blanks)
71-71: Expected: fenced; Actual: indented
Code block style(MD046, code-block-style)
Additional comments not posted (3)
docs/bridge/docs/Services/Scribe.md (3)
10-16
: Well-detailed features section.This section clearly outlines the key features of the Scribe service, enhancing user understanding of its capabilities.
107-116
: Comprehensive API documentation.This section effectively communicates how to utilize the GraphQL API, providing clear examples of queries.
118-120
: Clear and concise observability information.This section succinctly informs about the observability features of Scribe, directing users to further resources.
### Configuration | ||
|
||
Most deployments of scribe will run two components, the indexer and the server. The indexer is responsible for fetching and storing blockchain data, while the server provides a GraphQL API for querying indexed data. The configuration file for Scribe is a YAML file with the following structure: | ||
|
||
indexer.yaml: | ||
<details> | ||
<summary> example config</summary> | ||
```yaml | ||
|
||
``` | ||
</details> | ||
|
||
```yaml | ||
chains: | ||
- chain_id: 1 | ||
get_logs_range: 500 | ||
get_block_batch_amount: 1 | ||
store_concurrency: 100 | ||
concurrency_threshold: 50000 | ||
livefill_threshold: 300 | ||
livefill_range: 200 | ||
livefill_flush_interval: 10000 | ||
confirmations: 200 | ||
contracts: | ||
- address: 0xAf41a65F786339e7911F4acDAD6BD49426F2Dc6b | ||
start_block: 18646320 | ||
``` | ||
|
||
Key configuration parameters include: | ||
|
||
- `rpc_url`: The omnirpc url to use for querying chain data (no trailing slash). For more information on omnirpc, see [here](Services//Omnirpc.md). | ||
- `chains`: List of chains to index, including chain-specific parameters: | ||
- `chain_id`: The ID of the chain. | ||
- `get_logs_range`: The number of blocks to request in a single `getLogs` request. | ||
- `get_logs_batch_amount`: The number of `getLogs` requests to include in a batch request. | ||
- `store_concurrency`: The number of goroutines to use when storing data. | ||
- `concurrency_threshold`: The maximum number of blocks from the head in which concurrent operations (store, getLogs) are allowed. | ||
- `livefill_threshold`: Number of blocks away from the head to start livefilling. | ||
- `livefill_range`: Range in which the `getLogs` request for the livefill contracts will be requesting. | ||
- `livefill_flush_interval`: The interval in which the unconfirmed livefill table will be flushed. | ||
- `confirmations`: The number of blocks from the head that the livefiller will livefill up to (and where the unconfirmed livefill indexer will begin). | ||
- `contracts`: List of contracts to index per chain, including: | ||
- `address`: Address of the contract. | ||
- `start_block`: Block to start indexing the contract from (block with the first transaction). | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Configuration Section: Well-structured but requires punctuation fixes.
The configuration details are comprehensive, but the list formatting could be improved by adjusting punctuation.
- - `rpc_url`: The omnirpc url to use for querying chain data (no trailing slash).
+ - `rpc_url`: The omnirpc URL to use for querying chain data (no trailing slash).
Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
### Configuration | |
Most deployments of scribe will run two components, the indexer and the server. The indexer is responsible for fetching and storing blockchain data, while the server provides a GraphQL API for querying indexed data. The configuration file for Scribe is a YAML file with the following structure: | |
indexer.yaml: | |
<details> | |
<summary> example config</summary> | |
```yaml | |
``` | |
</details> | |
```yaml | |
chains: | |
- chain_id: 1 | |
get_logs_range: 500 | |
get_block_batch_amount: 1 | |
store_concurrency: 100 | |
concurrency_threshold: 50000 | |
livefill_threshold: 300 | |
livefill_range: 200 | |
livefill_flush_interval: 10000 | |
confirmations: 200 | |
contracts: | |
- address: 0xAf41a65F786339e7911F4acDAD6BD49426F2Dc6b | |
start_block: 18646320 | |
``` | |
Key configuration parameters include: | |
- `rpc_url`: The omnirpc url to use for querying chain data (no trailing slash). For more information on omnirpc, see [here](Services//Omnirpc.md). | |
- `chains`: List of chains to index, including chain-specific parameters: | |
- `chain_id`: The ID of the chain. | |
- `get_logs_range`: The number of blocks to request in a single `getLogs` request. | |
- `get_logs_batch_amount`: The number of `getLogs` requests to include in a batch request. | |
- `store_concurrency`: The number of goroutines to use when storing data. | |
- `concurrency_threshold`: The maximum number of blocks from the head in which concurrent operations (store, getLogs) are allowed. | |
- `livefill_threshold`: Number of blocks away from the head to start livefilling. | |
- `livefill_range`: Range in which the `getLogs` request for the livefill contracts will be requesting. | |
- `livefill_flush_interval`: The interval in which the unconfirmed livefill table will be flushed. | |
- `confirmations`: The number of blocks from the head that the livefiller will livefill up to (and where the unconfirmed livefill indexer will begin). | |
- `contracts`: List of contracts to index per chain, including: | |
- `address`: Address of the contract. | |
- `start_block`: Block to start indexing the contract from (block with the first transaction). | |
- `rpc_url`: The omnirpc URL to use for querying chain data (no trailing slash). For more information on omnirpc, see [here](Services//Omnirpc.md). |
Tools
LanguageTool
[uncategorized] ~92-~92: Loose punctuation mark.
Context: ...uration parameters include: -rpc_url
: The omnirpc url to use for querying cha...(UNLIKELY_OPENING_PUNCTUATION)
[uncategorized] ~93-~93: Loose punctuation mark.
Context: ...here. -chains
: List of chains to index, including chai...(UNLIKELY_OPENING_PUNCTUATION)
[uncategorized] ~95-~95: Loose punctuation mark.
Context: ...he ID of the chain. -get_logs_range
: The number of blocks to request in a si...(UNLIKELY_OPENING_PUNCTUATION)
[uncategorized] ~96-~96: Loose punctuation mark.
Context: ...gsrequest. -
get_logs_batch_amount: The number of
getLogs` requests to inc...(UNLIKELY_OPENING_PUNCTUATION)
[uncategorized] ~97-~97: Loose punctuation mark.
Context: ...a batch request. -store_concurrency
: The number of goroutines to use when st...(UNLIKELY_OPENING_PUNCTUATION)
[uncategorized] ~98-~98: Loose punctuation mark.
Context: ...toring data. -concurrency_threshold
: The maximum number of blocks from the h...(UNLIKELY_OPENING_PUNCTUATION)
[uncategorized] ~99-~99: Loose punctuation mark.
Context: ...s) are allowed. -livefill_threshold
: Number of blocks away from the head to ...(UNLIKELY_OPENING_PUNCTUATION)
[uncategorized] ~100-~100: Loose punctuation mark.
Context: ... start livefilling. -livefill_range
: Range in which thegetLogs
request fo...(UNLIKELY_OPENING_PUNCTUATION)
[uncategorized] ~101-~101: Loose punctuation mark.
Context: ...equesting. -livefill_flush_interval
: The interval in which the unconfirmed l...(UNLIKELY_OPENING_PUNCTUATION)
[uncategorized] ~102-~102: Loose punctuation mark.
Context: ...ble will be flushed. -confirmations
: The number of blocks from the head that...(UNLIKELY_OPENING_PUNCTUATION)
[uncategorized] ~103-~103: Loose punctuation mark.
Context: ...ill indexer will begin). -contracts
: List of contracts to index per chain, i...(UNLIKELY_OPENING_PUNCTUATION)
[uncategorized] ~105-~105: Loose punctuation mark.
Context: ...ess of the contract. -start_block
: Block to start indexing the contract fr...(UNLIKELY_OPENING_PUNCTUATION)
Markdownlint
71-71: Expected: fenced; Actual: indented
Code block style(MD046, code-block-style)
## Running Scribe | ||
|
||
### Building From Source | ||
|
||
To build Scribe from source, you will need to have Go installed. You can install Go by following the instructions [here](https://golang.org/doc/install). Once you have Go installed, you can build Scribe by running the following commands: | ||
|
||
1. `git clone https://github.com/synapsecns/sanguine --recursive` | ||
2. `cd sanguine/services/scribe` | ||
3. `go build` | ||
|
||
|
||
There is also a [docker image](https://github.com/synapsecns/sanguine/pkgs/container/sanguine%2Fscribe) available for scribe. | ||
|
||
### Running the Components | ||
|
||
To start the Scribe indexer: | ||
|
||
```bash | ||
./scribe --config </Full/Path/To/Config.yaml> --db <sqlite or mysql> --path <path/to/database or database url> | ||
``` | ||
|
||
To start the Scribe server: | ||
|
||
```bash | ||
./server --port <port> --db <sqlite or mysql> --path <path/to/database or database url> | ||
``` | ||
|
||
### Deployment | ||
|
||
Scribe can be deployed using Helm charts. You can see the scribe chart on [artifacthub](https://artifacthub.io/packages/helm/synapse/scribe) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Clear instructions but consider cleaning up formatting.
Instructions are well-detailed, but there are unnecessary blank lines that could be removed for better readability.
- 41~
-
Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
## Running Scribe | |
### Building From Source | |
To build Scribe from source, you will need to have Go installed. You can install Go by following the instructions [here](https://golang.org/doc/install). Once you have Go installed, you can build Scribe by running the following commands: | |
1. `git clone https://github.com/synapsecns/sanguine --recursive` | |
2. `cd sanguine/services/scribe` | |
3. `go build` | |
There is also a [docker image](https://github.com/synapsecns/sanguine/pkgs/container/sanguine%2Fscribe) available for scribe. | |
### Running the Components | |
To start the Scribe indexer: | |
```bash | |
./scribe --config </Full/Path/To/Config.yaml> --db <sqlite or mysql> --path <path/to/database or database url> | |
``` | |
To start the Scribe server: | |
```bash | |
./server --port <port> --db <sqlite or mysql> --path <path/to/database or database url> | |
``` | |
### Deployment | |
Scribe can be deployed using Helm charts. You can see the scribe chart on [artifacthub](https://artifacthub.io/packages/helm/synapse/scribe) | |
## Running Scribe | |
### Building From Source | |
To build Scribe from source, you will need to have Go installed. You can install Go by following the instructions [here](https://golang.org/doc/install). Once you have Go installed, you can build Scribe by running the following commands: | |
1. `git clone https://github.com/synapsecns/sanguine --recursive` | |
2. `cd sanguine/services/scribe` | |
3. `go build` | |
There is also a [docker image](https://github.com/synapsecns/sanguine/pkgs/container/sanguine%2Fscribe) available for scribe. | |
### Running the Components | |
To start the Scribe indexer: | |
```bash | |
./scribe --config </Full/Path/To/Config.yaml> --db <sqlite or mysql> --path <path/to/database or database url> | |
``` | |
To start the Scribe server: | |
```bash | |
./server --port <port> --db <sqlite or mysql> --path <path/to/database or database url> | |
``` | |
### Deployment | |
Scribe can be deployed using Helm charts. You can see the scribe chart on [artifacthub](https://artifacthub.io/packages/helm/synapse/scribe) |
Tools
LanguageTool
[uncategorized] ~46-~46: Possible missing comma found.
Context: ...scribe. ### Running the Components To start the Scribe indexer: ```bash ./scribe -...(AI_HYDRA_LEO_MISSING_COMMA)
Markdownlint
41-41: Expected: 1; Actual: 2
Multiple consecutive blank lines(MD012, no-multiple-blanks)
## Architecture | ||
|
||
Scribe consists of two main components: | ||
|
||
1. **Scribe Indexer**: Responsible for fetching and storing blockchain data. | ||
2. **Scribe Server**: Provides a GraphQL API for querying indexed data. | ||
|
||
The indexer architecture consists of three main components: | ||
|
||
1. **Fetcher**: Retrieves logs for specified contracts and block ranges. | ||
2. **Indexer**: Stores logs, receipts, and transactions for events for a given contract. | ||
3. **ChainIndexer**: Manages multiple indexers per chain for different indexing stages (backfill, livefill, unconfirmed livefill). |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Consider rephrasing for better readability.
The architecture section is informative, but the repetitive sentence structure could be improved.
- 1. **Scribe Indexer**: Responsible for fetching and storing blockchain data.
- 2. **Scribe Server**: Provides a GraphQL API for querying indexed data.
+ 1. **Scribe Indexer**: Fetches and stores blockchain data.
+ 2. **Scribe Server**: Offers a GraphQL API for data querying.
Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
## Architecture | |
Scribe consists of two main components: | |
1. **Scribe Indexer**: Responsible for fetching and storing blockchain data. | |
2. **Scribe Server**: Provides a GraphQL API for querying indexed data. | |
The indexer architecture consists of three main components: | |
1. **Fetcher**: Retrieves logs for specified contracts and block ranges. | |
2. **Indexer**: Stores logs, receipts, and transactions for events for a given contract. | |
3. **ChainIndexer**: Manages multiple indexers per chain for different indexing stages (backfill, livefill, unconfirmed livefill). | |
## Architecture | |
Scribe consists of two main components: | |
1. **Scribe Indexer**: Fetches and stores blockchain data. | |
2. **Scribe Server**: Offers a GraphQL API for data querying. | |
The indexer architecture consists of three main components: | |
1. **Fetcher**: Retrieves logs for specified contracts and block ranges. | |
2. **Indexer**: Stores logs, receipts, and transactions for events for a given contract. | |
3. **ChainIndexer**: Manages multiple indexers per chain for different indexing stages (backfill, livefill, unconfirmed livefill). |
Tools
LanguageTool
[style] ~23-~23: Three successive sentences begin with the same word. Consider rewording the sentence or use a thesaurus to find a synonym.
Context: ...ching and storing blockchain data. 2. Scribe Server: Provides a GraphQL API for qu...(ENGLISH_WORD_REPEAT_BEGINNING_RULE)
Description
add scribe docs
Summary by CodeRabbit
f7eca63: docs preview link