Skip to content

Անանուն գործարքներ

Iroha -ի անանուն գործարքները կառուցվում են գաղտնի ակտիվների գործողություններից: Փոխանակ հանրային գումարներով հանրային հաշիվից հաշվին փոխանցումներ գրելու, դրամապանակը արժեքը տեղափոխում է պաշտպանված գլխավոր գրասենյակ եւ այնուհետեւ ծախսում է ոչ թափանցիկ նոտաներ զրոյական գիտելիքի ապացույցներով:

Հանրային գրքում դեռեւս գրանցվում է, որ գաղտնի գործողություն է տեղի ունեցել: Այն արձանագրում է պարտավորությունները, չեղարկիչները, ապացուցման հաշերը եւ իրադարձությունները, բայց չի արձանագրել նամակի սեփականատերը, ստացողը կամ ծավալը պաշտպանվածից պաշտպանված տեղափոխության համար: Սովորական գործարքի փաթեթը դեռ կարող է բացահայտել ներկայացնող հաշիվը, այնպես որ "անուն" նշանակում է անանուն ակտիվների տեղաշարժը, այլ ոչ թե ցանցային մակարդակի կամ հաշվի մակարդակի ավտոմատ անանունությունը:

Շինարարական բլոկներ

ԳլխավորLedger- ի ներկայացումը
Պաշտպանված նոտաԱնձնական դրամապանակի արձանագրություն, որը պարունակում է ակտիվ, գումար, սեփականատերերի տվյալներ եւ պատահականություն:
Հանձնառություն32-բայտային հանրային արժեք, որը պարտավորվում է ծանոթագրության վրա՝ առանց դրա դաշտերը բացահայտելու:
Փոխարկիչ32-բայթային հանրային արժեք, որը ստացվում է նոտայի ծախսման ժամանակ: Iroha մերժում է կրկնակի ծախսերը կանխելու համար կրկնակի չեղարկման միջոցները:
Merkle արմատըԱշունի պարտավորության ծառի վերջերս արմատը, ապացույցները օգտագործում են այն ցույց տալու համար, որ ծախսված գրքերը գոյություն ունեն:
Ապացույցի հավելվածըProofAttachment, որը պարունակում է ապացուցման բայտներ, գումարած ստուգող բանալի հղում կամ ներկան ստուգող առանցք:
Գաղտնի իրադարձությունԳլխավոր գրքի իրադարձություն, ինչպիսին է ConfidentialEvent::Shielded, Transferred կամ Unshielded:

Հիմնական հրահանգները հետեւյալն են.

  • RegisterZkAsset: գրանցում է ակտիվը որպես ZK-ունակ եւ կապում փոխանցման, վահանակի եւ անվահանակի ստուգման բանալիները:
  • Shield: գրավում է հանրային հավասարակշռություն եւ հավելում պաշտպանված նոտա պարտավորության:
  • ZkTransfer: վաստակում է պաշտպանված թղթադրամներ նոր պարտավորություններ կատարելու համար:
  • Unshield: ծախսում է պաշտպանված գրառումներ եւ վաստակում է հանրային հաշվետվության բալանս:
  • ScheduleConfidentialPolicyTransition եւ CancelConfidentialPolicyTransition. փոխել ակտիվի գաղտնիության քաղաքականությունը կառավարման միջոցով:

Աշունների սահմանումը նաեւ պարունակում է AssetConfidentialPolicy: Քաղաքականության ռեժիմի վերահսկողությունները, որոնց հոսքերը գործում են.

ՄոդըՆշում
TransparentOnlyԸնդունվում են միայն սովորական հանրային հաշվեկշիռներ եւ փոխանցումներ:
ConvertibleՕգտագործողները կարող են փոխանցել արժեքը հանրային հաշվեկշռների եւ պաշտպանված գրքերի միջեւ:
ShieldedOnlyԳործիքների թողարկումը եւ փոխանցումները պետք է մնան պաշտպանված գրքում:

