Skip to main content

Namen

ZKVerifier omogoča zasebno mintanje: stranka dokaže, da pozna 6 besed (in s tem zasebni ključ), vezane na registrirano sredstvo, ne da bi ključ razkrila. Uporablja Groth16 (snarkjs) s Poseidon hash funkcijo (circomlib).

Tok mintanja

1

Registracija (UORS)

Overovitelj pokliče registerCommitment(commitment). Commitment je Poseidon2([pk, nonce]).
2

Izpeljava ključa (stranka)

Iz 6 besed: pk = wordsToPrivateKey(words).
3

Iskanje nonce

findMatchingNonce(pk) preišče oracle zapise in najde nonce, pri katerem se izračunani commitment ujema z registriranim.
4

ZK dokaz

snarkjs.groth16.fullProve(...) ustvari dokaz za vhode: privateKey, assetValue, entropyNonce, assetCommitment, minValue.
5

Mint

verifyAndMint(proof, ..., amount) preveri dokaz in zmintaj RWA žetone. Commitment se označi kot uporabljen (commitmentUsed).

Enkratna uporaba

Vsak commitment je enkraten — po uspešnem mintu commitmentUsed prepreči ponovno uporabo iste kode.
findMatchingNonce preišče vse oracle zapise (en RPC klic na zapis), zato je lahko počasen. Za hitrejši mint se splača shraniti nonce/indeks skupaj s kodo.

Znane rešitve

ProblemRešitev
quoteBuy vrača 0x / revertIzračunaj client-side: amtWei * priceRaw / 1e18
6-decimalna cena za 18-dec tokenKontrakt vedno pričakuje ceno v 1e6 formatu
Mint “obstane”Commitment ni registriran ali nonce ni iz oracle zapisa — naredi čist potek (generiraj → registriraj → mintaj takoj)