Loading...

[퀀텀 하드포크 Part 2] 하드포크 대비와 오류 복원

2019-10-12 20:00

지난 퀀텀 하드포크 파트 1에서는 하드포크에 대한 설명과 몇몇 사례들을 소개했었습니다. 이번에는 곧 있을 퀀텀 하드포크에 대해 이야기해보려 합니다.

퀀텀 2.0을 위한 하드포크는 스마트 컨트랙트 기능을 추가할 예정이고 블록 생성 시간을 단축시켜 동일 시간 내에 더 많은 블록을 생성할 예정입니다. 그 결과로 스테이킹 보상이 약 12.5% 향상될 것으로 예상됩니다. 이번 하드포크는 한국시간 10월 18일에 466,600 번째 블록에서 실행될 예정입니다. 이를 위해 퀀텀 코어 지갑인 Qtum-Qt(GUI 데스크톱 지갑) 또는 qtumd (커맨드 라인 서버 지갑)을 사용하시는 분들은 0.18.1 버전으로 업데이트해야 하고 모바일 지갑, 하드웨어 지갑 등 기타 지갑의 사용자분들께서는 업데이트할 필요가 없습니다.

업데이트를 하지 않은 지갑들은 하드포크 후 메인 네트워크와 연결이 안 되어 거래가 불가능해질 예정입니다. 스테이킹을 하던 지갑은 메인넷이 아닌 분리된 체인에서 스테이킹이 진행될 예정이고 이 경우 코인의 복원이 매우 어렵습니다. 또한 하드포크를 통해 새로운 코인이 생성되지는 않을 예정입니다.

QIP 5, 6, 7, 9의 기능

하드포크는 퀀텀 블록체인 성능을 개선할 4개의 QIP(Qtum Improvement Proposal)을 포함하고 있습니다. 이와 관련된 상세한 내용은 "퀀텀 2.0, 하드포크와 업그레이드"를 참고해주시길 바랍니다.

QIP-5: 블록체인 기반 서비스를 보다 쉽고 사용자 친화적이도록 하는 스마트 컨트랙트 기능 추가.

QIP-6: 스마트 컨트랙트 검증을 위한 프리컴파일된 컨트랙트와 라이브러리.

QIP-7: 이더리움 비잔티움과 콘스탄티노플 스마트 컨트랙트와의 호환성을 위해 11개의 opcode 추가.

QIP-9: 블록 생성 시간을 평균 128초로 단축하여 블록체인 성능 향상.

해당 기능들의 실현을 위해 퀀텀의 이더리움 가상 기계 (EVM)와 지분증명(PoS) 합의 알고리즘에 대한 수정이 요구됨으로 하드포크를 실행하게 되었습니다.

테스트넷 하드포크

퀀텀 테스트넷은 개발과 테스트를 위한 퍼블릭 블록체인입니다. 테스트넷은 지난 9월 20일에 성공적으로 하드포크를 실행했습니다. 아래는 테스트넷 하드포크 후의 결과입니다.

하드포크 후 OP_SENDER를 활용한 첫 스마트 컨트랙트 콜은 테스트넷의 446,324 번째 블록에서 이뤄졌습니다. OP_SENDER는 QIP-5를 통해 실현된 것으로 사용자가 주소에 가스비를 위한 퀀텀을 보유하지 않아도 블록체인 서비스 제공자와 같은 다른 참여자가 가스비를 대신 지불하여 스마트 컨트랙트 콜을 실행할 수 있도록 하는 기능입니다. 이를 통해 사용자들은 보다 쉽게 스마트 컨트랙트를 사용할 수 있게 될 예정입니다.

그림에서 466,324 번째 블록, OP_SENDER의 opcode가 컨트랙트 콜에 포함되어 있는 것을 확인할 수 있습니다.