Ինչպե՞ս օգտագործել դրանք

  1. Թույլատրվում է գաղտնի աջակցություն հավաստիացնող նոդերի վրա: Վավերացողները պետք է համաձայնվեն վավերացնողի հետագա վերջում, ակտիվ ստուգման բանալիների, Poseidon / Pedersen պարամետրի IDs, եւ գաղտնի կանոնների տարբերակի վերաբերյալ: Նոդները մերժում են զուգընկերներ կամ բլոկեր ՝ անհամատեղելի գաղտնի հատկությունների դիջետներով:
  2. Հրապարակել կամ գրանցել շրջանառությունների կողմից օգտագործվող ստուգող բանալիները եւ պարամետրերի հավաքածուները: Վալետներն ու օպերատորները պետք է հղում կատարեն VerifyingKeyId, օրինակ՝ halo2/ipa:vk_transfer։
  3. Գրանցեք ակտիվը որպես ZK-ի կարողություն ունեցող RegisterZkAsset, կամ անցեք քաղաքականության անցումից TransparentOnly դեպի Convertible կամ ShieldedOnly:
  4. Պաշտպանեք հանրային միջոցները Shield -ով: Գանձապանակը ստեղծում է գրառման պարտավորություն եւ կոդավորված օգտակար բեռ ստացողի համար, նախքան այն ներկայացնում է գործարքը:
  5. Փոխանցեք մասնավոր կերպով ZkTransfer: Գանձապանակը ապացուցում է, որ այն պատկանում է մուտքագրվող գրառումներին, որ մուտքի եւ արտադրանքի արժեքները հավասարակշռված են, եւ որ յուրաքանչյուր ծախսված գրառում ամրացված է վերջերս կատարված պարտավորությունների ծառի մեջ:
  6. Unshield բացահայտում է հանրային գումարը եւ ստացողի հաշիվը, ծախսում է մասնավոր թղթադրամների չեղարկիչը, եւ կարող է ստեղծել մասնավոր փոխանակման արտադրանքը.
  7. Փորձաքննություն՝ ընթերցելով գաղտնի իրադարձություններ, ապացույցների փաստաթղթեր, չեղյալ հայտարարողի կարգավիճակ եւ անանուն պահպանակային գրառումներ տիպված հարցումների եւ Torii վերջնական կետերի միջոցով:

CLI Օրինակներ

ZK CLI հրամանները նախատեսված են օպերատորի եւ փորձարկման հոսքերի համար: Արտադրության դրամապանակները պետք է առաջադրեն պարտավորություններ, կոդավորված օգտակար բեռնվածքներ եւ ապացույցներ դրամապանակը / ստուգիչ գրադարանի միջոցով նախքան արդյունաբերվող հրահանգները ուղարկելը:

Հիբրիդային ZK կարողություն ունեցող ակտիվը գրանցել.

bash
iroha app zk register-asset \
  --asset <asset-definition-id> \
  --allow-shield true \
  --allow-unshield true \
  --vk-transfer halo2/ipa:vk_transfer \
  --vk-unshield halo2/ipa:vk_unshield \
  --vk-shield halo2/ipa:vk_shield

Ստեղծեք վարկածային կոդավորված օգտակար բեռի փաթեթ ՝ պաշտպանված նոտայի համար.

bash
iroha app zk envelope \
  --ephemeral-pubkey 0101010101010101010101010101010101010101010101010101010101010101 \
  --nonce-hex 020202020202020202020202020202020202020202020202 \
  --ciphertext-b64 AQIDBA== \
  --print-json \
  --output note-envelope.bin

Պաշտպանված հանրային միջոցները ակտիվի պաշտպանված գլխավոր գրքում:

bash
iroha app zk shield \
  --asset <asset-definition-id> \
  --from <account-id> \
  --amount 1000 \
  --note-commitment ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB \
  --enc-payload note-envelope.bin

Անպաշտպանված՝ ապացուցական կոշտացած JSON:

bash
cat > unshield-proof.json <<'JSON'
{
  "backend": "halo2/ipa",
  "proof_b64": "BASE64_PROOF_BYTES",
  "vk_ref": {
    "backend": "halo2/ipa",
    "name": "vk_unshield"
  }
}
JSON

iroha app zk unshield \
  --asset <asset-definition-id> \
  --to <account-id> \
  --amount 1000 \
  --inputs DEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEF \
  --proof-json unshield-proof.json

SDK Օրինակ

Ճշգրիտ ապացույցի բայթները գալիս են կոմֆիգուրացված ապացույցի հետեւից: Գործարքի շահագործման համար անհրաժեշտ է միայն հանրային մուտքերը եւ ապացույցի հավելվածը.

