암호경제학은 블록체인 기반 분산 시스템을 설계, 구현하는데 핵심 요소입니다. 하지만 그 연구는 아직 미성숙한 단계죠. 암호경제시스템 전문 연구기업 디콘(DECON)과 코인데스크코리아가 암호경제학 이야기를 쉽게 풀어 소개하는 코너를 마련했습니다.

 

이미지=Getty Images Bank

 

난수(Random Number)는 IT 분야에서 중요한 역할을 합니다. 암호키 생성, 온라인 게임, 시뮬레이션 등 과정도 난수의 활용과 깊은 관련이 있죠.

블록체인도 예외는 아닙니다. 크립토 도박 서비스들은 난수 생성을 통해 각 베팅 결과를 정하고 있고, 몇몇 합의 알고리듬에서는 다음 블록 검증자를 선정할 때 난수를 사용하고 있기도 합니다. 

하지만 난수 활용 과정에서 많은 신뢰 문제가 발생하고 있습니다. 온라인 도박 조작이 여러 차례 발행한 것에서도 알 수 있죠. 때문에 이 문제를 잘 해결해 신뢰할 수 있는 난수를 생성하는 것은 매우 중요합니다. 

특히 블록체인에서 더욱 중요합니다. 상호 간 신뢰가 없는 노드들끼리 데이터를 공유하고 연산해야 하므로 다른 어느 분야보다 믿을 수 있는 난수를 생성하는 방법이 중요하죠. 그런 만큼 여러 방법이 제시되고 있습니다. 이번 글에서는 블록체인에서 난수를 생성하는 방법에 대해서 다루겠습니다.

 

1. 난수 생성 문제에 대한 소개


난수 생성에 대해 큰 관심이 없는 분들이라면 ‘머릿속으로 아무 숫자나 떠올려도 난수가 될 텐데 굳이 난수를 생성하기 위한 복잡한 논의가 필요한가?’라고 생각할 수 있습니다. 때문에 컴퓨터 과학 분야에서 공유하는 난수 생성 문제에 대해 먼저 설명해 이 문제에 대해 공감대를 형성한 이후에 블록체인에서의 난수 생성 문제를 이해하는 편이 좋습니다.

1.1. 일상생활 속의 난수

우리는 오래전부터 매우 쉽게 난수를 생성해왔습니다. 주사위 던지기, 동전 던지기, 카드 섞기 등등 모두 다 어떻게 보면 난수를 생성하는 익숙한 방법들이죠. 이 방법들의 공통점은 무엇일까요?

주사위
이미지=Getty Images Bank

 

첫 번째 공통점은 결과가 편향되지 않는다(비편향성)는 것입니다. 주사위를 던지면 보통 여섯 면이 골고루 나오고, 동전 던지기에서는 앞면과 뒷면 어느 한쪽으로도 치우침 없이 골고루 결과가 나올 겁니다. 이를 비편향성이라고 합니다. 두 번째 공통점은 매번 결과가 다른 패턴으로 나오기 때문에 예측할 수 없다(예측 불가능성)는 것입니다. 마지막 세 번째 공통점은 결과를 조작할 수 없다(조작 불가능성)는 것입니다.

무작위성 혹은 난수를 얘기하는 대부분의 경우에 요구되는 요소들도 대부분 위의 세 특징에 포함됩니다. 그리고 이 무작위성은 우리가 정확히 파악하지도 못하고, 조종하지도 못하는 물리계를 원천으로 활용하고 있기에 우리는 위의 세 특징을 쉽게 얻고 있는 것입니다.

1.2. 컴퓨터 과학에서의 난수

하지만 컴퓨터 과학에서의 난수 생성 문제로 가면 얘기가 완전히 달라집니다. 컴퓨터는 우리처럼 주사위 던지기를 쉽게 할 수 없습니다.

물론 컴퓨터도 여러 함수를 이용해 편향되지 않은 수를 생성하는 것은 매우 잘합니다. 하지만 예측할 수도 없고 조종 불가능한 특성을 원한다면 얘기는 완전히 달라집니다. 컴퓨터는 이전에 입력받은 순서대로 정해진 행동을 하도록 설계돼 있습니다. 컴퓨터는 자신이 가지고 있는 공간 내에서만 작동하기 때문에 우리와는 다르게 자신이 정확히 파악하지도 못하고 조종할 수 없는 다른 환경들로부터 새로운 정보를 얻는 것도 잘 못 합니다. 그래서 컴퓨터는 우리가 흔히들 무작위성의 원천으로 사용하고 있는 물리계와 같은 요소를 쉽게 활용할 수가 없습니다.

