<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Hiroshi Ichiyanagi</title>
    <description>The latest articles on DEV Community by Hiroshi Ichiyanagi (@hiroshi_ichiyanagi).</description>
    <link>https://dev.to/hiroshi_ichiyanagi</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3972440%2F7f22d04a-c966-4bf1-82cf-70880167a72e.png</url>
      <title>DEV Community: Hiroshi Ichiyanagi</title>
      <link>https://dev.to/hiroshi_ichiyanagi</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hiroshi_ichiyanagi"/>
    <language>en</language>
    <item>
      <title>openreserve: offline-verifiable proof-of-reserves for the off-chain world</title>
      <dc:creator>Hiroshi Ichiyanagi</dc:creator>
      <pubDate>Sun, 07 Jun 2026 11:45:22 +0000</pubDate>
      <link>https://dev.to/hiroshi_ichiyanagi/openreserve-offline-verifiable-proof-of-reserves-for-the-off-chain-world-hbg</link>
      <guid>https://dev.to/hiroshi_ichiyanagi/openreserve-offline-verifiable-proof-of-reserves-for-the-off-chain-world-hbg</guid>
      <description>&lt;p&gt;"Are the reserves actually there?" has become a recurring, expensive question. A string of high-profile failures — where customer funds turned out not to fully back the liabilities — has made &lt;em&gt;verifiable&lt;/em&gt; reserves a live concern rather than a back-office footnote. In parallel, there's a broader drift toward periodic, independently-checkable reserve attestation for some classes of issuers and custodians.&lt;/p&gt;

