안녕하세요, BQ개발자입니다.
지난 편에서 유한체는 오버플로우가 정상 동작이라고 했습니다.
오늘은 제가 이해하는 데 시간이 좀 걸렸던 개념을 다룹니다.
ZK 회로를 디버깅하다가 이상한 현상을 발견할 수 있습니다.
5 - 10을 계산했는데 `21888242871839275222246405745257275088696311157297823662689037894645226208578`이 나오는 거죠.
버그인 줄 알고 한참 헤멜 수 있지만, 알고 보면 정상입니다.
일반적으로 5 - 10 = -5죠.
그런데 유한체에는 음수가 없습니다. 0부터 p-1까지만 있어요.
그럼 5 - 10은 어떻게 표현될까요?
유한체 Fp에서는 0 아래로 가면 반대편 끝으로 돌아옵니다.
0 - 1 = p - 1이 되는 거죠.
5 - 10 = p - 5가 되고, 이게 바로 그 78자리 숫자입니다.
신기한 건 이 큰 수가 정확히 -5처럼 동작한다는 점입니다.
여기에 5를 더하면 0이 되고, 15를 더하면 10이 되거든요.
1️⃣ 토큰 전송 로직의 변화
일반 프로그래밍에서 토큰 전송을 구현할 때는 항상 잔액을 먼저 확인합니다.
잔액이 부족하면 음수가 되니까 막아야 하죠.
유한체에서는 다르게 접근한다고 합니다.
잔액 5에서 10을 빼면 그 거대한 78자리 숫자가 나옵니다.
정상적인 잔액은 보통 20자리 이하인데, 갑자기 78자리가 나온 거죠.
이 "비정상적으로 큰 값"을 걸러내는 방식으로 부정한 전송을 방지한다고 하네요.
조건문 대신 값의 크기로 판단하는 거죠.
2️⃣ 회로가 단순해지는 효과
ZK 회로에서 if-else 같은 분기문은 구현이 복잡하다고 합니다.
"조건이 참이면 A, 거짓이면 B"를 회로로 만들려면,
양쪽 경로를 다 계산한 뒤 선택하는 구조가 필요하다고 하더라고요.
유한체를 활용하면:
- 조건 확인 없이 바로 계산
- 결과값의 크기로 유효성 판단
직선적인 연산으로 처리되니 회로가 간단해진다고 합니다.
3️⃣ 제약이 오히려 편리함을 만드는 경우
처음엔 음수가 없다는 게 불편할 것 같았습니다.
그런데 생각해보니, 음수를 따로 관리하지 않아도 되는 거...?
부호 비트도 필요 없고, 양수인지 음수인지 체크하는 코드도 필요 없죠.
모든 값을 동일한 방식으로 처리할 수 있다는 점이 오히려 장점인 것 같습니다.
✏️ 유한체를 공부하면서 느낀 점 : 없는 게 있는 것
유한체 개념을 보면 음수가 "없다"고 하지만, 사실은 큰 양수로 "있는" 거라는점,
단지 표현 방식이 다를 뿐, 수학적 역할은 동일합니다.
수학이 정말 재미있는 건, 없애버린 것(음수)이 사실은 다른 형태(큰 양수)로 완벽하게 존재한다는 점인 것 같습니다.
제약을 만들었더니 오히려 더 자유로워진 거죠.
-5든 p-5든, 5를 더하면 0이 되는 건 같으니까..?
---
여러분의 좋아요와 공유는 사랑입니다 🥰
#BQ개발자 #ZK개발 #유한체 #영지식증명 #뺄셈
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3