Skip to main content
For the complete documentation index, see llms.txt

Detailed API reference

Top-level exports and native types and functions​

컨트랙트의 최상위에서 타입이나 circuit을 export하면 그 정의가 컨트랙트의 TypeScript API에서 보이고 사용 가능해집니다. 컨트랙트의 최상위에서 circuit을 export하면 추가로 그 circuit이 온체인 트랜잭션을 위한 컨트랙트의 진입점 중 하나가 됩니다.

표준 라이브러리에 정의된 타입과 함수 중 상당수는 네이티브 타입과 함수입니다. 이들은 Compact 컴파일러에서 어떤 식으로든 특별하게 처리되는 것들입니다. 이 특별한 처리의 결과로, 현재 이들은 컨트랙트의 최상위에서 export할 수 없습니다.

이러한 타입과 함수를 export하려는 시도는 컴파일러 오류입니다.

다만 네이티브 타입에 대한 타입 별칭을 export하고, 네이티브 함수를 감싸는 circuit을 export할 수는 있습니다. 예를 들어:

import { JubjubPoint as nativeJubjubPoint, ecAdd as nativeEcAdd } from CompactStandardLibrary;

export type JubjubPoint = nativeJubjubPoint;

export pure circuit ecAdd(a: JubjubPoint, b: JubjubPoint): JubjubPoint {
return nativeEcAdd(a, b);
}

생성된 TypeScript API에는 JubjubPoint와 ecAdd에 대한 정의가 포함됩니다. 표준 라이브러리의 ecAdd는 다형적이지만(Jubjub 외의 다른 곡선 타입에서도 동작) export된 버전은 JubjubPoint에 대해서만 동작한다는 점에 유의하세요.

Structure types​

Maybe​

값이 있을 수도 없을 수도 있는 경우를 표현합니다. is_some이 false이면 value는 관례상 default<T>여야 합니다.

struct Maybe<T> {
is_some: Boolean;
value: T;
}

Either​

A와 B의 분리합집합입니다. is_left가 true이면 left만 유효하고, 그렇지 않으면 right만 유효합니다. 유효하지 않은 쪽은 관례상 default< >여야 합니다.

struct Either<A, B> {
is_left: Boolean;
left: A;
right: B;
}

JubjubSchnorrSignature​

JubJub 내장 곡선 위의 Schnorr 서명입니다. announcement 점과 scalar response를 담으며, jubjubSchnorrVerify와 함께 사용합니다.

struct JubjubSchnorrSignature {
announcement: JubjubPoint;
response: Field;
}

Secp256k1EcdsaSignature​

secp256k1 곡선 위의 ECDSA 서명으로, secp256k1EcdsaVerify와 함께 사용합니다. r과 s 구성 요소는 Secp256k1Scalar입니다.

struct Secp256k1EcdsaSignature {
r: Secp256k1Scalar;
s: Secp256k1Scalar;
}

Secp256r1EcdsaSignature​

secp256r1(P256이라고도 함) 곡선 위의 ECDSA 서명으로, secp256r1EcdsaVerify와 함께 사용합니다. r과 s 구성 요소는 Secp256r1Scalar입니다.

struct Secp256r1EcdsaSignature {
r: Secp256r1Scalar;
s: Secp256r1Scalar;
}

Ed25519Signature​

Ed25519 서명으로, ed25519Verify와 함께 사용합니다. commitment 점 r(Curve25519Point)과 response 스칼라 s(Curve25519Scalar)로 구성됩니다.

표준 64바이트 Ed25519 서명은 r의 32바이트 인코딩 뒤에 s를 32바이트 리틀 엔디언 정수로 이어 붙인 것입니다(RFC 8032 5.1.6절).

공개 키는 r과 같은 방식으로 그 32바이트에서 디코딩됩니다.

struct Ed25519Signature {
r: Curve25519Point;
s: Curve25519Scalar;
}

MerkleTreeDigest​

단일 Field로 표현되는 Merkle 트리의 루트 해시입니다.

struct MerkleTreeDigest { field: Field; }

MerkleTreePathEntry​

Merkle 트리 경로의 항목으로, 경로가 왼쪽으로 가는지 오른쪽으로 가는지를 나타내며 형제 노드의 루트를 포함합니다. 주로 MerkleTreePath에서 사용됩니다.

struct MerkleTreePathEntry {
sibling: MerkleTreeDigest;
goes_left: Boolean;
}

MerkleTreePath​

깊이 n인 Merkle 트리에서 타입 T의 리프로 이어지는 경로입니다. 주로 merkleTreePathRoot에 사용됩니다.

컴파일러 출력의 findPathForLeaf 및 pathForLeaf 함수를 사용하는 witness에서 생성할 수 있습니다.

struct MerkleTreePath<#n, T> {
leaf: T;
path: Vector<n, MerkleTreePathEntry>;
}

ContractAddress​

컨트랙트의 주소로, sendShielded, sendImmediateShielded, createZswapOutput 및 mintShieldedToken에서 수신자로 사용됩니다.

struct ContractAddress { bytes: Bytes<32>; }

ShieldedCoinInfo​

새로 생성된 shielded 코인의 설명으로, shielded 코인 출력 또는 현재 트랜잭션에서 생성된 shielded 코인의 지출/수신에 사용됩니다.

