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
Try it yourself
equity.agents.org.inThe 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:
- Attributable. Every entry names who authorised it, provably rather than by assertion.
- Tamper-evident. Any alteration is detectable by a third party who was not present when the record was made.
- Independently verifiable. Without trusting the application, its authors, or its host.
- Confidential. Commercially sensitive detail is never published.
- 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.
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.
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.
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.
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.
On-chain anchor
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.
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.
#, 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.
Expense · approved
Jared Dunn
IndiGo · Travel · 104 days ago
$311.75
from ₹26,000 INR
1 USD = 83.40 INR · frozen at submission
Pied Piper · fully diluted
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.
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.
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.
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 capability | Outcome |
|---|---|
| Edits a stored entry | Detected — the recomputed hash diverges and every later link breaks |
| Rewrites the whole suffix | Detected once anchored — the published root no longer matches |
| Forges an approval | Prevented — requires the signer's private key |
| Approves their own claim | Prevented structurally, and surfaced by the audit scan |
| Alters a fundraise link in transit | Detected in the recipient's browser before anything is signed |
| Compromises the application host | No user data exists to take — there is no server |
| Backdates an entry | Bounded by the anchoring interval, and the gap is visible |
| Clears browser storage | Not covered — mitigated by backup and folder sync |
| Steals a recovery phrase | Not covered — wallet security is out of scope |
| Submits a fabricated receipt | Not covered — integrity is not truth |
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.
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.
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
- 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.
- 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.
- 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.
- Single-signature treasury. Reimbursement is presently one signature; a real treasury belongs behind a multisig.
- 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.
- 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]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]Y Combinator. The SAFE: post-money SAFE forms and SAFE User Guide. www.ycombinator.com/documents
- [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]Solana Program Library. SPL Memo program documentation. www.solana-program.com/docs/memo
- [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]OpenTimestamps. A timestamping proof standard: scalable, trust-minimised anchoring over Bitcoin. opentimestamps.org
- [7]OWASP Foundation. Password Storage Cheat Sheet — PBKDF2 iteration guidance. cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html
- [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]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]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