QIP-9는 지분증명(PoS) 합의 방식의 난이도 조절 알고리즘을 수정하여 블록 생성 시간을 현재의 평균 144초에서 평균 128초로 낮추는 수정사항입니다. 9월 20일 테스트넷 하드포크 후 블록 생성 평균 시간이 줄어든 것을 확인할 수 있습니다.

그림에서 블록 생성 평균 시간 - 9월 20일 테스트넷 하드포크 후 평균 시간이 128초로 줄어든 것을 확인할 수 있습니다.

하드포크가 실행되는 방식

0.18.1 버전의 퀀텀 코어 지갑은 하드포크 소프트웨어가 포함되어 있어 사전에 설정된 466,600 번째 블록에서 하드포크가 실행될 예정입니다. 하드포크가 실행되면 새로운 기능들은 자동적으로 퀀텀 블록체인에 실현됩니다.

이전 버전의 지갑들은 하드포크 후 네트워크에서 운영할 수 없게 될 예정이며 자동적으로 차단되어 메인 네트워크와 연결 불가한 상태가 될 예정입니다.

0.18.1 버전의 퀀텀 코어가 기본적으로 포함하고 있는 일부 신기능과 수정은 설치와 동시에 적용될 것이고 하드포크가 필요한 기능들은 블록이 하드포크 실행 높이에 도달한 후에 적용될 예정입니다. 하드포크 후에 더해질 새로운 기능들은 아래와 같은 pseudo-code를 통해 이뤄질 것입니다.

이러한 하드포크 방식은 매우 간단하여 여러 블록체인에서 활용된 사례가 있습니다.

하드포크 전에 업데이트를 하지 않는다면..

하드포크 전에 업데이트를 하지 않는다면 매우 곤란해질 것임으로 업데이트를 강력히 권고 드립니다. 그럼에도 불구하고 업데이트를 하지 않았다면 하드포크 후 해당 지갑은 제때 업데이트하지 않은 다른 몇몇 지갑하고만 연결될 수 있게 됩니다. 이렇게 분리된 체인의 네트워크 무게는 메인 네트워크에 비해 매우 작을 것으로 예상되며 스테이킹을 시도할 경우 매우 많은 블록을 생성하여 큰 보상을 받을 것입니다. 하지만 안타깝게도 이는 분리된 체인에서 획득한 것임으로 업데이트를 하지 않았던 노드들이 리셋을 하고 업데이트를 하면 분리된 체인은 삭제되고 결국 체인은 천천히 사라질 것입니다. 분리된 체인에서 진행된 송금 거래 또한 분리된 체인에 갇히게 될 것입니다.

하드포크 전에 업데이트를 하지 않았다면 다음과 같은 현상을 확인하게 될 것입니다.

  1. 최신 블록을 다운로드해도 익스플로러에 표시된 최신 블록보다 100개 또는 그 이상이 뒤처지는 현상.

  2. 네트워크 무게가 매우 적은 현상.

  3. 스테이킹 보상이 매우 높은 현상.

  4. 지갑을 다시 시작했는데 네트워크에 연결되지 않고 동기화가 안되는 현상. ("Syncing headers"에서 멈춰 있는 상황) 분리된 체인이 작동하지 않아 새로운 블록이 생성되지 않는 현상.

이 그림은 곧 있을 퀀텀 하드포크에 대한 것입니다. 466,600 번째 블록에서 업데이트를 진행한 노드들은 새로운 기능의 실현과 동시에 이전 버전을 사용하는 노드들과의 연결이 해제되게 됩니다. 이전 버전의 노드들은 몇몇 블록을 생성하겠지만 결국에는 분리된 블록에서 작동을 멈추게 될 것입니다.

하드포크 후 복원하는 방법

업데이트를 하기 전에 새로운 백업을 진행하는 것을 권고 드립니다. 백업 파일에 'wallet-before-0.18.1-update.dat'와 같이 식별하기 편한 이름을 사용하시길 바랍니다.