nonce는 evolveNonce로 결정론적으로 유도할 수 있습니다.

사용처:

struct ShieldedCoinInfo {
nonce: Bytes<32>;
color: Bytes<32>;
value: Uint<128>;
}

QualifiedShieldedCoinInfo​

ledger에 존재하는 shielded 코인의 설명으로, 지출 준비가 된 상태입니다.

사용처:

struct QualifiedShieldedCoinInfo {
nonce: Bytes<32>;
color: Bytes<32>;
value: Uint<128>;
mt_index: Uint<64>;
}

ZswapCoinPublicKey​

ShieldedCoinInfo를 사용자에게 출력하는 데 사용되는 공개 키로, sendShielded, sendImmediateShielded 및 createZswapOutput에서 수신자로 사용됩니다.

struct ZswapCoinPublicKey { bytes: Bytes<32>; }

ShieldedSendResult​

sendShielded 및 sendImmediateShielded의 출력으로, 생성된 shielded 코인과 입력 지출에 따른 잔돈(해당하는 경우)을 상세히 설명합니다.

struct ShieldedSendResult {
change: Maybe<ShieldedCoinInfo>;
sent: ShieldedCoinInfo;
}

UserAddress​

사용자의 공개 키로, sendUnshielded 및 mintUnshieldedToken에서 수신자로 사용됩니다.

struct UserAddress { bytes: Bytes<32>; }

Type aliases​

PublicAddress​

컨트랙트의 주소이거나 사용자의 주소입니다. unshielded 토큰 연산에서 사용하는 수신자 타입입니다.

type PublicAddress = Either<ContractAddress, UserAddress>;

Ledger fields​

kernel​

표준 라이브러리는 내장 Kernel ledger ADT의 ledger 필드 kernel 하나를 export합니다. 이는 컨트랙트에 체인에 대한 뷰를 제공합니다. 즉 자신의 주소, 호출자, unshielded 잔액, 현재 블록 시간, 그리고 Zswap 및 unshielded 효과를 청구하는 연산입니다. 연산은 Ledger 데이터 타입에 문서화되어 있습니다.

export ledger kernel: Kernel;

아래의 여러 circuit은 이 필드를 기준으로 정의됩니다. 예를 들어 현재 컨트랙트를 수신자로 지정하려면 right<ZswapCoinPublicKey, ContractAddress>(kernel.self())를 사용합니다.

Events​

이벤트는 emit 연산으로 발행할 수 있는 struct 타입입니다.

ShieldedSpend​

shielded 코인이 소비되고 사용자 수신자를 위한 새 코인이 생성됩니다.

직렬화 크기는 32입니다.

struct ShieldedSpend {
nullifier: Bytes<32> // indexed
}

ShieldedReceive​

컨트랙트가 들어오는 shielded 코인을 수락합니다.

contractAddress는 컨트랙트가 수신할 때 설정되고, 사용자 수신자의 경우 없습니다.

직렬화 크기는 578입니다.

struct ShieldedReceive {
commitment: Bytes<32>, // indexed
ciphertext: Maybe<Bytes<512>>,
contractAddress: Maybe<Bytes<32>>
}

ShieldedMint​

새 shielded 토큰이 생성됩니다.

tokenType은 소비자가 domainSep + ContractLog.address에서 유도합니다.

직렬화 크기는 81입니다.

struct ShieldedMint {
commitment: Bytes<32>, // indexed
domainSep: Bytes<32>, // indexed
amount: Maybe<Uint<128>>
}

ShieldedBurn​

shielded 코인이 소각 주소로 전송됩니다.

공급량 추적 — 토큰이 유통에서 영구히 제거됩니다.

직렬화 크기는 49입니다.

struct ShieldedBurn {
nullifier: Bytes<32>, // indexed
amount: Maybe<Uint<128>>
}

UnshieldedSpend​

공개 토큰이 송신자로부터 전송됩니다.

직렬화 크기는 145입니다.

struct UnshieldedSpend {
sender: Either<ZswapCoinPublicKey, ContractAddress>, // indexed
domainSep: Bytes<32>, // indexed
tokenType: Bytes<32>, // indexed
amount: Uint<128>
}

UnshieldedReceive​

공개 토큰이 수신자에게 전송됩니다.

직렬화 크기는 145입니다.

struct UnshieldedReceive {
recipient: Either<ZswapCoinPublicKey, ContractAddress>, // indexed
domainSep: Bytes<32>, // indexed
tokenType: Bytes<32>, // indexed
amount: Uint<128>
}

UnshieldedMint​

새 unshielded 토큰이 생성됩니다.

직렬화 크기는 80입니다.

struct UnshieldedMint {
domainSep: Bytes<32>, // indexed
tokenType: Bytes<32>, // indexed
amount: Uint<128>
}

UnshieldedBurn​

unshielded 코인이 소각 주소로 전송됩니다.

직렬화 크기는 113입니다.

struct UnshieldedBurn {
sender: Either<ZswapCoinPublicKey, ContractAddress>, // indexed
tokenType: Bytes<32>, // indexed
amount: Uint<128>
}

Paused​

컨트랙트 연산이 중단됩니다.

직렬화 크기는 0입니다.

struct Paused {}

Unpaused​

