을 생성하는 대신 절반 크기의 FFT를 재귀적으로 수행하여 FFT의 출력(f_0)을 짝수 계수로, FFT의 출력(f_1)을 홀수 계수로 취한다는 점을 제외하면, FFT는 FRI와 유사합니다. 를 홀수 계수로 사용합니다. 서클 그룹도 FRI와 비슷한 방식으로 구성되는 FFT를 지원합니다. 그러나 중요한 차이점은 원형 FFT(및 원형 FRI)가 다루는 객체가 엄밀히 말해 다항식이 아니라는 점입니다. 대신 수학적으로 '리만-로흐 공간'이라고 알려진 공간으로, 이 경우 다항식은 모듈로 원형(x^2 + y^2 - 1 = 0)입니다. 즉, x^2 + y^2 - 1의 배수는 모두 0으로 취급합니다. 이를 이해하는 또 다른 방법은 &y의 거듭제곱만 허용한다는 것입니다: &y^2 항이 나타나면 바로 &1 - x^2로 대체합니다.
이것은 또한 원형 FFT가 출력하는 계수가 일반 FRI에서처럼 단항식이 아니라는 것을 의미합니다(예: 일반 FRI가 [6, 2, 8, 3]을 출력한다면, 이는
을 의미한다는 것을 알 수 있습니다). 반면, 원형 FFT의 계수는 {1, y, x, xy, 2x^2 - 1, 2x^2y - y, 2x^3 - x, 2x^3y - xy, 8x^4 - 8x^2 + 1...}와 같이 원형 FFT의 기초에 따라 달라집니다.
좋은 소식은 개발자는 이를 완전히 무시할 수 있다는 것입니다.STARKs에서는 계수를 알 필요가 없습니다. 대신 다항식을 특정 도메인에 대해 평가된 값의 집합으로 저장하기만 하면 됩니다. FFT를 사용해야 하는 유일한 경우는 (리만-로흐 공간과 유사한) 저차 확장의 경우로, N개의 값이 주어지면 모두 동일한 다항식에 대해 k*N 값을 생성하는 것입니다. 이 경우 FFT를 사용하여 계수를 생성하고, 해당 계수에 (k-1) n개의 0을 더한 다음 역 FFT를 사용하여 더 큰 평가 값 집합을 얻을 수 있습니다.
원 FFT만이 특별한 FFT 유형은 아닙니다. 타원 곡선 FFT는 모든 유한 필드(소수 필드, 이진 필드 등)에서 작동하기 때문에 더 강력합니다. 그러나 ECFFT는 더 복잡하고 효율성이 떨어지므로
에서 원형 FFT를 사용할 수 있으므로 이를 사용하기로 했습니다.
이제부터는 일반 스타크와 다르게 구현된 서클 스타크를 구현하는 데 있어 좀 더 잘 알려지지 않은 세부 사항에 대해 알아보겠습니다.
쿼티엔팅
스타크 프로토콜의 일반적인 연산 중 하나는 의도적으로 또는 무작위로 선택할 수 있는 특정 포인트 집합에 대해 쿼티엔팅 연산을 수행하는 것입니다. 예를 들어 P(x) = y임을 증명하려면 다음 단계를 수행하면 됩니다.
몫 계산: 다항식 P(x)와 상수 y가 주어지면 몫 Q = {P - y}/{X - x}를 계산하고, 여기서 X는 선택된 점입니다.
다항식 증명하기: Q가 분수 값이 아닌 다항식임을 증명합니다. 이렇게 하면 P(x)=y가 유지됨을 알 수 있습니다.
또한, DEEP-FRI 프로토콜에서는 머클 분기 수를 줄이기 위해 평가 지점이 무작위로 선택되어 FRI 프로토콜의 보안과 효율성이 향상됩니다.
원 그룹에 대한 STARK 프로토콜을 다룰 때는 단일 지점을 통과할 수 있는 선형 함수가 없기 때문에 기존의 몫 방식 대신 다른 기법이 필요합니다. 이를 위해서는 종종 원 그룹의 특정 기하학적 속성을 사용하여 새로운 알고리즘을 설계해야 합니다.
원 그룹에서 접선 함수를 구성하여 그 점(P_x, P_y)에서 절단되도록 할 수 있지만, 그 함수는 그 점을 통해 2의 관련성을 가지므로, 즉 다항식이 그 선형 함수의 배수이기 위해서는 그 점에서 0이 되는 것보다 더 엄격한 조건을 만족해야만 합니다. 따라서 한 지점에서만 평가 결과를 증명할 수는 없습니다. 그렇다면 이 문제를 어떻게 해결할 수 있을까요?
두 지점에서 평가하여 더미 지점을 추가함으로써 문제를 해결하고 이를 증명해야 합니다.
선 함수: ax + by + c . 이를 방정식으로 바꾸어 0이 되도록 강제하면 고등학교 수학에서 표준 형식이라고 하는 선으로 인식할 수 있습니다.
x_1에서 y_1, x_2에서 y_2와 같은 다항식 P가 있다면 x_1에서 y_1, x_2에서 y_2와 같은 보간 함수 L을 선택할 수 있습니다. 이는 간단히 L = \frac {y_2 - y_1 }{x_2 - x_1} \cdot (x - x_1) + y_1.
그런 다음 P가 x_1에서 y_1, x_2에서 y_2와 같음을 L을 빼서(두 점에서 P - L이 0이 되도록) 증명한 다음 L(즉, x_2 - x_1 사이의 선형 함수)로 나누어 증명합니다. 몫 Q가 다항식임을 증명하기 위해 L로 나눕니다.
소실 다항식
스타크에서 증명하려는 다항식은 일반적으로 C(P (x), P ({next}(x)) = Z와 같이 보입니다. (x) ⋅ H (x)로, 여기서 Z (x)는 원래 평가 영역 전체에서 0과 같은 다항식입니다. 일반 STARK에서 이 함수는 입니다. 원형 STARK에서 해당 함수는 다음과 같습니다.
Z_1 (x,y) = y
Z_2 (x,y) = x
Z_{n+1}(x,y) = (2 * Z_n (x,y)^2) - 1
소실 다항식을 붕괴 함수에서 도출할 수 있습니다. 일반 STARK에서는 x → x^2를 재사용하고, 순환 STARK에서는 다음과 같이 사용합니다. 원형 STARK에서는 'x → 2x^2 - 1'을 반복합니다. 그러나 첫 번째 라운드의 경우 첫 번째 라운드가 특별하기 때문에 다르게 처리합니다.
역 비트 순서
스타크에서 다항식은 일반적으로 "자연스러운" 순서로 평가되지 않습니다. (예: P (1),P (ω),P (ω2),...,P (ωn-1)이 아니라 역 비트 순서라고 부르는 순서로 평가됩니다.
P (\. omega^{\frac {3n}{8}})
n=16으로 설정하고 평가하는 ω의 어느 거듭제곱에만 집중하면 목록은 다음과 같이 표시됩니다.
< em>{0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15}
이 정렬에는 FRI 평가 프로세스 초기에 함께 그룹화된 값이 정렬에서 서로 옆에 위치한다는 핵심 속성이 있습니다. 예를 들어, FRI의 첫 번째 단계에서는 x와 -x를 함께 그룹화합니다. n = 16인 경우, ω^8 = -1이며, 이는 P (ω^i) )와 (P (-ω^i) = P (ω^{i+8})\)를 의미합니다. 우리가 보았듯이, 이들은 정확히 서로 바로 옆에 있는 쌍입니다.FRI 그룹 P (ω^i), P (ω^{i+4}), P (ω^{i+8}) 및 P (ω^{i+12})의 두 번째 단계입니다. 이것이 바로 우리가 네 개의 그룹에서 보는 것과 정확히 일치합니다. 이렇게 하면 함께 접힌 값에 대해 머클 증명을 제공할 수 있으므로(또는 한 번에 2^k 라운드씩 접는 경우, 모든 2^k 값에 대해) FRI를 훨씬 더 공간 효율적으로 만들 수 있습니다.
원형 STARK에서는 접는 구조가 약간 다릅니다. 첫 번째 단계에서는 (x, y)를 (x, -y)와 쌍을 이루고, 두 번째 단계에서는 x를 -x와 쌍을 이루고, 이후 단계에서는 &p를 q와 쌍을 이루고, &p를 q와 쌍을 이루고, &p를 q -x와 쌍을 이루고, &p를 q -x와 쌍을 이루는 식이죠. 쌍을 이룰 때,
와 를 선택하여 Q^i(p) = -Q^i(q)가 되도록 하는데, 여기서 는 을 i번 반복하는 맵입니다. 이 점들을 원의 위치로 생각하면 각 단계에서 첫 번째 점은 마지막 점과 짝을 이루고, 두 번째 점은 두 번째 점과 짝을 이루는 식으로 보입니다.
이 접힌 구조를 반영하도록 역방향 비트 순서를 조정하려면 마지막 비트를 제외한 모든 비트를 반전시켜야 합니다. 마지막 비트를 유지하여 다른 비트의 반전 여부를 결정하는 데 사용합니다.
사이즈 16의 접힌 역 비트 순서는 다음과 같습니다:
{0, 15, 8, 7, 4, 11, 12, 3, 2, 13, 10, 5, 6, 9, 14, 1}
이전 섹션의 원을 보면 0, 15, 8, 7(오른쪽에서 시계 반대 방향)이 (x, y), (x, -y), (-x, -y), (-x, y) 형태라는 것을 알 수 있습니다.
효율
서클 스타크(그리고 일반적으로 31비트 프라임 스타크)에서 이러한 프로토콜은 매우 효율적입니다. 서클 스탁에서 증명되는 연산에는 일반적으로 다음과 같은 여러 유형의 연산이 포함됩니다.
1. 기본 산술: 계산과 같은 비즈니스 로직에 사용됩니다.
2. 네이티브 산술: 암호화에 사용되는 해시 함수, 예를 들어 '포세이돈'과 같은 해시 함수.
3. 조회 인수: 테이블에서 값을 읽어 다양한 계산을 수행하는 범용적이고 효율적인 방법입니다.
효율성의 핵심 척도는 전체 공간을 유용한 작업에 완전히 활용하고 있는지, 아니면 계산 추적에 많은 여유 공간을 남겨두고 있는지 여부입니다. 비즈니스 로직과 조회 테이블은 종종 작은 숫자(여기서 N은 계산의 총 단계 수이므로 실제로는 2^{25} 미만)를 계산하는 경우가 많지만 2^{256} 비트 크기의 필드 사용 비용을 지불해야 하기 때문에 필드가 큰 SNARK에서는 여유 공간이 많이 남는 경우가 많습니다. 이 경우 필드 크기는 2^{31}이므로 낭비되는 공간은 크지 않습니다. SNARK용으로 설계된 낮은 산술 복잡도 해시(예: 포세이돈)는 모든 필드에서 추적에 있는 모든 숫자의 모든 비트를 최대한 활용합니다.
Binius는 크기가 다른 필드를 혼합하여 보다 효율적인 비트 패킹을 할 수 있고, 조회 테이블 오버헤드를 추가하지 않고 32비트 추가를 수행할 수 있는 옵션도 제공하므로 Circle STARK보다 더 나은 솔루션입니다. 그러나 이러한 장점은 (제 생각에는) 개념적으로 더 복잡해지는 대가를 치르는 반면, 서클 스타크(및 BabyBear 기반의 일반 스타크)는 개념적으로 훨씬 더 간단합니다.
결론: 서클 스타크에 대한 제 생각
서클 스타크는 개발자에게는 스타크보다 더 복잡하지 않습니다. 위에서 언급한 세 가지 이슈가 구현 과정에서 일반 FRI와 차별화되는 핵심 요소입니다. 서클 FRI가 작동하는 다항식의 수학은 매우 복잡하고 수학을 이해하고 이해하는 데 시간이 걸리지만, 이러한 복잡성은 실제로는 덜 분명하게 숨겨져 있어 개발자가 직접 느끼지 못합니다.
서클 FRI와 서클 FFT를 이해하는 것은 다른 특수 FFT, 특히 Binius와 그 이전에는 LibSTARK에서 사용한 것과 같은 이진 도메인 FFT를 이해하는 방법이 될 수도 있습니다. Binius와 그 이전 버전인 LibSTARK에서 사용하는 것과 같은 FFT, 그리고 소수 대 다수의 매핑을 사용하고 타원 곡선 점 연산에 잘 작동하는 타원 곡선 FFT와 같은 더 복잡한 구조의 FFT가 있습니다.
Mersenne31, BabyBear, Binius와 같은 이진 도메인 기술을 결합하면 STARKs 기본 계층의 효율성 한계에 가까워지고 있다고 생각합니다. 이 시점에서 STARK 최적화의 방향은 다음과 같은 것에 초점을 맞출 것으로 예상합니다.
해시 함수, 서명 등의 연산 효율성 극대화: 해시 함수, 디지털 서명 등의 기본 암호화 프리미티브를 가장 효율적인 형태로 최적화하여 STARK 증명에 사용할 때 가능한 최상의 성능을 달성할 수 있습니다. 즉, 이러한 기본 요소를 구체적으로 최적화하여 계산을 줄이고 효율성을 높이는 것입니다.
병렬화를 위한 재귀적 구조: 재귀적 구조는 STARK 증명 프로세스를 여러 계층에 재귀적으로 적용하여 병렬 처리 능력을 높이는 것을 의미합니다. 이러한 방식으로 계산 리소스를 더 효율적으로 사용할 수 있고 증명 프로세스를 가속화할 수 있습니다.
가상 머신을 산술화하여 개발자 환경 개선: 가상 머신을 산술화하면 개발자가 보다 효율적이고 간편하게 계산 작업을 생성하고 실행할 수 있습니다. 여기에는 스마트 컨트랙트 또는 기타 연산 작업을 구축하고 테스트할 때 개발자 경험을 개선하고, STARK 증명에 사용하기 위해 VM을 최적화하는 것이 포함됩니다.