하드포크 후 이전 버전을 통해 스테이킹을 진행한다면 분리된 체인에 저장되게 됩니다. 매우 높은 블록 보상을 받은 상황에서 지갑을 업데이트하고 블록체인을 다시 불러온다면 익스플로러에서 원래의 퀀텀 보유액을 확인할 수 있을 것이고 지갑에서는 이보다 훨씬 적은 금액을 확인하게 될 것입니다. 코인들은 어디로 갔을까요? 해당 코인들은 분리된 체인에 스테이킹 되어 지갑에서 확인할 수 없게 된 것입니다.

복원을 위해서는 아래와 같이 실행해주세요.

1. 블록체인 파일을 삭제한 뒤 다시 다운로드해주세요.

지갑을 백업한 뒤, 0.18.1 버전으로 업데이트를 해주세요. 그리고 로컬에 저장된 블록체인 파일을 삭제하고 다시 블록체인을 다운로드해주세요.

로컬에 저장된 블록체인 파일은 아래와 같이 삭제해주세요. 대부분의 시스템에서 애플리케이션 데이터 폴더는 숨김 처리되어 있음으로 모두 보기로 설정을 변경해야 퀀텀 데이터 폴더를 찾을 수 있습니다.

1) 지갑을 종료합니다.

2) 퀀텀 데이터 파일을 확인합니다.

3) 'blocks', 'stateQtum', 'database' 폴더와 'banlist.dat' 파일을 삭제합니다.

4) 지갑을 실행하여 블록체인 전체를 다시 다운로드합니다.

위와 같은 방식 외에 명령어를 통해 블록체인 데이터를 지울 수도 있습니다.

qtumd: "-deleteblockchaindata"

Qtum-Qt: File -> Restore Wallet -> delete blockchain data and restrating

2. 잘못된 거래 내역 지우기

다른 방법으로는 분리된 체인에 저장된 잘못된 거래 내역을 지우는 방법이 있습니다. 'zapwallettxes=2' 명령어를 통해 잘못된 거래 내역을 삭제하고 이와 관련된 메타데이터를 회복하지 않도록 할 수 있습니다. 대부분의 경우 이 작업을 통해 유실된 코인을 되찾을 수 있을 것이고 만약에 복구되지 않는다면 퀀텀 공식 채널을 통해 도움을 요청해주시길 바랍니다.

해당 명령어 실행은 Qtum-Qt 메뉴, 설정 파일 그리고 명령어 화면을 통해 실현 가능합니다.

A. Qtum-Qt 메뉴

이 방법은 Qtum-Qt 지갑에만 적용 가능합니다.

A1. 지갑 화면에서 File -> Restore Wallet -> zapwallettxes=2를 선택하고 OK를 누르면 지갑이 다시 시작하며 해당 명령이 실행됩니다. (윈도우에서는 수동으로 재시작해야 합니다.)

Qtum-Qt 지갑이 재실행되면 몇 분간 'Rescanning...' 상태로 표시된 후 정상적인 상태로 운영될 것입니다.

B. 설정 파일 수정

이 방법은 Qtum-Qt와 qtumd 지갑에 적용 가능합니다.

지갑이 실행될 때 설정 파일인 'qtum.conf'을 읽게 됩니다. 그러므로 해당 파일에 'zapwallettxes=2' 명령어를 삽입하고 지갑을 재시작하면 됩니다. 아래의 순서대로 설정 파일을 생성하세요. 이미 생성되어 있다면 명령어 수정만 하시면 됩니다.

B1. 'zapwallettxes=2' 명령어로 이루어진 설정 파일을 생성하기 위해 텍스트 문서를 열어 해당 명령어를 입력하시고 'qtum.conf.txt' 이름으로 저장해주세요.

B2. 파일 이름을 'qtum.conf'로 수정하고 퀀텀 데이터 저장 위치로 옮겨주세요.

B3. 지갑을 재실행해주세요. Qtum-Qt 지갑은 'Rescanning...'으로 표시될 것이고 qtumd 지갑은 거래 내역을 지우고 다시 스캔하는 디버그 로그 메시지가 표시될 것입니다.

