feat: shielded credit pool with Orchard ZK proofs (Medusa)#3076
feat: shielded credit pool with Orchard ZK proofs (Medusa)#3076QuantumExplorer wants to merge 58 commits intov3.1-devfrom
Conversation
|
Important Review skippedDraft detected. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
❌ gRPC Query Coverage ReportTotal: 61 queries — 58 implemented, 2 ignored, 1 missing ❌ Missing
⏭️ Ignored (@sdk-ignore) (2)
✅ Implemented (58)
|
|
✅ DashSDKFFI.xcframework built for this PR.
SwiftPM (host the zip at a stable URL, then use): .binaryTarget(
name: "DashSDKFFI",
url: "https://your.cdn.example/DashSDKFFI.xcframework.zip",
checksum: "e806187988764d3917455f23c91160fe8f5c48c0006adc0a63754ee76a24d0f0"
)Xcode manual integration:
|
… anchors Add OptionalFeatureVersion dispatch for record_shielded_pool_anchor_if_changed so it is a no-op on protocol versions < 12 (which lack the shielded pool). This fixes strategy test panics when running chains starting from older protocol versions. Also adds a "Shielded Pool: Anchors and Spend Proofs" chapter to the book explaining why anchors make ZK spend proofs possible. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Accept v3.1-dev for dpp (merged feat/zk-dpp changes). Adapt drive, drive-abci, rs-sdk, and wasm-dpp to match updated dpp struct fields: - Remove flags from shielded transitions and OrchardBundleParams - value_balance: i64 -> amount/unshielding_amount: u64 - Remove user_fee_increase from ShieldFromAssetLock - Remove builder/ directory (replaced by builder.rs from v3.1-dev)
… hardcoding Each transition type determines the correct flags byte: - Shield/ShieldFromAssetLock: FLAGS_OUTPUTS_ONLY (0x02) - dummy spends, real outputs - Unshield/ShieldedWithdrawal: FLAGS_SPENDS_ONLY (0x01) - real spends, dummy outputs - ShieldedTransfer: FLAGS_SPENDS_AND_OUTPUTS (0x03) - both real
# Conflicts: # packages/rs-dpp/src/shielded/builder/mod.rs # packages/rs-dpp/src/shielded/builder/shield.rs # packages/rs-dpp/src/shielded/builder/shield_from_asset_lock.rs # packages/rs-dpp/src/shielded/builder/shielded_transfer.rs # packages/rs-dpp/src/shielded/builder/shielded_withdrawal.rs # packages/rs-dpp/src/shielded/builder/unshield.rs # packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/address_funds_transfer/tests.rs # packages/rs-drive-abci/tests/strategy_tests/verify_state_transitions.rs # packages/rs-drive/src/drive/initialization/v3/mod.rs # packages/rs-drive/src/drive/shielded/estimated_costs.rs # packages/rs-drive/src/drive/shielded/mod.rs # packages/rs-drive/src/drive/shielded/prove/mod.rs # packages/rs-drive/src/drive/shielded/prove/prove_nullifiers_branch_query/mod.rs # packages/rs-drive/src/drive/shielded/prove/prove_nullifiers_branch_query/v0/mod.rs # packages/rs-drive/src/fees/op.rs # packages/rs-drive/src/prove/prove_state_transition/v0/mod.rs # packages/rs-drive/src/state_transition_action/action_convert_to_operations/shielded/mod.rs # packages/rs-drive/src/state_transition_action/action_convert_to_operations/shielded/shielded_transfer_transition.rs # packages/rs-drive/src/state_transition_action/action_convert_to_operations/shielded/shielded_withdrawal_transition.rs # packages/rs-drive/src/state_transition_action/action_convert_to_operations/shielded/unshield_transition.rs # packages/rs-drive/src/state_transition_action/action_convert_to_operations/system/penalize_shielded_pool.rs # packages/rs-drive/src/state_transition_action/shielded/mod.rs # packages/rs-drive/src/state_transition_action/shielded/shield/transformer.rs # packages/rs-drive/src/state_transition_action/shielded/shield/v0/transformer.rs # packages/rs-drive/src/state_transition_action/shielded/shield_from_asset_lock/transformer.rs # packages/rs-drive/src/state_transition_action/shielded/shield_from_asset_lock/v0/transformer.rs # packages/rs-drive/src/state_transition_action/shielded/shielded_transfer/transformer.rs # packages/rs-drive/src/state_transition_action/shielded/shielded_transfer/v0/transformer.rs # packages/rs-drive/src/state_transition_action/shielded/shielded_withdrawal/transformer.rs # packages/rs-drive/src/state_transition_action/shielded/shielded_withdrawal/v0/transformer.rs # packages/rs-drive/src/state_transition_action/shielded/unshield/transformer.rs # packages/rs-drive/src/state_transition_action/shielded/unshield/v0/transformer.rs # packages/rs-drive/src/util/batch/drive_op_batch/drive_methods/apply_drive_operations/v0/mod.rs # packages/rs-drive/src/util/batch/drive_op_batch/finalize_task.rs # packages/rs-drive/src/util/batch/drive_op_batch/shielded.rs # packages/rs-drive/src/util/grove_operations/grove_get_proved_path_query_v1/v0/mod.rs # packages/rs-drive/src/util/grove_operations/grove_insert_empty_tree/v0/mod.rs # packages/rs-drive/src/verify/address_funds/verify_compacted_address_balance_changes/v0/mod.rs # packages/rs-drive/src/verify/shielded/verify_compacted_nullifier_changes/mod.rs # packages/rs-drive/src/verify/shielded/verify_compacted_nullifier_changes/v0/mod.rs # packages/rs-drive/src/verify/shielded/verify_nullifiers_trunk_query/v0/mod.rs # packages/rs-drive/src/verify/shielded/verify_recent_nullifier_changes/mod.rs # packages/rs-drive/src/verify/shielded/verify_recent_nullifier_changes/v0/mod.rs # packages/rs-drive/src/verify/shielded/verify_shielded_encrypted_notes/mod.rs # packages/rs-drive/src/verify/shielded/verify_shielded_encrypted_notes/v0/mod.rs # packages/rs-drive/src/verify/shielded/verify_shielded_nullifiers/mod.rs # packages/rs-drive/src/verify/shielded/verify_shielded_nullifiers/v0/mod.rs # packages/rs-drive/src/verify/state_transition/verify_state_transition_was_executed_with_proof/v0/mod.rs
Accept rs-drive from v3.1-dev and update drive-abci callers: - Notes/anchor extraction moved inside drive transformers - cleanup_expired_nullifiers renamed to cleanup_expired_nullifier_compactions - Nullifier query return types changed from tuples to structs - Element::empty_commitment_tree now returns Result Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
# Conflicts: # Cargo.lock # packages/rs-drive-abci/Cargo.toml # packages/rs-drive-abci/src/execution/engine/run_block_proposal/v0/mod.rs # packages/rs-drive-abci/src/execution/platform_events/block_processing_end_events/mod.rs # packages/rs-drive-abci/src/execution/platform_events/block_processing_end_events/record_shielded_pool_anchor/v0/mod.rs # packages/rs-drive-abci/src/execution/types/execution_event/mod.rs # packages/rs-drive-abci/src/execution/validation/state_transition/check_tx_verification/v0/mod.rs # packages/rs-drive-abci/src/execution/validation/state_transition/processor/traits/basic_structure.rs # packages/rs-drive-abci/src/execution/validation/state_transition/processor/traits/shielded_proof.rs # packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs # packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/shield/tests.rs # packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/shield_from_asset_lock/tests.rs # packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/shield_from_asset_lock/transform_into_action/v0/mod.rs # packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/shielded_common/mod.rs # packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/shielded_transfer/tests.rs # packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/shielded_transfer/transform_into_action/v0/mod.rs # packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/shielded_withdrawal/tests.rs # packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/shielded_withdrawal/transform_into_action/v0/mod.rs # packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/test_helpers.rs # packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/unshield/tests.rs # packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/unshield/transform_into_action/v0/mod.rs # packages/rs-drive-abci/src/query/service.rs # packages/rs-drive-abci/src/query/shielded/anchors/v0/mod.rs # packages/rs-drive-abci/src/query/shielded/mod.rs # packages/rs-drive-abci/tests/strategy_tests/strategy.rs # packages/rs-drive-abci/tests/strategy_tests/test_cases/mod.rs # packages/rs-drive-abci/tests/strategy_tests/test_cases/shielded_tests.rs # packages/rs-drive-abci/tests/strategy_tests/verify_state_transitions.rs # packages/wasm-dpp2/src/state_transitions/proof_result.rs
Re-enable all shielded code that was commented out on v3.1-dev because the OperationType shielded variants and dapi-grpc protobuf types were not available there. On feat/zk these dependencies exist. - Restore shielded query endpoints in query/service.rs - Restore shielded module declarations in query/shielded/mod.rs - Restore ShieldedState full impl, imports, helper methods, and match arms in strategy tests - Fix drive-proof-verifier nullifier type mismatches (struct vs tuple) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
# Conflicts: # .github/grpc-queries-cache.json
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Issue being fixed or feature implemented
Implements the shielded credit pool for Dash Platform (protocol version 12), enabling private value transfers using the Zcash Orchard protocol adapted for Platform's credit system. This is the core privacy feature for Dash Platform, allowing users to shield, transfer, unshield, and withdraw credits without revealing transaction amounts or linkage between sender and receiver.
What was done?
Five new state transition types
Each transition carries an Orchard bundle: serialized actions, a Halo 2 zero-knowledge proof, and RedPallas signatures. The Orchard circuit proves value conservation (inputs = outputs + value_balance) without revealing individual amounts.
Cryptographic foundation
SHA-256("DashPlatformSighash" || bundle_commitment || extra_data)) cryptographically binds Orchard bundle data to platform-specific transparent fieldsOn-chain state structure
The shielded pool lives under
[AddressBalances, "s"]with:[1][2][5][6]Nullifier tracking for recent block sync lives under
SavedBlockTransactionswith expiration-based cleanup.Validation pipeline
value_balance >= min_fee(placed before proof verification to reject underpaying bundles cheaply)BatchValidatorFee model
Shielded fees are embedded in
value_balanceand cryptographically bound to the ZK proof:The binding signature proves
value_balancewas not tampered with after bundle construction.SDK support
rs-sdk):ShieldedTransitionBuilderfor constructing all 5 transition types,ClientCommitmentTreefor wallet-side note tracking and Merkle witness generation, nullifier sync module for detecting spent notesjs-dash-sdk):platform.shielded.shield(),shieldedTransfer(),unshield(),shieldedWithdrawal(),shieldFromAssetLock()methodswasm-dpp,wasm-dpp2): JavaScript bindings for shielded state transition types and Orchard bundle handlingrs-dapi-client): gRPC transport forGetShieldedPoolState,GetShieldedEncryptedNotes,GetShieldedAnchors,GetShieldedNullifiersgRPC API (platform.proto)
New endpoints for light client syncing:
getShieldedPoolState— pool parameters, total balance, note countgetShieldedEncryptedNotes— encrypted notes by global position range (with V1 proof support for BulkAppendTree)getShieldedAnchors— historical anchors by block heightgetShieldedNullifiers— published nullifiers for spent note detectionPlatform versioning
DriveAbciStateTransitionProcessingMethodVersionsfields:store_nullifiers_to_recent_block_storage,cleanup_recent_block_storage_nullifiers(OptionalFeatureVersion,Nonefor v1-v6,Some(0)for v7)DriveAbciBlockEndMethodVersionsfield:record_shielded_pool_anchor(OptionalFeatureVersion)create_initial_state_structure: 3) creates the shielded pool tree structureDriveShieldedMethodVersionsfor nullifier query configurationDrive operations
ShieldedTransitionAction→DriveOperationconversion for each transition typeDriveOperationFinalizeTask::RecordShieldedAnchor— post-commit callback to record commitment tree anchorDocumentation
docs/SHIELDED_CLIENT_INTEGRATION.md— comprehensive 850+ line guide covering key management, bundle construction, note tracking, light client syncing, trial decryption, and fee modelbook/src/state-transitions/return-proofs.md— shielded transition proof verification documentationPackages modified
rs-dpprs-drivers-drive-abcirs-platform-versiondapi-grpcrs-sdkrs-dapi-clientjs-dash-sdkwasm-dpp/wasm-dpp2rs-drive-proof-verifierHow Has This Been Tested?
run_chain_shield_transitions,run_chain_shield_from_asset_lock_transitions,run_chain_shielded_transfer_transitions,run_chain_unshield_transitions,run_chain_shielded_withdrawal_transitionsBreaking Changes
None. The shielded pool is introduced in protocol version 12 and is fully version-gated. All new version fields use
OptionalFeatureVersionset toNonefor protocol versions ≤ 11 andSome(0)for protocol version 12. Existing tests and behavior are unaffected.Checklist:
For repository code-owners and collaborators only