Nullifier
Class: Nullifier
Nullifiers are used as a public commitment to a specific anonymous account, to forbid actions like double spending, or allow a consistent identity between anonymous actions.
RFC: https://github.com/o1-labs/o1js/issues/756
Paper: https://eprint.iacr.org/2022/1255.pdf
Hierarchy
{
private: { c: Field; g_r: Group; h_m_pk_r: Group; } ;public: { nullifier: Group; s: Scalar; } ;publicKey:Group= Group }↳
Nullifier
Table of contents
Constructors
Properties
Methods
Constructors
constructor
• new Nullifier(value)
Parameters
| Name | Type | Default value |
|---|---|---|
value | Object | undefined |
value.private | { c: Field; g_r: Group; h_m_pk_r: Group; } | undefined |
value.public | { nullifier: Group; s: Scalar; } | undefined |
value.publicKey | Group | Group |
Inherited from
Struct({ publicKey: Group, public: { nullifier: Group, s: Scalar, }, private: { c: Field, g_r: Group, h_m_pk_r: Group, }, }).constructor
Defined in
Properties
private
• private: Object
Type declaration
| Name | Type |
|---|---|
c | Field |
g_r | Group |
h_m_pk_r | Group |
Inherited from
Struct({ publicKey: Group, public: { nullifier: Group, s: Scalar, }, private: { c: Field, g_r: Group, h_m_pk_r: Group, }, }).private
Defined in
public
• public: Object
Type declaration
| Name | Type |
|---|---|
nullifier | Group |
s | Scalar |
Inherited from
Struct({ publicKey: Group, public: { nullifier: Group, s: Scalar, }, private: { c: Field, g_r: Group, h_m_pk_r: Group, }, }).public
Defined in
publicKey
• publicKey: Group = Group
Inherited from
Struct({ publicKey: Group, public: { nullifier: Group, s: Scalar, }, private: { c: Field, g_r: Group, h_m_pk_r: Group, }, }).publicKey
Defined in
_isStruct
▪ Static _isStruct: true
Inherited from
Struct({ publicKey: Group, public: { nullifier: Group, s: Scalar, }, private: { c: Field, g_r: Group, h_m_pk_r: Group, }, })._isStruct
Defined in
check
▪ Static check: (value: { private: { c: Field; g_r: Group; h_m_pk_r: Group; } ; public: { nullifier: Group; s: Scalar; } ; publicKey: Group = Group }) => void
Type declaration
▸ (value): void
Add assertions to the proof to check if value is a valid member of type T.
This function does not return anything, rather creates any number of assertions on the proof to prove value is a valid member of the type T.
For instance, calling check function on the type Bool asserts that the value of the element is either 1 or 0.
Parameters
| Name | Type | Default value | Description |
|---|---|---|---|
value | Object | undefined | the element of type T to put assertions on. |
value.private | { c: Field; g_r: Group; h_m_pk_r: Group; } | undefined | - |
value.public | { nullifier: Group; s: Scalar; } | undefined | - |
value.publicKey | Group | Group | - |
Returns
void
Inherited from
Struct({ publicKey: Group, public: { nullifier: Group, s: Scalar, }, private: { c: Field, g_r: Group, h_m_pk_r: Group, }, }).check
Defined in
empty
▪ Static empty: () => { private: { c: Field; g_r: Group; h_m_pk_r: Group; } ; public: { nullifier: Group; s: Scalar; } ; publicKey: Group = Group }
Type declaration
▸ (): Object
Returns
Object
| Name | Type |
|---|---|
private | { c: Field; g_r: Group; h_m_pk_r: Group; } |
public | { nullifier: Group; s: Scalar; } |
publicKey | Group |
Inherited from
Struct({ publicKey: Group, public: { nullifier: Group, s: Scalar, }, private: { c: Field, g_r: Group, h_m_pk_r: Group, }, }).empty
Defined in
fromFields
▪ Static fromFields: (fields: Field[]) => { private: { c: Field; g_r: Group; h_m_pk_r: Group; } ; public: { nullifier: Group; s: Scalar; } ; publicKey: Group = Group }
Type declaration
▸ (fields): Object
A function that returns an element of type T from the given provable data.
Important: For any element of type T, this function is the reverse operation of calling toFields method on an element of type T.
Parameters
| Name | Type | Description |
|---|---|---|
fields | Field[] | an array of Field elements describing the provable data of the new T element. |
Returns
Object
An element of type T generated from the given provable data.
| Name | Type |
|---|---|
private | { c: Field; g_r: Group; h_m_pk_r: Group; } |
public | { nullifier: Group; s: Scalar; } |
publicKey | Group |
Inherited from
Struct({ publicKey: Group, public: { nullifier: Group, s: Scalar, }, private: { c: Field, g_r: Group, h_m_pk_r: Group, }, }).fromFields
Defined in
toAuxiliary
▪ Static toAuxiliary: (value?: { private: { c: Field; g_r: Group; h_m_pk_r: Group; } ; public: { nullifier: Group; s: Scalar; } ; publicKey: Group = Group }) => any[]
Type declaration
▸ (value?): any[]
A function that takes value (optional), an element of type T, as argument and returns an array of any type that make up the "auxiliary" (non-provable) data of value.
As any element of the interface ProvablePure<T> includes no "auxiliary" data by definition, this function always returns a default value.
Parameters
| Name | Type | Default value | Description |
|---|---|---|---|
value? | Object | undefined | the element of type T to generate the auxiliary data array from, optional. If not provided, a default value for auxiliary data is returned. |
value.private | { c: Field; g_r: Group; h_m_pk_r: Group; } | undefined | - |
value.public | { nullifier: Group; s: Scalar; } | undefined | - |
value.publicKey | Group | Group | - |
Returns
any[]
An empty array, as any element of the interface ProvablePure<T> includes no "auxiliary" data by definition.
Inherited from
Struct({ publicKey: Group, public: { nullifier: Group, s: Scalar, }, private: { c: Field, g_r: Group, h_m_pk_r: Group, }, }).toAuxiliary
Defined in
toFields
▪ Static toFields: (value: { private: { c: Field; g_r: Group; h_m_pk_r: Group; } ; public: { nullifier: Group; s: Scalar; } ; publicKey: Group = Group }) => Field[]
Type declaration
▸ (value): Field[]
A function that takes value, an element of type T, as argument and returns an array of Field elements that make up the provable data of value.
Parameters
| Name | Type | Default value | Description |
|---|---|---|---|
value | Object | undefined | the element of type T to generate the Field array from. |
value.private | { c: Field; g_r: Group; h_m_pk_r: Group; } | undefined | - |
value.public | { nullifier: Group; s: Scalar; } | undefined | - |
value.publicKey | Group | Group | - |
Returns
Field[]
A Field array describing how this T element is made up of Field elements.
Inherited from
Struct({ publicKey: Group, public: { nullifier: Group, s: Scalar, }, private: { c: Field, g_r: Group, h_m_pk_r: Group, }, }).toFields
Defined in
toInput
▪ Static toInput: (x: { private: { c: Field; g_r: Group; h_m_pk_r: Group; } ; public: { nullifier: Group; s: Scalar; } ; publicKey: Group = Group }) => { fields?: Field[] ; packed?: [Field, number][] }
Type declaration
▸ (x): Object
Parameters
| Name | Type | Default value |
|---|---|---|
x | Object | undefined |
x.private | { c: Field; g_r: Group; h_m_pk_r: Group; } | undefined |
x.public | { nullifier: Group; s: Scalar; } | undefined |
x.publicKey | Group | Group |
Returns
Object
| Name | Type |
|---|---|
fields? | Field[] |
packed? | [Field, number][] |
Inherited from
Struct({ publicKey: Group, public: { nullifier: Group, s: Scalar, }, private: { c: Field, g_r: Group, h_m_pk_r: Group, }, }).toInput
Defined in
toJSON
▪ Static toJSON: (x: { private: { c: Field; g_r: Group; h_m_pk_r: Group; } ; public: { nullifier: Group; s: Scalar; } ; publicKey: Group = Group }) => { private: { c: string; g_r: { x: string; y: string; }; h_m_pk_r: { x: string; y: string; }; } ; public: { nullifier: { x: string; y: string; }; s: string; } ; publicKey: { x: string ; y: string } = Group }
Type declaration
▸ (x): Object
Parameters
| Name | Type | Default value |
|---|---|---|
x | Object | undefined |
x.private | { c: Field; g_r: Group; h_m_pk_r: Group; } | undefined |
x.public | { nullifier: Group; s: Scalar; } | undefined |
x.publicKey | Group | Group |
Returns
Object
| Name | Type |
|---|---|
private | { c: string; g_r: { x: string; y: string; }; h_m_pk_r: { x: string; y: string; }; } |
public | { nullifier: { x: string; y: string; }; s: string; } |
publicKey | { x: string ; y: string } |
publicKey.x | string |
publicKey.y | string |
Inherited from
Struct({ publicKey: Group, public: { nullifier: Group, s: Scalar, }, private: { c: Field, g_r: Group, h_m_pk_r: Group, }, }).toJSON
Defined in
Methods
assertUnused
▸ assertUnused(witness, root): void
Checks if the Nullifier has been used before.
Parameters
| Name | Type |
|---|---|
witness | MerkleMapWitness |
root | Field |
Returns
void
Example
// asserts that the nullifier has not been used before, throws an error otherwise
nullifier.assertUnused();
Defined in
getPublicKey
▸ getPublicKey(): PublicKey
Returns the PublicKey that is associated with this Nullifier.
Returns
Example
let pk = nullifier.getPublicKey();
Defined in
isUnused
▸ isUnused(witness, root): Bool
Returns the state of the Nullifier.
Parameters
| Name | Type |
|---|---|
witness | MerkleMapWitness |
root | Field |
Returns
Example
// returns a Bool based on whether or not the nullifier has been used before
let isUnused = nullifier.isUnused();
Defined in
key
▸ key(): Field
The key of the nullifier, which belongs to a unique message and a public key. Used as an index in Merkle trees.
Returns
Example
// returns the key of the nullifier which can be used as index in a Merkle tree/map
let key = nullifier.key();
Defined in
setUsed
▸ setUsed(witness): Field
Sets the Nullifier, returns the new Merkle root.
Parameters
| Name | Type |
|---|---|
witness | MerkleMapWitness |
Returns
Example
// calculates the new root of the Merkle tree in which the nullifier is set to used
let newRoot = nullifier.setUsed(witness);
Defined in
verify
▸ verify(message): void
Verifies that the Nullifier belongs to a specific message. Throws an error if the Nullifier is incorrect.
Parameters
| Name | Type |
|---|---|
message | Field[] |
Returns
void
Example
let nullifierMessage = [voteId, ...otherData];
// throws an error if the nullifier is invalid or doesn't belong to this specific message
nullifier.verify(nullifierMessage);
Defined in
createTestNullifier
▸ Static createTestNullifier(message, sk): Nullifier
Note: This is not the recommended way to create a Nullifier in production. Please use mina-signer to create Nullifiers. Also, this function cannot be run within provable code to avoid unintended creations of Nullifiers - a Nullifier should never be created inside proveable code (e.g. a smart contract) directly, but rather created inside the users wallet (or other secure enclaves, so the private key never leaves that enclave).
PLUME: An ECDSA Nullifier Scheme for Unique Pseudonymity within Zero Knowledge Proofs https://eprint.iacr.org/2022/1255.pdf chapter 3 page 14
Parameters
| Name | Type |
|---|---|
message | Field[] |
sk | PrivateKey |
Returns
Nullifier
Defined in
fromJSON
▸ Static fromJSON(json): Nullifier
Parameters
| Name | Type |
|---|---|
json | Nullifier |
Returns
Overrides
Struct({ publicKey: Group, public: { nullifier: Group, s: Scalar, }, private: { c: Field, g_r: Group, h_m_pk_r: Group, }, }).fromJSON
Defined in
sizeInFields
▸ Static sizeInFields(): number
Return the size of the T type in terms of Field type, as Field is the primitive type.
Warning: This function returns a number, so you cannot use it to prove something on chain. You can use it during debugging or to understand the memory complexity of some type.
Returns
number
A number representing the size of the T type in terms of Field type.
Inherited from
Struct({ publicKey: Group, public: { nullifier: Group, s: Scalar, }, private: { c: Field, g_r: Group, h_m_pk_r: Group, }, }).sizeInFields