컨트랙트 연산이 재개됩니다.

직렬화 크기는 0입니다.

struct Unpaused {}

Misc​

기타 이벤트 타입입니다.

직렬화 크기는 288입니다.

struct Misc {
name: Bytes<32>,
payload: Bytes<256>
}

Circuits and native types​

some​

타입 T의 요소를 포함하는 Maybe<T>를 생성합니다.

circuit some<T>(value: T): Maybe<T>;

none​

아무것도 포함하지 않는 Maybe<T>를 생성합니다.

circuit none<T>(): Maybe<T>;

left​

분리합집합의 A 항목을 포함하는 Either<A, B>를 생성합니다.

circuit left<A, B>(value: A): Either<A, B>;

분리합집합의 B 항목을 포함하는 Either<A, B>를 생성합니다.

circuit right<A, B>(value: B): Either<A, B>;

transientHash​

내장 임시 해시 압축 함수

임의의 값을 필드 요소로 변환하는 circuit 효율적 압축 함수입니다. 업그레이드 간 지속이 보장되지 않으므로 상태 데이터 도출에는 사용하지 말고 일관성 검사에만 사용해야 합니다.

입력의 해시를 반환하지만, 입력을 공개로부터 보호하기에 충분하다고 간주되지 않습니다. 입력에 witness 반환 값이 포함된 경우, 결과가 공개 ledger에 저장되거나 export된 circuit에서 반환되거나 크로스 컨트랙트 호출로 다른 컨트랙트에 전달될 수 있다면 disclose 래퍼를 통해 공개를 승인해야 합니다.

circuit transientHash<T>(value: T): Field;

transientCommit​

내장 임시 commitment 함수

임의 타입에 대한 circuit 효율적 commitment 함수로, 필드 요소 개방에서 필드 요소로 변환합니다. 업그레이드 간 지속이 보장되지 않으므로 상태 데이터 도출에는 사용하지 말고 일관성 검사에만 사용해야 합니다.

transientHash와 달리, rand 인수가 충분히 무작위적이라면 입력을 공개로부터 보호하기에 충분합니다. 따라서 입력에 witness 반환 값이 포함되어 있더라도, 결과가 공개 ledger에 저장되거나 export된 circuit에서 반환되거나 크로스 컨트랙트 호출로 전달되는 경우 disclose 래퍼를 통한 공개 승인이 필요 없습니다.

circuit transientCommit<T>(value: T, rand: Field): Field;

persistentHash​

내장 영구 해시 압축 함수

임의의 값을 256비트 바이트 문자열로 변환하는 비 circuit 최적화 압축 함수입니다. 업그레이드 간 지속이 보장되며 SHA-256 알고리즘을 일관되게 사용합니다. 상태 데이터 도출에 사용해야 하며, 가능하면 일관성 검사에는 사용하지 않아야 합니다.

transientHash의 공개 관련 참고 사항이 이 함수에도 적용됩니다.

circuit persistentHash<T>(value: T): Bytes<32>;

persistentCommit​

내장 영구 commitment 함수

Compact에서 표현 가능한 임의의 값과 256비트 바이트 문자열 개방을 받아 256비트 바이트 문자열을 반환하는 비 circuit 최적화 commitment 함수입니다. 업그레이드 간 지속이 보장되며 SHA-256 알고리즘을 사용합니다. 상태 데이터 도출에 사용해야 하며, 가능하면 일관성 검사에는 사용하지 않아야 합니다.

transientCommit의 공개 관련 참고 사항이 이 함수에도 적용됩니다.

circuit persistentCommit<T>(value: T, rand: Bytes<32>): Bytes<32>;

degradeToTransient​

이 함수는 persistentHash 또는 persistentCommit의 출력을 필드 요소로 "다운그레이드"하여 transientHash 또는 transientCommit에서 사용할 수 있게 합니다.

circuit degradeToTransient(x: Bytes<32>) : Field;

upgradeFromTransient​

이 함수는 필드 요소를 persistentHash 또는 persistentCommit의 출력으로 "업그레이드"합니다.

circuit upgradeFromTransient(x: Field): Bytes<32>;

keccak256​

이 함수는 입력을 Keccak-256 알고리즘으로 해시합니다. 32바이트 다이제스트를 반환합니다.

circuit keccak256<T>(value: T): Bytes<32>;

sha512​

이 함수는 입력을 SHA-512 알고리즘으로 해시합니다. 64바이트 다이제스트를 반환합니다.

circuit sha512<T>(value: T): Bytes<64>;

JubjubPoint​

네이티브 타입입니다.

내장 타원 곡선 위의 점 타입입니다. 아핀 x 좌표와 y 좌표의 쌍을 나타냅니다. 좌표는 네이티브 Field(BLS12-381) 값입니다.

JubjubScalar​

네이티브 타입입니다.

0(포함)과 Jubjub 내장 타원 곡선의 소수 차수 부분군의 차수(미포함) 사이의 숫자 값 타입입니다. Jubjub 곡선 점을 곱하는 데 사용하는 스칼라의 타입입니다.

최대값(필드 차수보다 1 작음)은 (10진수) 6554484396890773809930967563523245729705921265872317281365359162392183254198이고 (16진수) 0xe7db4ea6533afa906673b0101343b00a6682093ccc81082d0970e5ed6f72cb6입니다.