rust
use iroha_data_model::{
    isi::zk::{Unshield, ZkTransfer},
    prelude::{AccountId, AssetDefinitionId, InstructionBox},
    proof::{ProofAttachment, ProofBox, VerifyingKeyId},
};

fn transfer_instruction(
    asset: AssetDefinitionId,
    input_nullifier: [u8; 32],
    output_commitment: [u8; 32],
    anchor_root: [u8; 32],
    proof_bytes: Vec<u8>,
) -> InstructionBox {
    let backend = "halo2/ipa".into();
    let proof = ProofBox::new(backend, proof_bytes);
    let vk = VerifyingKeyId::new("halo2/ipa", "vk_transfer");
    let attachment = ProofAttachment::new_ref("halo2/ipa".into(), proof, vk);

    ZkTransfer::new(
        asset,
        vec![input_nullifier],
        vec![output_commitment],
        attachment,
        Some(anchor_root),
    )
    .into()
}

fn unshield_instruction(
    asset: AssetDefinitionId,
    recipient: AccountId,
    amount: u128,
    input_nullifier: [u8; 32],
    anchor_root: [u8; 32],
    proof_bytes: Vec<u8>,
) -> InstructionBox {
    let backend = "halo2/ipa".into();
    let proof = ProofBox::new(backend, proof_bytes);
    let vk = VerifyingKeyId::new("halo2/ipa", "vk_unshield");
    let attachment = ProofAttachment::new_ref("halo2/ipa".into(), proof, vk);

    Unshield::new(
        asset,
        recipient,
        amount,
        vec![input_nullifier],
        attachment,
        Some(anchor_root),
    )
    .into()
}

Անանուն ակտիվների գրավում

Անանուն ակտիվների պահպանումը օգտագործում է նույն պաշտպանված փոխանցման մեքենան պահպանի արժեքի համար: Կողմերը եւ պահպանի վիճակը դեռեւս գրանցվում են պահպանի արձանագրության մեջ, բայց ֆինանսավորման, թողարկման, չեղյալ հայտարարման եւ կարգավորման ոտքերը օգտագործում են պաշտպանված չեղարկիչներ եւ արտադրանքի պարտավորություններ:.

ISI վարքագծի եւ օրինակների մանրամասնման համար տես Նացիոն ակտիվների պահպանումը .

Կյանքի շրջանակը հետեւյալն է.

  1. OpenAnonymousAssetEscrow ծախսում է պաշտպանված ֆինանսավորման գրառումներ եւ ստեղծում է մեկ պարտավորություն ստուգման համար:
  2. AcceptAnonymousAssetEscrow գրառումներ գնորդի.
  3. MarkAnonymousEscrowPaymentSent արձանագրում է, որ գնորդը վճարումը ուղարկել է հեռու շղթայից:
  4. ReleaseAnonymousAssetEscrow ծախսում է գրավականային պարտավորությունը գնորդի արտադրանքի պարտավորություններին:
  5. CancelAnonymousAssetEscrow ծախսում է պահպանումի պարտավորությունը վաճառողի արտադրանքի պարտավորություններին, երբ վճարումը չի նշվել:
  6. OpenAnonymousEscrowDispute եւ ResolveAnonymousEscrowDispute բողոքի ակցիաները լուծում են վեճի տակ գտնվող գրավիչների հետ՝ ապացույցների թաքնմամբ եւ լուծողի կողմից վերահսկվող բաժանումով:

Օգտագործեք հարցումների մեջ նշված անանուն պահապանների հարցումները՝ ստուգելու պահապաների արձանագրությունները եւ կարգավիճակը:

Մաթեմատիկա

Ստորեւ նշված նշանը նկարագրում է գաղտնի ակտիվների հոսքը: Ներկայացումները օգտագործում են ակտիվ շրջանակը եւ պարամետրը IDs ակտիվ քաղաքականությունից եւ ստուգողի գրանցամատյանից, այնպես որ հաճախորդները պետք է վերաբերվեն պարտավորություններին, չեղյալ հայտարարողներին եւ ապացույցի բայթներին որպես դրամապանակի / պրովետի անբացատրելի արտադրանքներ:

Պաշտպանված գրառումը կարող է նկարագրվել հետեւյալ կերպ.

n=(asset,amount,owner,ρ) n = (\mathsf{asset}, \mathsf{amount}, \mathsf{owner}, \rho)

