Skip to content

Анонимді операциялар

Iroha -дағы анонимді транзакциялар құпия активтер операцияларынан құрылады. Қоғамдық сомалармен ашық шоттан-шотқа аударымдарды жазудың орнына, қоршалған кітапханаға құнды көшіреді және одан кейін нөлдік білімді дәлелдемелермен мөлдір емес жазбаларды жұмсады.

Қоғамдық кітапша әлі күнге дейін құпия операция болғандығын тіркейді. Ол міндеттемелерді, күшін жоюшыларды, дәлелденуші хештарды және оқиғаларды тіркейді, бірақ ол жазба иеленушісін, алушыны немесе қорғалғаннан қорғалғанға қозғалған соманы тіркемейді. Әдеттегі транзакция конверті әлі күнге дейін тапсырушы шотты аша алады, сондықтан "аноним" дегеніміз бұл жерде желі деңгейіндегі немесе шот деңгейіндегі автоматты анонимділік емес, анонимді активтердің қозғалысы.

Құрылыс блоктары

ТұжырымдамаКітаптық есептік жазбалар
Қорғалған жазбаЖеке қапшықта актив, сома, меншік иесінің деректері және кездейсоқлығы бар жеке жазба.
Қатысуы32 байттан тұратын қоғамдық құндылық, ол оның өрістерін ашпай-ақ жазбаға міндетті.
ТүсіндірушіIroha қосарланған шығындарды болдырмау үшін қайталанатын құнсыздаушыларды бас тартады.
Меркел тамырыБұл активтің міндеттеме ағашының жақында пайда болған тамыры. Дәлелдемелер оны жұмсалған банкноттар бар екенін көрсетуге қолданады.
Құжатты тіркеуProofAttachment құрамында дәлелді байттар, сондай-ақ тексеру кілті анықтамасы немесе желілік тексеру кілісі бар.
Құпия оқиғаConfidentialEvent::Shielded, Transferred, немесе Unshielded сияқты бухгалтерлік есептік жазба оқиғасы.

Негізгі нұсқаулар:

  • RegisterZkAsset: активті ZK ретінде тіркейді және трансфертті, қалқанды және қалқансыз тексеру кілттерін бекітеді.
  • Shield: мемлекеттiк балансты берешегi және қорғалған банкнотаның мiндеттемесiн қосады.
  • 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 жұмсалса, дәлелдеме C_i-ден соңғы қоғамдық тамырға жеке Merkle жолы:

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 үшін алушының шоты
  • анонимді кепілдіктерді сатушы, сатып алушы, мәртебесі, уақыт таңбалары және дәлелдену шешелері

Қолданбаларды жобалаңыз, сондықтан бұл қоғамдық метамәдени деректер сіз қорғауға тырысатын бизнес қарым-қатынасын аша алмайды.