ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 이중 지불 (Double Spent) / 51% Attack
    BlockChain Tech 2019. 1. 2. 11:22

    블록체인을 공부하면 자주 듣는 ‘이중 지불’ 이것은 무엇을 의미하며, 이를 해결 할 수 있는 방법에 대하여 알아보자.

    1. 이중 지불이란

    이중 지불이란 동일한 암호화화폐로 두 번 이상 지출하는 것을 의미한다. 암호화화폐에서 이중 지불은 실제 암호화화폐가 복사가 되어 지불되는 것이 아닌 충돌되는 트랜잭션이 있으면 더 많은 노드가 받아들인 트랙재션을 받아들이고, 받아들여지지 않은 다른 트랜잭션은 취소해버리는 블록체인 특징을 이용한 악의적인 행위이다. (출처 : NamuWiki)

    이중 지불은 51%의 공격을 이용한다. 예시를 통하여 이중 지불을 이해해보자.

    [1 Step]

    1–1. 류짱은 1BTC만 소유하고 있다. A와 B에게 각각 1BTC를 송금하고 그에 따른 물건을 받기로 한다.

    1–2. 첫 번째로 A에게 1BTC를 송금하고, Confirm을 기다린다.

    1–3. 만족한 Confirm을 기다린 A는 류짱에게 물건을 전달한다.

    거래소 or 블록생성 시간에 따라 Confirm 수가 다르다. 비트코인은 보통 1~3 Confirm이 지나면 안전하다 생각한다.

    [2 Step]

    2–1. 류짱은 A에게 송금한 시점에 B에게도 1BTC를 송금한다.

    • ‘어라.. 이미 A에게 송금하여 잔액이 없을 텐데. 어떻게 B에게 송금하지?’라고 생각하겠지만, B에게 전송한 노드는 다른 노드들과 소통할 수 없게랜선을 뽑아놓고 자신만의 로컬서버에서 채굴을 진행한다.

    2–2. A에게 물건을 받은 시점에 류짱은 자신의 로컬서버에서 만든 블록을 다른 노드에게 전파한다.

    921206 / 921207 블록의 채굴난이도는 실제 존재하는 블록과 같다. 그렇기 때문에 ‘51%’의 연산량이 필요하다.

    2. Pardon Me?

    앞의 이중 지불의 문제를 되짚어 보자.

    • 류짱은 1BTC 만 가지고 있었고, A와 B에게 각각 1BTC 총 2BTC를 송금해야했다. (1BTC가 부족하다.)
    • 비트코인의 Main Chain (실제 유저들이 존재하는 구역이라 생각하자.)에서는 A에게 송금을 하였고, 그것을 인정 받아 물건을 받았다.
    • 비트코인 ‘921206 블록’에서 포크한 Local Chain에서는 B에게 전송을 하고, A에게 물건을 받을때까지 전파하지 않은 상태에서 기다린다.
    • A에게 물건을 받은 즉시, Local Chain을 노드들에게 전파한다.

    [문제점]

    1. A가 류짱에게 1BTC를 송금 받고, N개의 Confirm을 기다렸다. 
      (Confirm 수를 기다리는 것은 결제 완전성(Settlement Finality)때문이다. 이는 기회가 되면 다루어보자.)
      비트코인의 블록생성 시간은 약 10분이다. 1 Confirm을 기다리려면, 약 10분이 걸린다는 소리이고 2~3 Confirm을 기다리면 약 20~30분의 시간을 기다려야한다. 큰 금액의 경우 안정적인 Confirm 까지 기다리겠지만, 소액 결제의 경우 Pending 상태에서도 거래 되는 일이 있을 것이다.
    921206번째 블록 기준으로 회색 블록은 MainChain / 오렌지 블록은 LocalChain이라 생각하자.
    • 블록체인에서는 Longest Chain is Main Chain 이라는 개념이 있다. (물론, 컨셉에 따라 다르게 설계 될 수 있지만 비트코인은 이런 개념을 갖고 있다.) 위 개념이 이중지불을 가능하게 한 개념이다.
    • 올바른 노드들(49%)이 회색 블록에서 921207번째 블록까지 생성했지만, 51%의 힘을 가진 류짱 노드는 혼자서 921208번째 블록까지 생성한 후, 이것을 노드들에게 전파 시키면 올바른 노드들(49%)는 ‘Longest Chain is Main Chain’ 이라는 개념 때문에 류짱의 블록 체인을 Main Chain으로 받아 들인다.
    류짱의 독촉과 귀찮은 마음에 안전한 Confirm 수를 기다리지 않은 A는 그렇게 류짱에게 속고, 물건도 빼앗겼다.
    류짱이 만든 ‘류짱Chain’에도 이러한 검사가 들어간다.

    3. 이중 지불(feat. 51%의 공격)을 막을 수 있는 방법

    이중 지불을 막는 방법은 여럿 존재 하겠지만, 제가 생각하는 방법 몇 가지만 기록합니다. 다른 방법이 있다면 댓글을 남겨주시면 모두에게 도움이 될 것입니다. 감사합니다!

    [힘을 가진 자에게 Risk를 부여하자]

    간단한 방법으로 51%의 힘을 가진 Miner에 존재가 이런 부정행위를 할 수 없게 만드는 것이다.

    • POS (Proof Of Stake)
      자산 증명 방식의 경우, 자신의 해시파워로 채굴하는 것이 아닌 자신의 자산을 예치 시켜 그것으로 합의를 하는 방식이다. 만약, 51%의 자산을 가진자가 자신의 힘을 남용하게 되면 해당 Chain의 가치가 떨어질 것이다. 자신의 자산 가치를 떨어뜨리면서 공격을 시도하지 않을 것이다.

    [Block Finalizing]

    실제 이더리움 Casper에서 채택한 방법이다. 주기적으로 블록에 Finalizing을 서명한다. 해당 서명이 있다면, Longest Chain이 등장하더라도 Main Chain이 될 수 없게 설계 한다.

    출처 : http://bit.ly/Johnson-Casper

    [Mining의 중앙화를 막는다.]

    가장 어려운 방법일 것 같다. CPU 채굴에서 GPU 채굴로 발전 되고, GPU 채굴에서 Mining Pool이 생겨난 것은 사토시의 설계 밖이라고 생각한다. 최근에는 꽤나 비율이 좋아졌지만, 이전에는 하나의 Mining Pool이 51% 이상의 해시파워를 가진적이 있다. Mining Pool이 생길 수 없게 설계 하거나, Mining Pool에게 가입 하는 ‘이유’를 없앤다. (일반 Miner들이 Mining Pool에 가입하는 가장 큰 이유는 ‘안정적인 수입' 때문일 것이다.)

    2018.10.1 11:09 a.m 기준 출처 (https://coin.dance/blocks/today)

    [안정적인 Node를 확보 할 수 없다면, 안정적인 Chain에 공생하자.]

    이중지불 / 51% 공격에 대한 문제를 염두하지 않고, 무조건 “우리들만의 Main Chain을 만들꺼야!!” 하는 마음으로는 51%의 공격을 당하기 쉽다. 그렇기 이더리움 혹은 다른 Chain에서 Plasma Chain이 되는 것을 선택한다. 신생 Chain에는 Node 확보가 어렵다. 이미 많은 Node를 확보하고 있는 Main Chain에서의 공생을 생각한다.

    참고 문헌


    'BlockChain Tech' 카테고리의 다른 글

    블록체인 Oracle Problem  (0) 2019.01.02
    ERC20 그리고 EIP  (0) 2019.01.02
    Mnemonic 과 HD Wallet  (0) 2019.01.02

    댓글

Developer RyuK