로테르담 밋업 후기 2편 (2018년 7월 18일)


#1

image

지난 주 네덜란드의 첫 카르다노 밋업이 로테르담에서 열렸습니다. 아름다운 이벤트 공간과 훌륭한 강연진에 네덜란드 커뮤니티에서 참석한 청중까지 압도적이어서 밋업이 성공적이었다는 말만으로는 부족할 따름입니다. 장소를 제공한 블록랩과 커뮤니티 회원이신 @ilhan , @bullish , @Andy_Hendrikx 님을 비롯해 밋업을 주관한 모든 특별히 감사를 전합니다!

로테르담 밋업 개요의 1부를 보시려면 여기를 클릭하세요.

베르나드로 다비드(Bernardo David)가 발표한 우로보로스와 지분 증명에 관한 내용이 이곳에 요약되어 있습니다


베르나르도의 발표에 이어 다음 강연자는 하스켈 컨설팅사, 웰타입드(Well-Typed)의 IOHK 컨설턴트인 에드스코 데 브리에스(Edsko de Vries)입니다. 브리에스는 카르다노 지갑과 특히 그 안에 담긴 수학에 관해 발표했습니다.

image

UTxO

  • UTxO는 미지출 거래 출력(Unspent Transaction Output)을 뜻합니다.
  • 카르다노 지갑은 UTxO 모델을 기반으로 하며, 결제하는 데 사용됩니다.
  • 에드스코는 실제 "현금" 환경에서의 트랜잭션을 설명하고, 이를 UTxO와 비교했습니다.
  • 예를들어, 앨리스(Alice)가 밥(Bob)에게 70을 지급하려는 경우를 들어보겠습니다.

image

  • 그림에서 보다시피, 위는 은행 계좌에서 흔히 볼 수 있는 거래입니다. 앨리스의 계좌에서 70을 빼서 밥의 계좌로 70을 보내는 거래를 나타냅니다.
  • 현금 측면에서 보자면, 앨리스가 100을 보내는 경우 밥이 앨리스에게 30을 돌려주면서 현금 70 거래를 완료할 수 있습니다.

image

  • 그러나 UTxO에서는 밥이 돈을 거슬러 줄 수 없습니다.
  • 그래서 앨리스가 밥에게 70을 주기 위해서 먼저 가지고 있던 현금 100을 "깨서 (destroy)" 70과 30을 만듭니다.

image

  • 이 때 '이중 지불’을 방지하기 위해 코인 100을 “깨는” 작업이 필요합니다.
  • 정확한 과정은 50짜리 두 개 코인을 만드는 것으로도 이루어질 수도 있습니다.
  • 이 프로세스를 UTxO라고 합니다.

더스트

  • 이제 앨리스가 8을 지불하려는 경우의 시나리오로 살펴보겠습니다.
  • 앨리스는 50과 10을 가지고 있고, 밥은 아무것도 없습니다.
  • 앨리스는 50 또는 10으로 깨기로 선택할 수 있는데, 아마 10을 가지고 8과 2를 만들려는 것으로 짐작할 수 있습니다.
  • 그러나 그렇게 하면 더스트(dust) 문제가 생기는데 ‘2’ 코인이 아주 작은 값이기 때문입니다.
  • 작은 코인이 너무 많이 있는 상황은 선호되지 않습니다.
  • 작은 코인은 성능에 좋지 않으며, 지불하기도 더 어려워지기 때문입니다.
  • 또한 트랜잭션에서 사용할 수 있는 코인의 수량에 제한이 있어서 코인으로 전부 지불하지 못하게 될 수도 있습니다.
  • 카르다노 프로토콜에는 트랜잭션 데이터의 크기에 따라 달라지는 변수를 가진 거래 수수료가 있습니다. 즉, 트랜잭션에서 코인을 많이 사용할수록 수수료가 더 높아질 수 있습니다.
  • 따라서 이 경우에서 좋은 방법은 50을 선택하여 깬 다음 8을 지불하고 42를 보유하는 것입니다.
  • 조심하지 않으면 작은 코인이 많이 쌓이게 되는데, 이를 들어 더스트(Dust) 라고 합니다.

자기 조직화

  • 그러면 코인을 어떻게 선택해야 할까요?
  • 에드스코는 매우 간단한 규칙에서 어떻게 복잡한 행동이 나타날 수 있는지 설명합니다.
  • 자연의 생명 활동에서 무리지어 날아가는 새떼를 볼 수 있습니다.
  • 무리를 이끄는 우두머리 새가 한 마리도 없지만, 각 새들의 독자적인 행동이 모여 무리를 짓는 집단 행위로 나타납니다.

image

  • 여기서 착안하여, 지갑에 작은 코인이나 더스트가 많이 쌓이는 것을 방지하는 방법을 살펴보았습니다.
  • 이러한 문제를 해결하고 해법을 찾기 위해 많은 시뮬레이션을 실행했습니다.

