crates/sui-framework/docs/sui/bls12381.md
Group operations of BLS12-381.
ScalarG1G2GTUncompressedG1bls12381_min_sig_verifybls12381_min_pk_verifyscalar_from_bytesscalar_from_u64scalar_zeroscalar_onescalar_addscalar_subscalar_mulscalar_divscalar_negscalar_invg1_from_bytesg1_identityg1_generatorg1_addg1_subg1_mulg1_divg1_neghash_to_g1g1_multi_scalar_multiplicationg1_to_uncompressed_g1g2_from_bytesg2_identityg2_generatorg2_addg2_subg2_mulg2_divg2_neghash_to_g2g2_multi_scalar_multiplicationgt_identitygt_generatorgt_addgt_subgt_mulgt_divgt_negpairinguncompressed_g1_to_g1uncompressed_g1_sum<a name="sui_bls12381_Scalar"></a>
Scalar<a name="sui_bls12381_G1"></a>
G1<a name="sui_bls12381_G2"></a>
G2<a name="sui_bls12381_GT"></a>
GT<a name="sui_bls12381_UncompressedG1"></a>
UncompressedG1<a name="@Constants_0"></a>
<a name="sui_bls12381_SCALAR_ZERO_BYTES"></a>
<pre><code><b>const</b> <a href="../sui/bls12381.md#sui_bls12381_SCALAR_ZERO_BYTES">SCALAR_ZERO_BYTES</a>: vector<u8> = vector[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; </code></pre><a name="sui_bls12381_SCALAR_ONE_BYTES"></a>
<pre><code><b>const</b> <a href="../sui/bls12381.md#sui_bls12381_SCALAR_ONE_BYTES">SCALAR_ONE_BYTES</a>: vector<u8> = vector[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]; </code></pre><a name="sui_bls12381_G1_IDENTITY_BYTES"></a>
<pre><code><b>const</b> <a href="../sui/bls12381.md#sui_bls12381_G1_IDENTITY_BYTES">G1_IDENTITY_BYTES</a>: vector<u8> = vector[192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; </code></pre><a name="sui_bls12381_G1_GENERATOR_BYTES"></a>
<pre><code><b>const</b> <a href="../sui/bls12381.md#sui_bls12381_G1_GENERATOR_BYTES">G1_GENERATOR_BYTES</a>: vector<u8> = vector[151, 241, 211, 167, 49, 151, 215, 148, 38, 149, 99, 140, 79, 169, 172, 15, 195, 104, 140, 79, 151, 116, 185, 5, 161, 78, 58, 63, 23, 27, 172, 88, 108, 85, 232, 63, 249, 122, 26, 239, 251, 58, 240, 10, 219, 34, 198, 187]; </code></pre><a name="sui_bls12381_G2_IDENTITY_BYTES"></a>
<pre><code><b>const</b> <a href="../sui/bls12381.md#sui_bls12381_G2_IDENTITY_BYTES">G2_IDENTITY_BYTES</a>: vector<u8> = vector[192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; </code></pre><a name="sui_bls12381_G2_GENERATOR_BYTES"></a>
<pre><code><b>const</b> <a href="../sui/bls12381.md#sui_bls12381_G2_GENERATOR_BYTES">G2_GENERATOR_BYTES</a>: vector<u8> = vector[147, 224, 43, 96, 82, 113, 159, 96, 125, 172, 211, 160, 136, 39, 79, 101, 89, 107, 208, 208, 153, 32, 182, 26, 181, 218, 97, 187, 220, 127, 80, 73, 51, 76, 241, 18, 19, 148, 93, 87, 229, 172, 125, 5, 93, 4, 43, 126, 2, 74, 162, 178, 240, 143, 10, 145, 38, 8, 5, 39, 45, 197, 16, 81, 198, 228, 122, 212, 250, 64, 59, 2, 180, 81, 11, 100, 122, 227, 209, 119, 11, 172, 3, 38, 168, 5, 187, 239, 212, 128, 86, 200, 193, 33, 189, 184]; </code></pre><a name="sui_bls12381_GT_IDENTITY_BYTES"></a>
<pre><code><b>const</b> <a href="../sui/bls12381.md#sui_bls12381_GT_IDENTITY_BYTES">GT_IDENTITY_BYTES</a>: vector<u8> = vector[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; </code></pre><a name="sui_bls12381_GT_GENERATOR_BYTES"></a>
<pre><code><b>const</b> <a href="../sui/bls12381.md#sui_bls12381_GT_GENERATOR_BYTES">GT_GENERATOR_BYTES</a>: vector<u8> = vector[18, 80, 235, 216, 113, 252, 10, 146, 167, 178, 216, 49, 104, 208, 215, 39, 39, 45, 68, 27, 239, 161, 92, 80, 61, 216, 233, 12, 233, 141, 179, 231, 182, 209, 148, 246, 8, 57, 197, 8, 168, 67, 5, 170, 202, 23, 137, 182, 8, 154, 28, 91, 70, 229, 17, 11, 134, 117, 14, 198, 165, 50, 52, 136, 104, 168, 64, 69, 72, 60, 146, 183, 175, 90, 246, 137, 69, 46, 175, 171, 241, 168, 148, 62, 80, 67, 159, 29, 89, 136, 42, 152, 234, 160, 23, 15, 25, 242, 99, 55, 210, 5, 251, 70, 156, 214, 189, 21, 195, 213, 160, 77, 200, 135, 132, 251, 179, 208, 178, 219, 222, 165, 77, 67, 178, 183, 63, 44, 187, 18, 213, 131, 134, 168, 112, 62, 15, 148, 130, 38, 228, 126, 232, 157, 6, 251, 162, 62, 183, 197, 175, 13, 159, 128, 148, 12, 167, 113, 182, 255, 213, 133, 123, 170, 242, 34, 235, 149, 167, 210, 128, 157, 97, 191, 224, 46, 27, 253, 27, 104, 255, 2, 240, 184, 16, 42, 225, 194, 213, 213, 171, 26, 19, 104, 187, 68, 92, 124, 45, 32, 151, 3, 242, 57, 104, 156, 227, 76, 3, 120, 166, 142, 114, 166, 179, 178, 22, 218, 14, 34, 165, 3, 27, 84, 221, 255, 87, 48, 147, 150, 179, 140, 136, 28, 76, 132, 158, 194, 62, 135, 25, 53, 2, 184, 110, 219, 136, 87, 194, 115, 250, 7, 90, 80, 81, 41, 55, 224, 121, 78, 30, 101, 167, 97, 124, 144, 216, 189, 102, 6, 91, 31, 255, 229, 29, 122, 87, 153, 115, 177, 49, 80, 33, 236, 60, 25, 147, 79, 17, 184, 180, 36, 205, 72, 191, 56, 252, 239, 104, 8, 59, 11, 14, 197, 200, 26, 147, 179, 48, 238, 26, 103, 125, 13, 21, 255, 123, 152, 78, 137, 120, 239, 72, 136, 30, 50, 250, 201, 27, 147, 180, 115, 51, 226, 186, 87, 3, 53, 15, 85, 167, 174, 252, 211, 195, 27, 79, 203, 108, 229, 119, 28, 198, 160, 233, 120, 106, 181, 151, 51, 32, 200, 6, 173, 54, 8, 41, 16, 123, 168, 16, 197, 160, 159, 253, 217, 190, 34, 145, 160, 194, 90, 153, 162, 1, 178, 245, 34, 71, 61, 23, 19, 145, 18, 91, 168, 77, 196, 0, 124, 251, 242, 248, 218, 117, 47, 124, 116, 24, 82, 3, 252, 202, 88, 154, 199, 25, 195, 77, 255, 187, 170, 216, 67, 29, 173, 28, 31, 181, 151, 170, 165, 1, 129, 7, 21, 79, 37, 167, 100, 189, 60, 121, 147, 122, 69, 184, 69, 70, 218, 99, 75, 143, 107, 225, 74, 128, 97, 229, 92, 206, 186, 71, 139, 35, 247, 218, 202, 163, 92, 140, 167, 139, 234, 233, 98, 64, 69, 180, 182, 4, 197, 129, 35, 77, 8, 106, 153, 2, 36, 155, 100, 114, 143, 253, 33, 161, 137, 232, 121, 53, 169, 84, 5, 28, 124, 219, 167, 179, 135, 38, 41, 164, 250, 252, 5, 6, 98, 69, 203, 145, 8, 240, 36, 45, 15, 227, 239, 15, 65, 229, 134, 99, 191, 8, 207, 6, 134, 114, 203, 208, 26, 126, 199, 59, 172, 164, 215, 44, 169, 53, 68, 222, 255, 104, 107, 253, 109, 245, 67, 212, 142, 170, 36, 175, 228, 126, 30, 253, 228, 73, 56, 59, 103, 102, 49]; </code></pre><a name="sui_bls12381_SCALAR_TYPE"></a>
<pre><code><b>const</b> <a href="../sui/bls12381.md#sui_bls12381_SCALAR_TYPE">SCALAR_TYPE</a>: u8 = 0; </code></pre><a name="sui_bls12381_G1_TYPE"></a>
<pre><code><b>const</b> <a href="../sui/bls12381.md#sui_bls12381_G1_TYPE">G1_TYPE</a>: u8 = 1; </code></pre><a name="sui_bls12381_G2_TYPE"></a>
<pre><code><b>const</b> <a href="../sui/bls12381.md#sui_bls12381_G2_TYPE">G2_TYPE</a>: u8 = 2; </code></pre><a name="sui_bls12381_GT_TYPE"></a>
<pre><code><b>const</b> <a href="../sui/bls12381.md#sui_bls12381_GT_TYPE">GT_TYPE</a>: u8 = 3; </code></pre><a name="sui_bls12381_UNCOMPRESSED_G1_TYPE"></a>
<pre><code><b>const</b> <a href="../sui/bls12381.md#sui_bls12381_UNCOMPRESSED_G1_TYPE">UNCOMPRESSED_G1_TYPE</a>: u8 = 4; </code></pre><a name="sui_bls12381_bls12381_min_sig_verify"></a>
bls12381_min_sig_verify@param signature: A 48-bytes signature that is a point on the G1 subgroup. @param public_key: A 96-bytes public key that is a point on the G2 subgroup. @param msg: The message that we test the signature against.
If the signature is a valid signature of the message and public key according to BLS_SIG_BLS12381G1_XMD:SHA-256_SSWU_RO_NUL_, return true. Otherwise, return false.
<pre><code><b>public</b> <b>fun</b> <a href="../sui/bls12381.md#sui_bls12381_bls12381_min_sig_verify">bls12381_min_sig_verify</a>(signature: &vector<u8>, public_key: &vector<u8>, msg: &vector<u8>): bool </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>native</b> <b>fun</b> <a href="../sui/bls12381.md#sui_bls12381_bls12381_min_sig_verify">bls12381_min_sig_verify</a>( signature: &vector<u8>, public_key: &vector<u8>, msg: &vector<u8>, ): bool; </code></pre> </details><a name="sui_bls12381_bls12381_min_pk_verify"></a>
bls12381_min_pk_verify@param signature: A 96-bytes signature that is a point on the G2 subgroup. @param public_key: A 48-bytes public key that is a point on the G1 subgroup. @param msg: The message that we test the signature against.
If the signature is a valid signature of the message and public key according to BLS_SIG_BLS12381G2_XMD:SHA-256_SSWU_RO_NUL_, return true. Otherwise, return false.
<pre><code><b>public</b> <b>fun</b> <a href="../sui/bls12381.md#sui_bls12381_bls12381_min_pk_verify">bls12381_min_pk_verify</a>(signature: &vector<u8>, public_key: &vector<u8>, msg: &vector<u8>): bool </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>native</b> <b>fun</b> <a href="../sui/bls12381.md#sui_bls12381_bls12381_min_pk_verify">bls12381_min_pk_verify</a>( signature: &vector<u8>, public_key: &vector<u8>, msg: &vector<u8>, ): bool; </code></pre> </details><a name="sui_bls12381_scalar_from_bytes"></a>
scalar_from_bytes<a name="sui_bls12381_scalar_from_u64"></a>
scalar_from_u64<a name="sui_bls12381_scalar_zero"></a>
scalar_zero<a name="sui_bls12381_scalar_one"></a>
scalar_one<a name="sui_bls12381_scalar_add"></a>
scalar_add<a name="sui_bls12381_scalar_sub"></a>
scalar_sub<a name="sui_bls12381_scalar_mul"></a>
scalar_mul<a name="sui_bls12381_scalar_div"></a>
scalar_divReturns e2/e1, fails if a is zero.
<pre><code><b>public</b> <b>fun</b> <a href="../sui/bls12381.md#sui_bls12381_scalar_div">scalar_div</a>(e1: &<a href="../sui/group_ops.md#sui_group_ops_Element">sui::group_ops::Element</a><<a href="../sui/bls12381.md#sui_bls12381_Scalar">sui::bls12381::Scalar</a>>, e2: &<a href="../sui/group_ops.md#sui_group_ops_Element">sui::group_ops::Element</a><<a href="../sui/bls12381.md#sui_bls12381_Scalar">sui::bls12381::Scalar</a>>): <a href="../sui/group_ops.md#sui_group_ops_Element">sui::group_ops::Element</a><<a href="../sui/bls12381.md#sui_bls12381_Scalar">sui::bls12381::Scalar</a>> </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="../sui/bls12381.md#sui_bls12381_scalar_div">scalar_div</a>(e1: &Element<<a href="../sui/bls12381.md#sui_bls12381_Scalar">Scalar</a>>, e2: &Element<<a href="../sui/bls12381.md#sui_bls12381_Scalar">Scalar</a>>): Element<<a href="../sui/bls12381.md#sui_bls12381_Scalar">Scalar</a>> { <a href="../sui/group_ops.md#sui_group_ops_div">group_ops::div</a>(<a href="../sui/bls12381.md#sui_bls12381_SCALAR_TYPE">SCALAR_TYPE</a>, e1, e2) } </code></pre> </details><a name="sui_bls12381_scalar_neg"></a>
scalar_neg<a name="sui_bls12381_scalar_inv"></a>
scalar_inv<a name="sui_bls12381_g1_from_bytes"></a>
g1_from_bytes<a name="sui_bls12381_g1_identity"></a>
g1_identity<a name="sui_bls12381_g1_generator"></a>
g1_generator<a name="sui_bls12381_g1_add"></a>
g1_add<a name="sui_bls12381_g1_sub"></a>
g1_sub<a name="sui_bls12381_g1_mul"></a>
g1_mul<a name="sui_bls12381_g1_div"></a>
g1_divReturns e2 / e1, fails if scalar is zero.
<pre><code><b>public</b> <b>fun</b> <a href="../sui/bls12381.md#sui_bls12381_g1_div">g1_div</a>(e1: &<a href="../sui/group_ops.md#sui_group_ops_Element">sui::group_ops::Element</a><<a href="../sui/bls12381.md#sui_bls12381_Scalar">sui::bls12381::Scalar</a>>, e2: &<a href="../sui/group_ops.md#sui_group_ops_Element">sui::group_ops::Element</a><<a href="../sui/bls12381.md#sui_bls12381_G1">sui::bls12381::G1</a>>): <a href="../sui/group_ops.md#sui_group_ops_Element">sui::group_ops::Element</a><<a href="../sui/bls12381.md#sui_bls12381_G1">sui::bls12381::G1</a>> </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="../sui/bls12381.md#sui_bls12381_g1_div">g1_div</a>(e1: &Element<<a href="../sui/bls12381.md#sui_bls12381_Scalar">Scalar</a>>, e2: &Element<<a href="../sui/bls12381.md#sui_bls12381_G1">G1</a>>): Element<<a href="../sui/bls12381.md#sui_bls12381_G1">G1</a>> { <a href="../sui/group_ops.md#sui_group_ops_div">group_ops::div</a>(<a href="../sui/bls12381.md#sui_bls12381_G1_TYPE">G1_TYPE</a>, e1, e2) } </code></pre> </details><a name="sui_bls12381_g1_neg"></a>
g1_neg<a name="sui_bls12381_hash_to_g1"></a>
hash_to_g1Hash using DST = BLS_SIG_BLS12381G1_XMD:SHA-256_SSWU_RO_NUL_
<pre><code><b>public</b> <b>fun</b> <a href="../sui/bls12381.md#sui_bls12381_hash_to_g1">hash_to_g1</a>(m: &vector<u8>): <a href="../sui/group_ops.md#sui_group_ops_Element">sui::group_ops::Element</a><<a href="../sui/bls12381.md#sui_bls12381_G1">sui::bls12381::G1</a>> </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="../sui/bls12381.md#sui_bls12381_hash_to_g1">hash_to_g1</a>(m: &vector<u8>): Element<<a href="../sui/bls12381.md#sui_bls12381_G1">G1</a>> { <a href="../sui/group_ops.md#sui_group_ops_hash_to">group_ops::hash_to</a>(<a href="../sui/bls12381.md#sui_bls12381_G1_TYPE">G1_TYPE</a>, m) } </code></pre> </details><a name="sui_bls12381_g1_multi_scalar_multiplication"></a>
g1_multi_scalar_multiplicationLet 'scalars' be the vector [s1, s2, ..., sn] and 'elements' be the vector [e1, e2, ..., en]. Returns s1e1 + s2e2 + ... + sn*en. Aborts with <code>EInputTooLong</code> if the vectors are larger than 32 (may increase in the future).
<pre><code><b>public</b> <b>fun</b> <a href="../sui/bls12381.md#sui_bls12381_g1_multi_scalar_multiplication">g1_multi_scalar_multiplication</a>(scalars: &vector<<a href="../sui/group_ops.md#sui_group_ops_Element">sui::group_ops::Element</a><<a href="../sui/bls12381.md#sui_bls12381_Scalar">sui::bls12381::Scalar</a>>>, elements: &vector<<a href="../sui/group_ops.md#sui_group_ops_Element">sui::group_ops::Element</a><<a href="../sui/bls12381.md#sui_bls12381_G1">sui::bls12381::G1</a>>>): <a href="../sui/group_ops.md#sui_group_ops_Element">sui::group_ops::Element</a><<a href="../sui/bls12381.md#sui_bls12381_G1">sui::bls12381::G1</a>> </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="../sui/bls12381.md#sui_bls12381_g1_multi_scalar_multiplication">g1_multi_scalar_multiplication</a>( scalars: &vector<Element<<a href="../sui/bls12381.md#sui_bls12381_Scalar">Scalar</a>>>, elements: &vector<Element<<a href="../sui/bls12381.md#sui_bls12381_G1">G1</a>>>, ): Element<<a href="../sui/bls12381.md#sui_bls12381_G1">G1</a>> { <a href="../sui/group_ops.md#sui_group_ops_multi_scalar_multiplication">group_ops::multi_scalar_multiplication</a>(<a href="../sui/bls12381.md#sui_bls12381_G1_TYPE">G1_TYPE</a>, scalars, elements) } </code></pre> </details><a name="sui_bls12381_g1_to_uncompressed_g1"></a>
g1_to_uncompressed_g1Convert an <code>Element<<a href="../sui/bls12381.md#sui_bls12381_G1">G1</a>></code> to uncompressed form.
<pre><code><b>public</b> <b>fun</b> <a href="../sui/bls12381.md#sui_bls12381_g1_to_uncompressed_g1">g1_to_uncompressed_g1</a>(e: &<a href="../sui/group_ops.md#sui_group_ops_Element">sui::group_ops::Element</a><<a href="../sui/bls12381.md#sui_bls12381_G1">sui::bls12381::G1</a>>): <a href="../sui/group_ops.md#sui_group_ops_Element">sui::group_ops::Element</a><<a href="../sui/bls12381.md#sui_bls12381_UncompressedG1">sui::bls12381::UncompressedG1</a>> </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="../sui/bls12381.md#sui_bls12381_g1_to_uncompressed_g1">g1_to_uncompressed_g1</a>(e: &Element<<a href="../sui/bls12381.md#sui_bls12381_G1">G1</a>>): Element<<a href="../sui/bls12381.md#sui_bls12381_UncompressedG1">UncompressedG1</a>> { <a href="../sui/group_ops.md#sui_group_ops_convert">group_ops::convert</a>(<a href="../sui/bls12381.md#sui_bls12381_G1_TYPE">G1_TYPE</a>, <a href="../sui/bls12381.md#sui_bls12381_UNCOMPRESSED_G1_TYPE">UNCOMPRESSED_G1_TYPE</a>, e) } </code></pre> </details><a name="sui_bls12381_g2_from_bytes"></a>
g2_from_bytes<a name="sui_bls12381_g2_identity"></a>
g2_identity<a name="sui_bls12381_g2_generator"></a>
g2_generator<a name="sui_bls12381_g2_add"></a>
g2_add<a name="sui_bls12381_g2_sub"></a>
g2_sub<a name="sui_bls12381_g2_mul"></a>
g2_mul<a name="sui_bls12381_g2_div"></a>
g2_divReturns e2 / e1, fails if scalar is zero.
<pre><code><b>public</b> <b>fun</b> <a href="../sui/bls12381.md#sui_bls12381_g2_div">g2_div</a>(e1: &<a href="../sui/group_ops.md#sui_group_ops_Element">sui::group_ops::Element</a><<a href="../sui/bls12381.md#sui_bls12381_Scalar">sui::bls12381::Scalar</a>>, e2: &<a href="../sui/group_ops.md#sui_group_ops_Element">sui::group_ops::Element</a><<a href="../sui/bls12381.md#sui_bls12381_G2">sui::bls12381::G2</a>>): <a href="../sui/group_ops.md#sui_group_ops_Element">sui::group_ops::Element</a><<a href="../sui/bls12381.md#sui_bls12381_G2">sui::bls12381::G2</a>> </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="../sui/bls12381.md#sui_bls12381_g2_div">g2_div</a>(e1: &Element<<a href="../sui/bls12381.md#sui_bls12381_Scalar">Scalar</a>>, e2: &Element<<a href="../sui/bls12381.md#sui_bls12381_G2">G2</a>>): Element<<a href="../sui/bls12381.md#sui_bls12381_G2">G2</a>> { <a href="../sui/group_ops.md#sui_group_ops_div">group_ops::div</a>(<a href="../sui/bls12381.md#sui_bls12381_G2_TYPE">G2_TYPE</a>, e1, e2) } </code></pre> </details><a name="sui_bls12381_g2_neg"></a>
g2_neg<a name="sui_bls12381_hash_to_g2"></a>
hash_to_g2Hash using DST = BLS_SIG_BLS12381G2_XMD:SHA-256_SSWU_RO_NUL_
<pre><code><b>public</b> <b>fun</b> <a href="../sui/bls12381.md#sui_bls12381_hash_to_g2">hash_to_g2</a>(m: &vector<u8>): <a href="../sui/group_ops.md#sui_group_ops_Element">sui::group_ops::Element</a><<a href="../sui/bls12381.md#sui_bls12381_G2">sui::bls12381::G2</a>> </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="../sui/bls12381.md#sui_bls12381_hash_to_g2">hash_to_g2</a>(m: &vector<u8>): Element<<a href="../sui/bls12381.md#sui_bls12381_G2">G2</a>> { <a href="../sui/group_ops.md#sui_group_ops_hash_to">group_ops::hash_to</a>(<a href="../sui/bls12381.md#sui_bls12381_G2_TYPE">G2_TYPE</a>, m) } </code></pre> </details><a name="sui_bls12381_g2_multi_scalar_multiplication"></a>
g2_multi_scalar_multiplicationLet 'scalars' be the vector [s1, s2, ..., sn] and 'elements' be the vector [e1, e2, ..., en]. Returns s1e1 + s2e2 + ... + sn*en. Aborts with <code>EInputTooLong</code> if the vectors are larger than 32 (may increase in the future).
<pre><code><b>public</b> <b>fun</b> <a href="../sui/bls12381.md#sui_bls12381_g2_multi_scalar_multiplication">g2_multi_scalar_multiplication</a>(scalars: &vector<<a href="../sui/group_ops.md#sui_group_ops_Element">sui::group_ops::Element</a><<a href="../sui/bls12381.md#sui_bls12381_Scalar">sui::bls12381::Scalar</a>>>, elements: &vector<<a href="../sui/group_ops.md#sui_group_ops_Element">sui::group_ops::Element</a><<a href="../sui/bls12381.md#sui_bls12381_G2">sui::bls12381::G2</a>>>): <a href="../sui/group_ops.md#sui_group_ops_Element">sui::group_ops::Element</a><<a href="../sui/bls12381.md#sui_bls12381_G2">sui::bls12381::G2</a>> </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="../sui/bls12381.md#sui_bls12381_g2_multi_scalar_multiplication">g2_multi_scalar_multiplication</a>( scalars: &vector<Element<<a href="../sui/bls12381.md#sui_bls12381_Scalar">Scalar</a>>>, elements: &vector<Element<<a href="../sui/bls12381.md#sui_bls12381_G2">G2</a>>>, ): Element<<a href="../sui/bls12381.md#sui_bls12381_G2">G2</a>> { <a href="../sui/group_ops.md#sui_group_ops_multi_scalar_multiplication">group_ops::multi_scalar_multiplication</a>(<a href="../sui/bls12381.md#sui_bls12381_G2_TYPE">G2_TYPE</a>, scalars, elements) } </code></pre> </details><a name="sui_bls12381_gt_identity"></a>
gt_identity<a name="sui_bls12381_gt_generator"></a>
gt_generator<a name="sui_bls12381_gt_add"></a>
gt_add<a name="sui_bls12381_gt_sub"></a>
gt_sub<a name="sui_bls12381_gt_mul"></a>
gt_mul<a name="sui_bls12381_gt_div"></a>
gt_divReturns e2 / e1, fails if scalar is zero.
<pre><code><b>public</b> <b>fun</b> <a href="../sui/bls12381.md#sui_bls12381_gt_div">gt_div</a>(e1: &<a href="../sui/group_ops.md#sui_group_ops_Element">sui::group_ops::Element</a><<a href="../sui/bls12381.md#sui_bls12381_Scalar">sui::bls12381::Scalar</a>>, e2: &<a href="../sui/group_ops.md#sui_group_ops_Element">sui::group_ops::Element</a><<a href="../sui/bls12381.md#sui_bls12381_GT">sui::bls12381::GT</a>>): <a href="../sui/group_ops.md#sui_group_ops_Element">sui::group_ops::Element</a><<a href="../sui/bls12381.md#sui_bls12381_GT">sui::bls12381::GT</a>> </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="../sui/bls12381.md#sui_bls12381_gt_div">gt_div</a>(e1: &Element<<a href="../sui/bls12381.md#sui_bls12381_Scalar">Scalar</a>>, e2: &Element<<a href="../sui/bls12381.md#sui_bls12381_GT">GT</a>>): Element<<a href="../sui/bls12381.md#sui_bls12381_GT">GT</a>> { <a href="../sui/group_ops.md#sui_group_ops_div">group_ops::div</a>(<a href="../sui/bls12381.md#sui_bls12381_GT_TYPE">GT_TYPE</a>, e1, e2) } </code></pre> </details><a name="sui_bls12381_gt_neg"></a>
gt_neg<a name="sui_bls12381_pairing"></a>
pairing<a name="sui_bls12381_uncompressed_g1_to_g1"></a>
uncompressed_g1_to_g1UncompressedG1 group operations /// Create a <code>Element<<a href="../sui/bls12381.md#sui_bls12381_G1">G1</a>></code> from its uncompressed form.
<pre><code><b>public</b> <b>fun</b> <a href="../sui/bls12381.md#sui_bls12381_uncompressed_g1_to_g1">uncompressed_g1_to_g1</a>(e: &<a href="../sui/group_ops.md#sui_group_ops_Element">sui::group_ops::Element</a><<a href="../sui/bls12381.md#sui_bls12381_UncompressedG1">sui::bls12381::UncompressedG1</a>>): <a href="../sui/group_ops.md#sui_group_ops_Element">sui::group_ops::Element</a><<a href="../sui/bls12381.md#sui_bls12381_G1">sui::bls12381::G1</a>> </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="../sui/bls12381.md#sui_bls12381_uncompressed_g1_to_g1">uncompressed_g1_to_g1</a>(e: &Element<<a href="../sui/bls12381.md#sui_bls12381_UncompressedG1">UncompressedG1</a>>): Element<<a href="../sui/bls12381.md#sui_bls12381_G1">G1</a>> { <a href="../sui/group_ops.md#sui_group_ops_convert">group_ops::convert</a>(<a href="../sui/bls12381.md#sui_bls12381_UNCOMPRESSED_G1_TYPE">UNCOMPRESSED_G1_TYPE</a>, <a href="../sui/bls12381.md#sui_bls12381_G1_TYPE">G1_TYPE</a>, e) } </code></pre> </details><a name="sui_bls12381_uncompressed_g1_sum"></a>
uncompressed_g1_sumCompute the sum of a list of uncompressed elements. This is significantly faster and cheaper than summing the elements.
<pre><code><b>public</b> <b>fun</b> <a href="../sui/bls12381.md#sui_bls12381_uncompressed_g1_sum">uncompressed_g1_sum</a>(terms: &vector<<a href="../sui/group_ops.md#sui_group_ops_Element">sui::group_ops::Element</a><<a href="../sui/bls12381.md#sui_bls12381_UncompressedG1">sui::bls12381::UncompressedG1</a>>>): <a href="../sui/group_ops.md#sui_group_ops_Element">sui::group_ops::Element</a><<a href="../sui/bls12381.md#sui_bls12381_UncompressedG1">sui::bls12381::UncompressedG1</a>> </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="../sui/bls12381.md#sui_bls12381_uncompressed_g1_sum">uncompressed_g1_sum</a>(terms: &vector<Element<<a href="../sui/bls12381.md#sui_bls12381_UncompressedG1">UncompressedG1</a>>>): Element<<a href="../sui/bls12381.md#sui_bls12381_UncompressedG1">UncompressedG1</a>> { <a href="../sui/group_ops.md#sui_group_ops_sum">group_ops::sum</a>(<a href="../sui/bls12381.md#sui_bls12381_UNCOMPRESSED_G1_TYPE">UNCOMPRESSED_G1_TYPE</a>, terms) } </code></pre> </details>