This section defines the common notation utilized throughout this paper for the Aurinko Network. Some standard notations are not denoted for the sake of brevity.

  • A left arrow and alternatively right arrow symbol denote an assignment function, e.g., A ← B or B → A stands for the assignment of B to A.

  • The equivalency function is denoted with an = symbol, e.g., A = B stands for A is equivalent to B.

  • A mapsto symbol defines a mapping function, e.g., A 7→ B, where B is mapped to A.

  • The || symbol denotes the appending of two byte sequences, e.g., a||b denotes b being appended to a.

  • The / symbol denotes division without the remainder, e.g., 6/4 = 1, while the % symbol denotes the remainder of the rounded division, e.g., 6%4 = 2.

We denote a tuple containing one or more elements with round brackets, e.g., Tuple ← (). A set is defined with a Set[] function, which denotes the element type the set is comprised of, e.g., ExampleSet ← Set[bool]. A list is defined with a List[] function, which denotes the element type the list is comprised of, e.g., ExampleList ← List[bool] stands for a list comprised of bool elements. The difference between a set and a list is that a set can only be comprised of unique elements, whereas a list can be comprised of identical elements. We define mapping functions Mapping[], which maps a key key to a value value, i.e., ExampleMap ← Mapping[byte32 7→ bool]. A binary sequence is defined with a BinarySeq[N] function, where N (N > 0) is the number of bytes the defined binary sequence is comprised of, e.g., ExampleBinarySeqF ← BinarySeq[32] stands for a binary sequence comprised of 32 bytes. A byte sequence is defined as a string of bytes. The member elements of the tuple, list, set, binary sequence, and byte sequence can be obtained by providing the index to their position in the structure (where the index always begins with 0), e.g., bool ← ExampleList[2]. A structure name enclosed in || defines the cardinality of the said structure, i.e., |ExampleList| = 4. A key provided as a substitute for an index in the case of a mapping would return the value corresponding to the said key, e.g., bool ← ExampleMap[byte32].

We denote a Merkle Tree structure with a MerkleTree[] function, which defines the element type the Merkle Tree leaves are comprised of and the depth of the Merkle Tree, e.g., ExampleTree ← MerkleTree[bool, 32], where 32 is the depth of the Merkle Tree of arity 2 (i.e., LeafCount(ExampleTree) = 2^32). A Merkle Tree with a superscript capital R defines the root of the Merkle Tree, e.g., ExampleTreeR. We define LeafCount() as a function that returns the maximum number of leaves the said Merkle Tree can have. Function O() takes the Merkle Tree root ExampleTreeR and the Merkle Tree path from a specified leaf exampleLeafP and returns true if the provided path is a valid opening to the specified root or false otherwise, i.e., bool ← O(ExampleTreeR, exampleLeafP).

We denote Generators to be a mapping, which maps the hash of secret secretHash to a tuple comprised of the cryptographic commitment to the bid balance cbid, bid eligibility height hbidEligibility, and bid expiration height hbidExpiration, i.e.: Generators ← Mapping[secretHash 7→(cbid, hbidEligibility, hbidExpiration)]. Additionally, we denote Provisioners to be a mapping, which maps the BLS public key pkBLS to a tuple comprised of the stake balance bstake, bid eligibility height hstakeEligibility, and bid expiration height hstakeExpiration, i.e.: Provisioners ← Mapping[pkBLS 7→ (bstake, hstakeEligibility, hstakeExpiration)].

We assume that there exist functions TotalActiveStake(), TotalHonestStake(), and TotalByzantineStake() which return the total amount of DUSK staked by the active (the owners of the bids/stakes for which the current block height is not smaller than hbidEligibility/hstakeEligibility and smaller than hbidExpiration/hstakeExpiration) Generators/Provisioners, the total amount of DUSK staked by the honest Generators/Provisioners, and the total amount of DUSK staked by the Byzantine Generators/Provisioners (NOTE: the three functions exist only in the theoretical model [aside from TotalActiveStake() applicable only to Provisioners] and do not exist in the concrete instantiation of the protocol).

Last updated