이러한 컴퓨터의 한계로 인해 컴퓨터 과학에서는 난수를 크게 두 부류로 나누어서 설명합니다. 먼저 '유사 난수(Pseudo Random)'는 컴퓨터 내부에 있는 값들과 알고리듬의 실행을 통해 얻은 결괏값을 말합니다. 이 값들은 알고리듬에 의해 생성되었기 때문에 특정 패턴을 가지고 있고 예측하는 것도 가능합니다. 그래서 1.1 파트에서 언급한 예측 불가능성의 조건을 만족시키지는 못합니다. 반대로 '진짜 난수(True Random)'는 컴퓨터 외부로부터 불확실성을 충분히 끌어온 상태에서 생성해낸 값입니다. 이렇게 생성된 난수는 1.1 파트의 세 가지 조건을 모두 만족시킵니다. 그리고 진짜 난수를 만들 때는 ‘어떻게 불확실성을 충분히 끌어오느냐’가 관건이 되죠.

여러 프로그래밍 언어, 프로그램에서 제공해주는 난수 생성 함수들은 해시 함수 등의 복잡한 함수를 통해서 결과의 비편향성만 만족시키는 유사 난수 생성기인 경우가 많습니다. 이 함수의 결과는 편향되지 않았다는 측면에서 난수처럼 보이지만 실제로는 예측 가능하고 이를 통해 결괏값을 어느 정도 조종할 수도 있기 때문에 진짜 난수라고 보기는 힘듭니다. 아래 그림을 통해 설명하겠습니다.

(왼쪽부터)진짜 난수(True Random)와 유사 난수(Pseudo Rnadom)를 시각화한 그림. 이미지=random.org 갈무리
진짜 난수(True Random)와 유사 난수(Pseudo Rnadom)를 시각화한 그림. 이미지=random.org 갈무리

 

왼쪽 그림은 random.org에서 제공하는 서비스를 통해 대기 잡음을 이용하여 진짜 난수를 뽑아서 2D 공간 위에 시각화한 것이고 오른쪽 그림은 PHP 언어의 rand 함수를 통해 생성한 난수를 시각화한 것입니다. 두 그림을 비교해 보면 유사 난수의 결과에서는 특정 패턴이 나타나고 있는 것을 볼 수 있습니다. 이 패턴을 통해서 다음 난수 생성 값을 어느 정도 예측하는 것도 가능합니다.

어떤 경우에는 유사 난수로도 충분하지만, 암호키 생성과 같은 분야에서는 진짜 난수를 반드시 필요로 합니다. 그래서 컴퓨터에서 사용할 만한 진짜 난수를 생성하려는 시도 또한 활발히 이루어지고 있습니다. 1998년부터 운영되어온 random.org 사이트가 대표적입니다. 이 사이트는 컴퓨터에서 사용할 수 있는 여러 난수 생성 방법을 정리해두고 이를 사용자에게 제공하고 있습니다. 이런 시도들에서는 컴퓨터를 임의로 무작위적으로 행동하게 하는 것은 불가능하니 어떻게든 물리 현상에서 예측하지도, 조종하지도 못한 값을 가져오려 합니다. 여기서 사용하는 물리 현상의 예로 방사성 붕괴, 열역학적인 현상 등의 물리적 수치 변화 등이 있습니다.

진짜 난수(True Random) 생성은 효율성 문제를 가지고 있습니다. 진짜 난수 생성을 생성하기 위해서는 물리 현상을 특정 시간 동안 관찰해야 합니다. 아무래도 이 경우에는 컴퓨터에 내재해 있는 값을 사용하는 유사 난수(Pseudo Random)에 비해서 많이 느리고 비쌀 수밖에 없습니다.

그래서 난수의 활용 용도에 따라 진짜 난수와 유사 난수 중 적절한 방법을 선택하는 것이 중요합니다. 예를 들어 음악 랜덤 재생, 오늘의 명언 추천 등 조작이 큰 문제가 안 되는 경우, 유사 난수로도 충분합니다.

 