constructJubjubPoint​

네이티브 circuit입니다.

이 함수는 x 좌표와 y 좌표에서 JubjubPoint를 구성합니다. 표준 라이브러리도, Compact JavaScript 런타임 패키지도 구성된 점이 실제로 Jubjub 곡선 위에 있는지는 검증하지 않습니다. 유효하지 않은 Jubjub 곡선 점을 구성하거나 그에 대해 연산하는 동작은 정의되지 않습니다. 일반적으로 유효하지 않은 Jubjub 곡선 점이 관련된 증명은 생성할 수 없습니다.

circuit constructJubjubPoint(x: Field, y: Field): JubjubPoint;

jubjubPointX​

네이티브 circuit입니다.

이 함수는 JubjubPoint에서 x 좌표를 추출합니다.

circuit jubjubPointX(pt: JubjubPoint): Field;

jubjubPointY​

네이티브 circuit입니다.

이 함수는 JubjubPoint에서 y 좌표를 추출합니다.

circuit jubjubPointY(pt: JubjubPoint): Field;

Secp256k1Point​

네이티브 타입입니다.

secp256k1 타원 곡선 위의 점 타입입니다. 아핀 x 좌표와 y 좌표의 쌍을 나타냅니다. 좌표는 Secp256k1Base 값입니다. secp256k1 점은 Compact에서 생성할 수 없지만, circuit 인수로 전달하고 witness 함수에서 반환할 수 있습니다. 유효하지 않은 secp256k1 곡선 점에 대해 연산하는 동작은 정의되지 않습니다. 일반적으로 유효하지 않은 secp256k1 곡선 점이 관련된 증명은 생성할 수 없습니다.

(가법) 항등점은 좌표 쌍으로 표현되지 않습니다. Compact에서는 default<Secp256k1Point>로 표현됩니다.

Secp256k1Base​

네이티브 타입입니다.

0(포함)과 secp256k1 타원 곡선의 기반 필드 차수(미포함) 사이의 값 타입입니다. 해당 곡선 위 점의 아핀 좌표의 타입입니다.

최대값(필드 차수보다 1 작음)은 (10진수) 115792089237316195423570985008687907853269984665640564039457584007908834671662이고 (16진수) 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2e입니다.

Secp256k1Scalar​

네이티브 타입입니다.

0(포함)과 secp256k1 그룹의 차수(미포함) 사이의 숫자 값 타입입니다. secp256k1 곡선 점을 곱하는 데 사용하는 스칼라의 타입입니다.

최대값(필드 차수보다 1 작음)은 (10진수) 115792089237316195423570985008687907852837564279074904382605163141518161494336이고 (16진수) 0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140입니다.

secp256k1PointX​

네이티브 circuit입니다.

이 함수는 Secp256k1Point에서 아핀 x 좌표를 추출합니다.

circuit secp256k1PointX(pt: Secp256k1Point): Secp256k1Base;

secp256k1PointY​

네이티브 circuit입니다.

이 함수는 Secp256k1Point에서 아핀 y 좌표를 추출합니다.

circuit secp256k1PointY(pt: Secp256k1Point): Secp256k1Base;

Secp256r1Point​

네이티브 타입입니다.

secp256r1 타원 곡선 위의 점 타입입니다. 아핀 x 좌표와 y 좌표의 쌍을 나타냅니다. 좌표는 Secp256r1Base 값입니다. secp256r1 점은 Compact에서 생성할 수 없지만, circuit 인수로 전달하고 witness 함수에서 반환할 수 있습니다. 유효하지 않은 secp256r1 곡선 점에 대해 연산하는 동작은 정의되지 않습니다. 일반적으로 유효하지 않은 secp256r1 곡선 점이 관련된 증명은 생성할 수 없습니다.

(가법) 항등점은 좌표 쌍으로 표현되지 않습니다. Compact에서는 default<Secp256r1Point>로 표현됩니다.

Secp256r1Base​

네이티브 타입입니다.

0(포함)과 secp256r1 타원 곡선의 기반 필드 차수(미포함) 사이의 값 타입입니다. 해당 곡선 위 점의 아핀 좌표의 타입입니다.

최대값(필드 차수보다 1 작음)은 (10진수) 115792089210356248762697446949407573530086143415290314195533631308867097853950이고 (16진수) 0xffffffff00000001000000000000000000000000fffffffffffffffffffffffe입니다.

Secp256r1Scalar​

네이티브 타입입니다.

0(포함)과 secp256r1 그룹의 차수(미포함) 사이의 숫자 값 타입입니다. secp256r1 곡선 점을 곱하는 데 사용하는 스칼라의 타입입니다.

최대값(필드 차수보다 1 작음)은 (10진수) 115792089210356248762697446949407573529996955224135760342422259061068512044368이고 (16진수) 0xffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550입니다.

secp256r1PointX​

네이티브 circuit입니다.

이 함수는 Secp256r1Point에서 아핀 x 좌표를 추출합니다.

circuit secp256r1PointX(pt: Secp256r1Point): Secp256r1Base;

secp256r1PointY​

네이티브 circuit입니다.

이 함수는 Secp256r1Point에서 아핀 y 좌표를 추출합니다.

circuit secp256r1PointY(pt: Secp256r1Point): Secp256r1Base;

