ARC,s-box,MDS: Poseidon permutation을 구성하는 각 함수들로, 순서대로 라운드 상수 덧셈, 비선형 연산, mds 행렬곱을 의미
Background
Sparse Matrix Factorization
partial 라운드의 연산 최적화 과정에서 사용되며, 어떤 정방행렬을 sparse 한 행렬(원소의 대부분이 0으로 이루어진 행렬)의 곱으로 factorization하는 방법이다. 함수 D:Fp3×3→Fp3×3×Fp3×3 를 정의해서 3×3 행렬 M을 입력으로 해서 m′⋅m′′=M을 만족하는 두 행렬을 반환하는 함수 m′,m′′←D(M) 를 정의하자. 구체적으로, 함수의 동작은 다음 0~6과정으로 이루어진다.
0.input M=⎣⎢⎡m00m10m20m01m11m21m02m12m22⎦⎥⎤1.m^=[m11m21m12m22],n^=[n11n21n12n22] such that n^=m^−12.m′=⎣⎢⎡1000m11m210m12m22⎦⎥⎤3.w=[m10m20]4.w^=n^⋅w5.m′′=⎣⎢⎡m00w^[0]w^[1]m0110m0201⎦⎥⎤6. return m′,m′′
위와 같이 정의된 함수 D는 3×3 행렬 M을 입력으로 받아서 M=m′⋅m′′을 만족하는 두개의 3×3 행렬 m′,m′′을 출력한다. 이부분은 다음과 같이 어렵지 않게 확인 가능하다.
이 함수에서 중요한 부분은 m′과 m′′ 이 단위행렬의 일부를 포함한 형태라는 것이다. 단위행렬의 경우 행렬곱 연산의 결과에 영향을 주지 않는데, 이러한 성질을 이용해서 partial 라운드의 연산을 더 적은 constraint들로 표현하는 것이 가능하다. 연산 결과에 영향을 주지 않는다는 것을 예를 들면, 다음과 같이 어떤 벡터에 행렬을 곱했을때 결과 벡터의 원소가 다시 자기자신이 되는 상황이다.
[x⋯⋯]⋅⎣⎢⎢⎡1000⋱⋯0⋮⎦⎥⎥⎤=⎣⎢⎢⎢⎡x⋮⋮⎦⎥⎥⎥⎤
Optimization
1. full round
하나의 full 라운드는 ARC>s-box>MDS 연산 순서로 구성된다. 이를 notation의 정의를 이용해서 표현하면 다음과 같다.
f(si+ri)⋅M=si+1
그러면 si+ri,si+1+ri+1의 관계식은 다음과 같다.
f(si+ri)⋅M+ri+1=si+1+ri+1
위 식은 i 라운드의 state si에 ARC, s-box, MDS 연산을 수행한 뒤 i+1 라운드의 state si+1에 대한 ARC 연산까지를 포함하는 제약식을 나타낸다. 식을 다시 정리하면 다음과 같다.
(f(si+ri)+ri+1⋅M−1)⋅M=si+1+ri+1
si+ri는 i−1의 full 라운드의 출력이라는 가정하에, i 라운드의 제약식은 si+ri와 ri+1⋅M−1를 입력으로 하여 출력 값 si+1+ri+1 에 대한 연산 관계를 정의한다. mds행렬 M과 라운드 상수는 연산을 수행하기 전에 미리 결정되는 값들로 r′i+1=ri+1⋅M−1을 미리 계산해 놓을 수 있다. 따라서, full 라운드의 연산은 위의 식의 반복으로 표현될 수 있다.
2. full -> partial round
si+ri 가 처음 절반의 full 라운드의 출력값이라 하자. 이 출력에 이어서 다시 full 라운드를 진행하는 경우에는 다음과 같이 mds행렬 M을 이용해서 출력 값을 나타낼 수 있다.
(f(si−1+ri−1)+ri⋅M−1)⋅M=si+1+ri+1
하지만 filecoin의 최적화 방법에서는 partial 라운드에서 비선형 연산을 첫번째 state만 적용하고 있다는 이점을 활용하기 위해서 마지막 full 라운드에 다소 테크닉컬한 방법을 사용한다.이해를 돕기 위해 두번의 partial 라운드에 대해서만 생각해보자. partial 라운드의 최적화 과정을 크게 MDS행렬 곱의 최적화와 라운드 상수의 최적화 두가지단계로 나눠서 볼것이다.
1. partial 라운드에서 보이는 sparse mds행렬 연산과정)
m0′,m0′′←D(M)라고 하고, m1′,m1′′←D(M⋅m0′) 이라하자.
마지막 full 라운드에서 partial 라운드의 입력을 위한 제약식을 다음과 같이 설정할 수 있다.
(f(si−1+ri−1)+ri⋅M−1)⋅M⋅m1′=(si+ri)⋅m1′
위 식에는 각 partial 라운드에서 필요한 연산 ARC > s-box > MDS에서 필요한 ARC연산 및 MDS의 일부 연산이 미리 적용되어 있다고 이해할 수 있다.
mi′=⎣⎢⎢⎡1000⋱⋯0⋮⎦⎥⎥⎤와 같은 형태로 정의되며, g는 첫번째 성분에만 적용되는 연산이므로 다음 등식이 성립함을 알 수 있다.
또한, g는 첫번째 성분에만 적용되는 연산이므로 위의 라운드 상수와 MDS 의 역행렬을 곱해서 얻어지는 초록색 상수부분을 partial라운드를 시작하기 이전에 precompute해서 라운드 상수를 새롭게 정의하면 partial라운드를 수행하면서 더해지는 상수부분을 비선형 연산이 적용되는 첫번째 성분에 대해서만 적용하면 충분하다. 즉, ri+1′=ri+1⋅M−1,ri+2′′=ri+2⋅M−2 라 정의하고 라운드 상수를 다음과 같이 다시 정의한다
위의 최적화 내용을 정리하자면, 마지막 full 라운드에서 partial 라운드의 입력을 위한 제약식을 다음과 같이 쓸 수 있다.
(f(si−1+ri−1)+ci⋅M−1)⋅M⋅m1′=(si+ci)⋅m1′
이후 이어지는 partial 라운드에서는 두번째, 세번째 state 에 대한 추가적인 라운드 상수의 덧셈을 고려하지 않아도 되며 sparse행렬의 곱과 첫번째 state에 대한 라운드 상수덧셈 및 비선형연산을 고려하면 된다.
단, 첫번째 state에는 라운드 상수를 더하는 연산과 비선형연산이 섞여있으므로 ci를 계산하면서 얻게되는 첫번째 성분에 더해지는 라운드 상수들을 partial 라운드 횟수만큼 따로 저장해 놓고 사용해야한다.
considerations:
mds행렬 M대신 M⋅m1′을 사용하는 것은 partial 라운드 두번을 수행하는 경우를 고려한 경우이며, 라운드 횟수에 따라서 라운드 상수 및 full라운드 마지막에 곱할 행렬에 대한 추가적인 계산이 필요하다. 하지만 연산을 수행하기전 미리 precompute 할 수 있다.
라운드 상수의 최적화로, 저장하고 있어야할 라운드 상수의 갯수와 라운드 상수 연산의 횟수가 줄어든다.
scroll's optimization에서는 7번의 partial 라운드를 8번에 거쳐서 제약식을 표현하는데, 각 8번에서 위와 같은 방식으로 유도하여 사용하는 mds행렬로 부터 유도된 값들은 동일하게 표현될 것으로 예상할 수 있다.
위와 같은 테크닉에서 사용되는 m′,m′′는 state 벡터의 첫번째 성분과 두번째, 세번째 성분의 연산을 나눠서 적용하기 위해 도입되었다고 볼 수 있다.
일반화된 알고리즘은 filecoin의 최적화 문서에서 찾아볼 수 있다.
3. partial round
full 라운드에서 partial 라운드로의 출력 값은 (si+ri)⋅m′ 에서 시작한다. 행렬 m′은 정의에 의해서 state 벡터 값에 행렬곱 연산 적용시 첫번째 성분의 값을 변경시키지 않으며, g는 첫번째 성분에만 적용되는 비선형 연산임을 기억하자. 비선형 연산을 적용하고 행렬 m′′을 곱하면 다음과 같다.
g((si+ri)⋅m′)⋅m′′=si+1
m′⋅m′′=M이라는 사실을 이용하면, full 라운드에서와 마찬가지로 si+ri,si+1,ri+1들에 대한 다음 관계식을 생각할 수 있다.
(g(si+ri)+ri+1⋅M−1)⋅M=si+1+ri+1
위 과정을 통해 한번의 partial 라운드에 대한 연산을 바르게 수행했는지 여부를 확인할 수 있으며, partial 라운드가 두번이상인 경우에는 '2. full -> partial round' 과정에서 사용했던 M⋅m′ 행렬을 다시 함수 D의 입력으로하여 라운드의 횟수만큼 수행하고 이때 m′′에 해당하는 행렬값들만 따로 저장하여 partial 라운드 진행시 적용하여 확장할 수 있다.