해결된 질문
작성
·
188
1
안녕하세요. 좋은 강의 덕분에 블록체인에 대해 많이 배우고 있는 학생입니다.
플립함수 구현을 보는 데 난수를 편의상 블록넘버로 주어 확인시키는 것을 이해했습니다.
그런데, 블록체인을 이용하는 사람은 블록에 기록되는 신뢰성으로 이러한 프로젝트를 이용하는 것으로 알고 있습니다.
만약 난수를 내부함수로 구현하고 keccab으로 참, 거짓을 맞춘다면, 자기가 플립하여 실패했을 때 이용자가 그것이 공정히 랜덤으로 돌렸는지 확인을 못할 것 같습니다. 이용자가 정말로 코인이 랜덤으로 정해졌는지 확인 할 수 있는 방법이 있을까요?
괜찮으시다면, 답변 부탁드리겠습니다.
감사합니다.
답변 2
1
세세한 답변 감사합니다.
이용자가 확인할 수 있게 동일한 결과가 나와야 블록체인에 의의가 있다고 생각하였고 난수를 사용해서 랜덤으로 선택한다는게 선뜻 이해되지 않았는데 자세한 설명 덕분에 쉽게 이해할 수 있었습니다.
블록체인 전문가를 꿈으로 가진 학생으로서 좋은 강의에 감사드립니다.
1
좋은 질문을 해주셨습니다.
일반적으로 블록체인은 "deterministic" 시스템이라고 말합니다. 다수의 서로 다른 노드가 어떤 연산을 수행했을 때 항상 동일한 결과가 나와야만 블록체인의 마스터 "원장"이 서로 일치하기 때문입니다.
그래서 블록체인에서 난수발생 RNG은 항상 어려운 문제입니다. 난수라는 것이 원래 실행할 때마다 달라져야 하는 것인데 이렇게 되면 각 노드에서 서로 다른 난수가 나오게 되어 공유 "원장"의 의미는 없어질테니까요.
그런데 블록체인에서 난수함수 대신 난수처럼 사용할 수 있는 것이 있습니다. 그 중에 하나가 블록해쉬입니다. 블록해쉬는 새로 추가되는 블록의 고유한 아이디에 해당하는 것인데 비트코인이나 이더리움은 그것을, 소위 말하는 채굴자(마이너)들이 엄청난 전력을 소모해가면서 그 블록해쉬를 찾습니다. 즉 그 블록해쉬를 찾기 전까지는 아무도 다음 블록해쉬가 어떤 값이 나올지 모릅니다(찾으면 보상을 받죠💰).
이 강좌의 예제인 동전 던지기는 기본적으로 동전 앞뒤를 선택하고 동전을 던져서 맞추면 사용자에게 상금, 틀리면 게임장 주인이 가지게 됩니다. 이 게임에 참여하는 두 사람은 모두 다음 플립 함수를 실행했을 때 그 트랜잭션이 채굴되어 포함되는 블록의 블록해쉬를 전혀 알 수 없다는 것을 전제로 합니다.
블록해쉬가 난수로 적합하지 않다는 생각도 할 수 있습니다. 채굴자는 새로 만들어지는 블록해쉬를 알고 있습니다. 따라서 게임의 승패에 영향을 줄 수 있습니다. 원하는 블록해쉬가 나오지 않으면 그 블록해쉬를 버릴 수 있으니까 말입니다. 그러나 이 경우, 사토시 나카모토의 비트코인 백서에 언급된 것처럼, 그렇게 함으로써 얻는 이익보다는 규칙을 지켜서 블록을 만들어서 보상을 얻는 이익이 훨씬 크기 때문에 원하는 결과를 얻기 위해 블록해쉬를 선택적으로 만드는 일은 없다고 보는 것이 타당합니다.
블록체인의 "on-chain"에서는 완벽한 난수를 얻지 못하므로 외부의 "신뢰할 수 있는" 곳에서 난수를 가져오는 방법이 있을 수 있습니다. "on-chain"이 아닌 외부로 부터 데이터를 가져오는 것을 "oraclize"라고 하는데 이러한 오라클 서비스를 생각해볼 수도 있겠습니다.
강좌의 예제는 어디까지나 편의상 그렇게 한 것으로 이해하고 좀 더 자세한 내용은 여러 자료를 찾아보기를 부탁드립니다.