Curve25519Point​

네이티브 타입입니다.

비틀린 에드워즈 형식(Ed25519의 곡선)의 Curve25519 위의 점 타입입니다. 아핀 x 좌표와 y 좌표의 쌍을 나타냅니다. 좌표는 Curve25519Base 값입니다. Curve25519 점은 Compact에서 생성할 수 없지만, circuit 인수로 전달하고 witness 함수에서 반환할 수 있습니다. 유효하지 않은 Curve25519 점에 대해 연산하는 동작은 정의되지 않습니다. 일반적으로 유효하지 않은 Curve25519 점이나 소수 차수 부분군 밖의 점이 관련된 증명은 생성할 수 없습니다.

(가법) 항등점은 (0, 1)입니다.

Curve25519Base​

네이티브 타입입니다.

0(포함)과 Curve25519의 기반 필드 차수 2^255 - 19(미포함) 사이의 값 타입입니다. 해당 곡선 위 점의 아핀 좌표의 타입입니다.

최대값(필드 차수보다 1 작음)은 (10진수) 57896044618658097711785492504343953926634992332820282019728792003956564819948이고 (16진수) 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec입니다.

Curve25519Scalar​

네이티브 타입입니다.

0(포함)과 Curve25519의 소수 차수 부분군의 차수(미포함) 사이의 숫자 값 타입입니다. Curve25519 점을 곱하는 데 사용하는 스칼라의 타입입니다.

최대값(부분군 차수보다 1 작음)은 (10진수) 7237005577332262213973186563042994240857116359379907606001950938285454250988이고 (16진수) 0x1000000000000000000000000000000014def9dea2f79cd65812631a5cf5d3ec입니다.

curve25519PointX​

네이티브 circuit입니다.

이 함수는 Curve25519Point에서 아핀 x 좌표를 추출합니다.

circuit curve25519PointX(pt: Curve25519Point): Curve25519Base;

curve25519PointY​

네이티브 circuit입니다.

이 함수는 Curve25519Point에서 아핀 y 좌표를 추출합니다.

circuit curve25519PointY(pt: Curve25519Point): Curve25519Base;

ecAdd​

이 함수는 두 타원 곡선 점을 더합니다. 다음 타입에 대해 다형적입니다:

circuit ecAdd(a: JubjubPoint, b: JubjubPoint): JubjubPoint;
circuit ecAdd(a: Secp256k1Point, b: Secp256k1Point): Secp256k1Point;
circuit ecAdd(a: Secp256r1Point, b: Secp256r1Point): Secp256r1Point;
circuit ecAdd(a: Curve25519Point, b: Curve25519Point): Curve25519Point;

ecNeg​

이 함수는 타원 JubjubPoint를 부정합니다. JubJub 비틀린 에드워즈 곡선에서 (x, y)의 부정은 (-x, y)입니다.

circuit ecNeg(a: JubjubPoint): JubjubPoint;

ecMul​

이 함수는 타원 곡선 점에 스칼라를 곱합니다. 다음 타입에 대해 다형적입니다:

circuit ecMul(a: JubjubPoint, b: JubjubScalar): JubjubPoint;
circuit ecMul(a: Secp256k1Point, b: Secp256k1Scalar): Secp256k1Point;
circuit ecMul(a: Secp256r1Point, b: Secp256r1Scalar): Secp256r1Point;
circuit ecMul(a: Curve25519Point, b: Curve25519Scalar): Curve25519Point;

ecMulGenerator​

이 함수는 곡선의 주요 그룹 생성자에 스칼라를 곱합니다. 다음 타입에 대해 다형적입니다:

circuit ecMulGenerator(b: JubjubScalar): JubjubPoint;
circuit ecMulGenerator(b: Secp256k1Scalar): Secp256k1Point;
circuit ecMulGenerator(b: Secp256r1Scalar): Secp256r1Point;
circuit ecMulGenerator(b: Curve25519Scalar): Curve25519Point;

neg​

필드 요소를 부정합니다. 즉 add(x, y)가 필드에서 0이 되는 값 y를 반환합니다. 다음 타입에 대해 동작하는 다형 함수입니다:

  • Secp256k1Base
  • Secp256k1Scalar
  • Secp256r1Base
  • Secp256r1Scalar
  • Curve25519Base
  • Curve25519Scalar
circuit neg(s: Secp256k1Base): Secp256k1Base;
circuit neg(s: Secp256k1Scalar): Secp256k1Scalar;
circuit neg(s: Secp256r1Base): Secp256r1Base;
circuit neg(s: Secp256r1Scalar): Secp256r1Scalar;
circuit neg(s: Curve25519Base): Curve25519Base;
circuit neg(s: Curve25519Scalar): Curve25519Scalar;

inv​

필드 요소의 곱셈 역원, 즉 mul(x, y)가 필드에서 1이 되는 값 y를 반환합니다. 다음 타입에 대해 동작하는 다형 함수입니다:

  • Secp256k1Base
  • Secp256k1Scalar
  • Secp256r1Base
  • Secp256r1Scalar
  • Curve25519Base
  • Curve25519Scalar