B4. 퀀텀 데이터 저장 위치에서 'qtum.conf' 파일을 삭제하거나 'qtum.conf.sav'로 이름을 바꿔주시면 재실행할 때마다 위에 과정을 반복하지 않게 됩니다.

C. 명령어 화면

이 방법은 Qtum-Qt와 qtumd 지갑에 적용 가능합니다.

명령어 터미널 또는 윈도우 명령어 프롬프트가 편하시다면 아래와 같은 순서로 명령어를 입력하여 유실된 퀀텀을 복구할 수 있습니다.

윈도우 :

1) 윈도우 Qtum-Qt의 경우, 명령어 프롬프트 'C:\users\:'에서 아래의 명령어를 입력해주세요. ('.exe'와 '-zapwallettxes=2' 사이를 한 칸 띄어주세요.)

2) 윈도우 qtumd의 경우, 명령어 프롬프트 'C:\users\:'에서 아래의 명령어를 입력해주세요.

macOS:

1) macOS Qtum-Qt, 리눅스 설치 버전일 경우 (퀀텀이 '~Desktop/Qtum/qtum-0.18.1'에 설치되어 있음), 프롬프트 ':~ $'에서 아래 명령어를 입력해주세요.

2) macOS qtumd, 리눅스 설치 버전일 경우 (퀀텀이 '~Desktop/Qtum/qtum-0.18.1'에 설치되어 있음), 프롬프트 ':~ $'에서 아래 명령어를 입력해주세요.

3) macOS Qtum-Qt, .dmg 설치 버전일 경우, 프롬프트 ':~ $'에서 아래 명령어를 입력해주세요.

Linux Ubuntu:

1) Ubuntu Qtum-Qt의 경우 ('Desktop/Qtum/qtum-0.18.1'에 설치되어 있음), 프롬프트 ':~$'에 아래 명령어를 입력해주세요.

2) Ubuntu qtumd의 경우 ('Desktop/Qtum/qtum-0.18.1'에 설치되어 있음), 프롬프트 ':~$'에 아래 명령어를 입력해주세요.

Raspbian (Raspberry Pi)

1) Raspbian Qtum-Qt의 경우 ('Desktop/Qtum/qtum-0.18.1'에 설치되어 있음), 프롬프트 '[email protected]:~ $'에 아래 명령어를 입력해주세요.

2) Raspbian qtumd의 경우 ('Desktop/Qtum/qtum-0.18.1'에 설치되어 있음), 프롬프트 '[email protected]:~ $'에 아래 명령어를 입력해주세요.

3) Raspbian Qtum-Qt가 이미지를 통해 설치된 경우, 프롬프트 '[email protected]:~ $'에 아래 명령어를 입력해주세요.

업데이트하지 않은 지갑의 예시

업데이트를 하지 않은 지갑이 하드포크 후 맞이하게 될 상황에 대한 예시입니다. 하도포크가 진행된 테스트넷을 통해 얻은 내역입니다. 절대 따라 하지 마세요!

1) 첫 번째 패널은 하드포크 후 업데이트하지 않은 지갑에 표시되는 내용입니다. 굉장히 높은 잔액이 스테이킹 되고 있는 것을 확인할 수 있고 두 개의 블록 보상을 획득한 상황입니다.

2) 두 번째 패널은 해당 지갑이 0.18.1 버전으로 업데이트한 후 블록체인에 다시 접속한 상황입니다. 스테이킹하던 코인들이 분리된 체인에 저장되어 유실된 것을 확인하실 수 있습니다.

3) 세 번째 패널은 'zapwallettxes'를 통해 블록 보상을 받았던 내용을 제외한 원래의 잔액이 복구된 상황입니다.

퀀텀 공식 커뮤니티

Naver Blog

Telegram

Kakao Talk

Facebook