@cogcoin/indexer@1.0.2 is the pure-function Cogcoin indexer kernel for developers building clients, sync engines, explorers, and other protocol tooling. It exposes deterministic block transition APIs, rewindable block records, state hashing, and explicit query/type subpaths while delegating canonical mining settlement to @cogcoin/scoring.
Use Node 18 or newer.
- Website: cogcoin.org
- Whitepaper: cogcoin.org/whitepaper.md
- Source: github.com/cogcoin/indexer
- Genesis package: npmjs.com/package/@cogcoin/genesis
- Scoring package: npmjs.com/package/@cogcoin/scoring
Install the package:
npm install @cogcoin/indexerThen, from your project root, run:
node node_modules/@cogcoin/genesis/verify.mjsVerify the installed genesis artifacts before using the indexer in a production implementation.
The published package keeps its runtime dependency surface intentionally small:
@cogcoin/genesis@1.0.0@cogcoin/scoring@1.0.0
The package does not ship a store, sync loop, transport, database adapter, or CLI. Applications are expected to own persistence and orchestration around the pure state machine.
State lifecycle:
loadBundledGenesisParameters()createInitialState(genesisParameters)prepareBlock(state, block, genesisParameters)finalizePreparedBlock(preparedBlock, miningSettlementResult)applyBlockWithScoring(state, block, genesisParameters)rewindBlock(state, blockRecord)
State hashing and serialization:
computeStateHash(consensusState, blockHeight)computeStateHashHex(consensusState, blockHeight)serializeConsensusState(...)deserializeConsensusState(...)serializeHistoryState(...)deserializeHistoryState(...)serializeIndexerState(...)deserializeIndexerState(...)serializeBlockRecord(...)deserializeBlockRecord(...)
Query subpath:
@cogcoin/indexer/queries
Type subpath:
@cogcoin/indexer/types
import {
applyBlockWithScoring,
createInitialState,
loadBundledGenesisParameters,
} from "@cogcoin/indexer";
import { getBlockWinners, lookupDomain } from "@cogcoin/indexer/queries";
const genesis = await loadBundledGenesisParameters();
let state = createInitialState(genesis);
const bitcoinBlock = {
height: 937338,
// Block hashes use Bitcoin internal byte order, not JSON-RPC display hex.
hash: new Uint8Array(32),
previousHash: new Uint8Array(32),
transactions: [],
};
const applied = await applyBlockWithScoring(state, bitcoinBlock, genesis);
state = applied.state;
const domain = lookupDomain(state, "alpha");
const winners = getBlockWinners(state, bitcoinBlock.height);The package never mutates the input state. Every block application returns a new state plus a reversible block record.
The kernel stores the whitepaper's non-consensus query data directly in history:
- founding messages from
DOMAIN_ANCHOR - reviews from
REP_COMMITandREP_REVOKE - mining winner history by block height
- resolved lock history by recipient domain
- field write and clear history
- chronological domain event logs
- Cogcoin explorer block and transaction result history
These values are rewinded exactly with the same journal mechanism as consensus state, but they do not participate in the state hash.
BitcoinBlock.hashandBitcoinBlock.previousHashmust use Bitcoin internal byte order, not JSON-RPC display-order hex.- Sender identity is always the prevout
scriptPubKeyof input0. - Transactions are processed strictly in block order, and mining settlement runs after the transaction loop for the block.
- The package uses
@cogcoin/scoringfor canonical mining settlement. Conforming implementations must not use the scoring WASM exportsettle_block_wasmas an indexer shortcut. - Founding messages, reviews, winner history, resolved lock history, domain event logs, and explorer history are protocol-level stored data, but they do not affect validation or any state hash field.
dist/index.js: public package entrypointdist/index.d.ts: bundled type declarationsdist/queries.js: selector subpath entrypointdist/public-types.d.ts: public type subpath declarationsdist/*: compiled ESM implementationREADME.md: package guideLICENSE: MIT license text