image

  • 이 표는 코인의 분포를 보여주며, x 축이 코인의 크기를 나타냅니다.

  • y 축은 가지고 있는 코인의 수량을 나타냅니다.

  • 작은 그래프에서 파란색 선은 잔고이며 빨간색 선은 지갑에 있는 코인의 총수입니다.

  • 코인의 총 보유 숫자는 낮추는 경향을 보여야 합니다.

  • 이전 사례로 돌아가서, 분명한 것은 항상 가장 큰 코인(즉, 50짜리 코인)을 가져야한다는 것입니다.

  • 항상 더 큰 코인을 가지고 가면, 더스트의 수가 계속 올라가서 코인의 수가 6만 개까지 늘어날 수 있습니다.

  • "큰 것 우선" 시뮬레이션 보기

  • 이를 통해 첫번째 자기 조직화 원리 (Self Organisation Principle)을 도출할 수 있습니다.

자기 조직화 원리 #1 : 코인을 무작위로 선택하면, 작은 코인이 많을 있을 때 바로 작은 코인을 선택할 가능성이 큽니다.

  • 이다음 시뮬레이션은 코인을 무작위로 선택하는 새로운 "무작위 (Random function)" 정책을 추가한 경우를 보여줍니다.
  • 더스트가 많이 있는 상황에서 무작위 정책이 더스트를 사용하여 더스트를 치울 수 있습니다.
  • 무작위 정책이 시작될 때 갑자기 더스트의 수가 하락하는 것을 볼 수 있습니다.

  • 이를 보면, 작은 코인을 사용하니까 무작위 함수를 사용하는 것이 가장 좋을 수 있습니다.
  • 그러나 더스트를 치움으로써 물론 더스트가 하락하기도 하겠지만, 더 많은 더스트가 생길 수도 있습니다.
  • 아래의 시뮬레이션을 보면 더스트가 생성되는 것을 관찰할 수 있습니다.

자기 조직화 원리 # 2 : x값을 지불할 때마다 거의 같은 x값의 거스름 코인이 생기면, x 크기의 지불금이 많이 있을 때 바로 x크기의 지갑에 거스름 코인이 많이 쌓이게 됩니다.

  • 이제 에드스코는 카르다노와 함께 제안된 무작위-개선(Random-Improve) 코인 선택 알고리즘을 설명합니다.
  • 이 알고리즘에서 더스트의 발생이 훨씬 줄어든다는 사실을 알아냈습니다.
  • 많은 시나리오에서 추가 테스트를 통해 회복력이 입증되고 좋은 결과가 나왔습니다.
  • 앨리스가 70을 지불하려던 사례로 돌아가서, 코인을 무작위로 선택한다고 가정해 보겠습니다.
  • 예컨대, 값이 300인 큰 코인을 선택한다고 합시다.
  • 한 가지 방법은 일단 선택한 코인을 옆에 두고 계속 찾는 것입니다.
  • 두 번째 방법은 그 시점에서 포기하고 선택한 코인을 사용하는 것입니다.
  • 첫 번째 방법은 실제로 좋은 해결책이 아닙니다. 왜냐하면 최악의 시나리오의 경우에 앨리스는 좋은 코인(70에 가깝거나 같은 코인)을 찾기위해 지갑에 있는 모든 코인을 계속 확인할 것이기 때문입니다.
  • 이 프로세스는 매우 느릴 뿐더러 성능에도 좋지 않습니다.
  • 두 번째 방법으로 돌아가서, 수용할 수 있는 크기의 상한선을 설정하면(이 사례에서는 지불 금액의 두 배로 설정) 알고리즘은 자기 조직화를 활용하여 작동하는 솔루션을 만들게 됩니다.
  • 따라서, 주어진 시나리오에서 앨리스는 자신의 코인을 무작위로 선택하여 코인이 70의 두 배인 상한선을 넘어서면 최대 140까지 코인을 추가한 다음 포기하고 해당 코인을 사용할 것입니다.

  • 이제 세 번째이자 마지막 원리를 살펴보겠습니다.
  • 아주 간단하지만 잘 작동하는 원리입니다.

자기 조직화 원리 #3 : 지갑에서 추가 코인을 찾아서 거스름 코인을 개선하는 것은 지갑에 충분히 작은 코인이 들어 있을 때만 유용합니다. 그러나 정확하게는, 지갑에 작은 코인이 많이 있을 때 무작위로 선택한 코인이 모두 미리 정해진 상한선 위로 올라갈 가능성은 더 적습니다.

지갑 잔고

  • 코인 선택에 관해 설명한 후 에드스코는 계속해서 지갑 잔고에 대해 발표했습니다.
  • 지갑 잔고는 " 가지고 있는 금액이 얼마인가 ?" 라는 질문과 관련이 있습니다.
  • 쉬운 질문처럼 보일지 모르나 실제로는 상당히 복잡합니다.
  • IOHK에는 암호화폐 지갑 증명에 관한 45 페이지 분량의 수학 문서가 있는데, 그 중 상당 부분은 잔고에 관한 내용입니다.
  • 보류 중인 트랜잭션에서 잔고에 차이가 발생할 수 있습니다.
  • 예를 들어, 앨리스가 밥에게 70을 보냈지만 시스템에서 처리되지 않은 경우입니다.

image

  • 밥은 70을 받지 않았고, 앨리스는 현재 잔고 대비 이용 가능 잔고를 보게 됩니다.
  • 현재 잔고는 마지막으로 등록된 잔고를 표시합니다.
  • 이용 가능한 잔고 앨리스가 어떻게 100을 깨서 밥에게 70을 지불했는지 보여줍니다.
  • 그리고 총계 잔고에는 앨리스가 보류 중인 트랜잭션에서 돌려받을 "거스름" 금액이 포함됩니다.
  • 은행 계좌에서 거래 시에는 돌려받을 거스름 돈을 기다릴 필요가 없기 때문에 이러한 최종 잔고는 ‘새로운’ 개념입니다.
  • 여기에 추가로, 실제로는 또 다른 네 번째 잔고가 있습니다.

image

  • 블록체인을 사용하면 모든 사람에게 트랜잭션이 전송됩니다.
  • 설명을 위해, 미국과 유럽 사이에 단 하나의 연결만 있다고 가정하겠습니다.
  • 위 그림에 표시되어 있습니다.
  • 한 시스템 내의 트랜잭션이 다른 대륙으로 전파되는 경우
  • 코인이 사용되면 모두가 코인이 지불되었고 사용자가 확인할 수 있다는 것을 알아야 하므로 이중 지불을 방지하는 것이 중요합니다.
  • 그러나 미국과 유럽 간의 이러한 연결이 잠시 중단되면 어떻게 될까요? 현재 해당 지역에 있는 사람들만 발생하는 거래에 대해 알고 있습니다.
  • 시스템 연결이 끊어지면 포크(fork)가 생기기 때문에 좋지 않습니다.
  • 물론, 어떤 시점에서 연결이 복원될 것이고 이 때 체인 선택 규칙이 적용됩니다.
  • 최장 체인 선택 규칙에 따라 더 긴 체인이 선택됩니다.
  • 짧은 체인에 있던 트랜잭션은 모두 사라지고, 그것이 모두 체인에 입력된다는 보장은 없다는 뜻입니다.

image

  • 이것이 잔고에는 어떤 의미일까요?
  • 두 가지 시나리오를 살펴보겠습니다.

image

  • 첫 번째 시나리오에서는 1000으로 시작한다고 합시다.
  • 포크가 생기면 회색 체인이 빨간색으로 변하면서, 100이 있고 여기서 10을 지불해 90이 남은 것을 볼 수 있습니다.
  • 거스름을 받을 때 총 잔고는 1090이었습니다.
  • 그러나 이 시점에서 포크가 해결되고 다른 더 긴 체인이 선택되었습니다.
  • 그러면 짧은 체인에 있던 사람들의 잔고는 어떻게 될까요?
  • 새로운 체인에 포함될 가능성이 있지만, 트랜잭션이 포함되지 않고 잔고가 다시 1000으로 돌아갈 가능성도 있습니다.
  • 첫 번째 트랜잭션이 포함되고 잔고가 1100이 될 가능성도 있습니다.
  • 첫 번째 트랜잭션도 포함되지 않은 채 두 번째 -10 트랜잭션도 처리될 수 없는 경우도 생깁니다.
  • 하지만 보수적이고 안전한 방법은 잔고가 1000이 되는 것입니다.

image

  • 두 번째 시나리오에서는 잔고 1000을 가지고 동일한 방법으로 시작하는데 포크가 있습니다.
  • 포크 발생 후 100을 받지만, 이제 200을 지불합니다.
  • 즉, 둘 다 지불한다는 의미입니다.
  • 포크가 해결된 후 지금은 어떻게 됩니까?
  • +100과 -200 두 가지 트랜잭션이 포함되거나 포함되지 않을 수 있습니다.
  • 포함되는 경우 잔고는 900입니다.
  • 둘 다 포함되지 않으면 잔고는 1000입니다.
  • 이 시나리오에는 두 가정이 모두 포함되어 있으며 최상의 추측은 900입니다.

이 주제에 관한 자세한 내용은 에드스코의 블로그 게시물에서 확인하시기 바랍니다.
코인 선택에서 자기 조직화
반정형 개발: 카르다노 지갑

로테르담 카르다노 밋업의 내용이 유익 하셨다면 좋아요를 눌러주시고, 더 궁금하신 점, 혹은 좋은 의견이 있으시면 아래에 댓글로 남겨주세요! ↓↓ :slight_smile: