이전글 에 이어서
“스티밋KR코인” 의 프로토콜을 개선해 봅시다.
스캠코인으로 남을 순 없죠.
프로토콜 v0.1을 요약하면 다음과 같습니다.
- 철수의 KR 은 오직 철수만 쓸 수 있습니다.
- 말해놓고 번복 할 수 없습니다.
- 돈 = "나, XX은, OO에게 YY만큼의 돈을 지급한다" 라고 적은 메시지
- 이런 과정을 통틀어서 유식하게 트랜젝션이라 부릅니다.
- 지갑주소 = 공개키,
긴 자리수의 영문+숫자로 이루어진 문자열 = 비공개키
그리고 프로토콜v0.1 은 아래 두개의 문제점을 가지고 있죠.
- 철수가 돈을 진짜로 가지고 있는지 판별 하는법에 대한 언급 X
- 중복 지불을 어떻게 막을지 언급 X
이번 글에서는 이 두문제를 해결하는
프로토콜 v0.2 을 만들어 보겠습니다.
메시지에 숫자를 함께 첨부하기
다시 한번, 철수가 영희에게 1KR 을 주고 싶은 상황을 가정해봅시다.
"나, 철수는, 영희에게 1 KR 을 지불한다. “
"나, 철수는, 영희에게 1 KR 을 지불한다. “
"나, 철수는, 영희에게 1 KR 을 지불한다. “
"나, 철수는, 영희에게 1 KR 을 지불한다. "
"나, 철수는, 영희에게 1 KR 을 지불한다. "
메시지가 무려 5개 입니다.
영희는 이 5개의 메시지를 어떻게 해석해야 할까요?
- 철수가 진짜로 서로 다른 1 KR 코인을 5번이나 보냈나보다.
완전 콜 - 철수가 한번만 보냈는데 실수로 5번이나 중복 전달 되었나보다.
애매합니다.
프로토콜은 이와 같은 애매모호 함이 있어서는 안됩니다.
어떻게 개선할 수 있을까요?
아이디어를 얻기 위해 실제 지폐를 한번 살펴봅시다.
사진을 살펴보시면 알 수 있는 사실이 있습니다.
바로, 모든 지폐에는 일련번호가 붙어있다는 사실입니다.
우리의 스티밋KR 코인에도 일련번호를 붙여보면 어떨까요?
즉,
"나, 철수는, 영희에게 1 KR 을 지불한다. “
가 아니라
"나, 철수는, 영희에게 일련번호 1232211의 1 KR 을 지불한다. “
와 같이 되는 것 입니다.
일련번호가 붙게 되면서
앞에 언급한 상황이 더 이상 애매모호 하지 않습니다.
1) 중복으로 메시지를 전달한 케이스
"나, 철수는, 영희에게 일련번호 12323232 1 KR 을 지불한다. “
"나, 철수는, 영희에게 일련번호 12323232 1 KR 을 지불한다. “
"나, 철수는, 영희에게 일련번호 12323232 1 KR 을 지불한다. “
"나, 철수는, 영희에게 일련번호 12323232 1 KR 을 지불한다. “
"나, 철수는, 영희에게 일련번호 12323232 1 KR 을 지불한다. “
이 상황은 이제
- 철수가 한번만 보냈는데 실수로 5번이나 중복 전달 되었나보다.
라고 영희가 분명히 해석 할 수 있죠.
2) 여러번 메시지를 전달한 케이스
"나, 철수는, 영희에게 일련번호 12323223 1 KR 을 지불한다. “
"나, 철수는, 영희에게 일련번호 27323252 1 KR 을 지불한다. “
"나, 철수는, 영희에게 일련번호 36321232 1 KR 을 지불한다. “
"나, 철수는, 영희에게 일련번호 42823242 1 KR 을 지불한다. “
"나, 철수는, 영희에게 일련번호 12887745 1 KR 을 지불한다. “
이 상황또한 이제
- 철수가 진짜로 서로 다른 1 KR 코인을 5번이나 보냈나보다.
라고 해석 할 수 있죠.
은행의 필요성
위에 제시 된 일련번호를 부여하는 방법에는
치명적인 약점이 있습니다.
아무나 일련번호를 부여하면 의미가 없습니다
즉, 은행 과 같은 존재가
다음의 두가지 일을 해야 합니다.
- 같은 일련번호를 가진 코인이 두번 쓰이지 않도록 보장한다.
- 각각의 일련번호를 가진 코인을 누가 가지고 있는지 기록한다.
이 두가지 일은,
서두에 언급한 프로토콜 v0.1의 문제점들의
해결책 이기도 합니다.
이해를 돕기위해 구체적인 예를 들어봅시다.
철수가 영희에게 1 KR 을 전송하고 싶습니다.
그럼, 먼저 철수는 은행에 가서
“1 KR 을 제 잔고에서 빼 주세요”
라고 합니다.
그럼 은행은
실제로 잔고가 있으면
“네 고갱님 계좌에서 1KR 차감하였습니다.
일련번호 12345678 을
다음 서명에 첨부해주세요.”
라고 알려 줍니다.
그럼, 철수가 이전과 마찬가지로
"나, 철수는, 영희에게 일련번호 12345678 의 1 KR 을 지불한다. “
라는 메시지를 작성하고 전자서명해서 보내면 됩니다.
만약에, 1 KR 더 보내고 싶으면
철수가 은행에게 같은 방법으로
일련번호 54321878 을 전달 받아
"나, 철수는, 영희에게 일련번호 54321878 의 1 KR 을 지불한다. “
라고 작성하면 되는 것이죠.
영희 입장에서 생각해보죠.
프로토콜 v0.1 에서 영희는
"나, 철수는, 영희에게 일련번호 12345678 의 1 KR 을 지불한다. “
라는 메시지를 받으면
그냥 냉큼 받았습니다.
하지만, 바보 같은 영희는 이돈이
이미 쓰인 돈인지 알턱이 없었죠.
프로토콜 v0.2 에서 영희는 더욱 스마트 해졌습니다.
KR 을 받으면 냉큼 수락하는 것이 아니라 은행에 먼저 물어봅니다.
“일련번호 12345678 철수꺼 맞나요?”
"그리고 일련번호 12345678 KR 아직 안쓰인거 맞나요?”
오직 은행만이 일련번호를 발행하고 관리하기 때문에
은행은 위 두 질문에 "예" 혹은 "아니오"로 답할 수 있습니다.
오직, 두 질문의 답 모두 "예" 인 경우에만 영희는
철수로 부터 받은 이 KR 을 수락합니다.
아주 스마트하죠.
그리고 은행은
“일련번호 12345678은 이제 철수가 아니라 영희 꺼”
라고 업데이트 합니다.
여전히 남은 문제점. Decentralized ledger
은행이 있으니 만사가 편하네요.
하지만, 날카로운 독자님들은
“근데 님아, 은행 이라고요?
스티밋KR코인은 탈중앙화(decentralized) 코인 아닌가요?”
라고 반문하실 껍니다.
반문 하셔야 정상입니다
네, 안타깝지만
은행이라는 하나의 거대한 조직이
일련번호를 발행하고 관리하는 해결책은
그렇죠. 아주 구식입니다.
어떻게 해결 할 수 있을까요?
간단합니다.
모두가 은행이 되면 됩니다.
이를, 유식한 말로
분산원장(decentralized ledger) 라고 부릅니다.
네, 드디어, 이름부터 어려운 이말이 무슨 뜻인지 알았습니다.
모두가 은행이 된다는 말입니다.
즉,
모든 사람이
- 같은 일련번호를 가진 코인이 두번 쓰이지 않도록 보장한다.
- 각각의 일련번호를 가진 코인을 누가 가지고 있는지 기록한다.
의 역할을 수행하는 것이죠.
근데, 모두가 은행이 된다는 말은 말이 쉽지
실제로 아주 많은 애매한 상황들이 발생합니다.
예를들어,
철수가 일련번호 12345678 의 1 KR 의 보유하고 있다고
생각해 봅시다.
이를 영희 에게 전달하기 위해
본인의 기록을 업데이트 합니다.
철수 본인의 종이(ledger)에다가
라고 적습니다.
근데, 까먹고 이를 짱구에게 전달하지 않았습니다.
즉 짱구의 종이에는 여전히,
라고만 적혀있게 됩니다.
이 상태에서,
철수에게 돈을 받을 것이 있는 맹구가
짱구에게 물어봅니다.
“짱구야, 철수 12345678 에 해당하는 1KR 아직도 가지고 있니?”
그럼, 짱구는 바보같이
“응. 내 종이에는 그렇게 적혀있음~"
과 같이 대답하게 되죠.
즉, 모든사람이 은행의 역할을 하게 되버리면서
서로 가진 정보의 싱크가 맞지 않는 문제가
생겨 버렸습니다.
어떻게 해결해야 할까요?
요약
프로토콜 v0.2 은
중복지급 문제와 코인 소유확인 문제를
해결하기 위해서
다음과 같이 바뀌었습니다.
- 모든 KR 에 일련 번호를 붙인다.
- 모두가 은행의 역할을 한다.
- 이를 유식한 말로 분산원장(decentralized ledger)이라 부른다.
하지만, 언급한 것 처럼,
모두가 은행이 되면서 생기는 문제가
아주 많습니다.
다음글에는
이 문제들을 해결 해보도록 합시다.
잘 보고 있습니다.
드디어 분산원장이 나왔네요.
다음글이 기대됩니다.
감사합니다. 특히 더 궁금한 부분이 있으면 댓글 달아주세요
순서대로 진행되면 궁금한거 다 나올것 같아요... 다음편 기다리고 있습니다.
정말 이해가 쉽네요! 좋은 글 감사합니다.
You got a 23.81% upvote from @upyou thanks to @houstonian!
This wonderful post has received a @houstonian 16.9% upvote from @mrswhale. Discord Channel: https://discord.gg/XG4y3mg You can vote in the name of the odl. https://steemit.com/~witnesses
This post has received a 25.00 % upvote, thanks to: @houstonian.
You got a 0.51% upvote from @postpromoter courtesy of @houstonian! Want to promote your posts too? Check out the Steem Bot Tracker website for more info. If you would like to support development of @postpromoter and the bot tracker please vote for @yabapmatt for witness!
날이 춥네요^^
그래도 맘은 따뜻한 하루가 되시길~
감사합니다. 제가 있는 휴스턴도 오늘은 한파주위보가 내렸네요. 감기 조심하세요
능력자시군요. 저녁에 정독 예정입니다.
과찬이십니다. 1편도 꼭 읽으시길 권합니다. 그리고 피드백까지 남겨주시면 참 좋겠네요.