계산기 컨트랙트
이 Compact 컨트랙트는 간단한 계산기를 구현합니다. 다음 기능을 시연합니다:
- Witness 함수
- 오프체인 연산의 온체인 검증
divMod는 함수 시그니처만 선언되어 있습니다. 실제 로직은 TypeScript 프론트엔드에서 구현되므로 컨트랙트에서는 알 수 없지만, divide의 assert 문을 통해 올바른 실행을 강제할 수 있습니다.
pragma language_version 0.22;
export ledger result: Uint<16>;
export circuit add(num1: Uint<16>, num2: Uint<16>): [] {
result = disclose(num1 + num2 as Uint<16>);
}
export circuit subtract(num1: Uint<16>, num2: Uint<16>): [] {
result = disclose(num1 - num2 as Uint<16>);
}
export circuit multiply(num1: Uint<16>, num2: Uint<16>): [] {
result = disclose(num1 * num2 as Uint<16>);
}
export circuit square(num1: Uint<16>): [] {
result = disclose(num1 * num1 as Uint<16>);
}
// 두 숫자를 나누는 오프체인 함수 선언
witness divMod(num1: Uint<16>, num2: Uint<16>): [Uint<16>, Uint<16>];
// divMod의 오프체인 로직에 대해 온체인에서 올바른 로직을 강제
circuit divide(num1: Uint<16>, num2: Uint<16>): Uint<16> {
const [quo, rem] = divMod(num1, num2);
assert(rem < num2 && quo * num2 + rem == num1, "incorrect division");
return quo;
}