որտեղ owner ստացվում է ստանալու դիտման կամ ծախսերի նյութից, եւ rho նշում պատահականություն:

Նոթի պարտավորությունը թաքնված պարտավորություն է.

C=Commit(asset,amount,owner,ρ) C = \mathsf{Commit}(\mathsf{asset}, \mathsf{amount}, \mathsf{owner}, \rho)

Ներկայիս գաղտնի փոխանցման շրջանների համար հանրային մուտքերը ներառում են նոտա պարտավորությունները, չեղարկիչները, Merkle արմատը, ակտիվի տեգը եւ շղթայի տեգը: Շրջանը պարտավորությունների հարաբերություն է պարտադրում այս ձեւով:

C=Hc(amount,ρ,owner_tag,asset_tag) C = H_c(\mathsf{amount}, \rho, \mathsf{owner\_tag}, \mathsf{asset\_tag})

Երբ թղթադրամը ծախսվում է, դրամապանակում ստացվում է չեղյալ հայտարարող.

N=Hn(spend_key,ρ,asset_tag,chain_tag) N = H_n(\mathsf{spend\_key}, \rho, \mathsf{asset\_tag}, \mathsf{chain\_tag})

N հանրային է: Այն չի բացահայտում թղթադրամը, բայց այն կայուն է այդ թղթադրամի եւ շղթայի համար, այնպես որ Iroha կարող է մերժել նույն չեղարկիչի հետ երկրորդ ծախսը.

Հանձնառության ծառը ապացուցում է գրառումների առկայությունը: Եթե դրամապանակը ծախսում է պարտավորություն C_i, ապացույցը ներառում է մասնավոր Merkle ուղին C_i ՝ վերջերս հրապարակված արմատի վրա.

MerkleRoot(Ci,path)=R \mathsf{MerkleRoot}(C_i, \mathsf{path}) = R

Պաշտպանված-պաշտպանված փոխանցման համար ապացույցը նաեւ պարտադրում է արժեքի պահպանումը.

inputs=outputs \sum \mathsf{inputs} = \sum \mathsf{outputs}

Անպաշտպանության դեպքում ներառվում է հանրային գումարը.

inputs=public_amount+private_change \sum \mathsf{inputs} = \mathsf{public\_amount} + \sum \mathsf{private\_change}

Ներկայացված ապացույցը կարող է ամփոփվել հետեւյալ կերպ.

Verify(vk,public_inputs,π)=true \mathsf{Verify}(\mathsf{vk}, \mathsf{public\_inputs}, \pi) = \mathsf{true}

որտեղ public_inputs են պարտավորությունները, չեղարկիչները, արմատը, ակտիվի նշանը, շղթայի նշանը եւ ցանկացած հանրային չպաշտպանված գումարը: Ականատեսը պարունակում է ծանուցման գումարները, պատահականությունը, ծախսերի նյութը եւ Merkle ուղիները: Վալիդատորները ստուգում են ապացույցը եւ այնուհետեւ փոխում են գլխավոր գրքի վիճակը՝ ավելացնելով արտադրանքի պարտավորությունները եւ նշելով մուտքային չեղարկիչները որպես ծախսված։

Ի՞նչ է հանրային

Անանուն գործարքները չեն դարձնում յուրաքանչյուր դիտարկելի փաստ գաղտնի: Հետեւյալ տվյալները դեռեւս կարող են հանրային լինել.

  • գործարքի хэշը, բլոկի բարձրությունը եւ կարգավորումը
  • փոխանցման ներկայացնող մարմինը, բացառությամբ այն դեպքերի, երբ դիմումը օգտագործում է մասնավոր մուտքի կետ կամ հետապնդումային ձեւաչափ:
  • օգտագործվող ակտիվի սահմանումը
  • չեղարկիչներ եւ արտադրանքային պարտավորություններ
  • ապացուցման հիշեր, ստուգող բանալիների հղումներ եւ ընտրանքային փաթեթային հիշեր
  • Unshield հանրային գումարը եւ ստացողի հաշիվը
  • անանուն վարկային վաճառող, գնորդ, կարգավիճակ, ժամադրություն եւ ապացույցներ

Ստեղծեք ծրագրեր, որպեսզի այս հանրային մետադատաները չբացահայտեն այն գործարար հարաբերությունները, որոնք փորձում եք պաշտպանել: