Research / Chain files / Zcash

Zcash: who can change what the oracle reads

6 Zcash targets are scored and attested: the consensus-rule authority of Zcash itself, the funding streams, two custody vaults and a bridge. Zcash has no contract VM, so there is no oracle contract: the scores are committed in a transaction on Zcash Testnet, and the page says what that proves and what it does not.

What a track judge can check in two minutes

Zcash has no contract VM, so the scores are committed in one transaction on Zcash Testnet. Three checks, with git, python3 and curl and nothing from us.

git clone --depth 1 https://github.com/RealSpap/authority-risk-oracle-showcase
cd authority-risk-oracle-showcase/chains/zcash/scripts

# 1. re-derive every leaf, the Merkle root and the commitment from the records, and check each inclusion proof
python3 attest_scores.py verify ../data/testnet_attestation_v2_six_live_2026-09-20.json

# 2. the commitment (the OP_RETURN data, ARO2 plus 32 bytes) is in the raw transaction 462de12bf72e5e635a1feed4a4cedb02c03f17745bd15176787f8f5f8fcd701c
curl -s https://api.testnet.cipherscan.app/api/tx/462de12bf72e5e635a1feed4a4cedb02c03f17745bd15176787f8f5f8fcd701c/raw | python3 -c "import json,sys; h=json.load(sys.stdin)['hex']; print('41524f32214f8105de87576532d84c10e86478c6228bb54a7e426dfb4c349f7dcaeb24ca' in h)"

# 3. when and where the transaction was mined
curl -s https://api.testnet.cipherscan.app/api/tx/462de12bf72e5e635a1feed4a4cedb02c03f17745bd15176787f8f5f8fcd701c | python3 -c "import json,sys; d=json.load(sys.stdin); print(d['blockHeight'], d['blockTime'], d['status'])"

Expected

1 -> 6 proofs OK, self re-derivation: MATCH, VERIFY PASS
2 -> True
3 -> 4371248 1789932225 confirmed

3 findings, each with its replay

1. The whole Zcash set is committed in one transaction, and anyone can re-derive the commitment from the published records

A script turns every target returned by the Zcash scorer into one commitment: a Merkle root over per-target records, hashed with a header, written as the 36-byte data of a single OP_RETURN output, the tag ARO2 followed by the commitment. The transaction is on Zcash Testnet and never on mainnet. Each target has an inclusion proof against the root, so one score can be checked without the others. The replay below re-derives the commitment from the published records, checks the six inclusion proofs and finds the commitment in the raw transaction.

Replay it (public data, no key)
# re-derive the commitment from the records and read the six scores
git clone --depth 1 https://github.com/RealSpap/authority-risk-oracle-showcase
cd authority-risk-oracle-showcase/chains/zcash/scripts
python3 attest_scores.py verify ../data/testnet_attestation_v2_six_live_2026-09-20.json | tail -4
python3 -c "import json; [print(r['target'][:12], r['compositeScore']) for r in json.load(open('../data/testnet_attestation_v2_six_live_2026-09-20.json'))['records']]"
# -> self re-derivation: MATCH, VERIFY PASS, then six targets with composites 34, 56, 56, 32, 32 and 7
# the commitment is in the raw transaction served by a testnet explorer
TX=462de12bf72e5e635a1feed4a4cedb02c03f17745bd15176787f8f5f8fcd701c
curl -s https://api.testnet.cipherscan.app/api/tx/$TX/raw | python3 -c "import json,sys; h=json.load(sys.stdin)['hex']; o=json.load(open('../data/testnet_attestation_v2_six_live_2026-09-20.json'))['opReturnDataHex']; print(o in h)"
# -> True

Notes: testnet_oracle_batch_2026-09-19.md

2. The Zcash shielded pools are disclosed as facts and deliberately not scored: a trusted-setup assumption is not a read anyone can repeat

Sprout and Sapling use Groth16 proofs with a trusted setup, from a ceremony of 6 participants for Sprout and around 90 per round for Sapling; Orchard and Ironwood use Halo 2, which does not need one. If a ceremony's hidden structure were recovered, fake proofs could counterfeit funds in that pool. The note decides not to turn this into a 0 to 100 number: every other score here comes from a read that can be repeated today, while whether at least one participant was honest is an assumption about past conduct that no read can answer. A number would look as checkable as the others and would not be.

Replay it (public data, no key)
# the primary source: ZIP 224 on the Orchard proving system
curl -s https://zips.z.cash/zip-0224 | python3 -c "import sys,re; t=re.sub(r'\\s+',' ',re.sub(r'<[^>]+>',' ',sys.stdin.read())); i=t.find('does not require an SRS'); print(t[i-120:i+30])"
# -> a sentence that ends: ... a proving system that is both amenable to recursion and does not require an SRS

Notes: pool_trusted_setup_disclosure_2026-09-17.md

3. Three payout addresses receive more than half of recent Zcash blocks, and the search for who they are came back empty

Reading the coinbase payout of the last 2000 blocks, the top three transparent addresses together receive more than half of them (57.9 percent on 26 September 2026). The two largest addresses without a published label, at 27.2 and 7.0 percent that day, could not be attributed: the note records a search through mining pool sites, block explorers and the Zcash forum, found no primary source naming either, and publishes that as a negative result instead of a guess. This concentration is part of the Zcash L1 score. The replay prints the shares of today's window.

Replay it (public data, no key)
# the tip of the chain, then the payout shares of the 2000 blocks before it
git clone --depth 1 https://github.com/RealSpap/authority-risk-oracle-showcase
cd authority-risk-oracle-showcase/chains/zcash/scripts
HOST=zec.rocks:443
TIP=$(python3 zcash_read.py info $HOST | sed -n 's/^blockHeight=//p')
python3 miner_concentration.py $HOST $((TIP-2010)) $((TIP-10)) | tail -3
# -> the three largest shares sum above 50 percent: addresses_to_exceed_50pct=3 (a changing window: the number can move)

Notes: finding_2026-09-26-coinbase-address-attribution.md

Targets

6 targets are tracked on Zcash, scored and attested in a signed commitment on Zcash Testnet. Bands of the composite score:

critical1
weak3
moderate2

Up to 6 targets, ordered by value where known, then by lowest score.

TargetCompositeBand
zec.omft.near (NEAR PoA bridge, ZEC)7critical
ZCG funding stream (FS_FPF_ZCG_H3)32weak
ZIP 271 one-time lockbox disbursement32weak
Zcash L1 (consensus-rule-change authority)34weak
Maya Protocol Asgard vault mayapub1addwnpepqdgafgd6... (native ZEC custody, TSS)56moderate
Maya Protocol Asgard vault mayapub1addwnpepq24t2hk5... (native ZEC custody, TSS)56moderate

What is not read

Read from the public repository and the Watch at build, 2026-10-15 21:09 UTC. A finding is a dated reading with its replay, not an audit and not investment advice. All chain files ยท Dashboard.