Review paper · Blockchain Policy · TA-1

Verifiable without disclosure: anchored ledgers for organisational spending and pre-incorporation equity

Harshit Khemani

Roll number 241302081

B.Tech Computer Science and Engineering (Artificial Intelligence and Machine Learning), 2024–2028

Department of Computer Science and Engineering, School of Engineering and Technology

SGT University

harshit@khe.money · +91 97171 71333

OPEN THE SYSTEMVIEW THE SLIDESSOURCEOpens the print dialog. Choose Save as PDF as the destination.

Try it yourself

equity.agents.org.in

The full system, including the tamper simulator this paper's central claim rests on.

Abstract

Organisational spending is recorded in systems that cannot attest to their own integrity: the audit log lives in the same database as the records it audits, protected by the same access control it is meant to police. Proposals to move such records onto a public blockchain solve the integrity problem and create a worse one, because publishing an expense ledger makes salaries, vendor relationships and burn rate world-readable. This paper presents eQuity, a working system that resolves the tension by using a public chain for exactly one property it uniquely provides — a public, adversarial, unforgeable timestamp — while ordering, attribution and confidentiality are handled off-chain by a SHA-256 hash chain, ed25519 wallet signatures and Merkle inclusion proofs. A batch of ledger entries is committed on chain as a single 32-byte Merkle root; the entries themselves never leave the user’s browser. The same architecture is extended to pre-incorporation equity, where founders currently have no timestamped, attributable record of an agreed split, and to peer-to-peer fundraising in which a signed agreement travels inside a URL fragment that no server ever receives. We report an implementation of 90-plus modules, a threat model that names what the design does not cover, and a falsifiable demonstration: a built-in tamper simulator that edits a stored record and shows the chain failing in ten seconds.

Keywords: blockchain anchoring, Merkle commitment, expense auditing, event sourcing, cap table, SAFE, self-sovereign identity, Solana, tamper evidence, selective disclosure

1Introduction

An expense management platform stores claims, approvals and its own audit log in one database under one administrator. That administrator — or anyone who obtains their credentials — can alter an amount, substitute an approver, or backdate a submission, and then alter the log that would have recorded the change. The log is not independent evidence. It is another table in the same database.

This is not a hypothetical failure. The Association of Certified Fraud Examiners consistently finds expense reimbursement and billing schemes among the most common categories of asset misappropriation, with internal control override among the most common enablers. The control that fails is rarely the rule. It is the record.

A structurally identical problem exists one layer earlier in a company’s life. Before incorporation there is no register of members. Founders agree a split verbally or in a chat thread, and that agreement carries no timestamp, no signature, and no independent custodian. When it is disputed — commonly two to three years later, after value has accrued — the available evidence is a screenshot.

Both problems share a shape: a record whose integrity depends on the good faith of whoever holds it. This paper asks what the minimum intervention is that removes that dependence, and argues that it is considerably smaller than “put it on a blockchain”.

2Background and related work

The pattern this work builds on is anchoring: committing a cryptographic digest of off-chain data to a public ledger so that the data’s existence and state at a point in time become independently checkable, without the data itself being published.

Certificate Transparency (RFC 6962) established the template at scale, using append-only Merkle logs to make certificate issuance publicly auditable while keeping the log servers untrusted. OpenTimestamps applies the same idea to arbitrary documents over Bitcoin, aggregating many digests into one on-chain commitment to amortise cost. Solana Pay contributes a smaller but load-bearing technique used here: a “reference” public key attached to a transaction as a read-only, non-signer account purely so the transaction can later be located by address.

Where this work differs from existing blockchain accounting proposals is in what it declines to put on chain. Systems that record transactions themselves inherit the confidentiality problem and typically respond with permissioned chains, which reintroduces the trusted operator the design was meant to remove. By committing only a root, this design keeps a permissionless public chain and full confidentiality, at the cost of requiring the data holder to supply the entries for any verification.

The equity layer follows Y Combinator’s post-money SAFE, whose defining property is that an investor’s percentage is knowable on the day of signing, because dilution from other SAFEs is borne by founders rather than shared among investors.

3Design goals

