// nockchain/common/v2/blockchain.proto syntax = "proto3"; package nockchain.public.v2; import "primitives.proto"; import "pagination.proto"; option go_package = "./;nockchain"; message Balance { repeated BalanceEntry notes = 1; BlockHeight height = 2; optional Hash block_id = 3; PageResponse page = 4; } message BalanceEntry { Name name = 1; Note note = 2; } message RawTransaction { NoteVersion version = 1; Hash id = 2; repeated SpendEntry spends = 3; } message SpendEntry { Name name = 1; Spend spend = 2; } message Spend { oneof spend_kind { LegacySpend legacy = 1; WitnessSpend witness = 2; } } message LegacySpend { Signature signature = 1; repeated Seed seeds = 2; Nicks miner_fee_nicks = 3; } message WitnessSpend { Witness witness = 1; repeated Seed seeds = 2; Nicks fee = 3; } message Seed { // Absent when the seed originates from a coinbase output. Source output_source = 1; Hash lock_root = 2; NoteData note_data = 3; Nicks gift = 4; Hash parent_hash = 5; } message Witness { LockMerkleProof lock_merkle_proof = 1; PkhSignature pkh_signature = 2; repeated HaxPreimage hax = 3; //uint64 tim = 4; // reserved field, currently 0 } message HaxPreimage { Hash hash = 1; bytes value = 2; // jammed noun bytes } message PkhSignature { repeated PkhSignatureEntry entries = 1; } message PkhSignatureEntry { Hash hash = 1; SchnorrPubkey pubkey = 2; SchnorrSignature signature = 3; } message LockMerkleProof { SpendCondition spend_condition = 1; uint64 axis = 2; MerkleProof proof = 3; } message SpendCondition { repeated LockPrimitive primitives = 1; } message LockPrimitive { oneof primitive { PkhLock pkh = 1; LockTim tim = 2; HaxLock hax = 3; BurnLock burn = 4; } } message PkhLock { uint64 m = 1; repeated Hash hashes = 2; } message LockTim { TimeLockRangeRelative rel = 1; TimeLockRangeAbsolute abs = 2; } message HaxLock { repeated Hash hashes = 1; } message BurnLock {} message MerkleProof { Hash root = 1; repeated Hash path = 2; } message OutputSource { optional Source source = 1; } message Source { Hash hash = 1; bool coinbase = 2; } message TimeLockIntent { oneof value { TimeLockRangeAbsolute absolute = 1; TimeLockRangeRelative relative = 2; TimeLockRangeAbsoluteAndRelative absolute_and_relative = 3; } } message TimeLockRangeAbsoluteAndRelative { optional TimeLockRangeAbsolute absolute = 1; optional TimeLockRangeRelative relative = 2; } // min and max are absolute origin page numbers message TimeLockRangeAbsolute { optional BlockHeight min = 1; optional BlockHeight max = 2; } // min and max are relative to the note's creation page message TimeLockRangeRelative { optional BlockHeightDelta min = 1; optional BlockHeightDelta max = 2; } // =================================================================== // Wallet Domain Types: UTXO (nnote), Lock, and Signature (multisig) // =================================================================== message Lock { uint32 keys_required = 1; // threshold of keys required to spend the note // DEPRECATED: repeated string schnorr_pubkeys_b58 = 2; repeated SchnorrPubkey schnorr_pubkeys = 2; // schnorr pubkeys (curve: cheetah) } message Name { // First is the hash of whether the note has a timelock and the lock Hash first = 1; // Last is the hash of the actual timelock and the source Hash last = 2; } message Note { oneof note_version { NoteV0 legacy = 1; NoteV1 v1 = 2; } } message NoteV0 { BlockHeight origin_page = 1; // page-number when added to balance optional TimeLockIntent timelock = 2; // enforced timelock Name name = 3; // nname (human/name label) Lock lock = 4; // spending condition Source source = 5; // provenance commitment Nicks assets = 6; // coin amount (nicks) NoteVersion version = 7; // note version (currently 0) } message NoteV1 { NoteVersion version = 1; BlockHeight origin_page = 2; Name name = 3; NoteData note_data = 4; Nicks assets = 5; } message NoteData { repeated NoteDataEntry entries = 1; } message NoteDataEntry { string key = 1; bytes blob = 2; // jammed noun bytes } message Signature { repeated SignatureEntry entries = 1; } message SignatureEntry { SchnorrPubkey schnorr_pubkey = 1; // serialized pubkey corresponding to the signer SchnorrSignature signature = 2; } message SchnorrSignature { EightBelt chal = 1; EightBelt sig = 2; }