Skip to content

ანონიმური ოპერაციები

ანონიმური ტრანზაქციები Iroha აშენდება კონფიდენციალური აქტივების ოპერაციებიდან. საჯარო თანხებით საჯარო ანგარიშზე გადარიცხვების დაწერის ნაცვლად, ქაღალდი გადაიტანს ღირებულებას დაცულ ლიტერატურაში და შემდეგ ხარჯავს არაგამჭვირვალე ჩანაწერებს ნული ცოდნის მტკიცებულებებით.

საჯარო ბუღალტრში დღემდე ფიქსირდება, რომ მოხდა კონფიდენციალური ოპერაცია. ის აღნიშნავს ვალდებულებებს, გაუქმებებს, მტკიცებულების ჰეშებსა და მოვლენებს, მაგრამ არ აღნიშნავს ჩანაწერის მფლობელს, მიმღებელს ან თანხას დაცულიდან დაცულიდან გადაადგილებისათვის. ტრანზაქციის ჩვეულებრივ კონვერტზე შეიძლება კვლავ გაჟღერდეს წარდგენილი ანგარიში, ამიტომ "ანონიმური" აქ ნიშნავს ანონიმურ აქტივების მოძრაობას და არა ავტომატურ ქსელის დონეზე ან ანგარიშის დონეზე анонимურობას.

სამშენებლო ბლოკები

კონცეფციალიდერების წარმოდგენა
ფარდული შენიშვნაკერძო საფულე ჩანაწერი, რომელიც შეიცავს აქტივს, თანხას, მფლობელის მონაცემებს და შემთხვევითობას.
ვალდებულება32-ბაიტიანი საჯარო ღირებულება, რომელიც ჩანაწერზე ვალდებულია მისი ველების გამჟღავნების გარეშე.
ანულირებელიIroha უარყოფს განმეორებულ ნულიფიკატორებს, რათა თავიდან იქნას აცილებული ორმაგი ხარჯვა.
მერკლის ფესვიკუთვნილობის ხის ახლახანდელი ფესვი. მტკიცებულებები იყენებენ მას იმის დასამტკიცებლად, რომ ხარჯული ნოტები არსებობს.
მტკიცებულება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 მაგალითი

ზუსტი მტკიცებულების ბაიტები მოდის კონფიგურირებული მტკიცებულება backend. ტრანზაქციის სასარგებლო ტვირთი მხოლოდ საჭიროებს საჯარო შეყვანები და მტკიცებულება attachment:

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)

მიმდინარე კონფიდენციალური გადაცემის ცირკულეტებისათვის, საჯარო შეყვანები მოიცავს ნოტის ვალდებულებებს, ანულიფერებს, მერკლ რძეს, აქტივის თარგს და ჯაჭვური თარგს. ცირკული ამ ფორმის ვალდებულებათა ურთიერთობას აამოქმედებს.

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 არის ვალდებულებები, ანულიფიკატორები, ფესვი, აქტივების ნიშანი, ჯაჭვის ნიშანი და ნებისმიერი საჯარო არალეგირებული თანხა. მოწმე შეიცავს ნოტების თანხებს, შემთხვევითობას, ვალიდატორები ადასტურებენ დამტკიცებას და შემდეგ მუტირებენ ლიდერის მდგომარეობას გამომუშავების ვალდებულებების დამატებით და შესვლის ანულიფიტორების გათვალისწინებით, როგორც გამოყოფილი.

რა არის საჯარო

ანონიმური ტრანზაქციები არ განაპირობებს ყველა შესამჩნეველ ფაქტზე კონფიდენციალურობას. შემდეგი მონაცემები მაინც შეიძლება იყოს საჯარო:

  • ტრანზაქციის ჰეში, ბლოკების სიმაღლე და შეკვეთები
  • გზავნილის წარმომადგენელი ტრანზაქციის ორგანო, თუკი განაცხადი არ იყენებს კერძო შესასვლელ პუნქტს ან გადამდებარე სტრუქტურას
  • გამოყენებული აქტივების განსაზღვრა
  • ანულიფიკატორები და გამოდის ვალდებულებები
  • დამტკიცების ჰეშები, საკვანძო რეფერენციები და ვარიანტიანი კონვერტის ჰეშები.
  • საჯარო თანხა და მიმღებ ანგარიში Unshield
  • ანონიმური მიმყიდველი, მყიდველი, სტატუსი, დროის შტამპები და მტკიცებულებების ჰეშები

შექმენით აპლიკაციები ისე, რომ ეს საჯარო მეტა მონაცემები არ გამოავლინოს ბიზნესი ურთიერთობა თქვენ ცდილობთ დაიცვას.