블록체인의 Finality

707·2022년 11월 17일
0

블록체인

목록 보기
9/10
post-thumbnail

Finality란?

과거 거래가 절대 변경될 수 없다는 보장

우리는 보통 트랜잭션을 보내고, 그 트랜잭션이 블록에 담기면 해당 트랜잭션은 변경될 수 없다고 생각한다.

하지만 대부분의 블록체인 시스템은 확률적으로 트랜잭션 완결성을 보장한다.
시간이 지날수록 자식 블록이 쌓이게 되고 그만큼 트랜잭션이 무효가 될 확률이 줄어드는 방식이라는 뜻이다. (확률적 Finality)

어떤 블록체인은 한번 체인에 들어가면 어떤 경우에도 그 블록을 되돌릴 수 없음을 보장하는 방식을 채택하고 있다. BFT(비잔틴 장애 허용) 합의 알고리즘(3분의 2가 동의하면 무조건 그걸로 확정)을 사용하는 블록체인의 경우 이런 식으로 완결성을 보장해준다. (절대적 Finality)

Orphan Block이란?

orphan blocks are blocks mined simultaneously as another block but not accepted by the blockchain.

동시적으로 여러 마이너가 경쟁하며 채굴을 진행하는 상황에서 2개 이상의 블록이 서로 다른 마이너에게 채굴이 되면 해당 블록을 기반으로 하는 체인이 각각 형성되게 된다.

이런 경우 PoW 방식에서는 이렇게 각각 형성된 체인 중 더 긴 쪽을 메인 체인으로 선택하게 되고, 짧은 체인에 담긴 블록은 버려지게 된다.

블록체인에서는 부모 블록의 정보를 담아 블록 해시를 생성하게 되는데 그 부모 블록이 잘못된 해시를 가지기 때문에 해당 체인에 있는 블록은 비정상적인 해시값을 가지게 된다. 이렇게 불완전한 블록은 체인과는 별개로 존재하게 되어 버려진다.

자식 블록이 많아지면 많아질수록 해당 체인은 orphan이 될 확률이 줄어든다. PoW에서는 이런 방식으로 finality를 체크한다.

현재 이더리움이 채택하고있는 PoS 방식의 경우 한번에 하나의 블록만 선택되기 때문에 (여러 마이너에 의해 동시에 채굴될 일이 없기 때문에) Orphan Block 문제는 발생하지 않는다. (하지만 다른 방식의 공격으로 이중지불 문제는 발생할 가능성이 있다.)

내 트랜잭션이 Orphan Block에 담긴다면?

트랜잭션이 발생하고 해당 트랜잭션의 Receipt를 받게 되더라도 이렇게 Orphan Block에 담기게 된다면 내 트랜잭션 기록은 사라질 수도 있게 되는 것이다.

보통은 메인 체인으로 채택된 체인 속 블록에도 내 트랜잭션이 담겨 있을 것이기 때문에 문제가 되지는 않을 것이다. 하지만 그렇지 않을 확률 역시 존재하기 때문에 트랜잭션의 확정은 아주 중요하다.

🤯 이중지불 문제

이중지불(double spending)이란 디지털 현금 시스템 내에서 동일한 자산이 두 명의 수신자에게 동시에 전송될 수 있는 문제를 뜻합니다

이는 블록체인이 있기 전의 인터넷 시스템에서의 거래에 있는 피할 수 없는 문제였다. 기존 web2에서는 이러한 문제를 해결하기 위해 은행과 같은 신뢰할 수 있는 중개기관을 두고 이를 의존하여 거래를 처리했다.

블록체인이 각광받는 이유 역시 여기에 있다. 중개자를 통하지 않은 개인간의 거래에서 이중지불문제 없이 처리가 가능하기 때문이다. 내가 A에게 1BTC를 전송한 뒤 B에게 다시 1BTC를 보내려고 하면 해당 트랜잭션을 처리해주는 노드들은 이전 거래 기록을 모두 가지고 있고 이를 확인하여 트랜잭션을 승인해주게 되며, 잔액이 없는 상태에서 이런 잘못된 트랜잭션을 보냈을 때 이를 거부하게 된다.

하지만 위에서 말한 orphan block 과 같은 경우에는 이와 같은 이중지불문제를 완벽하게 해결할 수 없다. 내 거래 기록이 메인 체인에 담기지 않게 될 확률이 있기 때문이다.

이렇게 이중지불 문제를 수반하는 블록체인 공격방법들은 다음과 같다.

  1. 블록체인 레벨의 공격
  • 51% Attack (PoW)
  • Nothing at Stake Attack (PoS)
  • Long Range Attack
  • grinding attack
  • eclipse attack
  • selfish mining (PoW)
  1. 사용자 레벨의 공격
  • Race attack
  • Finney attack
  • Replay attack

여유가 되면 이 공격유형들을 좀 더 자세하게 다루는 글을 써봐야겠다.

어떻게 해결할까?

가장 일반적으로는 confirmation 개념이 등장한다. 하나의 트랜잭션을 보내고 나면 비트코인의 경우 6번, 이더리움의 경우 20~25 번의 확인(해당 블록 이후에 추가된 자식 블록 수 : 자식 블록이 채굴될 때마다 이전 블록을 검증하게 되므로)을 거쳐 트랜잭션의 Finality를 결정한다.

많은 금액의, 중요한 거래가 담긴 트랜잭션의 경우 confirm 수를 높게 잡는 것이 좋다. 하지만 확인 수를 높게 잡는다는 것은 결국 그만큼의 추가 시간이 필요하다는 뜻이 된다. 10분마다 블록 하나가 채굴되는 비트코인이 6번의 confirm을 받는 다는 것은 1시간 가량의 시간을 기다려야 한다는 것이다.

여러 거래소들의 최근 입출금 confirmation을 확인해보니
비트코인은 1-2회, 이더리움은 70-100번 정도의 confirmation을 확인하고 있었다.
리플은 1 confirmation으로 즉시 송금이 가능하다.
최근 일을 하며 Ce-fi 거래소의 블록스캐너 서버를 만들고 있어 이런 것들을 찾아봤었는데 리플은 다른 탈중앙화된 체인과는 조금 다른 특성을 가지고 있어 그런 것 같다. 따로 자세히 이 체인의 특성을 공부한 적이 없기때문에 나중에 각잡고 좀 파봐야겠다.

아무튼 이러한 이유로 빠르고 안전한 최종성을 달성하는 것은 여전히 블록체인 시스템에 대한 연구에서 상당히 활발한 영역이다!



0개의 댓글