The system was built to satisfy five requirements simultaneously:

  1. Attributable. Every entry names who authorised it, provably rather than by assertion.
  2. Tamper-evident. Any alteration is detectable by a third party who was not present when the record was made.
  3. Independently verifiable. Without trusting the application, its authors, or its host.
  4. Confidential. Commercially sensitive detail is never published.
  5. Usable. By a four-person team with no compliance function.

Requirement 4 is the one most blockchain proposals fail, and requirements 3 and 4 are in apparent tension: independent verification normally implies disclosure. Resolving that tension is the technical contribution of this work.

4Architecture

The resolution is a division of labour. The requirement that genuinely needs a blockchain is a public, adversarial timestamp: a commitment that cannot be backdated, cannot be selectively withdrawn, and is witnessed by parties with no relationship to the organisation. Databases cannot provide this, and neither can a single trusted timestamping authority, which is one point of trust and one point of coercion.

What is not needed is on-chain storage, on-chain computation, or a token. Each adds cost, latency and disclosure without addressing the requirement.

Three layers: the device holds the ledger, the network carries only Merkle roots, and peer transports move data between peopleTHE DEVICENever leaves the browserAppend-only event logseq · ts · type · actor · payloadSHA-256 hash chaineach entry commits to its predecessored25519 signaturesthe wallet signs the entry hashProjectionscap table, expenses, policyReceipt hashesthe file itself is never uploaded32 BYTESone Merkle rootSOLANAPublic, permissionless, nobody owns itSPL Memo transactioneQ1|org|0-51|6e1ab2…d695e7Reveals that a commitment exists. Nothing more.PEER TRANSPORTSNo infrastructure we operateURL fragment — never sent to a serverQR code — two devices, no networkFile — encrypted, or a synced folder
Figure 1. The division of labour. Ordering, attribution and confidentiality are handled on the device by cheap primitives; the chain is used for exactly one property it alone provides — a public, unforgeable timestamp. Only a 32-byte root crosses the boundary.

4.1 The event log

There is exactly one writable structure: an append-only array of events. Members, expenses, approvals, grants, SAFEs and policy are all projections, recomputed by replaying that array on every read.

interface LedgerEvent {
  seq: number;        // contiguous from 0
  ts: number;         // unix ms
  type: EventType;    // "expense.approved", "equity.granted", ...
  actor: string;      // Solana address, base58
  payload: object;    // type-specific
  prevHash: string;   // hash of event seq-1
  hash: string;       // SHA-256 over all of the above, canonicalised
  sig?: string;       // ed25519 over `hash`, by `actor`
  anchor?: AnchorRef; // set once covered by a published root
}

Nothing is stored twice. A cached projection would be a second source of truth, and the one easier to edit; recomputation is the price of having only one.

One append-only log replayed into several read-only projectionsAppend-only log012345Immutable. Only ever grows.project()pure replayon every readMembersread-onlyExpensesread-onlyCap tableread-onlySAFEsread-onlyPolicyread-onlyA cache here would be a second source of truth, and the one that is easier to edit.Recomputation is the cost of having only one.Historic payload shapes are reconciled in the reducer, never in the UI.
Figure 2. There is exactly one writable structure. Members, expenses, the cap table and SAFEs are all recomputed by replaying the log on every read, never cached and patched — so a projection cannot drift from the record it describes. If the two ever disagreed, the log would win.

4.2 Hashing and the chain

Each entry’s hash covers its sequence, timestamp, type, actor, canonicalised payload and its predecessor’s hash. It deliberately excludes the signature and the anchor: a signature is taken of the hash and an anchor is written after it, so folding either back in would be circular. This is precisely why anchoring an old batch can never invalidate a later entry.

JSON is canonicalised — object keys sorted at every depth — before hashing, so a round trip through storage cannot alter a digest and falsely report tampering.

A hash chain where editing one entry breaks every link after itEdit entry 12, and 13 and 14 stop verifying12entrypayloadprev 4e81…hash 9f2c…13entrypayloadprev 9f2c…hash 3ba0…14entrypayloadprev 3ba0…hash c48d…PUBLISHED ROOT6e1ab2…d695e7Covers entries 0–51.Cannot be altered by anyone.The hash covers seq, ts, type, actor, payload and prevHash — but deliberately excludes the signature and the anchor,because both are produced after the hash exists. Including either would be circular.
Figure 3. Each entry stores the SHA-256 of its predecessor. Editing entry 12 changes its hash, so entry 13’s stored prevHash no longer matches and every later link fails with it. Rewriting one line requires rewriting the entire tail — and any part of that tail already covered by a published root cannot be rewritten at all.

