Module sui::group_ops
Generic Move and native functions for group operations.
- Struct Element
- Constants
- Function bytes
- Function equal
- Function from_bytes
- Function add
- Function sub
- Function mul
- Function div
- Function hash_to
- Function multi_scalar_multiplication
- Function pairing
- Function convert
- Function sum
- Function internal_validate
- Function internal_add
- Function internal_sub
- Function internal_mul
- Function internal_div
- Function internal_hash_to
- Function internal_multi_scalar_mul
- Function internal_pairing
- Function internal_convert
- Function internal_sum
- Function set_as_prefix
use std::ascii;
use std::bcs;
use std::option;
use std::string;
use std::vector;
use sui::address;
use sui::bcs;
use sui::hex;
Struct Element
public struct Element<phantom T> has copy, drop, store
Click to open
Fields
-
bytes: vector<u8>
Constants
const ENotSupported: u64 = 0;
const EInvalidInput: u64 = 1;
const EInputTooLong: u64 = 2;
const EInvalidBufferLength: u64 = 3;
Function bytes
public fun bytes<G>(e: &sui::group_ops::Element<G>): &vector<u8>
Function equal
public fun equal<G>(e1: &sui::group_ops::Element<G>, e2: &sui::group_ops::Element<G>): bool
Click to open
Function from_bytes
public(package) fun from_bytes<G>(type_: u8, bytes: &vector<u8>, is_trusted: bool): sui::group_ops::Element<G>
Click to open
Implementation
public(package) fun from_bytes<G>(type_: u8, bytes: &vector<u8>, is_trusted: bool): Element<G> {
assert!(is_trusted || internal_validate(type_, bytes), EInvalidInput);
Element<G> { bytes: *bytes }
}
Function add
public(package) fun add<G>(type_: u8, e1: &sui::group_ops::Element<G>, e2: &sui::group_ops::Element<G>): sui::group_ops::Element<G>
Click to open
Function sub
public(package) fun sub<G>(type_: u8, e1: &sui::group_ops::Element<G>, e2: &sui::group_ops::Element<G>): sui::group_ops::Element<G>
Click to open
Function mul
public(package) fun mul<S, G>(type_: u8, scalar: &sui::group_ops::Element<S>, e: &sui::group_ops::Element<G>): sui::group_ops::Element<G>
Click to open
Function div
Fails if scalar = 0. Else returns 1/scalar * e.
public(package) fun div<S, G>(type_: u8, scalar: &sui::group_ops::Element<S>, e: &sui::group_ops::Element<G>): sui::group_ops::Element<G>
Click to open
Function hash_to
public(package) fun hash_to<G>(type_: u8, m: &vector<u8>): sui::group_ops::Element<G>
Click to open
Function multi_scalar_multiplication
Aborts with
EInputTooLong if the vectors are too long.
This function is currently only enabled on Devnet.
public(package) fun multi_scalar_multiplication<S, G>(type_: u8, scalars: &vector<sui::group_ops::Element<S>>, elements: &vector<sui::group_ops::Element<G>>): sui::group_ops::Element<G>
Click to open
Implementation
public(package) fun multi_scalar_multiplication<S, G>(
type_: u8,
scalars: &vector<Element<S>>,
elements: &vector<Element<G>>,
): Element<G> {
assert!(scalars.length() > 0, EInvalidInput);
assert!(scalars.length() == elements.length(), EInvalidInput);
let mut scalars_bytes: vector<u8> = vector[];
let mut elements_bytes: vector<u8> = vector[];
let mut i = 0;
while (i < scalars.length()) {
let scalar_vec = scalars[i];
scalars_bytes.append(scalar_vec.bytes);
let element_vec = elements[i];
elements_bytes.append(element_vec.bytes);
i = i + 1;
};
Element<G> { bytes: internal_multi_scalar_mul(type_, &scalars_bytes, &elements_bytes) }
}