The potential scenario in which future technology (i.e. quantum computers) allows machines to break the security of the discrete log problem poses a threat to the economic security and privacy of the Monero network. FCMP++ mitigates most of the of on-chain privacy concerns posed by a quantum adversary, however, it does not address the economic security threats due to such a machine's ability to forge FCMP++ proofs. Tthe Monero network should migrate to post-quantum (PQ) cryptography before the first working quantum computer is suspected of breaking an Ed25519 relationship. The holders of XMR before that point ideally should also be able to move their funds over to the new scheme. However, the old FCMP++ proofs should not be considered secure after a certain point, at which point old holders of XMR are effectively locked out of spending their enotes.
Any solution to migrate old enotes to a new PQ-secure protocol must prove the following statements in a PQ-secure manner:
- Enote exists in the ledger
- Enote's transaction and dependent transactions all have proven balanced and non-negative amounts within their output sets
- Enote's amount is bound at time of creation and cannot be modified later
- Enote has not yet been spent
Any migration of an enote must be signed by its intended recipient without revealing the signing key material to a non-PQ adversary.
A turnstile with the following design would enable migrating enotes of Carrot/FCMP++ txs received by a Carrot-derived account. In other words, this does not enable spending previous RingCT enotes nor FCMP++ enotes addressed to legacy keys. The overall intuitive approach is to have verifiers re-do Carrot subaddress generation, Carrot enote derivation, and key image opening inside the migrating transaction's input. Due to the way that Carrot subaddress generation and Carrot enote derivation function, we can maintain the security properties mentioned above, even on a FCMP++'s bivariate amount commitments and output pubkeys. This design assumes that referenced enotes for migration, and dependent transactions, could not have been constructed by a quantum adversary. In other words, enotes must have been hoenstly constructed at time of creation and inclusion to the chain.
See the Carrot spec for notation.
To spend an FCMP++ enote with output pubkey is_subaddress, second address index
preimage enote_type, and a signature of the migration transaction
First, the verifier fetches
- If transaction with TXID not in chain, or doesn't contain enough outputs, return
FAIL - If
$K_o$ ,$C_a$ , or$K_{ps}$ not in main prime order subgroup of Ed25519, returnFAIL - Let
$k_{gi}' = ScalarDerive(\text{"Carrot generate-image key"} \Vert s_{gp} \Vert K_{ps})$ - Let
$K_s' = K_{ps} + k_{gi}' G$ - Let
$k'^j_{subscal} = ScalarDerive(\text{"Carrot subaddress scalar"} \Vert s^j_{ap2} \Vert K_s')$ , iffis_subaddress, else let$k'^j_{subscal} = 1$ - Let
$K'^j_s = k'^j_{subscal} K_s'$ - Let
$k_a' = ScalarDerive(\text{"Carrot commitment mask"} \Vert s_{sr}^{ctx} \Vert a \Vert K'^j_s \Vert \text{enote\_type})$ - Let
$C_a' = k_a' G + a H$ - If
$C_a' \neq C_a$ , then returnFAIL - Let
$k'^g_o = ScalarDerive(\text{"Carrot key extension G"} \Vert s_{sr}^{ctx} \Vert C_a)$ - Let
$k'^t_o = ScalarDerive(\text{"Carrot key extension T"} \Vert s_{sr}^{ctx} \Vert C_a)$ - Let
$K_o' = K'^j_s + k'^g_o G + k'^t_o T$ - If
$K_o' \neq K_o$ , then returnFAIL - If
$\Omega_m^{ps}$ does not verify for migration transaction$m$ and pubkey$K_{ps}$ , returnFAIL - Let
$L = (k_{gi}' * k'^j_{subscal} + k'^g_o) H^2_p(K_o)$ - If
$L$ is already spent in chain, returnFAIL - Return
SUCCESS
If this prodecure suceeds, then
The opening of amount commitments in this manner is PQ-secure, taking a large amount of
inspiration from Switch commitments. To find an opening
of
Note that the amount blinding factor binds to
Since all variables in the calculation of the key image
The membership proof correctness is so trivial that it may go unnoticed: it validates iff TXID
is in the chain and contains more
See the Carrot spec for notation.
To spend an FCMP++ enote with output pubkey
First, the verifier fetches
- If transaction with TXID not in chain, or doesn't contain enough outputs, return
FAIL - If
$K_o$ ,$C_a$ , or$K_{ps}$ not in main prime order subgroup of Ed25519, returnFAIL - Let
$k_{gi}' = ScalarDerive(\text{"Carrot generate-image key"} \Vert s_{gp} \Vert K_{ps})$ - Let
$K_s' = K_{ps} + k_{gi}' G$ - Let
$C_a' = G + a H$ - If
$C_a' \neq C_a$ , then returnFAIL - Let
$k'^g_o = ScalarDerive(\text{"Carrot coinbase extension G"} \Vert s_{sr}^{ctx} \Vert a \Vert K_s')$ - Let
$k'^t_o = ScalarDerive(\text{"Carrot coinbase extension T"} \Vert s_{sr}^{ctx} \Vert a \Vert K_s')$ - Let
$K_o' = K_s' + k'^g_o G + k'^t_o T$ - If
$K_o' \neq K_o$ , then returnFAIL - If
$\Omega_m^{ps}$ does not verify for migration transaction$m$ and pubkey$K_{ps}$ , returnFAIL - Let
$L = (k_{gi}' + k'^g_o) H^2_p(K_o)$ - If
$L$ is already spent in chain, returnFAIL - Return
SUCCESS
If this prodecure suceeds, then
The opening of amount commitments in this manner is PQ-secure, since the relation between coinbase amounts and amount commitments is 1-to-1.
Unlike non-coinbase, there is no amount blinding factor binding to
Since all variables in the calculation of the key image
This design cannot work with coinbase outputs because it relies on the blinding factor$k_a$ of the amount commitment $C_a$ binding to the address spend pubkey $K^j_s$ . However, coinbase outputs implicitly have a "blinding factor" of 1 in RingCT. I see four paths forward:
Personally, I am in favor of the last option, but this would require yet another set of small tweaks to the addressing protocol.