Chain Architecture
Describes hived 1.30.0 and the public API stack of the pixagram-node repository at commit 4a271e8. Checked against the six public nodes on 2026-10-05 and 2026-10-08; on 2026-11-03 all six ran 1.30.1, a release without a hardfork.
This page shows the parts of the Pixa network a developer talks to, what each part does, and where each kind of data lives. Read it before the Developer Quickstart if you are new to Hive-family chains, or before running a node (Run a Node).
The parts at a glance
| Part | What it is | Consensus? |
|---|---|---|
| hived | The node software, built from Hive's code. It validates and stores blocks, keeps the chain's current state and answers chain API calls. Every node runs it. | Yes |
| Witness node | A hived with the witness plugin and a block-signing key. It produces a block when its turn comes (Witnesses and DPoS). |
Yes |
| HAF | Hive Application Framework: a second hived that writes every block into PostgreSQL. | No |
| Hivemind | The social indexer. It reads HAF's database and answers bridge.*, follow_api.*, tags_api.* and some condenser_api.* calls: feeds, follows, communities, notifications. |
No |
| Jussi | The gateway in front of both. It sends each call to hived or Hivemind and renames Hive's field names to Pixa's (Differences from Hive). | No |
| Caddy | Terminates TLS, obtains certificates and compresses responses. | No |
| Price feed | A program each witness runs to publish the PIXA price of one Big Mac every hour (Become a Witness). | Its output is input to consensus; the program is not |
| Clients | The Pixagram app and any other program. They sign transactions locally and send them over HTTPS. | No |
Six public API nodes run this stack: api.pixagram.com, pixarex.net, merlion.surf, blockforge.lol, boitata.quest and pixa-dubai.xyz. They serve the same chain and answered identically on 2026-10-05 (Architecture says who runs each).
The chain: blocks, transactions, operations
| Term | Meaning |
|---|---|
| Block | A batch of transactions signed by one witness. One every 3 seconds (Chain Parameters). |
| Transaction | One or more operations, signed together. It names a recent block (ref_block_num, ref_block_prefix) and an expiry, so it cannot be replayed on another fork or later. |
| Operation | One action: comment publishes a post or an artwork, vote votes, transfer moves tokens, custom_json carries app data such as follows and community actions. |
| Virtual operation | A record the chain writes itself when a rule applies, such as author_reward at payout or producer_reward for a block. Nobody signs it. |
| Irreversible block | A block confirmed by a supermajority of the scheduled witnesses, so that it can no longer be undone. |
Signatures stay with the client. A client builds a transaction, signs it with a private key and sends only the signed result. No node and no gateway ever sees a key. A signature covers the chain ID, so a transaction signed for Pixa is invalid on Hive and the other way round.
Rules are compiled in. Every hived enforces the same rules. Witnesses change some parameters by vote; everything else changes only when they run a new version (Protocol Upgrades).
What a node keeps on disk
| Path in the data directory | What it holds | If lost |
|---|---|---|
blockchain/block_log* |
Every block since genesis. This is the chain. | Download it again over P2P. |
blockchain/shared_memory.bin |
The current state: accounts, balances, votes, witnesses, proposals, posts awaiting payout | Rebuilt from the block log by a replay |
blockchain/comments-rocksdb-storage |
Posts and comments after their payout, moved out of the state file | Rebuilt by a replay |
blockchain/account-history-rocksdb-storage |
Each account's operations, on API nodes only | Rebuilt by a replay |
config.ini |
The node's settings, and on a witness its signing key | Cannot be rebuilt. Back it up. |
Plugins decide what a node indexes and which API calls it answers. A witness node loads four; a public API node loads eleven (Run a Node).
How a read travels
- The client sends an HTTPS
POSTwith a JSON-RPC body, for example{"method":"condenser_api.get_accounts", …}. - Caddy terminates TLS and passes the request to Jussi.
- Jussi reads the method name.
bridge,follow_apiandtags_apicalls, and 23 namedcondenser_apicalls such asget_contentandget_discussions_by_created, go to Hivemind. Everything else goes to hived, after Jussi renames Pixa field names in the request to Hive's. - On the way back, Jussi renames Hive field names to Pixa's, such as
hbd_balancetopxs_balance, and Caddy compresses the response.
How a write travels
- The client reads the head block (
get_dynamic_global_properties), builds a transaction that references it, and signs it locally. - It sends the signed transaction with
condenser_api.broadcast_transaction. hived checks the signatures against the account's keys, and the Resource Credits the transaction costs, then passes it to its peers. - The next witness to produce a block includes it, usually within 3 seconds. The transaction becomes irreversible once enough witnesses have built on that block.
- HAF writes the block into PostgreSQL, and Hivemind indexes it. From then on the post, vote or follow appears in
bridge.*results.
Where each kind of data lives
| Data | Where | On chain? |
|---|---|---|
| Artworks, posts, comments, votes, transfers | Blocks, in every node's block log | Yes |
| Balances, keys, witness votes, proposals | hived's state, derived from the blocks | Yes, as derived state |
| Follows, mutes, reblogs, community roles | custom_json operations in blocks; Hivemind keeps their current effect |
The operations are; Hivemind's tables are an index |
| Feeds, rankings, notifications | Hivemind's database | No, computed |
| Images inside blog posts | Arweave, through a project upload service; the post holds a link | No (Pixel Art On Chain) |
| AI conversions, search, the image proxy | Services run for the app | No |
Anything marked No can be rebuilt or replaced without the chain changing. An app that reads blocks directly needs none of it.
Compared with Hive
| Aspect | Steem / Hive | Pixa |
|---|---|---|
| Node software | hived (Hive), steemd (Steem) | hived, forked from Hive's 1.28.7; 1.30.1 merged Hive's 1.28.8 (Protocol Upgrades) |
| Social indexer | Hivemind; on Hive, built on HAF | the same, built on HAF |
| Gateway called Jussi | a Python service that routes calls | an OpenResty (nginx and Lua) configuration that routes calls and renames fields |
| Field names in API responses | hbd_balance, reward_hive … on Hive |
pxs_balance, reward_pixa … through the gateway; Hive's names from hived directly |
Sources
- Gateway:
jussi/nginx.conf(routing at lines 18-51, renames at 63-117),docker-compose.ymlandssl-proxy/Caddyfile, at commit4a271e8, which moved the images to 1.30.0 and changed nothing else. - Witness node:
witnessat commite3b8841. - Node software:
pixagram-blockchain/pixagramat tagv1.30.0. - Public nodes: the app's node list in
constants.js; each answeredcondenser_api.get_dynamic_global_propertiesandbridge.get_ranked_postson 2026-10-05. - Hive whitepaper (2020), §III.5 "Node Types" and §IV.1 "Integration"; Steem whitepaper, "Consensus in Steem".
- Comment archive:
rocksdb_comment_archive.cpp, called at payout fromdatabase_comment.cpp:118.