2. 블록체인에서의 난수 생성 방법


 

블록체인
이미지=Getty Images Bank

 

컴퓨터 과학에서 난수를 생성하는 것이 생각만큼 쉬운 일은 아니라는 것을 느꼈을 것입니다. 게다가 ‘난수'라고 해서 다 같은 난수인 것도 아니고 생성하는 난이도가 같지도 않다는 것까지도 파악했을 것이라고 생각합니다.

블록체인에서의 난수 생성 방법에 본격적으로 들어가기 이전에 먼저 글에서 다루려고 하는 난수의 범위를 좁혀보고자 합니다. 이 글에서 다루고 있는 난수는 비편향성에 더하여 진짜 난수처럼 예측하지도 못하고 원하는 결괏값이 나오도록 조종할 수도 없는 결과물들로 한정하겠습니다. 유사 난수의 경우 해시 함수로 가득 차 있는 블록체인의 특성상 만들어내는 것이 그렇게 어렵지도 않고 사용과정에서 발생하는 신뢰 문제도 그리 심각하지 않을 거로 생각했기 때문입니다.

그리고 난수 생성 방법을 난수 생성을 위해 필요한 여러 단계 중에서 random.org에서 사용한 대기 속의 소음, 방사성 붕괴와 같은 불확실성, 무작위성의 원천을 어디서, 어떻게 얻을지에 초점을 맞춰 설명하겠습니다.

블록체인에서의 난수 생성 방법 중 쉬운 것부터 이들의 한계점들을 먼저 짚어보겠습니다. 블록체인상에서 난수를 생성하는 것이 일반 컴퓨터 과학에서 진짜 난수를 생성하는 것보다 더 어려운지, 어떤 특징들이 추가로 요구되는지에 대해서 다루면서 블록체인에서의 난수 생성 방법에 대해 설명 하겠습니다.

 

2.1. 쉽게 떠올릴 수 있는 안일한 방식들

2.1.1. 물리 현상 이용하기

얼핏 보기엔 블록체인에서 난수 생성시키는 것과 컴퓨터 과학에서 난수 생성시키는 것에 큰 차이가 있겠냐는 생각을 하기 쉽습니다. 왜냐하면 컴퓨터에서 그랬던 것처럼 물리 현상에서 측정한 값을 통해서 충분한 무작위성을 얻을 수 있지 않냐고 생각할 수 있기 때문이죠.

 

물리, 파동
이미지=Getty Images Bank

 

하지만 블록체인에서 이 문제는 이렇게 간단하지 않습니다. 우선 난수가 생성되는 과정에서 참여자가 정직하게 행동하지 않는 문제가 발생할 수 있습니다. 난수 생성에 사용할 물리 현상을 측정하는 당사자는 자신이 원하는 결과가 나올 때까지 계속 측정을 반복하다가 자신에게 유리한 값이 나오고 나서야 비로소 그 값을 스마트 계약에 보낼 위험이 있습니다. 이 경우 특정 사용자가 난수 값을 조작할 수 있는 것이나 다름없기 때문에, 이 결과를 진짜 난수로 사용하기에는 위험이 있습니다.

2.1.2. 여러 사용자가 보낸 값 활용하기

여기서 한 명이 아니라 여러 명의 값을 섞으면 어떨까라고 떠올리셨을 겁니다. 한 명이 측정한 물리 현상을 무작위성의 원천으로 사용할 것이 아니라 여기다가 여러 사용자가 보낸 값들을 취합해서 이를 함께 사용해서 한 명의 사용자에 의해 발생하는 조작 가능성을 낮추는 것입니다. 왜냐하면 다른 사용자들이 어떤 값을 보낼지 모르기 때문에 한 명의 힘으로는 난수 생성의 결과를 조작할 수 없습니다.

하지만 이 문제 또한 2.1.1 해결책에서 발생하는 문제와 비슷한 문제에 노출되게 됩니다. 값을 보내는 여러 사용자 중에서 마지막에 값을 보내게 될 사용자가 다른 사용자들이 보내는 값을 관찰하고 있다가 이 모든 값을 참고하여 자기에게 유리한 값이 나오도록 하는 값을 보냄으로써 난수 생성의 결과를 조작할 수 있기 때문이죠.

2.1.3. 블록 해시 등 블록체인 내부의 값 이용하기