&lt;p&gt;Most of the tooling people reach for here is &lt;strong&gt;on-chain&lt;/strong&gt;: oracle-style proof-of-reserve systems (Chainlink's Proof of Reserve is the well-known example) designed for on-chain assets and smart-contract consumers. That's a real and useful domain — but it's not the one a payment processor, e-money issuer, wallet, or custodian lives in. Their ledger is in a normal database; their auditors and regulators are off-chain; an on-chain oracle is the wrong shape. &lt;strong&gt;openreserve&lt;/strong&gt; is a small attempt at the off-chain gap.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it is
&lt;/h2&gt;

&lt;p&gt;openreserve is a dependency-free Python library (standard library only); install it with &lt;code&gt;pip install openreserve&lt;/code&gt;. Given a &lt;strong&gt;ledger state&lt;/strong&gt; — an append-only, double-entry ledger — and an &lt;strong&gt;explicit point in time&lt;/strong&gt;, it produces and verifies:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Proof of Reserves&lt;/strong&gt; — a Merkle tree over user-account balances plus reserve-account totals, with a solvency check (&lt;code&gt;reserves &amp;gt;= liabilities&lt;/code&gt;). A user can verify their own balance is included via a Merkle proof, without the operator revealing other users' balances.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Proof of Solvency&lt;/strong&gt; — per-currency proof-of-reserves aggregated with the audit chain's commitment hash.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Audit chain&lt;/strong&gt; — a hash-linked event log (&lt;code&gt;prev_hash → event_hash&lt;/code&gt;) with a &lt;code&gt;verify_chain()&lt;/code&gt; that detects any tampering with past entries.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reserve / deposit calculation&lt;/strong&gt; — point-in-time required-reserve computation (settled balances plus in-flight obligations; negative balances excluded).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The artifacts are plain data. A proof's public summary is a JSON-serializable dict, so you can publish it at a static URL and a third party can fetch it and re-verify it offline using the same library primitives. openreserve does &lt;strong&gt;not&lt;/strong&gt; ship an HTTP serving layer — exposing an endpoint is the integrator's job.&lt;/p&gt;

&lt;h2&gt;
  
  
  Proof of Reserves vs Proof of Solvency
&lt;/h2&gt;

&lt;p&gt;These two are often conflated, so to be precise:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Proof of Reserves&lt;/strong&gt; — evidence that the assets (reserves) actually exist / are held.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Proof of Solvency&lt;/strong&gt; — evidence that &lt;strong&gt;assets ≥ liabilities&lt;/strong&gt;: the reserves actually cover what is owed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;openreserve does both: a Merkle-committed reserve proof, plus a per-currency solvency check (&lt;code&gt;reserves &amp;gt;= liabilities&lt;/code&gt;). The solvency claim is only as complete as the liabilities you include — see &lt;em&gt;Limitations&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who it's for
&lt;/h2&gt;

&lt;p&gt;The common shape is an operator whose balances are an &lt;strong&gt;off-chain liability&lt;/strong&gt; in a normal database, and whose auditors, counterparties, or regulators are off-chain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;E-money / prepaid-balance issuers&lt;/strong&gt; — customer balances are liabilities that must be backed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Payment processors / PSPs&lt;/strong&gt; holding client or settlement funds.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custodians&lt;/strong&gt;, including the &lt;strong&gt;off-chain customer-balance ledger of a crypto exchange&lt;/strong&gt; (the familiar "CEX proof-of-reserves" case).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stablecoin issuers&lt;/strong&gt; attesting the &lt;strong&gt;off-chain reserve&lt;/strong&gt; backing (the reserve side, held in banks/custody — not the on-chain token).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Loyalty-point / closed-loop wallet operators&lt;/strong&gt; — outstanding points are an off-chain liability.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In every case the question is the same: &lt;em&gt;can a third party verify the reserves cover the off-chain liabilities, without trusting a dashboard?&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The core property: determinism
&lt;/h2&gt;

&lt;p&gt;The reason any of this is worth doing is that the proofs are &lt;strong&gt;deterministic&lt;/strong&gt;. Proof generation takes the as-of / event time as an explicit, required input and never reads the wall clock. The same ledger state and the same timestamp produce a byte-identical Merkle root and audit hash.&lt;/p&gt;

&lt;p&gt;This is the difference between "trust our dashboard" and "verify our proof." If the output depended on &lt;code&gt;datetime.now()&lt;/code&gt;, no outsider could reproduce it. Because it doesn't, a regulator, auditor, or counterparty can take a published proof and check it themselves.&lt;/p&gt;

&lt;h2&gt;
  
  
  Don't trust me, verify me
&lt;/h2&gt;

&lt;p&gt;The verification loop is one-directional — the operator publishes, anyone re-checks offline:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;OPERATOR SIDE
  ledger state + explicit as-of time
        |
        v
  generate proof            (deterministic: same state + time -&amp;gt; same hashes)
        |
        v
  publish proof as JSON     (static URL or file)
        |
========|=====================================================
        v
VERIFIER SIDE  (auditor / user / regulator -- offline, no trust in operator)
  fetch proof JSON
        |
        +--&amp;gt; recompute Merkle root
        +--&amp;gt; verify audit chain   (prev_hash -&amp;gt; event_hash)
        +--&amp;gt; check solvency       (reserves &amp;gt;= liabilities)
        +--&amp;gt; (a user) verify own balance is included via Merkle proof
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The repo ships a determinism guard you can run yourself (clone the repo and run the test suite):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python &lt;span class="nt"&gt;-m&lt;/span&gt; pytest tests/test_determinism_guard.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It asserts (a) the same ledger state + same &lt;code&gt;snapshot_at&lt;/code&gt; reproduces the same Merkle root and audit hash, and (b) with &lt;code&gt;datetime.now&lt;/code&gt; patched to raise, generation with an explicit time still succeeds — i.e. the wall clock is genuinely never touched.&lt;/p&gt;

&lt;p&gt;A minimal end-to-end example (after &lt;code&gt;pip install openreserve&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timezone&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openreserve&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;Currency&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Ledger&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Money&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;OwnerType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;ProofOfReservesGenerator&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SQLiteLedgerStorage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TransactionBuilder&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2026&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tzinfo&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;timezone&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;utc&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# explicit time — no wall clock
&lt;/span&gt;&lt;span class="n"&gt;ledger&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Ledger&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;SQLiteLedgerStorage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;:memory:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;platform&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ledger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;open_account&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;OwnerType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PLATFORM&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Currency&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;JPY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;platform&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;reserve&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ledger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;open_account&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;OwnerType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RESERVE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Currency&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;JPY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;reserve&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;alice&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ledger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;open_account&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;OwnerType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;USER&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Currency&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;JPY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;alice&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;fund&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dst&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;units&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;TransactionBuilder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;FUND&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ops&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;initiated_at&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;transfer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;account_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dst&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;account_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Money&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;from_units&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;units&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Currency&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;JPY&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;ledger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;build&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt; &lt;span class="n"&gt;ledger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;settle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;transaction_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;settled_at&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;fund&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;platform&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;reserve&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1_000_000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;fund&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;platform&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;alice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;300_000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;proof&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ProofOfReservesGenerator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ledger&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;generate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;currency&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;Currency&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;JPY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;snapshot_at&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;proof&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;is_solvent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;proof&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;user_liabilities_total_cents&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;proof&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;reserve_assets_total_cents&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# True 300000 1000000
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Limitations
&lt;/h2&gt;

&lt;p&gt;Being precise about what is and isn't guaranteed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Determinism is on the time axis.&lt;/strong&gt; Account and transaction identifiers are UUID-based, so two ledgers rebuilt independently won't share identifiers or hashes; identifier stability is &lt;em&gt;not&lt;/em&gt; claimed. What &lt;em&gt;is&lt;/em&gt; claimed: a given ledger state, at a given time, is reproducibly provable, and any published proof is independently verifiable. (Content-addressed, rebuild-stable identifiers are on the roadmap.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Liabilities completeness.&lt;/strong&gt; Like all proof-of-reserves, it proves assets cover the liabilities you &lt;em&gt;include&lt;/em&gt;; it can't force you to include every liability. Per-user Merkle inclusion raises the cost of silently omitting someone, but it is not a substitute for an attestation of completeness.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No HTTP / serving layer.&lt;/strong&gt; Publishing a proof at an endpoint is the integrator's job; the library only produces and verifies the artifacts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No on-chain anchoring.&lt;/strong&gt; A proof isn't committed to a blockchain today (it could be layered on top); the core stays off-chain.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Early and unproven.&lt;/strong&gt; v0.1.1, no production adoption, APIs may change.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What it is not
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Not on-chain&lt;/strong&gt;, and not a replacement for or competitor to oracle-style PoR. Different domain, different consumers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Not a compliance product.&lt;/strong&gt; It makes no claim to satisfy any specific regulation, and nothing here is legal or financial advice. The regulatory climate is context, not an endorsement.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Not novel cryptography.&lt;/strong&gt; It's a clean integration of standard primitives (Merkle trees, hash chains) with a determinism discipline — the value is in the assembly and the verifiability, not in inventing new math.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Status &amp;amp; roadmap
&lt;/h2&gt;

&lt;p&gt;The determinism guarantee is on the time axis; UUID identifiers are the obvious next thing to make deterministic if cross-rebuild reproducibility is needed. There's no HTTP/serving layer and no on-chain anchoring (both could be layered on top). CI runs the suite on Python 3.11–3.13 plus a packaging check.&lt;/p&gt;

&lt;p&gt;Apache-2.0. On PyPI (&lt;code&gt;pip install openreserve&lt;/code&gt;); repo and issues: &lt;a href="https://github.com/Hiroshi-Ichiyanagi/openreserve" rel="noopener noreferrer"&gt;https://github.com/Hiroshi-Ichiyanagi/openreserve&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>fintech</category>
      <category>opensource</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