4.3 Merkle anchoring and selective disclosure

Anchoring builds a Merkle tree over the hashes of a contiguous batch and writes the root into a Solana transaction using the SPL Memo program, in the versioned form eQ1|orgId|from-to|root. Only the root goes on chain.

An odd node at any level is promoted rather than duplicated. Duplicating the final node is the CVE-2012-2459 shape, in which two distinct leaf sets can produce an identical root — a forgery primitive. Promotion eliminates that class entirely.

A Merkle tree with an inclusion proof for one leaf, and an odd node promoted rather than duplicatedrooth(h01+h23)h₄ promotedh(h0+h1)h(h2+h3)h₂h₃PROOF FOR h₂1. sibling h₃2. sibling h(h0+h1)3. sibling h₄3 hashes prove 5 entries
Figure 4. Selective disclosure. Proving entry h₂ requires only its sibling and one interior node — the shaded path — so a company can prove a single transaction to an auditor without revealing the rest of the ledger. The odd node h₄ is promoted rather than duplicated: duplicating the last node is the CVE-2012-2459 shape, in which two different leaf sets yield an identical root.

A subtlety discovered during implementation is worth recording, because it is a trap that a naive implementation falls into. A Merkle tree commits to hashes as stored. An adversary who edits an entry’s payload while leaving its stored hash field untouched produces an entry whose inclusion proof still verifies perfectly — the tree faithfully proves that a hash was published, not that the presented content produced it. Correct verification therefore requires recomputing the entry hash from its own fields and checking it against the leaf, in addition to checking the Merkle path. The implementation reports these as separate conditions and treats only their conjunction as verified.

/app/ledgerdevnet

On-chain anchor

Anchoredentries 0–51 · slot 298,441,077

SPL Memo payload

eQ1|org_m8kd2p|0-51|6e1ab2c7f4d0a93b5c8e2f71d4a06b93e5c17f8a2d6b04e91c3f7a5d8b2e6d695e7

52

entries covered

32

bytes published

5,000

lamports

Vendors, amounts and salaries stayed on the device. Anyone without the entries learns only that a commitment exists.

Figure 5. The published commitment as the application presents it. The entire on-chain footprint of fifty-two entries is the memo string shown: a version tag, an organisation id, the range covered, and one 32-byte root.

4.4 Identity

A Solana address is an ed25519 public key. An address, a signature and the signed bytes therefore constitute a complete, self-contained proof requiring no server and no trust in the application.

Every consequential action signs a human-readable statement naming the entry hash, so what appears in the wallet prompt is what is being agreed to rather than an opaque digest. This is a security property, not a courtesy: wallet-signature phishing works precisely because most prompts are unreadable, and a system that trains users to approve opaque blobs has manufactured a vulnerability while claiming to remove one.

4.5 Peer-to-peer transports

There is no backend. Everything that must move between two people uses a transport the authors do not operate: a URL fragment (never transmitted to a server by any browser), a QR code (two devices, no network), the chain itself, or a file the user controls.

A fundraise offer travelling in a URL fragment, countersigned and returned, with no server involvedCOMPANYsigns the termsed25519THE LINKpayload in the fragment/offer#z8Kq…INVESTORverifies, then countersignsed25519receipt link — both signatures over one document hashNo server sees the terms. No account is created. The investor’s acknowledgements are recorded verbatim inside the receipt.
Figure 6. The fundraise path. The signed offer travels in the URL fragment — the portion after #, which browsers never transmit — so the terms reach the investor without touching any infrastructure. Their browser verifies the company’s signature against its wallet address before displaying anything.

Ledger merges are fast-forward only. Where two copies share a history and then diverge, no automatic rule can select a winner without deleting somebody’s approvals, so the system reports the fork and names the tiebreaker: whichever chain a published root already covers demonstrably existed.

5Implementation