2.1.1과 2.1.2에서 발생한 문제들을 보면 참여자가 결과를 어느 정도 조작할 수 있다는 데서 발생하였습니다. 그렇다면 블록체인 블록 해시값 등을 사용하면 되지 않을까요? 블록 해시값은 블록이 생성되기 전까지는 아무도 모르기 때문에 예측할 수 없지 않을까요?

하지만 아쉽게도 이전 블록 해시값 등은 이미 모두에게 공개돼있기 때문에 예측 불가능성이라는 특성을 만족시킬 수가 없습니다. 과거가 아닌, 현재 혹은 미래의 블록 해시값을 사용할 경우에는 위의 두 해결책과 마찬가지로 블록을 생성하는 노드(채굴자)에 의한 조작이 가능합니다.

2.2. 블록체인의 난수 생성은 왜 더 어려운 걸까

위에서 제시한 안일한 방법들은 블록체인이 아니라 일반적인 애플리케이션에서는 진짜 난수를 생성하기에 충분히 좋은 해결책입니다. 하지만 블록체인 애플리케이션에는 쓰기 어렵습니다. 일반 상황에서는 꽤 안전한 방법이 왜 블록체인에 와서는 문제투성이가 됐을까요? 블록체인에서는 ‘믿을 놈이 없다'라는 가정이 있기 때문입니다. 블록체인에서 이 신뢰 문제를 해결하는 방식과 난수 생성에 필요한 요소들은 상충하는 부분들이 많기 때문에 블록체인에서 난수를 생성하는 것이 더 어려워졌습니다.

블록체인에서는 분산 원장 속 데이터 간 합의 및 무결성 보장을 위해 블록체인 내부에서 일어나는 모든 동작은 결정적인(deterministic) 방식으로만 일어나게 됩니다. 결정적인 방식이라는 것은 정해진 상태 값과 인풋 값이 있을 때 그 결괏값 또한 예측한 그대로 똑같은 값만 내뱉어야 한다는 것을 의미합니다. 결정적이라는 특징은 블록체인이 한 블록 동안 발생한 트랜잭션을 다시 재생시킨 결과가 현재 자신이 보유한 데이터 상태와 일치한다는 것을 보일 수 있게 함으로써 원장의 무결성을 증명하는 것을 매우 쉽게 해줍니다.

하지만 우리가 난수를 생성할 때 기대하는 특성은 이와 정반대입니다. 난수를 생성할 때 사용하려는 무작위적인 요소들은 결정적이어서는 안 됩니다. 왜냐하면 상황마다 예측하지 못한 다른 값이 나와야 난수가 필요로 하는 예측 불가능성과 조작 불가능성을 만족하기 때문이죠. 그 결과, 블록체인을 통해서는 난수를 생성하는 과정에서 사용된 여러 무작위적인 요소들이 정말 무작위적인 요소들인지 검증할 수가 없습니다. 안일한 방식들이 가지고 있는 취약점들도 모두 무작위적인 요소에 대해 검증을 할 수 없다는 데서 발생한 문제들입니다.

예시를 들어 설명하자면, 2.1.1의 해결책에서는 누군가가 측정하여 제출한 물리 값이 정말 그 사용자가 정직하게 한 번만 측정해서 나온 값인지 아니면 자신에게 유리한 값이 나올 때까지 측정을 반복한 결과물인지 구분할 수 없다는 데에서 문제들이 발생한 것입니다. 2.1.2의 해결책도 마찬가지입니다.

블록체인이라는 누구도 믿을 수 없고, 모든 것이 공개된 환경에서 난수를 안전하게 생성하기 위해서는 이렇게 생성된 난수가 정말 난수라는 것을 증명해야 합니다. 그래서 블록체인상의 난수 생성 문제를 다루고 있는 해결책은 대부분 글의 도입부에서 소개한 비편향성, 예측 불가능성, 조작 불가능성에 더하여 증명 가능성까지 염두에 두어야 합니다. 무작위적으로 일어난 결과가 정말로 무작위적으로 일어난 결과인지를 어떻게 증명할 것인지가 핵심이 됩니다.

 

2.3. 블록체인에서 난수 생성하는 방법

2.3.1. Commit Reveal Scheme

