51% 공격은 작업증명 (PoW) 알고리즘에서 나오는 용어입니다. 비트코인은 작업증명(PoW)을 사용해서 연산을 통해 일종의 문제를 가장 빨리 푼 노드에게 블록을 추가시킬수 있는 권한을 줍니다. 이때 나머지 노드들은 해당 블록이 유효한 거래인지 승인을 하게 됩니다. 절반 이상의 승인을 거치면 유효한 거래로 확인하고 블록을 블록체인에 연결, 모든 노드에게 전파하게 됩니다. 그런데 블록체인 전체 연산량의 50%이상을 보유한 채굴자는 압도적인 채굴량을 바탕으로 전체 네트워크를 마음대로 결정할 수 있게되며 51%공격을 감행할 수 있습니다.
(1) 공격자는 성능이 좋은 컴퓨터 파워를 통해 이더리움 네트워크에 접속합니다. 이때, 블록체인 네트워크에 접속해주는 프로그램을 수정해서, 채굴한 블록들(데이터가 저장된 블록)을 정상 네트워크에 전파(Broadcast) 하지 않고 혼자 보관합니다. 이런 식으로 여러 블록을 생성합니다. 이때 공격자는 51% 이상의 해시 파워를 갖고 있기 때문에, 블록 생성 속도가 기존 네트워크보다 빠릅니다.
(2) 공격자는 정상 네트워크에 트랜잭션을 발생시킵니다. 100 ETH를 어느 거래소에 입금합니다. 이때 블록 넘버가 150번에 기록됬다 가정해봅시다. 이때 공격자가 따로 갖고 있는 블록에는 100 ETH를 그대로 본인 지갑 주소에 갖고 있게 데이터를 저장합니다.
(3) 공격자는 거래소에 입금된 순간을 기다렸다가 거래소에서 100ETH를 현금으로 거래합니다. 이때의 블록 넘버가 160번이라고 가정해봅시다. 위에서 말한 거처럼, 51%의 해시 파워를 갖고 있기 때문에, 정상 네트워크 보단 블록 생성 속도가 훨씬 빠릅니다.
거래소에서 현금을 거래한 블록넘버가 160번이라면, 공격자가 갖고 있는 블록은 넘버는 160번을 넘은 그 이상의 블록 넘버일 겁니다.
(4) 공격자는 본인이 갖고 있는 블록과 체인을 정상 네트워크에 전파합니다.
이때 정상 네트워크의 블록넘버가 160번이고, 공격자가 갖고 있는 블록 넘버는 그 이상인 170번이라고 가정해 봅시다.
블록체인은 이렇게 체인이 두 개로 나뉘었을 경우, 더 긴 체인을 선택하고 나머지 짧은 체인을 취소합니다.
이렇게 취소된 체인은 고아 블록(orphan blocks)라고 합니다. 그리고 이런 과정을 체인 재구성이라고 합니다.
(5) 공격자가 100ETH를 거래소를 통해 현금으로 바꾼 블록은 160번이지만, 그 내역은 고아 블록이 되어 취소되었습니다. 공격자가 갖고 있던 블록과 체인이 새로 재구성되며, 공격자의 지갑에는 여전히 100 ETH를 갖게 됩니다.
컨펌 횟수 증가
51% 공격은 블록체인 해시파워의 과반수를 확보하여 이중 지불 형태( 두 번의 거래 )로 입금한 후, 빼가는 방법입니다.
이때 이중 지불 여부를 확인할 때 까지 거래 확정을 늦춘다면 예방이 가능합니다.
그러나 거래 확정을 늦추는 방법은 안전성을 보장할 수 있지만 거래 처리 속도가 느려져 사용성이 떨어지게 됩니다.
지연 기능
51% 공격이 성공하려면 악의적인 노드가 거래 기록을 네트워크에 기록하기 전에 따로 블록을 생성해야 합니다. 지연 기능은 블록체인 트랜잭션을 증명하는 증명 노드를 따로 둠으로써 전체 불변성을 보장하고 트랜잭션에 보안의 두 번째 계층을 제공합니다.
하드 포크
해커가 공격하여 이득을 취하기 전 상태로 블록의 상태를 되돌리는 방식입니다. 되돌린다기보다, 이전의 블록들을 새로운 네트워크로 옮겨, 공격당하기 전 시점부터 네트워크를 다시 진행하는 방식입니다. 이는 블록체인의 탈중앙화 정신과 반대된다며 반대하는 세력도 많기에, 주로 투표를 통해 진행됩니다.
소프트 포크는 기존의 규칙에서 큰 틀은 바꾸지 않고 부분적인 업데이트만 이루어집니다. 그래서 포크가 이루어지기 전과 후의 블록에 호환이 가능하고 이를 바탕으로 한 암호화폐도 동일합니다
하드 포크는 프로토콜의 변경 사항입니다. 이전 버전과 새 버전이 호환되지 않습니다.
일반적으로 기존의 기능을 수정할 경우 소프트 포크로 가능하지만 새로운 기능의 추가는 하드 포크로만 가능하기 때문입니다. 그 외에 기존 블록체인의 규칙이나 기능 자체를 수정해 이전에 발생한 문제들을 해결하거나 해킹으로 기존의 블록 내용에 문제가 있을 때 블록 내용을 수정하거나 원래대로 돌릴 경우에도 하드포크가 진행됩니다.