
RANDAO란 Ethereum에서 다음 block proposer를 뽑기 위해서 만든 난수 생성 알고리즘이다.
1. 정확히 모든 사람이 Block Proposer를 이 값으로부터 Deterministic 하게 알 수 있어야 하기 때문에, Public 해야 한다.
2. 그러나, Attacker가 이 값을 조작하기는 어려워야 하기 때문에 Randomness가 필요하다.
는 2가지의 난제를 둘 다 해결해야 하기 때문에, 생각보다 이는 어려운 문제이다.
1. PoW 시절의 RANDAO
우선 RANDAO가 어떻게 난수를 정하는가 봐보자. 일단 이미 정해진 random 값이, slot 1부터 쓰인다. 오래된 랜덤값을 $R_{old}$, 새로 만들 것을 $R_{new}$라고 하겠다. 모든 slot의 block proposer는 block을 제시할 때 반드시 같이 randao reveal ($RR$) 값을 같이 제출해야만 한다. 이를 이용해서 다음 $R_{new}$을 계산하는 방법은 간단하게 다음과도 같다.
$ R_{new} = R_{old} \oplus SHA256(RR) $
일단 기본적으로는 이것만 해도 $R_{new}$를 조작하는 것은 거의 불가능하다. 왜냐? slot은 1개당 12초이다. 즉 12초 안에 block의 header를 propose 해야 하고, 그와 동시에 randao reveal값도 내야 한다. XOR연산 자체는 충분히 쉬운 일이고 $R_{old}$자체도 알려져 있지만 문제는 해시에 대한 역상공격을 12초 이내에 해내야 한다는 말이다. XOR이 되는 건 reveal값 자체가 아니라 그의 해시값이기 때문이다. 이건 확률이 없다고는 못하지만 거의 불가능의 영역에 가깝다.
2. PoS, The Merge이후의 RANDAO reveal
안 그래도 reveal값을 맘대로 설정할 수 있어도 가뜩이나 어려운 randomness 공격은 지금은 더 어려워졌다. reveal값 자체도 정하는 메커니즘이 생겨 났기 때문이다. BLS 서명이라는 게 등장했기 때문이다. BLS12-381, 줄여서 BLS 서명은 여러 명의 서명을 합쳐 96Byte의 짧은 서명으로 대체할 수 있게 만드는 기술이다. 이 서명의 특징은 여전히 누가 서명했는지 검증하긴 쉬우면서도 수십만 개의 서명을 합쳐서 짧게 만드는게 가능하다는 것이다. 내부적으로는 타원곡선의 점 덧셈을 이용한다는 것으로 보인다. 수십만개의 서명을 직접 header에 넣기에는 비용이 너무 크므로, 실제 서명은 이게 이용된다고 생각하면 편하다. 그리고 덧셈 연산이 가능하다는 점에서 눈치챘을 수도 있는데, 이미 정해진 이전의 서명들에 자신의 서명을 더하는 것으로 자신의 것이 포함된 BLS 서명을 바로 만들 수 있다. 다만 여기서는 크게 쓰이진 않는다. 위에서 이야기한 BLS의 통합 기능은 실제로 block에 서명을 진행할 때 이용된다.
$ randao_reveal = BLS(pk, slot_number) $
이것을 randao reveal값으로 이용한다.(아마 이것보다는 보안을 위해서 이것저것 집어넣을 수 있겠지만 지금은 이런 것으로 안다.)
기본적인 randao의 동작이 실제로 이런 지는 여기에서 확인했다 :
Unpredictable RANDAO
Co-authors banri, vita, and Hiro from Titania Research. Thank you SoraSue and Masato for the discussion, and to Davide, Lin, donnoh, Vitalik and everyone who spoke with us at ZuBerlin. TL;DR This post explains the issues of predictability and manipulabilit
ethresear.ch
아무튼 이렇게 정해진 난수값으로 순서를 뒤섞어서 누군가 항상 자신만이 선택이 되게 만드는 Attack등을 멈추는 것으로 보인다.