지금까지 제시된 난수 생성 방법 중 가장 널리 알려져 있고 간단한 방법 중 하나는 'Commit Reveal Scheme'입니다. 이 방식은 2.1.2 파트에서 소개한 방식을 보다 암호학적으로 확장한 솔루션이라고 볼 수 있습니다.

2.1.2 파트의 ‘여러 사용자가 보낸 값을 활용하는 경우’에 마지막으로 값을 전송하는 사용자에 의해서 난수 결과가 조작될 수 있다는 문제가 발생했습니다. 이 문제가 생기는 이유는 블록체인에서는 다른 사용자들이 어떤 행동을 하는지가 모두 공개되기 때문입니다. 여기서 간단한 해결책은 남들이 어떤 행동을 하는지 서로 모르도록 하는 겁니다. 그래서 Commit Reveal Scheme에서는 각 사용자가 난수 생성을 위해서 값을 보낼 때 값을 그대로 보내는 것이 아니라 암호화시켜서 보내도록 합니다. 그러면 다른 사용자들이 어떤 값을 보냈는지 알 수 없기 때문에 마지막 사용자가 자신에게 유리한 방향으로 난수 생성을 조작할 수가 없게 되죠.

Commit Reveal Scheme이 진행되는 순서는 다음과 같습니다.

commit reveal scheme 개념도. 이미지=디콘 제작
commit reveal scheme 개념도. 이미지=디콘 제작

 

1. Commit Stage

각 참여자(U1,U2,)는 자신이 보내려고 하는 값 si를 암호화한 값 encrypt(si)를 주어진 기간 동안 제출합니다. 이 값을 제출할 때에는 일정 금액 이상의 토큰을 함께 예치해놓습니다. 

2. Reveal Stage

주어진 기간이 종료되면 각 참여자들은 자신이 제출하려고 했던 값 si를 제출하고 스마트 계약은 이 값을 암호화한 값이 참여자가 Commit Stage 동안 제출한 encrypt(si)와 일치하는지 확인하여 유효성 여부를 검사합니다. 만약 참여자가 유효한 값을 제출하였다면 이 참여자가 예치한 토큰은 반환하여 줍니다. 반대로 유효하지 않은 si가 제출되었다면 이 참여자가 예치한 토큰은 몰수합니다.

보다시피 Commit Reveal Scheme은 매우 간단합니다. 남들이 어떤 값을 보냈는지 알 수 없게 함으로써 난수 생성 과정을 조작하는 것도 불가능해졌고, 결과를 예측하는 것도 불가능합니다. 게다가 참여자가 제출한 si 값에 대한 검증 과정이 있기 때문에 난수 생성 과정에 대한 증명도 가능해졌습니다.

하지만 이 방식은 몇 가지 치명적인 단점을 가지고 있습니다. 우선 각 참여자들이 난수 하나를 생성하기 위해 해야하는 일이 너무 많습니다. Stage마다 이 방식에서 요구하는 값을 제출하여야 하고 토큰 예치까지 해야 한다는 점에서 꽤 귀찮은 일들을 필요로 합니다.

게다가 시간과 비용이 많이 듭니다. 사용자들의 참여를 해야하기에 기본적으로 몇 블록 생성주기 이상을 각 Stage에 할당하여야 하고 그로 인해 난수 하나를 생성하는 데에도 많은 시간이 소비되게 됩니다. 거기다가 몇몇 참여자들이 Reveal 과정에서 의도적으로 si를 제출하지 않거나 잘못된 si를 제출하는 등 제대로 참여하지 않았을 경우에는 난수 생성 방법 설계에 따라서는 해당 과정을 뒤엎고 Commit Reveal 과정을 다시 반복해야 한다는 점에서도 시간 낭비가 발생할 수 있습니다.

2.3.2. BLS Scheme

 

threshold signatures
임계값 서명(threshold signatures) 개념도. 이미지=디콘 제작

 

BLS 서명은 임계 값 서명(threshold signature) 시스템 중 하나입니다. 여기서는 N명으로 이루어진 한 그룹의 참여자들이 개인 키 S를 나눠서 소유하고 있습니다. 각 참여자들은 S를 통째로 소유하지 않고 S의 일부분만 가지고 있습니다. 서명이 필요한 경우에 참여자들이 자신이 가지고 있는 키를 가지고 서명을 하게 되는데 N명 중 k명 이상이 서명하였을 때 비로소 유효한 서명이 생성되게 됩니다. 

