$$
\def\C\{\text{C}}
\def\Csyn\{\text{C}^{\text{syn}}}
\def\N\{\text{N}}
\def\Nsyn\{\text{N}^\text{syn}}
\def\Ch\{\text{Ch}}
\def\csyn_#1{c^\text{syn}_{#1}}
\def\Bit\{\{0, 1\}}
\def\par\{\mathbin\Vert}
\def\TreeD\{\text{TreeD}}
\def\TreeC\{\text{TreeC}}
\def\TreeR\{\text{TreeR}}
\def\CommR\{\text{CommR}}
\def\SectorSize\{\textsf{SECTOR_SIZE}}
\def\SectorNodes\{\textsf{SECTOR_NODES}}
\def\Gib\{\text{GiB}}
\def\ReplicaID\{\text{ReplicaID}}
$$
# Synth-PoRep Spec
## Notation & Constants
$\textbf{const } \textsf{NODE_SIZE} = 32 \text{ Bytes}$
Size in bytes of one node.
$\textbf{const } \SectorSize \in \{32\Gib, 64\Gib\}$
The size in bytes of the sector being sealed.
$\textbf{const } \SectorNodes = \SectorSize \mathbin/ \textsf{NODE_SIZE}$
The size in 32-byte nodes of the sector being sealed.
$\textbf{type } \CommR: \mathbb{F} = \texttt{poseidon}(\text{CommC} \par \text{RootR})$
A commitment to sealed data. $\text{CommC}$ is the root of $\text{TreeC}$ and $\text{RootR}$ is the root of $\TreeR$.
$\textbf{type } \ReplicaID: \mathbb{F}$
A unique identifier associated with a replica $\text{R}$ of sector data $\text{D}$.
</br>
**Challenge Counts:**
$\textbf{const } \Nsyn = 2^{14} = 16{,}384$
The number of synthetic challenges.
$\textbf{const } \N = 176$
The number of PoRep challenges.
</br>
**Challenge Sets:**
$\textbf{type } \Csyn: \texttt{u32}^{[\Nsyn]} = (\csyn_i)_{i \in [0, \Nsyn)}$
The synthetic challenge set.
$\textbf{type } \C: \texttt{u32}^{[\N]} = (c_i)_{i \in [0, \N)}$
The PoRep challenge set.
## Challenge Generation
### SHA256
$\overline{\underline{\text{Function:}\ \texttt{gen_synth_challenges}(\ReplicaID) \rightarrow \Csyn}}$
$\textbf{for } i: \texttt{u32} \in [0, \Nsyn)\thinspace \textbf{:}$
$\quad \text{digest}: \texttt{u32}^{[8]} = \texttt{sha256}(\texttt{le_bytes}(\ReplicaID) \par \texttt{le_bytes}(i))$
$\quad \text{bigint} = \texttt{u256::from_le_u32s}(\text{digest})$
$\quad \csyn_i: \texttt{u32} = (\text{bigint} \mathbin\% (\SectorNodes - 1)) + 1$
</br>
$\overline{\underline{\text{Function:}\ \texttt{gen_porep_challenges}(\ReplicaID, \Csyn, \text{rand}: \texttt{u8}^{[32]}) \rightarrow \C}}$
$\textbf{for } i: \texttt{u32} \in [0, \N / 8)\thinspace \textbf{:}$
$\quad \text{digest}: \texttt{u32}^{[8]} = \texttt{sha256}(\texttt{le_bytes}(\ReplicaID) \par \text{rand} \par \texttt{le_bytes}(i))$
$\quad \textbf{for } j \in [0, 8)\thinspace \textbf{:}$
$\quad\quad \text{idx} = \text{digest}[j] \mathbin\% \Nsyn$
$\quad\quad c_{8i + j} = \csyn_{\text{idx}}$
</br>
### ChaCha20
$\textbf{const } \textsf{NONCE}: \texttt{u8}^{[12]} = 0^{[12]}$
$\textbf{const } \textsf{EMPTY_BLOCK}: \texttt{u8}^{[64]} = 0^{[64]}$
$\overline{\underline{\text{Function:}\ \texttt{gen_synth_challenges}(\ReplicaID) \rightarrow \Csyn}}$
$\text{key}: \texttt{u8}^{[32]} = \texttt{le_bytes}(\ReplicaID)$
$\text{stream} = \texttt{ChaCha20::new}(\text{key}, \textsf{NONCE})$
$\textbf{for } i \in [0, \Nsyn / 2)\thinspace \textbf{:}$
$\quad \text{block}: \texttt{u8}^{[64]} = \text{stream}{.}\texttt{encrypt}(\textsf{EMPTY_BLOCK})$
$\quad \text{bigint}_1 = \texttt{u256::from_le_bytes}(\text{block}[\text{..}32])$
$\quad \text{bigint}_2 = \texttt{u256::from_le_bytes}(\text{block}[32\text{..}])$
$\quad \csyn_{2i}: \texttt{u32} = (\text{bigint}_1 \mathbin\% (\textsf{SECTOR_NODES} - 1)) + 1$
$\quad \csyn_{2i + 1}: \texttt{u32} = (\text{bigint}_2 \mathbin\% (\textsf{SECTOR_NODES} - 1)) + 1$
</br>
$\overline{\underline{\text{Function:}\ \texttt{gen_porep_challenges}(\ReplicaID, \Csyn, \text{rand}: \texttt{u8}^{[32]}) \rightarrow \C}}$
$\text{key}: \texttt{u8}^{[32]} = \texttt{sha256}(\texttt{le_bytes}(\ReplicaID) \par \text{rand})$
$\text{stream} = \texttt{ChaCha20::new}(\text{key}, \textsf{NONCE})$
$\textbf{for } i \in [0, \N/16)\thinspace \textbf{:}$
$\quad \text{block}: \texttt{u8}^{[64]} = \text{stream}{.}\texttt{encrypt}(\textsf{EMPTY_BLOCK})$
$\quad \textbf{for } j \in [0, 16)\thinspace \textbf{:}$
$\quad\quad \text{idx} = \texttt{u32::from_le_bytes}(\text{block}[4j..4j + 4]) \mathbin\% \Nsyn$
$\quad\quad c_{16i + j} = \csyn_{\text{idx}}$