circuit inv(s: Secp256k1Base): Secp256k1Base;
circuit inv(s: Secp256k1Scalar): Secp256k1Scalar;
circuit inv(s: Secp256r1Base): Secp256r1Base;
circuit inv(s: Secp256r1Scalar): Secp256r1Scalar;
circuit inv(s: Curve25519Base): Curve25519Base;
circuit inv(s: Curve25519Scalar): Curve25519Scalar;

hashToCurve​

이 함수는 임의의 타입을 JubjubPoint로 매핑합니다.

출력은 그룹 베이스 및 다른 출력에 대해 알려지지 않은 이산 로그를 가짐이 보장되지만, 고유함이 보장되지는 않습니다(주어진 입력이 여러 출력에 대해 올바른 것으로 증명될 수 있습니다).

다른 타입 T의 입력이 동일한 필드 정렬 이진 표현을 가지는 경우 동일한 출력을 가질 수 있습니다.

circuit hashToCurve<T>(value: T): JubjubPoint;

jubjubSchnorrVerify​

JubJub 내장 곡선 위의 Schnorr 서명을 검증합니다. N개의 필드 요소로 이루어진 벡터 형태의 메시지, JubjubSchnorrSignature, 공개 키(내장 곡선 위의 JubjubPoint)를 받습니다. 공개 키가 항등(기본) JubjubPoint가 아님을 assert하는데, 이는 검증을 메시지와 무관하게 만들기 때문에 허용되지 않습니다. 서명이 유효하면 true, 아니면 false를 반환합니다.

Compact circuit에서 서명이 유효함을 실제로 강제하려면 결과가 true라는 assert를 사용하세요.

circuit jubjubSchnorrVerify<#N>(
msg: Vector<N, Field>,
signature: JubjubSchnorrSignature,
pk: JubjubPoint
): Boolean;

secp256k1EcdsaVerify​

secp256k1 곡선 위의 ECDSA 서명을 검증합니다. 32바이트 메시지 해시, Secp256k1EcdsaSignature, 공개 키(Secp256k1Point)를 받습니다. 공개 키가 항등(기본) Secp256k1Point가 아님을 assert하는데, 이는 검증을 메시지 해시와 무관하게 만들기 때문에 허용되지 않습니다. 서명이 유효하면 true, 아니면 false를 반환합니다.

circuit은 msgHash를 주어진 대로 받으며 어떤 메시지에도 제약하지 않습니다. 호출자는 해당 메시지를 in-circuit으로 해싱하여(예: 이더리움 방식 서명에는 keccak256, 비트코인 방식에는 persistentHash) 실제 메시지에 바인딩해야 합니다.

더 넓은 다이제스트(SHA-512, SHA3-512 등)는 선행 32바이트 slice<32>(digest, 0)을 전달하여 검증합니다. 이는 그룹 차수보다 넓은 다이제스트에 대해 FIPS 186-5 6.4.2절이 규정하는 절단이자 서명자가 사용하는 방식입니다.

Compact circuit에서 서명이 유효함을 실제로 강제하려면 결과가 true라는 assert를 사용하세요.

circuit secp256k1EcdsaVerify(msgHash: Bytes<32>, sig: Secp256k1EcdsaSignature, pk: Secp256k1Point): Boolean;

secp256k1EthereumAddress​

secp256k1 공개 키의 20바이트 이더리움 방식 주소, 즉 Secp256k1Point의 Keccak-256 해시 하위 20바이트를 유도합니다.

circuit secp256k1EthereumAddress(pk: Secp256k1Point): Bytes<20>;

secp256r1EcdsaVerify​

secp256r1(P256이라고도 함) 곡선 위의 ECDSA 서명을 검증합니다. 32바이트 메시지 해시, Secp256r1EcdsaSignature, 공개 키(Secp256r1Point)를 받습니다. 공개 키가 항등(기본) Secp256r1Point가 아님을 assert합니다. 서명이 유효하면 true, 아니면 false를 반환합니다.

secp256k1EcdsaVerify와 마찬가지로, circuit은 msgHash를 주어진 대로 받으며 어떤 메시지에도 제약하지 않고, 더 넓은 다이제스트는 선행 32바이트를 전달하여 검증합니다.

Compact circuit에서 서명이 유효함을 실제로 강제하려면 결과가 true라는 assert를 사용하세요.

circuit secp256r1EcdsaVerify(msgHash: Bytes<32>, sig: Secp256r1EcdsaSignature, pk: Secp256r1Point): Boolean;

ed25519Verify​

n바이트 메시지에 대한 Ed25519 서명(RFC 8032)을 검증합니다. 메시지, Ed25519Signature, 공개 키(Curve25519Point)를 받습니다. 메시지는 표준이 규정하는 대로 in-circuit에서 SHA-512로 해싱됩니다. 순수 Ed25519만 해당하며, RFC 8032의 Ed25519ctx 또는 Ed25519ph(사전 해시) 변형으로 만든 서명은 검증되지 않습니다. 공개 키가 항등 Curve25519Point가 아님을 assert합니다. 서명이 유효하면 true, 아니면 false를 반환합니다.

Compact circuit에서 서명이 유효함을 실제로 강제하려면 결과가 true라는 assert를 사용하세요.

circuit ed25519Verify<#n>(msg: Bytes<n>, sig: Ed25519Signature, pk: Curve25519Point): Boolean;

merkleTreePathRoot​

