블록체인에 올라간 스마트 컨트랙트는 수동적인 존재입니다. 즉, EOA를 통해서만 작동하게 됩니다. 즉, 스마트 컨트랙트는 주어진 데이터에 따라 계약을 이행하기만 하기 때문에 외부 데이터가 올바른 데이터인지 검증할 능력은 가지고 있지 않습니다. 만약 해커에 의해 위변조된, 출처가 불분명한 데이터를 가져오는 과정에서 오작동을 일으킬 소지가 있습니다. 이를 오라클(Oracle) 문제라고 합니다.
예를 들어 A,B가 선거에 출마했습니다. A가 당선되면 C에게 코인을 지급하고, B가 당선되면 D에게 코인을 지급하는 스마트 컨트랙트가 있다고 가정합니다. 실제로는 A가 당선되었지만 D의 이익을 대변하는 해커가 B가 당선되었다는 거짓 정보로 변조해서 스마트 컨트랙트에 입력하게 되면 스마트 컨트랙트는 외부 정보를 검증할 방법이 없기 때문에 D에게 코인을 잘못 지급하게 됩니다.
블록체인에 기록된 데이터에 대해서는 위변조가 힘들지만, 블록체인에 올라가기 위해 입력되는 데이터들은 얼마든지 위변조 될 수 있습니다. 즉 블록체인에 데이터를 입력하는 중간자를 신뢰할 수 있는 방법이 필요하게 됩니다.
오라클(Oracle)이란?
Web API나 외부 데이터센터등을 통해 블록체인과 스마트 컨트랙트로 외부 데이터를 검색하고 검증하는 작업을 의미합니다. 스마트 컨트랙트에서 사용하는 데이터는 가격정보, 날씨정보, 난수 등이 있습니다. 오라클은 외부 데이터 자원에 쿼리를 보내고, 블록체인과 외부 데이터 간 인터페이스를 제공합니다.
블록체인이나 스마트 컨트랙트의 경우 결정적으로 작동하게 됩니다. 주어진 입력값에 따라 미리 결정된 결과값을 반환하게 됩니다. 문제는 외부에서 들어오는 데이터가 결정적이지 않다는 점에 있습니다. 오라클은 외부에서 입력되는 비결정적인 데이터를 블록체인과 스마트 컨트랙트가 특정 조건에서 실행할 수 있도록 하는 역할을 담당합니다.
실제 스마트 컨트랙트를 구현할 때 완벽한 오라클 모델을 만드는 것은 대단히 어려운 일입니다. 오라클 문제를 해결하기 위한 모델로는 투표, 중앙값, 중간자 를 두는 방법이 사용되고 있습니다.
난수 생성 문제
대표적인 오라클 문제는 난수 생성입니다. 이더리움에 올라가는 스마트 컨트랙트에서는 난수 생성에 대한 고도의 기술을 필요로 합니다. 하지만 컴퓨터 과학에서 사용하는 난수는 우리가 일반적으로 생각하는 완전한 난수가 아닙니다. 컴퓨터는 입력값에 따라 정해진 작동만 하기 때문에 예측이 가능하고, 패턴을 가진 가짜 난수를 생성하게 됩니다.
컴퓨터 과학에서의 난수는 유사난수(Pseudo Random)과 진짜 난수(True Random)으로 구분됩니다. 먼저 유사 난수는 컴퓨터 내의 알고리즘과 데이터로 생성됩니다. 따라서 특정한 패턴을 가지고 예측이 가능합니다. 진짜 난수는 외부의 비결정적인 데이터(외부의 소음 데이터를 사용)를 사용하여 생성된 난수로 무작위성을 확보할 수 있습니다. 따라서 패턴이 없으며 예측 불가능합니다.
블록체인의 난수 생성
블록체인에서 난수 생성은 주사위 던지기 보다 훨씬 어려운 일입니다. 모든 노드들이 트랜잭션을 검증하면서 데이터의 무결성을 검증하는 과정이 존재하는데, 이 과정에서 모든 동작은 결정적으로 이루어집니다. 하지만 진짜 난수를 사용하는 트랜잭션은 결과값이 항상 변하기 때문에 데이터 무결성을 검증하기가 어렵습니다.
난수 생성은 결정적이어서는 안됩니다. 이 경우 예측이 가능하고 패턴을 가지고 있기 때문에 권한이 없는 노드가 데이터를 예측할 수 있게 되고, 조작이 가능해지기 때문입니다. 따라서 블록체인에서 진짜 난수를 만들 경우 해당 결과값이 조작되지 않았는지에 대한 무결성 검증이 가능해야 합니다.
일반적으로 외부 소음을 이용한 난수 생성, 다른 노드들로부터 임의의 데이터를 받아 난수를 생성, 블록체인 내부의 블록 해시 값등을 사용해 난수를 생성할 수 있지만 이 경우 악의적인 노드에 의해 자신에게 유리한 값으로 조작이 가능해집니다. 예를 들어 블록 해시값을 사용해 난수를 생성하는 경우 블록 생성 노드는 이전 블록의 해시값을 가장 먼저 알기 때문에 자신에게 유리한 블록 해시가 나올 때 까지 채굴을 진행할 수 있습니다.
블록체인에서 진짜 난수를 사용하기 위해서는 난수값이 조작되어서는 안되고 이를 모든 노드들에게 증명할 수 있어야 합니다.
① Commit Reveal Scheme
스마트 컨트랙트를 사용해 서로의 값을 모른 채로 값을 제출하여 난수를 생성합니다. 우선 Commit Stage에서 자신이 보내는 값을 암호화하고 일정 토큰과 함께 스마트 컨트랙트로 전송합니다. 전송된 토큰은 일종의 예치금 개념입니다.
일정시간이 지난 후 참여자들은 본인들이 제출하려고 했던 원래 값을 스마트 컨트랙트로 전송합니다. 스마트 컨트랙트는 참여자들이 보낸 값을 암호화한 후 이전에 전송한 값과 비교하면서 유효성 검증을 하게 됩니다. 통과되면 이 값들을 모아 난수를 생성하게 됩니다.
Commit Reveal Scheme에서는 다른 사용자들이 어떤 값을 보내는지 알 수 없기 때문에 진짜 난수를 생성할 수 있습니다. 또한 유효성 검증을 통해 조작되지 않았다는 것을 증명해낼 수 있는 방법입니다.
② BLS Scheme
N명의 참여자들은 개인키를 쪼개어 가지고 있습니다. 난수를 생성하는 경우 자신이 가지고 있는 개인키 조각을 제출하게 됩니다. 만약 k명 이상의 참여자들이 개인키 조각을 제출하면 이를 가지고 난수를 생성합니다.
Commit Reveal Scheme은 소수의 악의적인 노드가 존재하면 난수 생성이 불가능해집니다. 반면 BLS Scheme의 경우 k명의 참여자만 정직한 경우 난수 생성이 가능해집니다.
Reference
'Blockchain' 카테고리의 다른 글
[Blockchain] Remixd 사용하는 방법 (0) | 2022.07.12 |
---|---|
[Blockchain] 이더리움 스마트 컨트랙트 배포하기(Remix) (0) | 2022.07.12 |
[Blockchain] 이더리움 프라이빗 네트워크 구축 방법 (0) | 2022.07.08 |
[Blockchain] 이더리움 EVM 작동 구조 원리 (0) | 2022.07.08 |
[Blockchain] 이더리움이란? (1) | 2022.07.07 |
댓글