Skip to content

Commit ec1f28e

Browse files
Ludo Galabrusmcclellan
Ludo Galabru
andauthored
fix: release 1.0.2 (#179)
* chore: stop auto-adding issues to DevTools Project (#170) * fix: enable streaming for in-memory observers (#171) * Squashed commit of the following: commit 9862b71 Author: semantic-release-bot <semantic-release-bot@martynus.net> Date: Thu Sep 7 00:06:39 2023 +0000 chore(release): 1.0.0 [skip ci] ## 1.0.0 (2023-09-07) ### Features * ability to control inclusion of inputs/outputs/proofs/witness ([daf5547](daf5547)) * ability to download hord.sqlite ([3dafa53](3dafa53)) * ability to generate config ([9fda9d0](9fda9d0)) * ability to replay inscriptions ([f1adca9](f1adca9)) * ability to resume ([6c7eaa3](6c7eaa3)) * ability to target blocks ([f6be49e](f6be49e)) * ability to tolerate corrupted data ([adb1b98](adb1b98)) * ability to track updates when scanning bitcoin (+refactor) ([9e54bff](9e54bff)) * ability to update stacks db from cli + fix caching logic ([3ea9f59](3ea9f59)) * add command to check stacks db integrity ([322f473](322f473)) * add get block command to cli ([97de0b0](97de0b0)) * add log, fix ordinal transfers scan ([c4202da](c4202da)) * add logs ([473ddd0](473ddd0)) * add metrics to `/ping` response of event observer server ([#297](https://github.com/hirosystems/ordhook/issues/297)) ([0e1ee7c](0e1ee7c)), closes [#285](#285) * add option to skip chainhook node ping ([a7c0b12](a7c0b12)) * add options for logs ([917090b](917090b)) * add post_transfer_output_value ([4ce0e9e](4ce0e9e)) * add retry ([117e41e](117e41e)) * add shared cache ([07523ae](07523ae)) * add support for bitcoin op DelegatedStacking ([6516155](6516155)) * add transfers table ([db14f60](db14f60)) * always try to initialize tables when starting service ([1a9eddb](1a9eddb)) * attempt to scale up multithreading ([be91202](be91202)) * attempt to support cursed inscriptions ([9b45f90](9b45f90)) * attempt transition to lazy model ([dda0b03](dda0b03)) * batch ingestion, improve cleaning ([168162e](168162e)) * better handling of blessed inscription turning cursed ([f11509a](f11509a)) * cascade changes in CLI interface ([24f27fe](24f27fe)) * cascade hord activation ([42c090b](42c090b)) * chainhook-sdk config niteties ([7d9e179](7d9e179)) * class interface ([9dfec45](9dfec45)) * client draft ([6a6451c](6a6451c)) * complete migration to lazy blocks ([fa50584](fa50584)) * disable certs ([389f77d](389f77d)) * draft naive inscription detection ([9b3e38a](9b3e38a)) * draft ordhook-sdk-js ([b264e72](b264e72)) * draft sha256 verification (wip) ([e6f0619](e6f0619)) * drafting lazy deserialization ([eaa2f71](eaa2f71)) * dry config ([135297e](135297e)) * expose `is_streaming_blocks` prop ([1ba27d7](1ba27d7)) * expose more functions for working with the indexer ([654fead](654fead)) * expose scanning status in GET endpoint ([156c463](156c463)) * expose transfers_pre_inscription ([65afd77](65afd77)) * fetch full bitcoin block, including witness data ([ee9a345](ee9a345)) * fix download block ([38b50df](38b50df)) * handle stacks unconfirmed state scans ([f6d050f](f6d050f)) * handle transfer ([fd5da52](fd5da52)) * HTTP responses adjustments ([51572ef](51572ef)) * implement and document new development flow ([66019a0](66019a0)) * implement zmq runloop ([c6c1c0e](c6c1c0e)) * import inscription parser ([45e0147](45e0147)) * improve cli ergonomics ([991e33f](991e33f)) * improve cli experience ([e865628](e865628)) * improve debug log ([5df77d7](5df77d7)) * improve hord db commands ([21c09c2](21c09c2)) * improve onboarding ([deaa739](deaa739)) * improve ordinal scan efficiency ([e510d4b](e510d4b)) * improve README ([f30e6f4](f30e6f4)) * improve repair command conveniency ([46be0ab](46be0ab)) * improving curse approach ([dcb8054](dcb8054)) * in-house thread pool ([bc5ffdd](bc5ffdd)) * inscription replay speedup ([33a4f8b](33a4f8b)) * introduce check command ([f17dc4c](f17dc4c)) * introduce evaluation reports ([54ad874](54ad874)) * introduce migration script ([8c2b16c](8c2b16c)) * introduce new predicate + refactor schemas ([611c79c](611c79c)) * introduce rocksdb storage for Stacks ([4564e88](4564e88)) * introduce sync command ([ab022e6](ab022e6)) * introduce terminate function ([91616f6](91616f6)) * is_streaming_blocks ([aacf487](aacf487)) * keep 1st tx in cache ([0978a5d](0978a5d)) * logic to start ingestion during indexing ([3c1c99d](3c1c99d)) * merge "inscription_revealed" and "inscription_transferred" into "inscription_feed" ([741290d](741290d)) * migrate stacks scans to rocksdb ([4408b1e](4408b1e)) * migration to rocksdb, moving json parsing from networking thread ([5ad0147](5ad0147)) * move thread pool size to config ([bc313fa](bc313fa)) * multithread traversals ([fba5c89](fba5c89)) * number of retries for 4 to 3 ([b294dff](b294dff)) * optimize memory ([5db1531](5db1531)) * optimize replay ([be26dac](be26dac)) * ordinal inscription_transfer code complete ([f55a5ee](f55a5ee)) * plug inscription processing in ibd ([df36617](df36617)) * plumbing for ordhook-sdk-js ([7487589](7487589)) * polish `hord find sat_point` command ([d071484](d071484)) * polish first impression ([3c2b00c](3c2b00c)) * predicate schemas ([198cdaa](198cdaa)) * prototype warmup ([fa6c86f](fa6c86f)) * re-approach stacks block commit schema ([218d599](218d599)) * re-implement satoshi overflows handling ([8ea5bdf](8ea5bdf)) * re-introduce ingestion ([71c90d7](71c90d7)) * restore ability to replay transfers ([98e7e9b](98e7e9b)) * return enable in api ([f39259c](f39259c)) * return local result when known ([5441851](5441851)) * revisit caching strategy ([2705b95](2705b95)) * revisit threading model ([05b6d5c](05b6d5c)) * scan inscription revealed ([84c5a0c](84c5a0c)) * scan inscription revealed ([644d515](644d515)) * share traversals_cache over 10 blocks spans ([b0378c3](b0378c3)) * simplify + improve coordination ([1922fd9](1922fd9)) * start investigating zmq signaling ([0ec2653](0ec2653)) * streamline processors ([13421db](13421db)) * support cursed inscriptions in chainhook client ([d7cc5a4](d7cc5a4)) * support for latest archives, add logs ([494cf3c](494cf3c)) * tweak mmap / page_size values ([5316a57](5316a57)) * update chainhook-sdk ([f052e08](f052e08)) * update inscription transfer logic ([9d0d106](9d0d106)) * update inscription transfer schemas ([f80e983](f80e983)) * upgrade `service start` implementation + documentation ([02db65e](02db65e)) * use caching on streamed blocks ([784e9a0](784e9a0)) * use thread pools for scans ([45b9abd](45b9abd)) * zmq sockets ([d2e328a](d2e328a)) ### Bug Fixes * ability to run without redis ([96825c3](96825c3)) * add busy handler ([d712e0d](d712e0d)) * add exp backoff ([f014c14](f014c14)) * add retry logic in rocksdb ([247df20](247df20)) * add retry logic to work around unexpected responses from bitcoind ([2ab6b32](2ab6b32)) * additional adjustments ([fe26063](fe26063)) * additional fixes (network, address, offsets) ([8006000](8006000)) * address build warnings ([dc623a0](dc623a0)) * address non-inscribed block case ([a7d08a3](a7d08a3)) * address redis disconnects ([a6b4a5f](a6b4a5f)) * address remaining issues ([74b2fa9](74b2fa9)) * adjust error message ([3e7b0d0](3e7b0d0)) * allow empty block ([fe8ce45](fe8ce45)) * always fetch blocks ([97060a1](97060a1)) * async/await regression ([676aac1](676aac1)) * attempt ([9e14fce](9e14fce)) * attempt to fix offset ([e6c5d0e](e6c5d0e)) * attempt to retrieve blocks from iterator ([f718071](f718071)) * attempt to tweak rocksdb ([11b9b6b](11b9b6b)) * auto enable stacks predicate ([30557f8](30557f8)) * backpressure on traversals ([3177e22](3177e22)) * batch inscription ([cd1085c](cd1085c)) * batch migration ([ed8b7ad](ed8b7ad)) * better redis error handling ([debb06c](debb06c)) * better support of reinscriptions ([a1410e2](a1410e2)) * better termination ([8a5482c](8a5482c)) * binary name ([4950a50](4950a50)) * block streaming ([dcdfd16](dcdfd16)) * boot sequence ([577f1c2](577f1c2)) * boot sequence, logs, format ([d03f851](d03f851)) * borrow issue ([66e2a7c](66e2a7c)) * broken build ([f0d471e](f0d471e)) * broken test ([239b26a](239b26a)) * broken tests ([2ab6e7d](2ab6e7d)) * build ([4067f08](4067f08)) * build ([607ac95](607ac95)) * build error ([d6ed108](d6ed108)) * build error ([bbede8b](bbede8b)) * build error ([fa802fa](fa802fa)) * build error ([44ca74b](44ca74b)) * build error ([053b781](053b781)) * build error ([5c3bcf4](5c3bcf4)) * build error ([b78c0cc](b78c0cc)) * build error ([879ed67](879ed67)) * build errors ([60cd4d0](60cd4d0)) * build errors ([8dd91bf](8dd91bf)) * build errors / merge snafu ([47da0c1](47da0c1)) * build errors + warnings ([938c6df](938c6df)) * build failing ([83f1496](83f1496)) * build warning ([561e51e](561e51e)) * build warning ([75847df](75847df)) * build warning ([0194483](0194483)) * build warnings ([d3e998c](d3e998c)) * build warnings ([e7ad175](e7ad175)) * build warnings ([670bde6](670bde6)) * bump incoming payload limit to 20mb ([7e15086](7e15086)) * cache invalidation ([05bd903](05bd903)) * cache L2 capacity ([e2fbc73](e2fbc73)) * cache size ([ce61205](ce61205)) * cache's ambitions ([e438db7](e438db7)) * Cargo.toml ([759c3a3](759c3a3)) * chain mixup, add logs ([0427a10](0427a10)) * change forking behavior ([4c10014](4c10014)) * clean expectations ([f9e089f](f9e089f)) * clear cache more regularly ([c3b884f](c3b884f)) * command for db patch ([27f6838](27f6838)) * commands doc ([3485e6f](3485e6f)) * compatibility with clarinet ([a282655](a282655)) * condition ([0233dc5](0233dc5)) * create dummy inscription for sats overflow ([84aa6ce](84aa6ce)) * db init command ([55e293b](55e293b)) * decrease compression - from 4 bytes to 8 bytes ([b2eb314](b2eb314)) * deployer predicate wildcard ([05ca395](05ca395)) * disable sleep ([41ecace](41ecace)) * disable steam scan when scanning past blocks ([e2949d2](e2949d2)) * disambiguate inscription_output_value and inscription_fee ([9816cbb](9816cbb)) * do not panic ([a0fa1a9](a0fa1a9)) * doc drift ([b595339](b595339)) * docker build ([df39302](df39302)) * docker file ([6ad5206](6ad5206)) * dockerfile ([73ad612](73ad612)) * dockerfile ([da21ec4](da21ec4)) * documentation drift ([c5335a7](c5335a7)) * documentation drift ([38153ca](38153ca)) * don't early exit when satoshi computing fail ([a8d76b0](a8d76b0)) * don't enable predicate if error ([1274cbf](1274cbf)) * early return ([8f97b56](8f97b56)) * edge case when requests processed in order ([8c4325f](8c4325f)) * edge case when requests processed out of order ([a35cea2](a35cea2)) * edge case when requests processed out of order ([a6651b8](a6651b8)) * enable profiling ([f99b073](f99b073)) * enable specs on reboot ([f23be24](f23be24)) * enforce db reconnection in http endpoints ([bcd2a45](bcd2a45)) * enum serialization ([67cb340](67cb340)) * error management ([f0274f5](f0274f5)) * export all types on ts client ([be8bfbc](be8bfbc)) * failing build ([1502d5d](1502d5d)) * fee ([0337f92](0337f92)) * filter out sat overflows from payloads ([ce439ae](ce439ae)) * gap in stacks scanning ([8c8c5c8](8c8c5c8)) * generator typo ([8a7eddb](8a7eddb)) * handle hint and case of re-inscriptions ([f86b184](f86b184)) * handle non-spending transaction ([cb01eb5](cb01eb5)) * handle re-inscription for unbound inscriptions ([a1ffc1a](a1ffc1a)) * hard coded dev-dependency ([5c105de](5c105de)) * ignore invalid inscription ([f18bc00](f18bc00)) * ignore transaction aborting that we could not classify ([37c80f7](37c80f7)) * implement error handler ([d071b81](d071b81)) * improve progress bar ([b28da56](b28da56)) * improve rewrite block command ([d524771](d524771)) * in-block re-inscription case ([90db9c3](90db9c3)) * include blocks discovered during scan, if any ([1eabce2](1eabce2)) * include ordinals operations in standardized blocks ([a13351d](a13351d)) * include proof on scan commands ([6574008](6574008)) * increase number of retries ([343ddd6](343ddd6)) * indexing ([45661ab](45661ab)) * inject l1 cache hit in results (+ clearing) ([62fd929](62fd929)) * inscription fee ([2ac3022](2ac3022)) * inscription_number ([a7d8153](a7d8153)) * insert new locations ([6475aeb](6475aeb)) * iterate on values ([0c73e62](0c73e62)) * keep trying opening rocksdb conn if failing ([dbc794a](dbc794a)) * lazy block approach ([b567322](b567322)) * leader_registered doc ([f9d7370](f9d7370)) * loading predicates from redis ([3bd308f](3bd308f)) * log level, zeromq dependency ([4a2a6ef](4a2a6ef)) * logic determining start height ([5dd300f](5dd300f)) * logs ([81be24e](81be24e)) * mark inscriber_address as nullable ([77fd88b](77fd88b)) * more pessimism on retries ([9b987c5](9b987c5)) * move parsing back to network thread ([bad1ee6](bad1ee6)) * moving stacks tip ([87c409e](87c409e)) * multithreading cap ([c80ae60](c80ae60)) * myriad of improvements ([0633182](0633182)) * nefarious logs ([3b01a48](3b01a48)) * network, cascade changes ([1f45ec2](1f45ec2)) * off by one ([2a0e75f](2a0e75f)) * off by one ([c31611f](c31611f)) * off by one ([94e1141](94e1141)) * off by one ([abf70e7](abf70e7)) * off by one error ([3832cf9](3832cf9)) * off by one inscriptions number ([cdfbf48](cdfbf48)) * off by one isssue ([fead2ed](fead2ed)) * off by one issue ([a8988ba](a8988ba)) * off by one issue ([155e3a6](155e3a6)) * off by one issue on sats overflow ([8a12004](8a12004)) * off-by-one error in backward traversal ([d4128aa](d4128aa)) * off-by-one in sats number resolution ([42acbeb](42acbeb)) * offset ([278a655](278a655)) * only avoid override for blessed inscriptions ([b50bbc1](b50bbc1)) * optimize reg and dereg ([c2ec1b5](c2ec1b5)) * ordinals scans ([62b62bd](62b62bd)) * outdated dockerfile ([771b036](771b036)) * outdated documentation ([f472a49](f472a49)) * overriden inscriptions ([25c6441](25c6441)) * parsing ([1f047a9](1f047a9)) * patch absence of witness data ([f8fcfca](f8fcfca)) * patch boot latency ([0e3faf9](0e3faf9)) * patch crach ([20d9df6](20d9df6)) * patch db call ([d385df2](d385df2)) * pipeline logic ([a864c85](a864c85)) * pipeline resuming ([06883c6](06883c6)) * ports ([3ee98a8](3ee98a8)) * potential resolve coinbase spent ([5d26738](5d26738)) * PoxInfo default for scan commands ([a00ccf5](a00ccf5)) * predicate documentation ([572cf20](572cf20)) * predicate generator network ([8f0ae21](8f0ae21)) * provide optional values ([2cbf87e](2cbf87e)) * re-apply initial fix ([f5cb516](f5cb516)) * re-arrange logs ([2857d0a](2857d0a)) * re-enable sleep ([0f61a26](0f61a26)) * re-initiate inscriptions connection every 250 blocks ([39671f4](39671f4)) * re-qualify error to warn ([9431684](9431684)) * re-wire cmd ([a1447ad](a1447ad)) * README ([db1d584](db1d584)) * recreate db conn on a regular basis ([81d8575](81d8575)) * redis update ([d4889f1](d4889f1)) * related issue ([4b3a0da](4b3a0da)) * remove rocksdb reconnect ([f2b067e](f2b067e)) * remove sleep ([c371e74](c371e74)) * remove start logic ([a04711a](a04711a)) * remove support for p2wsh inscription reveal support ([4fe71f2](4fe71f2)) * remove symbols ([108117b](108117b)) * remove thread_max * 2 ([359c6f9](359c6f9)) * reopen connect on failures ([3e15da5](3e15da5)) * reply with 500 on payload processing error ([eaa6d7b](eaa6d7b)) * report generation ([0dce12a](0dce12a)) * restore stable values ([fb5c591](fb5c591)) * return blocks to rollback in reverse order ([9fab5a3](9fab5a3)) * reuse existing computation for fix ([222f7c3](222f7c3)) * revert fix, avoid collision in traversals map ([dfcadec](dfcadec)) * revisit log level ([4168661](4168661)) * revisit transfer loop ([1f2151c](1f2151c)) * rocket_okapi version ([2af31a8](2af31a8)) * safer db open, dockerfile ([43d37d7](43d37d7)) * safer error handling ([11509e4](11509e4)) * sat offset computation ([b278b66](b278b66)) * sats overflow handling ([a3f745c](a3f745c)) * schema for curse_type ([72d43c6](72d43c6)) * serialize handlers in one thread ([cdfc264](cdfc264)) * slow down initial configuration ([3096ad3](3096ad3)) * sql query ([1a3bc42](1a3bc42)) * sql query bis ([a479884](a479884)) * sql request ([6345df2](6345df2)) * sql table setup ([c8884a7](c8884a7)) * stack overflow ([aed7d5d](aed7d5d)) * stacks predicate format ([fcf9fb0](fcf9fb0)) * start_block off by one ([b99f7b0](b99f7b0)) * streamline txid handling ([ad48351](ad48351)) * test suite ([c7672f9](c7672f9)) * test warns and errors ([0887d6b](0887d6b)) * threading model ([c9c43ae](c9c43ae)) * threading model ([c2354fc](c2354fc)) * track interrupted scans ([2b51dca](2b51dca)) * transaction type schema ([c35a737](c35a737)) * transfer recomputing commit ([3643636](3643636)) * transfer tracking ([0ea85e3](0ea85e3)) * transfer tracking ([30f299e](30f299e)) * transfer tracking ([0cd29f5](0cd29f5)) * transfer tracking + empty blocks ([dc94875](dc94875)) * traversals algo ([e8ee3ab](e8ee3ab)) * tweak rocksdb options ([a0a6950](a0a6950)) * typo ([b0498bb](b0498bb)) * typo ([baa773f](baa773f)) * unexpected expectation ([7dd362b](7dd362b)) * unify rosetta operation schemas ([bf3216b](bf3216b)) * unused imports ([3aab402](3aab402)) * update chainhook schema ([4e82714](4e82714)) * update inscription_number ([89b94e7](89b94e7)) * update license ([6ebeb77](6ebeb77)) * update rust version in docker build ([fab6f69](fab6f69)) * update spec status ([e268925](e268925)) * update/pin dependencies ([#311](#311)) ([f54b374](f54b374)), closes [#310](#310) * use first input to stick with ord spec interpretation / implementation ([206678f](206678f)) * use rpc instead of rest ([1b18818](1b18818)) * zeromq, subsidy issue ([dbca70c](dbca70c)) ### Reverts * Revert "chore: tmp patch" ([3e022ca](3e022ca)) commit 4ef18d5 Merge: d111c44 4cde5e8 Author: Scott McClellan <scott.mcclellan@gmail.com> Date: Wed Sep 6 18:44:26 2023 -0500 Merge pull request #168 from hirosystems/develop Merge up `develop` to `main` * fix: CI rust version mismatch, create empty db (#173) * fix: create db if does not exists * chore: update rust version * chore: bump version to 1.0.1 * fix: service boot sequence (#175) * fix: ci * fix: initial flow (#178) * chore: update chainhook-sdk + cascade changes * fix: update archive url * feat: only create rocksdb if sqlite present * fix: use crossbeam channel instead of std * fix: improve error message * doc: update README * fix: build warnings * fix: block_archiving expiration * fix: archive url * fix: read content len from http header * chore: untar sqlite file * chore: bump versions --------- Co-authored-by: Scott McClellan <scott.mcclellan@gmail.com>
1 parent d23edf3 commit ec1f28e

File tree

17 files changed

+661
-784
lines changed

17 files changed

+661
-784
lines changed

Cargo.lock

+543-738
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,5 @@ members = [
44
"components/ordhook-core",
55
"components/ordhook-sdk-js"
66
]
7-
87
default-members = ["components/ordhook-cli"]
8+
resolver = "2"

README.md

+11
Original file line numberDiff line numberDiff line change
@@ -112,4 +112,15 @@ will spin up a HTTP API for managing events destinations.
112112

113113
A comprehensive OpenAPI specification explaining how to interact with this HTTP REST API can be found [here](https://github.com/hirosystems/chainhook/blob/develop/docs/chainhook-openapi.json).
114114

115+
---
116+
### Troubleshooting: Performance and System Requirements
117+
118+
The Ordinals Theory protocol is resource-intensive, demanding significant CPU, memory, and disk capabilities. As we continue to refine and optimize, keep in mind the following system requirements and recommendations to ensure optimal performance:
119+
120+
CPU: The ordhook tool efficiently utilizes multiple cores when detected at runtime, parallelizing tasks to boost performance.
121+
122+
Memory: A minimum of 16GB RAM is recommended.
123+
124+
Disk: To enhance I/O performance, SSD or NVMe storage is suggested.
115125

126+
OS Requirements: Ensure your system allows for a minimum of 4096 open file descriptors. Configuration may vary based on your operating system. On certain systems, this can be adjusted using the `ulimit` command or the `launchctl limit` command.

components/ordhook-cli/Cargo.toml

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "ordhook-cli"
3-
version = "1.0.1"
3+
version = "1.0.2"
44
edition = "2021"
55

66
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
@@ -15,7 +15,7 @@ serde = "1"
1515
serde_json = "1"
1616
serde_derive = "1"
1717
reqwest = { version = "0.11", features = ["stream", "json"] }
18-
hiro-system-kit = "0.1.0"
18+
hiro-system-kit = "0.3.1"
1919
clap = { version = "3.2.23", features = ["derive"], optional = true }
2020
clap_generate = { version = "3.0.3", optional = true }
2121
toml = { version = "0.5.6", features = ["preserve_order"], optional = true }

components/ordhook-cli/src/config/generator.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ max_caching_memory_size_mb = 32000
3737
# Disable the following section if the state
3838
# must be built locally
3939
[bootstrap]
40-
download_url="/https://archive.hiro.so/mainnet/chainhooks/hord.sqlite"
40+
download_url="/https://archive.hiro.so/mainnet/ordhook/mainnet-ordhook-sqlite-latest"
4141
4242
[logs]
4343
ordinals_internals = true

components/ordhook-core/Cargo.toml

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "ordhook"
3-
version = "0.4.0"
3+
version = "0.5.0"
44
edition = "2021"
55

66
[dependencies]
@@ -12,9 +12,9 @@ redis = "0.21.5"
1212
serde-redis = "0.12.0"
1313
hex = "0.4.3"
1414
rand = "0.8.5"
15-
chainhook-sdk = { version = "=0.9.0", default-features = false, features = ["zeromq", "log"] }
15+
chainhook-sdk = { version = "=0.9.5", default-features = false, features = ["zeromq", "log"] }
1616
# chainhook-sdk = { version = "=0.9.0", path = "../../../chainhook/components/chainhook-sdk", default-features = false, features = ["zeromq", "log"] }
17-
hiro-system-kit = "0.1.0"
17+
hiro-system-kit = "0.3.1"
1818
reqwest = { version = "0.11", features = ["stream", "json"] }
1919
tokio = { version = "=1.24", features = ["full"] }
2020
futures-util = "0.3.24"

components/ordhook-core/src/config/mod.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use chainhook_sdk::types::{
77
use std::path::PathBuf;
88

99
const DEFAULT_MAINNET_ORDINALS_SQLITE_ARCHIVE: &str =
10-
"https://archive.hiro.so/mainnet/chainhooks/hord.sqlite";
10+
"https://archive.hiro.so/mainnet/ordhook/mainnet-ordhook-sqlite-latest";
1111

1212
pub const DEFAULT_INGESTION_PORT: u16 = 20455;
1313
pub const DEFAULT_CONTROL_PORT: u16 = 20456;
@@ -155,7 +155,7 @@ impl Config {
155155
}
156156

157157
pub fn expected_remote_ordinals_sqlite_url(&self) -> String {
158-
format!("{}.gz", self.expected_remote_ordinals_sqlite_base_url())
158+
format!("{}.tar.gz", self.expected_remote_ordinals_sqlite_base_url())
159159
}
160160

161161
pub fn devnet_default() -> Config {

components/ordhook-core/src/core/mod.rs

+23-3
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,12 @@ use chainhook_sdk::{
1414

1515
use crate::{
1616
config::{Config, LogConfig},
17-
db::find_lazy_block_at_block_height,
17+
db::{find_lazy_block_at_block_height, open_readwrite_ordhook_db_conn_rocks_db},
1818
};
1919

2020
use crate::db::{
2121
find_last_block_inserted, find_latest_inscription_block_height, initialize_ordhook_db,
22-
open_readonly_ordhook_db_conn, open_readonly_ordhook_db_conn_rocks_db,
22+
open_readonly_ordhook_db_conn,
2323
};
2424

2525
use crate::db::LazyBlockTransaction;
@@ -94,6 +94,26 @@ pub fn compute_next_satpoint_data(
9494
SatPosition::Output((output_index, (offset_cross_inputs - offset_intra_outputs)))
9595
}
9696

97+
pub fn should_sync_rocks_db(
98+
config: &Config,
99+
ctx: &Context,
100+
) -> Result<Option<(u64, u64)>, String> {
101+
let blocks_db = open_readwrite_ordhook_db_conn_rocks_db(&config.expected_cache_path(), &ctx)?;
102+
let inscriptions_db_conn = open_readonly_ordhook_db_conn(&config.expected_cache_path(), &ctx)?;
103+
let last_compressed_block = find_last_block_inserted(&blocks_db) as u64;
104+
let last_indexed_block = match find_latest_inscription_block_height(&inscriptions_db_conn, ctx)? {
105+
Some(last_indexed_block) => last_indexed_block,
106+
None => 0
107+
};
108+
109+
let res = if last_compressed_block < last_indexed_block {
110+
Some((last_compressed_block, last_indexed_block))
111+
} else {
112+
None
113+
};
114+
Ok(res)
115+
}
116+
97117
pub fn should_sync_ordhook_db(
98118
config: &Config,
99119
ctx: &Context,
@@ -110,7 +130,7 @@ pub fn should_sync_ordhook_db(
110130
}
111131
};
112132

113-
let blocks_db = open_readonly_ordhook_db_conn_rocks_db(&config.expected_cache_path(), &ctx)?;
133+
let blocks_db = open_readwrite_ordhook_db_conn_rocks_db(&config.expected_cache_path(), &ctx)?;
114134
let mut start_block = find_last_block_inserted(&blocks_db) as u64;
115135

116136
if start_block == 0 {

components/ordhook-core/src/core/pipeline/processors/block_archiving.rs

+3-20
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,16 @@
11
use std::{
2-
sync::mpsc::Sender,
32
thread::{sleep, JoinHandle},
43
time::Duration,
54
};
6-
5+
use crossbeam_channel::{Sender, TryRecvError};
76
use chainhook_sdk::{types::BitcoinBlockData, utils::Context};
8-
use crossbeam_channel::TryRecvError;
97
use rocksdb::DB;
108

119
use crate::{
1210
config::Config,
1311
core::pipeline::{PostProcessorCommand, PostProcessorController, PostProcessorEvent},
1412
db::{
15-
insert_entry_in_blocks, open_ordhook_db_conn_rocks_db_loop,
13+
insert_entry_in_blocks,
1614
open_readwrite_ordhook_db_conn_rocks_db, LazyBlock,
1715
},
1816
};
@@ -30,10 +28,9 @@ pub fn start_block_archiving_processor(
3028
let ctx = ctx.clone();
3129
let handle: JoinHandle<()> = hiro_system_kit::thread_named("Processor Runloop")
3230
.spawn(move || {
33-
let mut blocks_db_rw =
31+
let blocks_db_rw =
3432
open_readwrite_ordhook_db_conn_rocks_db(&config.expected_cache_path(), &ctx)
3533
.unwrap();
36-
let mut empty_cycles = 0;
3734
let mut processed_blocks = 0;
3835

3936
loop {
@@ -49,16 +46,7 @@ pub fn start_block_archiving_processor(
4946
}
5047
Err(e) => match e {
5148
TryRecvError::Empty => {
52-
empty_cycles += 1;
53-
if empty_cycles == 30 {
54-
warn!(ctx.expect_logger(), "Block processor reached expiration");
55-
let _ = events_tx.send(PostProcessorEvent::Expired);
56-
break;
57-
}
5849
sleep(Duration::from_secs(1));
59-
if empty_cycles > 120 {
60-
break;
61-
}
6250
continue;
6351
}
6452
_ => {
@@ -71,11 +59,6 @@ pub fn start_block_archiving_processor(
7159

7260
if processed_blocks % 10_000 == 0 {
7361
let _ = blocks_db_rw.flush_wal(true);
74-
blocks_db_rw = open_ordhook_db_conn_rocks_db_loop(
75-
true,
76-
&config.expected_cache_path(),
77-
&ctx,
78-
);
7962
}
8063
}
8164

components/ordhook-core/src/db/mod.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,7 @@ pub fn open_readonly_ordhook_db_conn_rocks_db(
228228
opts.set_disable_auto_compactions(true);
229229
opts.set_max_background_jobs(0);
230230
let db = DB::open_for_read_only(&opts, path, false)
231-
.map_err(|e| format!("unable to open blocks_db: {}", e.to_string()))?;
231+
.map_err(|e| format!("unable to open hord.rocksdb: {}", e.to_string()))?;
232232
Ok(db)
233233
}
234234

@@ -276,7 +276,7 @@ pub fn open_readwrite_ordhook_db_conn_rocks_db(
276276
let path = get_default_ordhook_db_file_path_rocks_db(&base_dir);
277277
let opts = rocks_db_default_options();
278278
let db = DB::open(&opts, path)
279-
.map_err(|e| format!("unable to open blocks_db: {}", e.to_string()))?;
279+
.map_err(|e| format!("unable to open hord.rocksdb: {}", e.to_string()))?;
280280
Ok(db)
281281
}
282282

components/ordhook-core/src/download/mod.rs

+5-5
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ use flate2::read::GzDecoder;
66
use futures_util::StreamExt;
77
use progressing::mapping::Bar as MappingBar;
88
use progressing::Baring;
9+
use tar::Archive;
910
use std::fs;
1011
use std::io::{self, Cursor};
1112
use std::io::{Read, Write};
@@ -19,7 +20,7 @@ pub fn default_sqlite_sha_file_path(_network: &BitcoinNetwork) -> String {
1920
}
2021

2122
pub async fn download_sqlite_file(config: &Config, _ctx: &Context) -> Result<(), String> {
22-
let mut destination_path = config.expected_cache_path();
23+
let destination_path = config.expected_cache_path();
2324
std::fs::create_dir_all(&destination_path).unwrap_or_else(|e| {
2425
println!("{}", e.to_string());
2526
});
@@ -46,22 +47,21 @@ pub async fn download_sqlite_file(config: &Config, _ctx: &Context) -> Result<(),
4647

4748
// Download chunks
4849
let (tx, rx) = flume::bounded(0);
49-
destination_path.push(default_sqlite_file_path(&config.network.bitcoin_network));
5050

5151
let decoder_thread = std::thread::spawn(move || {
5252
let input = ChannelRead::new(rx);
5353
let mut decoder = GzDecoder::new(input);
5454
let mut content = Vec::new();
5555
let _ = decoder.read_to_end(&mut content);
56-
let mut file = fs::File::create(&destination_path).unwrap();
57-
if let Err(e) = file.write_all(&content[..]) {
56+
let mut archive = Archive::new(&content[..]);
57+
if let Err(e) = archive.unpack(&destination_path) {
5858
println!("unable to write file: {}", e.to_string());
5959
std::process::exit(1);
6060
}
6161
});
6262

6363
if res.status() == reqwest::StatusCode::OK {
64-
let limit = 5_400_000_000;
64+
let limit = res.content_length().unwrap_or(10_000_000_000) as i64;
6565
let mut progress_bar = MappingBar::with_range(0i64, limit);
6666
progress_bar.set_len(60);
6767
let mut stdout = std::io::stdout();

components/ordhook-core/src/scan/bitcoin.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -234,14 +234,14 @@ pub async fn process_block_with_predicates(
234234
predicates: &Vec<&BitcoinChainhookSpecification>,
235235
event_observer_config: &EventObserverConfig,
236236
ctx: &Context,
237-
) -> Result<u32, ()> {
237+
) -> Result<u32, String> {
238238
let chain_event =
239239
BitcoinChainEvent::ChainUpdatedWithBlocks(BitcoinChainUpdatedWithBlocksData {
240240
new_blocks: vec![block],
241241
confirmed_blocks: vec![],
242242
});
243243

244-
let (predicates_triggered, _predicates_evaluated) =
244+
let (predicates_triggered, _predicates_evaluated, _) =
245245
evaluate_bitcoin_chainhooks_on_chain_event(&chain_event, predicates, ctx);
246246

247247
execute_predicates_action(predicates_triggered, &event_observer_config, &ctx).await
@@ -251,7 +251,7 @@ pub async fn execute_predicates_action<'a>(
251251
hits: Vec<BitcoinTriggerChainhook<'a>>,
252252
config: &EventObserverConfig,
253253
ctx: &Context,
254-
) -> Result<u32, ()> {
254+
) -> Result<u32, String> {
255255
let mut actions_triggered = 0;
256256
let mut proofs = HashMap::new();
257257
for trigger in hits.into_iter() {

components/ordhook-core/src/service/http_api.rs

+25-1
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ fn handle_get_predicates(
9999

100100
let serialized_predicates = predicates
101101
.iter()
102-
.map(|(p, _)| p.into_serialized_json())
102+
.map(|(p, s)| serialized_predicate_with_status(p, s))
103103
.collect::<Vec<_>>();
104104

105105
Json(json!({
@@ -311,3 +311,27 @@ pub fn load_predicates_from_redis(
311311
.map_err(|e| format!("unable to connect to redis: {}", e.to_string()))?;
312312
get_entries_from_predicates_db(&mut predicate_db_conn, ctx)
313313
}
314+
315+
fn serialized_predicate_with_status(
316+
predicate: &ChainhookSpecification,
317+
status: &PredicateStatus,
318+
) -> JsonValue {
319+
match (predicate, status) {
320+
(ChainhookSpecification::Stacks(spec), status) => json!({
321+
"chain": "stacks",
322+
"uuid": spec.uuid,
323+
"network": spec.network,
324+
"predicate": spec.predicate,
325+
"status": status,
326+
"enabled": spec.enabled,
327+
}),
328+
(ChainhookSpecification::Bitcoin(spec), status) => json!({
329+
"chain": "bitcoin",
330+
"uuid": spec.uuid,
331+
"network": spec.network,
332+
"predicate": spec.predicate,
333+
"status": status,
334+
"enabled": spec.enabled,
335+
}),
336+
}
337+
}

components/ordhook-core/src/service/mod.rs

+34-1
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,15 @@ mod runloops;
44

55
use crate::config::{Config, PredicatesApi};
66
use crate::core::pipeline::download_and_pipeline_blocks;
7+
use crate::core::pipeline::processors::block_archiving::start_block_archiving_processor;
78
use crate::core::pipeline::processors::inscription_indexing::process_block;
89
use crate::core::pipeline::processors::start_inscription_indexing_processor;
910
use crate::core::pipeline::processors::transfers_recomputing::start_transfers_recomputing_processor;
1011
use crate::core::protocol::inscription_parsing::{
1112
get_inscriptions_revealed_in_block, parse_inscriptions_in_standardized_block,
1213
};
1314
use crate::core::protocol::inscription_sequencing::SequenceCursor;
14-
use crate::core::{new_traversals_lazy_cache, should_sync_ordhook_db};
15+
use crate::core::{new_traversals_lazy_cache, should_sync_ordhook_db, should_sync_rocks_db};
1516
use crate::db::{
1617
delete_data_in_ordhook_db, insert_entry_in_blocks,
1718
update_inscriptions_with_block, update_locations_with_block,
@@ -465,6 +466,38 @@ impl Service {
465466
&self,
466467
block_post_processor: Option<crossbeam_channel::Sender<BitcoinBlockData>>,
467468
) -> Result<(), String> {
469+
// First, make sure that rocksdb and sqlite are aligned.
470+
// If rocksdb.chain_tip.height <= sqlite.chain_tip.height
471+
// Perform some block compression until that height.
472+
if let Some((start_block, end_block)) = should_sync_rocks_db(&self.config, &self.ctx)? {
473+
let blocks_post_processor = start_block_archiving_processor(
474+
&self.config,
475+
&self.ctx,
476+
false,
477+
block_post_processor.clone(),
478+
);
479+
480+
self.ctx.try_log(|logger| {
481+
info!(
482+
logger,
483+
"Compressing blocks (from #{start_block} to #{end_block})"
484+
)
485+
});
486+
487+
let ordhook_config = self.config.get_ordhook_config();
488+
let first_inscription_height = ordhook_config.first_inscription_height;
489+
let blocks = BlockHeights::BlockRange(start_block, end_block).get_sorted_entries();
490+
download_and_pipeline_blocks(
491+
&self.config,
492+
blocks.into(),
493+
first_inscription_height,
494+
Some(&blocks_post_processor),
495+
10_000,
496+
&self.ctx,
497+
)
498+
.await?;
499+
}
500+
468501
// Start predicate processor
469502
let mut last_block_processed = 0;
470503
while let Some((start_block, end_block, speed)) =

components/ordhook-core/src/service/predicates.rs

+1
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,7 @@ pub fn create_and_consolidate_chainhook_config_with_predicates(
248248
blocks: None,
249249
start_block: None,
250250
end_block: None,
251+
expired_at: None,
251252
expire_after_occurrence: None,
252253
predicate: chainhook_sdk::chainhooks::types::BitcoinPredicateType::OrdinalsProtocol(
253254
chainhook_sdk::chainhooks::types::OrdinalOperations::InscriptionFeed,

components/ordhook-sdk-js/Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "ordhook-sdk-js"
3-
version = "0.4.0"
3+
version = "0.5.0"
44
edition = "2021"
55
exclude = ["index.node"]
66

0 commit comments

Comments
 (0)