The system is a client-rendered Next.js application in TypeScript, with a Solana devnet deployment and Phantom as the wallet. Cryptography uses a synchronous SHA-256 implementation rather than crypto.subtle, because the audit view re-derives and verifies the entire chain during render and an asynchronous digest would force every reducer and every proof into a promise chain.

Two implementation decisions carry disproportionate weight. First, policy findings are evaluated at submission and frozen into the entry; re-evaluating historic expenses against current policy would silently erase findings that were real when made. Second, an expense stores the amount as incurred, its currency, the conversion rate and the provenance of that rate. Storing only a converted figure makes the number irreproducible; storing the rate without its source is barely better, since a later reader cannot tell whether it was a live quote, a reference table, or a typed override.

This matters far more for crypto than for fiat, and the reason is structural rather than merely practical. Because the ledger is hash-chained, a figure derived from a live price at read time could never participate in the hash: exclude it and the chain verifies a record omitting the amounts; include it and the hash breaks on the next price tick. There is no version of read-time pricing that survives a content-addressed ledger. Freezing the rate at write is what makes the chain verifiable at all.

/app/expensesdevnet

Expense · approved

Jared Dunn

IndiGo · Travel · 104 days ago

Approved

$311.75

from ₹26,000 INR

1 USD = 83.40 INR · frozen at submission

Signed off byDinesh · Richard
9f2c41a8…d695e7receipt hashed
/app/equitydevnet

Pied Piper · fully diluted

9,000,000 shares100.00%
  • Richard Hendricks4,000,000 common44.44%

    Fully vested

  • Bertram Gilfoyle2,500,000 common27.78%

    Fully vested

  • Dinesh Chugtai1,500,000 common16.67%

    62% vested

  • Option pool1,000,000 reserved · 190,000 granted11.11%

Jared holds 150,000 ISOs at $0.25. Pre-cliff, so nothing has vested yet.

Figure 7. Two of the surfaces this produces. Left: a single claim carrying the amount as incurred, the frozen rate and its provenance, and two independent signatures. Right: a register that exists before the company does, apportioned so the column sums to exactly 100.00 rather than to 99.99.

Identity is the wallet, and nothing else. There is no account to create and no directory to consult, so a member is an address plus whatever name the ledger recorded when they were added. Faces are generated locally from the address rather than fetched from an avatar host, because requesting an image per member would disclose the organisation’s entire membership to a third party on every page load — a leak that would be invisible, permanent, and entirely gratuitous.

/appdevnet

Pied Piper · 5 members

  • Richard HendricksFounderAll settled
  • Bertram GilfoyleAdminWaiting to be paid
  • Dinesh ChugtaiApprover1 flagged claim
  • Jared DunnMember1 claim sent back
  • Monica HallAuditorRead-only

Membership is a wallet. The face is generated from the address, so the same person looks the same to everybody before anyone customises anything.

Figure 8. The member roster. Each face reports the state of that person’s claims and is always paired with the same information in words, so the expression is never the only carrier — a rule that also keeps the colour from being the only carrier.

An MCP server ships alongside the application so that AI agents can audit a ledger. It operates on an exported bundle plus public chain data, because there is no API to call — and it deliberately re-implements the verification logic rather than importing the application’s own, since a checker that borrows the code it is checking would faithfully reproduce that code’s bugs and prove nothing.

6Security analysis

The security argument reduces to one function. Re-derive every hash from the stored fields; if a row was edited, its recomputed digest diverges, and because each event commits to its predecessor, every later link breaks with it. An adversary must therefore rewrite the entire suffix — and any part of that suffix already covered by a published root is contradicted by a public commitment they cannot alter.

Adversary capabilityOutcome
Edits a stored entryDetected — the recomputed hash diverges and every later link breaks
Rewrites the whole suffixDetected once anchored — the published root no longer matches
Forges an approvalPrevented — requires the signer's private key
Approves their own claimPrevented structurally, and surfaced by the audit scan
Alters a fundraise link in transitDetected in the recipient's browser before anything is signed
Compromises the application hostNo user data exists to take — there is no server
Backdates an entryBounded by the anchoring interval, and the gap is visible
Clears browser storageNot covered — mitigated by backup and folder sync
Steals a recovery phraseNot covered — wallet security is out of scope
Submits a fabricated receiptNot covered — integrity is not truth
Figure 9. The threat model, including what it does not cover. The last two rows are the honest boundary of the entire approach: the system proves a record was not altered after the fact, and cannot prove it was true when written.