BLS 서명을 통해 난수를 생성할 때에는 주로 서명 값을 난수 생성에 사용하게 됩니다. 예를 들어 난수 생성을 위해 사용할 특정 값이 있습니다. 그럼 난수 생성의 의무가 있는 참여자들이 각각 이 값에 대해 서명을 진행하고 그 결과 값을 제출합니다. 그리고 k명 이상으로부터 서명이 모였으면 이를 통해 BLS 서명을 만들고 그 결괏값을 난수 생성에 이용하게 됩니다.

이 방식은 전체 N 명의 참여자 중에서 k명의 사람만 정직해도 제대로 작동할 수 있다는 장점이 있습니다. Commit Reveal 방식에서는 Reveal 단계에서 값을 제대로 제출하지 않는 한두 명의 사람에 의해 난수가 생성되지 않을 위험도 있습니다. BLS Scheme에서는 이런 부정직한 참여자 한두 명에 의해 난수 생성이 중단되지는 않습니다.

하지만 설계에 따라서 만약 난수 생성을 위해 사용할 값을 정할 수 있다면 k명의 부정직한 참여자만 있어도 이들끼리 담합하여 자신에게 유리한 난수를 생성하도록 하여 서명을 하고 이 값을 제출해버릴 수도 있습니다. 또, k의 값이 N에 비해서 지나치게 작을 않을 경우에는 서명 값이 전체 정직한 참여자들의 의지를 제대로 반영하지 못한다는 문제가 발생할 수 있기 때문에 적절한 k 값을 설정하여야 하기도 합니다. BLS scheme에서도 난수 생성의 결과가 참여자 대부분의 이해관계와 연관될 경우 집단적으로 부정직한 행동을 할 가능성도 있습니다.

이외에도 많은 방식이 제안돼 왔습니다. 지금도 블록체인 업계의 여러 사람이 난수 생성 방법에 대해서 관심을 갖고 연구를 진행하고 있습니다. 재밌는 아이디어도 계속해서 나오고 있고요. 이러한 아이디어들을 볼 때 각 아이디어에서 어떤 요소를 이용해 무작위성과 난수의 증명 가능성 사이에 균형을 맞추려고 하는지를 파악해보는 것도 재밌는 일이 될 거로 생각합니다.

 

3. 난수 생성은 블록체인 서비스의 주요 부분


블록체인상에서 난수를 생성하는 방법을 소개했습니다. 블록체인에서 난수를 생성하기 위해서는 불확실성과 무작위성뿐만 아니라 남들에게 생성된 결과가 정말 난수임을 증명하는 것까지 신경 써야 합니다. 이 때문에 컴퓨터 과학에서 사용하고 있는 진짜 난수 생성 방법들보다 더 복잡한 과정을 필요로  하죠.

난수 생성은 이미 블록체인 서비스의 중요한 부분으로 자리 잡았습니다. 많은 백서에서 난수 생성을 설명하는 데 따로 파트를 할애하거나 심지어는 난수 생성 방법에 대한 백서를 따로 준비할 정도입니다. 이 글을 통해 독자 분들은 각 난수 생성 방법을 분석할 때 어떤 면을 보아야 하는지, 어떤 공격이 발생할 수 있는지에 대하여 이해하셨다고 생각합니다. 이를 기반으로 각 백서에서 제시하고 있는 난수 생성 방법이 안전한 방법인지, 유효한 방법인지 파악해보는 것도 좋을 것 같습니다.

<지난글 보기>

#1_  드디어 스테이블코인이 이해되기 시작했다(1)

#2_  드디어 스테이블코인이 이해되기 시작했다(2)

#3_스테이블코인의 이해_#3: 암호자산 담보 스테이블코인

#4_스테이블코인의 이해_#4: 암호자산 담보 스테이블코인

#5_스테이블코인의 이해_#5: 무담보 스테이블코인

#6_스테이블코인의 이해_#6: 무담보 스테이블코인의 장단점

#7_스테이블코인의 이해_#7: 혼합형 스테이블코인

#8_가장 효율적인 블록체인 컴퓨팅 자원 분배 방법은?

#9_스마트 계약을 통해 ‘유동성 공급’은 어떻게 가능할까?

 

제보, 보도자료는 contact@coindeskkorea.com
저작권자 © 코인데스크코리아 무단전재 및 재배포 금지