비트코인 백서부터 시작합니다(8)
@noctisk님의 글 리스팀했습니다. 앞으로 10편 정말 공부하는 자세로 읽어봐야겠네요.ㅎ
오늘 끝을 내야죠. 겨우 한번 읽는 건데 너무 오래 걸린거 같습니다. 역시 뭘 하든 게으름이 가장 큰 적이네요.ㅎ
어제 밤에 술의 힘을 빌려 이성은 별로 없고 감성만 많은 글을 적었네요.ㅎㅎ그래두 글 쓰면서 기분은 많이 풀린 거 같습니다. 글 읽으면서 풀고 글 쓰면서 풀고. 저에게는 정말 새로운 경험이네요.
다시 힘내야죠!
비트코인 백서부터 시작합니다
비트코인 백서부터 시작합니다(2)
비트코인 백서부터 시작합니다(3)
비트코인 백서부터 시작합니다(4)
비트코인 백서부터 시작합니다(5)
비트코인 백서부터 시작합니다(6)
비트코인 백서부터 시작합니다(7)
10. 개인 정보 보호
기존의 은행 모델은 당사자들과 제 3자 신용기관에 정보 접근 권한을 제한하여 개인 정보 보호가 어 느 정도 가능하도록 했다. 모든 거래를 공개적으로 알려야 하는 중요성은 이러한 것을 불가능하게 하지 만, 공개키를 익명으로 소유하도록 함으로써 정보의 흐름을 차단하고 개인 정보가 유지될 수 있다. 외 부에서는 누가 다른 누군가에게 얼마를 보냈단 사실을 볼 수는 있으나, 그 거래 당사자들의 신분으로 연결되지 않으면 알 수가 없다. 이는 증시에서 공개되는, 시간과 거래 목록만 확인 가능한 거래 체결 정보 공개 수준과 비슷하다.
오늘 다룰 내용은 익명성에 관한 것입니다. 개인키와 공개키에 관해서는 제 전 글 비트코인 백서부터 시작합니다(3)에서 설명드린바 있습니다. 자세히 기억 안나시는 분은 제 글보다 @easyblockchain님의 글을 보고 오시길 부탁드립니다.
개인키로부터 공개키를 만들고 그 공개키로부터 주소를 만드는 식이었습니다. 저희가 거래소에서 주소를 받을 때는 거래소 가입절차에 신상정보를 등록하게 되어있기 때문에 익명성을 바랄 수 없지만 개인 지갑은 아닙니다.
제 글에 안 등장하시면 섭섭하니 @twinbraid님의 개인지갑 사용에 관한 글 올립니다.
https://steemit.com/kr/@twinbraid/nrmcq 저두 한번 해보려구요.ㅎㅎ 비트가 없어서 문제지..
개인 지갑을 만드는 과정에서 개인정보는 필요없습니다. 그냥 만들고 쓰면 됩니다. 그래서 개인 지갑을 사용하는 사람이 비트코인 주소를 공개한다고 해도 그 주소를 보고서는 누군지 전혀 알 수 없습니다. 비트코인의 거래원장(Ledger)에 관한 정보는 블록체인에서 계속 공개되지만 그 거래원장을 누가 만들었고 누구한테 가는 것인지는 알 수 없습니다. 그래서 저희가 알수 있는 것은 거래소의 체결목록 같은 시간과 양 정도입니다.
비트코인의 거래 흐름에 대해서는 완전히 알 수 있지만 그것을 소유한 사람이 누구인지는 알 수 없기 때문에 반익명성(pseudo anonymity 혹은 psuedonymous)라는 말을 많이 씁니다.(다른 글을 읽다가도 영어 원문에 자주 나와서 적었습니다.)
블럭체인의 원리상으로는 반익명성을 가지지만 현실 세계에서는 그렇지 않습니다. 비트코인을 가지고 존버한다면 뭐 이야기가 다르지만 현금화하려면 아무래도 거래소같은 신분인증 기관을 거쳐야하는 게 현실이기 때문입니다.
비트코인을 카드 같이 쓸 수 있는 세상이 오면, 화폐를 대체하는 세상이 오면 달라지겠죠..그럴 일이 있을까요?^^
추가적인 안전장치의 일환으로, 매번 거래마다 새로운 공개키-비밀키 쌍을 사용하여 공통의 소유자에 게 연결되도록 하면 된다. 여러 개의 입력을 갖는 거래의 경우에는 여전히 연결고리를 남기는 것이 불 가피하게도, 그 입력들이 동일 소유자라는 사실을 공개된다. 소유자의 암호키가 공개되면 그러한 연관 성이 다른 거래 내역에서도 동일인에 의한 것이라는 게 알려지게 된다.
요새 읽고 있는 '비트코인, 블록체인과 금융의 혁신' 책에 지갑 원리에 대해 어마어마한 외계어로 자세히 설명이 되어있는데 이 글에서 그 지갑들에 대해 다 설명하긴 좀 힘들거 같습니다. 저두 아직 제대로 이해를 못하고 있어서.
백서의 '거래마다 새로운 공개키-비밀키 쌍을 사용'은 HD wallet(Hierarchical Deterministic Wallet)을 알면 이해하는 데 도움이 될 거 같습니다.
저번 글에 UTXO 설명하면서 올린 @twinbraid님의 글에 약간의 설명이 있었는데 다른 글 하나 링크하겠습니다.
https://steemit.com/kr/@goldenman/hd-wallet
이렇게 매번 거래마다 새로운 공개키-비밀키 쌍을 사용하더라도 여러 개의 입력을 갖는 경우 그 연결고리를 찾을 수 있습니다. 키 생성 방식이 부모-자식-손자 식으로 무한히 내려가고 이들 사이에는 인간의 유전자와 같은 연결 고리 있기 때문입니다. 이 연결 고리가 밝혀진다면 다른 거래에서 쓰는 새로운 주소들에서도 그 소유주가 같다는 걸 알 수 있습니다.
11. 계산
공격자가 다른 체인의 갈래를 빠르게 생성하려고 시도하여 정직한 노드들의 체인을 앞질러 가장 긴 체인을 생성할 시나리오를 간주해보자. 이것이 성공한다 하더라도, 그렇게 가짜 금액을 만들거나 공격자 소유였던 적이 없는 돈을 사취하더라도, 임의의 시스템 변화 상태로는 남겨두지 않는다. 노드들은 유효하지 않은 거래를 지불로 승인하지 않을 것이며, 정직한 노드들은 그러한 거래 내역을 포함하는 블록을 절대 받아들이지 않을 것이다. 공격자는 오직 최근에 지불한 돈을 도로 되찾기 위해 그의 거래 내역 하나만 바꾸려고 시도할 수 있다.
이 단락은 공격자들이 정직한 노드들을 제치고 가장 긴 체인을 만들 수 있는 확률에 대해서 말하고 있습니다. 그것이 힘들다는 것을 수학적으로 증명하는 것입니다. 공격자가 이전 거래내역을 조작하면 앞에서 이해한대로 해시값들이 바뀔 것이고 이 바뀐 해시값을 가진 블록들은 정직한 노드들에 의해 거부될 것입니다. 그럼 남은 방법은 자신이 가장 긴 체인을 만드는 것이겠죠.
정직한 노드들의 체인과 공격자의 체인 간의 경쟁은 이항랜덤워크(Binomial Random Walk)로 특정 지을 수 있다. 정직한 체인이 하나의 블록을 성공적으로 생성하는 사건이 일어나면 +1, 실패하여 공격 자의 체인이 블록을 하나 생성하는 사건이 일어나면 -1이라 한다. 공격자가 갖고 있지도 않은 금액으로 성공할 확률은 도박사의 파산 문제(Gambler’s Ruin problem) 와 비슷하다. 무제한의 신용을 가진 도박사가 적자 상태로 시작하여 거의 무제한의 게임을 시도하여 손 익분기점에 도달한다 가정하자. 그가 손익분기점에 도달할 확률, 즉 공격자가 정직한 체인을 따라잡을 수 있는 가능성은 다음과 같이 계산할 수 있다[8]
p > q 라는 가정이 주어진다면, 공격자가 블록 증가를 따라잡을 수 있는 확률은 블록 수에 지수적으 로 감소하게 된다. 공격자가 먼저 달려들어 운이 좋게 성공하지 못한다면, 가능성은 뒤로 갈수록 점점 희박해진다.
이번에는 새로운 거래에서 돈을 받는 사람 입장에서 송금자가 거래를 바꾸지 못할 거라는 것이 충분 히 확증하려면 얼마나 기다려야 하는지 생각해보기로 한다. 송금자가 받는 사람이 일시적으로 돈을 받 았다 믿게 만들고 일정 시간 뒤에 다시 돈을 자기 자신에게 되돌리게 시도하려는 공격자라 가정하자. 받는 사람은 그러한 일이 벌어지면 경고 알림을 받을 것이고, 공격자는 그게 늦기를 바랄 것이다.
받는 사람은 새로운 암호키 쌍을 생성하여 송금자에게 서명하기 직전에 공개키를 넘긴다. 이러한 방 법은 공격자가 미리 충분한 시간 전에 가짜 블록 체인 생성을 준비해두어 가짜 거래를 성립시키는 것을 방지한다. 송금이 이뤄질 때, 정직하지 않은 송금자는 은밀히 그의 다른 거래 내역을 포함하는 체인을 동시에 생성을 시작한다.
돈을 받는 사람은 거래가 블록에 포함되고 추가로 z개의 추가 블록들이 연결될 때까지 기다린다. 그 는 공격자가 얼마나 많은 작업을 진척시켰는지 정확히 모르지만, 정직한 블록들이 매 평균 시간 간격마 다 생성될 것이고, 공격자의 잠재적 진행률은 포아송 분포의 기대값인 다음과 같을 것이다.
한번 천천히 읽어보시길 바랍니다. 저두 수식이 들어가고 포아송 함수? 이게 뭐야 하면서 그냥 지나쳤었는데 앞의 수식 같은 경우는 천천히 읽어보면 이해는 됩니다. 뒤의 포아송 함수 무한급수는 모르겠지만요.ㅎㅎ
이항랜덤워크라는 것은 쉽게 동전던지기를 생각하시면 됩니다. 앞면이 나오면 한칸 앞으로, 뒷면이 나오면 한칸 뒤로를 계속 반복할 때 제자리에 있게 되는 확률에 관한 것입니다. 이걸 이 공격자와 정직한 노드의 상황에 대입해보면, 정직한 노드(동전 앞면)가 블럭을 하나 만들면 +1(한칸 앞으로)이라고 하고 공격자가 만들면 그 길이가 같아지니 -1(한칸 뒤로)이 됩니다. 위에 동전던지기처럼 제자리가 되는 것이죠.
도박사의 파산 문제는 이항랜덤워크에서 나오는 내용인데 간단하게 도박사가 계속 도박을 할수록 파산할 가능성이 높아지니 도박을 하려면 한판만 하라는 내용입니다.
둘 다 재밌는 내용이긴 한데 수식이 많이 들어가므로 관심있으신 분은 위키형님을 이용하시면 됩니다.ㅎ
다시 본문으로 돌아가서, 수식이 왜 저렇게 나오는지는 모르겠지만 결론만 내보겠습니다.
정직한 노드가 다음 블록을 찾을 확률 p > 공격자 노드가 다음 블록을 찾을 확률 q 이면 z개의 다음 블록들을 공격자가 빨리 찾을 확률 qz는 이렇게 풀립니다. 위의 식에서 q/p는 1보다 작게되고 1보다 작은 것을 계속 제곱, 세제곱으로 늘려가면 점점 더 작아지므로 점점 가능성이 줄어들게 됩니다. 그러니 공격해서 이득을 취하려면 빨리 해야겠죠?
돈을 다시 돌려받는 공격이 안되는 이유는 돈을 받은 사람으로부터 다시 돌려받는 거래 내역을 만들어서 충분한 시간 전에 가짜 블록체인을 생성하고 있어야하는데 수신자가 새로운 암호키 쌍으로 서명하기 직전에 공개키를 넘겨버리면 자신이 만들고 있던 가짜 블록체인에 거래내역을 만들어서 넣을 수가 없기 때문입니다. (흐음 이건 제대로 이해했는지 잘 모르겠습니다. 아시는 분 설명 좀...ㅠㅠ)
두 번째 수식은 이중지불에 관한 수식인데 이중지불된 거래 내역을 포함하는 체인을 거래와 동시에 생성해서 제일 긴 체인으로 만들 확률에 관한 것입니다.
포아송 분포는 정해진 시간 안에 어떤 사건이 일어날 횟수에 대한 기대값(ㅅ 거꾸로 된거)와 그 사건이 n회(여기선 k) 일어날 확률에 대한 수식입니다. 간단한 예로 일정 시간동안 발생하는 불량품의 수 같은 것을 계산하는 수식입니다.
여기선 블럭의 생성시간은 10분으로 정해져있으니 10분이라는 일정 시간동안 공격자가 블럭을 생성할 확률을 구하는 것이겠죠.
이 수식은 정말 잘 모르겠어서 그냥 블럭이 많이 생길수록 줄어드는 구나 정도로...(그래두 예전에는 수학 꽤 했는데 말이죠..흑흑)
결론은 다음글에서 쓰려고 합니다. 딱히 할말이 많을 거 같진 않지만 이 시리즈 마무리 짓고 다음 할 일을 생각해보려고요.
재미없는 긴 글 읽어주셔서 감사합니다~~