The final two rows are the honest boundary of the entire approach and of every integrity system: the design proves that a record was not altered after the fact. It cannot prove the record was true when written. A fabricated receipt hashes as cleanly as a real one.

7Policy analysis

7.1 What the record legally is

The system produces evidence, not filings. A hash-chained, wallet-signed, publicly anchored statement is timestamped, attributable and tamper-evident — properties a court weighs alongside other evidence. It does not create, transfer or perfect legal title, is not notarisation in any jurisdiction by default, and does not render an unenforceable agreement enforceable.

Conflating evidence with a filing would be the most consequential error this project could make. A cap table here mirrors real ownership at best; the statutory register remains authoritative, and where the two disagree the register wins.

7.2 Securities law

An instrument granting a future right to equity in exchange for money is almost always a security, and offering securities is regulated in nearly every jurisdiction. The rules turn on who is offered, how they are reached, and where each party is located. A private approach to known parties is treated very differently from general solicitation, and a publicly posted bearer link can convert a private placement into a public offering.

The implementation responds by surfacing this at the point of link creation rather than in a terms page, and by recording the investor’s acknowledgements verbatim inside the countersignature, so a later dispute can establish what the investor was shown at the moment they signed rather than what a policy document said at some other date.

7.3 Data protection and the erasure tension

The architecture is privacy-preserving by construction rather than by policy: there is no controller-held personal data, no accounts, no server logs. This sidesteps most GDPR and DPDP obligations by having nothing to process.

A genuine tension remains. Wallet addresses are pseudonymous identifiers, and transactions on a public chain are permanent and cannot be erased. The right to erasure is therefore in real conflict with immutability — which is exactly why the design publishes only roots. A root is not personal data, and there is consequently nothing on chain that anyone could be asked to erase.

7.4 Autonomous agents as contributors

The system permits an AI agent to be recorded as a contributor with its own wallet, but never as an owner. Essentially no jurisdiction recognises an autonomous software agent as a legal person capable of holding title or being sued. Every agent therefore carries a named operator who legally holds anything allocated to that agent and is accountable for its conduct: the agent’s wallet records attribution, and the operator holds the property. Modelling it otherwise would place an unenforceable line on a cap table, which is worse than no line at all.

8Evaluation

The central claim — that tampering is detectable — is made falsifiable in the product itself. The audit view includes a tamper simulator that edits a stored amount while leaving the stored hash untouched, exactly as an adversary with storage access would. The integrity check then fails at that entry and at every entry after it, and a restore control reverses it. A demonstration a sceptic can run in ten seconds is stronger evidence than any assertion in this paper.

/app/auditdevnet

Integrity check · after tampering

Chain broken at entry 12. 3 of 54 entries no longer verify.

  • 11 · expense.submitted
  • 12 · expense.approvedRecomputed hash does not match the stored hash
  • 13 · equity.grantedPredecessor hash broken
  • 14 · anchor.committedPredecessor hash broken

One amount was altered. Entry 12 fails on its own content; 13 and 14 fail because they commit to it.

Figure 10. The integrity check after the simulator has edited one stored amount. Entry 12 fails on its own content — the hash recomputed from its fields no longer matches the hash stored beside them — and entries 13 and 14 fail because they commit to it. The healthy state is not shown, because a system with no integrity guarantee at all would produce an identical picture of everything passing.

Verification is fully independent. Given an exported bundle, a third party can recompute every hash, confirm every predecessor link, rebuild each Merkle tree, fetch each anchoring transaction from any public RPC and compare roots, verify every signature against its actor’s address, and replay the log to re-derive the cap table and totals. Every export includes the raw log for exactly this purpose: a summary that cannot be recomputed is a claim, not an audit.

Cost is negligible. One anchoring transaction carries a base fee of 5,000 lamports regardless of how many entries the root covers, so ten thousand entries anchored in batches cost a fraction of a cent in aggregate. Read cost is one RPC call per thousand transactions, because the memo text is returned inline with the signature listing.