MerkleTreePath의 Merkle 트리 루트를 유도하며, 이 경로가 유래한 트리의 루트와 일치해야 합니다.

circuit merkleTreePathRoot<#n, T>(path: MerkleTreePath<n, T>): MerkleTreeDigest;

merkleTreePathRootNoLeafHash​

MerkleTreePath의 Merkle 트리 루트를 유도하며, 이 경로가 유래한 트리의 루트와 일치해야 합니다. merkleTreePathRoot와 달리, 이 변형은 트리 리프가 이미 외부에서 해시되었다고 가정합니다.

circuit merkleTreePathRootNoLeafHash<#n>(path: MerkleTreePath<n, Bytes<32>>): MerkleTreeDigest;

nativeToken​

네이티브 토큰의 토큰 타입을 반환합니다.

circuit nativeToken(): Bytes<32>;

tokenType​

컨트랙트의 도메인 구분자를 전역 네임스페이스의 토큰 타입으로 변환합니다. 컨트랙트는 자체 도메인 구분자로 토큰을 발행하여 새 토큰을 생성할 수 있지만, 해시 충돌 저항성 덕분에 다른 컨트랙트의 토큰 타입에 대한 토큰은 발행할 수 없습니다. ShieldedCoinInfo의 color 필드와 sendUnshielded, receiveUnshielded 등 함수의 인수로 사용됩니다.

circuit tokenType(
domain_sep: Bytes<32>,
contractAddress: ContractAddress
): Bytes<32>;

mintShieldedToken​

이 컨트랙트가 발행한 새 shielded 코인을 생성하여 지정된 수신자에게 전송하고, 해당하는 ShieldedCoinInfo를 반환합니다. 안전한 작동을 위해 고유한 nonce가 필요하며, nonce 생성 방법은 사용자가 결정합니다. 현재 컨트랙트에 shielded 토큰을 발행하려면 recipient로 right<ZswapCoinPublicKey, ContractAddress>(kernel.self())를 전달하세요.

circuit mintShieldedToken(
domain_sep: Bytes<32>,
value: Uint<64>,
nonce: Bytes<32>,
recipient: Either<ZswapCoinPublicKey, ContractAddress>
): ShieldedCoinInfo;

evolveNonce​

카운터 인덱스와 이전 nonce에서 ShieldedCoinInfo nonce를 결정론적으로 유도합니다.

circuit evolveNonce(
index: Uint<128>,
nonce: Bytes<32>
): Bytes<32>;

shieldedBurnAddress​

전송된 shielded 코인이 소각됨을 보장하는 지불 주소를 반환합니다.

circuit shieldedBurnAddress(): Either<ZswapCoinPublicKey, ContractAddress>;

receiveShielded​

shielded 코인을 수신하며, 이 코인이 이 컨트랙트에 주소가 지정된 출력으로 존재해야 하고 다른 호출이 수신하지 않았어야 한다는 검증 조건을 추가합니다.

circuit receiveShielded(coin: ShieldedCoinInfo): [];

sendShielded​

컨트랙트가 보유한 shielded 코인에서 지정된 금액을 수신자에게 전송합니다. 잔돈이 반환되며 컨트랙트에서 관리해야 합니다.

현재 이 함수는 코인 암호문을 생성하지 않으므로, 현재 사용자가 아닌 다른 사용자의 공개 키로 전송하면 수신자가 전송된 코인에 대한 알림을 받지 못합니다. 현재 컨트랙트에 shielded 토큰을 전송하려면 recipient로 right<ZswapCoinPublicKey, ContractAddress>(kernel.self())를 전달하세요.

circuit sendShielded(input: QualifiedShieldedCoinInfo, recipient: Either<ZswapCoinPublicKey, ContractAddress>, value: Uint<128>): ShieldedSendResult;

sendImmediateShielded​

sendShielded와 동일하지만, 이 트랜잭션 내에서 생성된 코인에 대해 사용합니다.

circuit sendImmediateShielded(input: ShieldedCoinInfo, target: Either<ZswapCoinPublicKey, ContractAddress>, value: Uint<128>): ShieldedSendResult;

mergeCoin​

ledger에 저장된 두 개의 코인을 가져와 하나로 합칩니다.

circuit mergeCoin(
a: QualifiedShieldedCoinInfo,
b: QualifiedShieldedCoinInfo
): ShieldedCoinInfo;

mergeCoinImmediate​

ledger에 저장된 코인 하나와 이 트랜잭션 내에서 생성된 코인 하나를 가져와 하나로 합칩니다.

circuit mergeCoinImmediate(
a: QualifiedShieldedCoinInfo,
b: ShieldedCoinInfo
): ShieldedCoinInfo;

ownPublicKey​

이 트랜잭션을 생성하는 최종 사용자의 ZswapCoinPublicKey를 반환합니다.

witness ownPublicKey(): ZswapCoinPublicKey;

createZswapInput​

이 호출에서 시작되는 새로운 Zswap 입력을 생성하도록 컨텍스트에 알립니다. 일반적으로 수동으로 호출해서는 안 되며, 대신 sendShielded 및 sendImmediateShielded를 사용하세요.

transientCommit과 마찬가지로, 이 함수는 인수를 그 자체로 공개하지 않으므로, witness에서 유도한 데이터를 전달해도 disclose 래퍼가 필요 없습니다.