9Limitations

  1. Anchoring frequency is a policy choice. Between anchors the ledger is only tamper-evident to a party holding a prior copy. Shorter intervals cost more transactions.
  2. Availability is the user’s responsibility. No backend means no server-side backup. Encrypted export and folder sync mitigate this; they do not eliminate it.
  3. Rate sources. Live rates are fetched from a public endpoint with a static table as an offline fallback. Production use should read an oracle at the instant of transfer and record the value used.
  4. Single-signature treasury. Reimbursement is presently one signature; a real treasury belongs behind a multisig.
  5. Same-slot ordering. Solana’s signature listing does not expose transaction index, so intra-slot ordering is not reliably readable from the RPC. The design does not depend on it, because ordering is carried by the sequence number and predecessor hash within the payload.
  6. Integrity is not truth. The system proves a record was not altered. It cannot establish that it was accurate when created.

10Future work

Four directions follow naturally. A multisig treasury would remove the single-signature reimbursement path. Zero-knowledge policy proofs would allow a company to prove that an expense satisfied policy without revealing the amount, enabling public compliance attestation over private figures. Encrypted on-chain messaging, using X25519 keys derived from wallet signatures, would let invitations and countersignatures deliver themselves over the chain already being used for anchoring, removing the last manually-carried step in the peer-to-peer flows. Finally, formal verification of the apportionment and SAFE conversion arithmetic would raise confidence in the two places where an error is silent and expensive.

11Conclusion

The contribution here is not that a blockchain was used, but that it was used for exactly one thing: an unforgeable, non-disclosing, publicly witnessed timestamp. Ordering, attribution, policy enforcement and confidentiality are handled by considerably cheaper mechanisms that require no publication — hash chains, ed25519 signatures, and Merkle proofs.

That division is what makes the result deployable. A team obtains a spending record an outsider can verify and an ownership record that exists before the company does, without publishing their salaries, trusting a vendor, or running a server. The cost is that verification requires the data holder’s cooperation — they must supply the entries — which is a materially weaker property than a fully public ledger, and an honest account of this design must say so.

References

  1. [1]Laurie, B., Langley, A., and Kasper, E. Certificate Transparency. RFC 6962, Internet Engineering Task Force, June 2013. www.rfc-editor.org/rfc/rfc6962Obsoleted by RFC 9162. Cited in its original form because it is the document that established the append-only Merkle log as a deployable pattern.
  2. [2]Y Combinator. The SAFE: post-money SAFE forms and SAFE User Guide. www.ycombinator.com/documents
  3. [3]Solana Labs. Solana Pay Specification. docs.solanapay.com/specSource of the reference-key technique used here to make an anchoring transaction locatable by address.
  4. [4]Solana Program Library. SPL Memo program documentation. www.solana-program.com/docs/memo
  5. [5]National Vulnerability Database. CVE-2012-2459: Bitcoin Merkle tree duplicate-node vulnerability, permitting distinct leaf sets to yield identical roots. nvd.nist.gov/vuln/detail/CVE-2012-2459
  6. [6]OpenTimestamps. A timestamping proof standard: scalable, trust-minimised anchoring over Bitcoin. opentimestamps.org
  7. [7]OWASP Foundation. Password Storage Cheat Sheet — PBKDF2 iteration guidance. cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html
  8. [8]Association of Certified Fraud Examiners. Occupational Fraud 2026: A Report to the Nations. www.acfe.com/fraud-resources/report-to-the-nations2,402 cases across 143 countries; the source for the claim that expense reimbursement and billing schemes recur among the most common misappropriation categories, with control override among the most common enablers.
  9. [9]Merkle, R. C. A Digital Signature Based on a Conventional Encryption Function. Advances in Cryptology — CRYPTO ’87, LNCS 293, pp. 369–378, 1988. doi.org/10.1007/3-540-48184-2_32
  10. [10]Bernstein, D. J., Duif, N., Lange, T., Schwabe, P., and Yang, B.-Y. High-speed high-security signatures. Journal of Cryptographic Engineering 2(2), pp. 77–89, 2012. doi.org/10.1007/s13389-012-0027-1
The system described here is a working implementation, running at equity.agents.org.in with source at github.com/HKTITAN/equity. It is a coursework project and a demonstration; nothing in it is legal, tax or investment advice, and it is not a registered transfer agent or cap table of record. See the legal notices for the full position.