witness createZswapInput(coin: QualifiedShieldedCoinInfo): [];

createZswapOutput​

이 호출에서 시작되는 새로운 Zswap 출력을 생성하도록 컨텍스트에 알립니다. 일반적으로 수동으로 호출해서는 안 되며, 대신 sendShielded, sendImmediateShielded 및 receiveShielded를 사용하세요.

transientCommit과 마찬가지로, 이 함수는 인수를 그 자체로 공개하지 않으므로, witness에서 유도한 데이터를 전달해도 disclose 래퍼가 필요 없습니다.

witness createZswapOutput(coin: ShieldedCoinInfo, recipient: Either<ZswapCoinPublicKey, ContractAddress>): [];

mintUnshieldedToken​

이 컨트랙트가 발행한 새로운 unshielded 코인을 생성하고 주어진 수신자에게 전송합니다. 해당하는 코인 색상을 반환합니다. 현재 컨트랙트에 unshielded 토큰을 발행하려면 recipient로 left<ContractAddress, UserAddress>(kernel.self())를 전달하세요.

circuit mintUnshieldedToken(
domainSep: Bytes<32>,
amount: Uint<64>,
recipient: Either<ContractAddress, UserAddress>
): Bytes<32>;

sendUnshielded​

주어진 unshielded 토큰(색상으로 식별)의 주어진 금액을 주어진 수신자에게 전송합니다. 이 함수에서는 잔돈이 반환되지 않습니다. 현재 컨트랙트에 unshielded 토큰을 전송하려면 recipient로 left<ContractAddress, UserAddress>(kernel.self())를 전달하세요.

circuit sendUnshielded(color: Bytes<32>, amount: Uint<128>, recipient: Either<ContractAddress, UserAddress>): [];

receiveUnshielded​

색상으로 식별되는 unshielded 토큰의 주어진 금액을 수신합니다.

circuit receiveUnshielded(color: Bytes<32>, amount: Uint<128>): [];

unshieldedBalance​

지정된 타입의 unshielded 토큰에 대한 컨트랙트 잔액을 반환합니다. 이 잔액은 컨트랙트 실행 중 unshielded 전송/수신으로는 업데이트되지 않으며 항상 실행 시작 시점의 값으로 고정됩니다. 또한 이 함수를 사용하면 트랜잭션 구성 시점과 적용 시점의 토큰 잔액이 정확히 일치해야 하며, 그렇지 않으면 트랜잭션이 실패합니다. 이 제약이 필요 없다면 잔액 비교 함수 unshieldedBalanceLt, unshieldedBalanceGte, unshieldedBalanceGt, unshieldedBalanceLte를 사용하세요.

circuit unshieldedBalance(color: Bytes<32>): Uint<128>;

unshieldedBalanceLt​

주어진 토큰 타입에 대한 컨트랙트의 unshielded 잔액이 주어진 값보다 작으면 true를 반환합니다.

circuit unshieldedBalanceLt(color: Bytes<32>, amount: Uint<128>): Boolean;

unshieldedBalanceGte​

주어진 토큰 타입에 대한 컨트랙트의 unshielded 잔액이 주어진 값보다 크거나 같으면 true를 반환합니다.

circuit unshieldedBalanceGte(color: Bytes<32>, amount: Uint<128>): Boolean;

unshieldedBalanceGt​

주어진 토큰 타입에 대한 컨트랙트의 unshielded 잔액이 주어진 값보다 크면 true를 반환합니다.

circuit unshieldedBalanceGt(color: Bytes<32>, amount: Uint<128>): Boolean;

unshieldedBalanceLte​

주어진 토큰 타입에 대한 컨트랙트의 unshielded 잔액이 주어진 값보다 작거나 같으면 true를 반환합니다.

circuit unshieldedBalanceLte(color: Bytes<32>, amount: Uint<128>): Boolean;

blockTimeLt​

현재 블록 시간이 주어진 값보다 작으면 true를 반환합니다.

circuit blockTimeLt(time: Uint<64>): Boolean;

blockTimeGte​

현재 블록 시간이 주어진 값보다 크거나 같으면 true를 반환합니다.

circuit blockTimeGte(time: Uint<64>): Boolean;

blockTimeGt​

현재 블록 시간이 주어진 값보다 크면 true를 반환합니다.

circuit blockTimeGt(time: Uint<64>): Boolean;

blockTimeLte​

현재 블록 시간이 주어진 값보다 작거나 같으면 true를 반환합니다.

circuit blockTimeLte(time: Uint<64>): Boolean;

serialize<T, #n>​

주어진 이벤트 타입 값의 canonical 바이트 인코딩을 반환합니다. serialize는 이벤트 타입과 그 canonical 직렬화 크기에 대해서만 인스턴스화할 수 있다는 점에 유의하세요.

circuit serialize<T, #n> (x: T): Bytes<n>;

deserialize<T, #n>​

이벤트 타입의 값을 그 canonical 바이트 인코딩에서 재구성합니다. deserialize는 이벤트 타입과 그 canonical 직렬화 크기에 대해서만 인스턴스화할 수 있다는 점에 유의하세요.

circuit deserialize<T, #n> (x: Bytes<n>): T;