"온라인증명"의 두 판 사이의 차이
(→참고자료) |
leejia1222 (토론 | 기여) (→큐시티) |
||
(사용자 3명의 중간 판 20개는 보이지 않습니다) | |||
1번째 줄: | 1번째 줄: | ||
− | '''온라인증명'''(Proof of Online; PoO)은 | + | '''온라인증명'''(Proof of Online; PoO)은 한국의 블록체인 개발 전문기업 [[㈜이트라]]<!--이트라-->가 개발한 알고리즘으로, 새로운 블록의 전파 과정에서 해당 블록이 온라인상에서 생성된 것인지 검증하는 과정을 추가하여 [[블록보류공격]](BWA)을 원천적으로 차단하는 [[합의 알고리즘]]이다. 온라인증명 합의 알고리즘을 채택한 코인으로는 [[큐시티]](Qcity)가 있다. |
== 개요 == | == 개요 == | ||
+ | [[비트코인]]의 합의 알고리즘 방식인 [[작업증명]](PoW) 방식을 채택한 수많은 [[알트코인]]들이 [[51% 공격]]의 일종인 블록보류공격(BWA ; Block Withholding Attack)에 의해 2018년에만 약 2천만 달러, 한화 227억 원을 탈취당했다. 블록보류공격은 전체의 51%에 해당하는 [[해시파워]]를 가진 [[노드]]가 온라인 [[블록]]에서 자금을 빼돌린 뒤 오프라인상에서 쌓은 긴 블록을 전파하여 이를 무효화하는 방식으로 [[해킹]]이 진행되는데, 이를 해결하기 위해서는 온라인에서 생성된 블록만이 유효한 것으로 받아 들여져야 한다. ㈜이트라는 이러한 문제를 해결하기 위해 새로운 블록의 전파과정에서 해당 블록이 온라인상에서 생성된 것인지 검증할 수 있는 과정을 추가하여 원천적으로 블록보류공격을 차단하는 온라인증명 합의 알고리즘을 개발했다. | ||
− | + | ㈜이트라의 유영근 대표는 기존 작업증명 방식에 온라인증명 방식을 추가로 적용하면 비트코인 계열의 많은 알트코인들이 51% 공격으로부터 안전할 수 있다고 설명하며, 직접 개발한 [[큐시티]](Qcity)에 11월1일자로 적용하여 블록 안정성 검토까지 마친 상태라고 밝혔다. 2018년 11월 12일 특허청으로부터 특허결정을 통보받았고, 현재 많은 알트코인들에 적용하여 [[블록체인]]에 대한 안정성을 높이는데 기여할 수 있도록 비트코인 커뮤니티 공론화를 거쳐 [[BIP]](Bitcoin Improvement Proposal)에 제안 준비를 하고있다.<ref> 윤병찬 기자, 〈[http://biz.heraldcorp.com/view.php?ud=20181116000175 국내 개발진이 최초로 제시한 51% 공격에 대한 대비책-PoO]〉, 《헤럴드경제》, 2018-11-16 </ref> | |
− | == | + | ==활용== |
+ | ===큐시티=== | ||
+ | [[큐시티]](Qcity)는 전 세계 어디에서나 즉시 전송, 지불, 교환이 가능한 디지털 통화용 [[암호화폐]]이자 [[비즈니스]] [[플랫폼]]이다. 큐시티는 중소상공인을 위해 개발됐다. 큐시티는 [[큐코인]](Qcoin)이라는 거래 화폐를 가지고 있으며 큐플랫폼 내 현지 법정통화 1:1 가치를 유지한다. 큐코인은 암호화폐의 변동성 문제를 해결하며 중소상공인, 가맹점에 전송 지연문제를 해결한다. 이용자는 큐코인이 필요하면 큐시티를 통해 큐플랫폼에서 충전하며, 가맹점은 큐플랫폼 자율 계약에 따른 공제 기금으로 큐시티를 예치한다.<ref>영보스, 〈[https://blog.naver.com/jruits/221299126904 큐시티(QCITY)에 대해 알아보자]〉, 《네이버 블로그》, 2018-06-15</ref> | ||
− | 기존의 | + | 기존의 블록보류공격 방식은 블록을 생성한 결과를 주변 노드에 전파하지 않고 오프라인 상태에 있다가 수익을 얻은 이후 온라인에 연결하여 기존의 거래들을 무산시키는 방식이기 때문에, 처음부터 오프라인 상태에서는 일정 길이 이상을 블록을 생성할 수 없게 하는 게 온라인증명 합의 알고리즘의 핵심이다. 예를 들어, 블록타임이 1분이 큐시티의 경우 10번째에 해당하는 매 블록은(10, 20, 30…) 검증자 권한을 가진 특별한 노드들만 생성할 수 있으며, 이를 온라인증명 블록이라 부른다. 결과적으로 오프라인에서 공격을 시도하더라도 길이가 10인 블록 이내, 즉 10분 이내에 자금회수가 어려우므로 공격 시도를 원천적으로 차단하게 되는 것이다. 만약, 검증자 노드가 모두 잠시라도 멈추는 상황이 발생하게 된다면 블록이 더 이상 생성되지 않는 상황이 발생할 수 있으므로, 온라인증명 블록 차례에서 기준 블록타임의 2배인 2분이 넘을 경우 일반 블록으로 대체 가능한 알고리즘을 포함하여 네트워크의 안정성을 최우선으로 하게끔 설계됐다.<ref name="큐시티">Qcity, 〈[https://qcitycoin.blog.me/221367661343 POO(Proof Of Online) - 51% attack에 맞설 솔루션]〉, 《네이버 블로그》, 2018-09-29</ref> |
− | 재단에서 운영하는 검증자 노드는, 신규 노드가 최초로 블록 정보를 탐색할 시작점을 안내하기 위해 재단이 운영하는 [[시드노드]]를 코어 소스에 | + | 재단에서 운영하는 검증자 노드는, 신규 노드가 최초로 블록 정보를 탐색할 시작점을 안내하기 위해 재단이 운영하는 [[시드노드]]를 코어 소스에 [[하드코딩]]하여 관리하는 것과 동일한 방식으로 관리된다. [[네트워크]]가 발전됨에 따라 초기 세팅된 검증자 목록이 변경되야 하는 상황이 생길 수 있으므로, 이후에 공동 [[서명]]을 통해 새로운 검증자를 추가하거나 자신의 검증자 권한을 이양할 수 있는 기능을 추가할 예정이다. 온라인증명 합의 알고리즘의 도입으로 기존 [[채굴자]]들은 10번중 1번의 채굴 기회를 잃게 된다. 이에 대한 피해를 최소화하기 위해 온라인증명 블록은 채굴 보상을 없애고 [[트랜잭션]]을 위한 최소한의 수수료만 보상으로 책정하였다. 일반 블록에서 채굴보상을 코인베이스 트랜잭션이라 하는데, 온라인증명 블록은 [[헤더]]에 검증자의 서명 정보를 담아야 하고, 보상 구조가 다르기 때문에 이를 구별하여 코인온라인 트랜잭션이라 칭한다.<ref name="큐시티"></ref> |
− | + | * '''트랜잭션''' | |
− | + | : 기존의 블록체인 트랜잭션은 코인베이스 트랜잭션과 일반적인 트랜잭션 두 가지로 나눌 수 있다. 일반적인 트랜잭션에는 전송자와 수신자가 존재하며, 전송자의 주소(공개키)는 입력부에, 수신자의 주소(공개키) 정보는 출력부에 들어간다. 전송자는 거래 내용을 개인키로 서명(암호화)하고, 수신자는 이를 전송자의 [[공개키]]로 해독하여 실제로 자격이 있는 해당 공개키의 [[개인키]]를 소유한 사람이 생성한 거래인지를 확인한다. 이에 비해 코인베이스 트랜잭션<math>(tx[0])</math>은 채굴된 [[코인]]의 첫 번째 트랜잭션으로서 수신자만 존재하므로 서명정보가 필요 없다. 그러나 온라인증명 블록에서는 별도로 정해진 검증자들만 블록을 생성할 수 있고, 이에 대한 확인을 위해 서명정보가 필요하므로 코인온라인(CoinOnline)이라는 새로운 형태의 트랜잭션 구조를 갖는다.<ref name="기술백서">큐시티 기술 백서 - http://www.qcitycoin.org/img/tech-wihtepaper_en.pdf</ref> | |
− | 기존의 블록체인 트랜잭션은 코인베이스 트랜잭션과 일반적인 트랜잭션 | ||
− | 수신자는 이를 전송자의 | ||
− | 이에 비해 | ||
− | + | * '''온라인증명 블록''' | |
− | 블록체인의 height % n == 0 번째 블록을 | + | : 블록체인의 <math>height % n == 0</math>번째 블록을 온라인증명 블록이라 칭하며, 항상 특정 서명자가 서명한 블록을 포함하도록 한다. 큐시티는 <math>n=10</math>으로 하여 매 10번째 블록 즉, <math>xxx00</math><math>,</math> <math>xxx10</math><math>,</math> <math>xxx20</math><math>,</math> …<math>,</math> <math>xxx90</math>이 온라인증명 블록이 된다. 여기서 특정 서명자라 함은 해당 블록체인을 초기 설계하거나, 해당 블록체인을 운영하는 재단 또는 조직이 소유한 계정으로 검증자라 칭하며, 공개된 주소의 비밀키로 온라인증명 블록에 서명함으로써 해당 블록이 네트워크에 동기화되어 있음을 제공한다. 기타 모든 노드들은 온라인증명 블록이 재단이 공개한 주소로 서명이 되었음을 확인하여, 해당 블록을 받아들인다.<ref name="기술백서"></ref> |
− | + | * '''검증자 공개키''' | |
− | 일반적인 블록체인 | + | : 일반적인 블록체인 재단 등에서는 운영하는 노드들을 프로그램 소스에 반영하거나, 시드DNS(seed DNS)에 최우선적으로 등록하여, 네트워크상의 대부분의 노드들이 기본적으로 접속을 하고, 기타 네트워크를 찾는 시드(seed)가 되게 하는 시느도느(seed node) 방식을 사용한다. 이 방식을 따라서 재단이 운영하는 검증자 공개키 목록을 프로그램 소스에 반영하고, 온라인증명을 위한 블록 추가 작업은 검증자 공개키에게만 서명 권한을 부여한다.<ref name="기술백서"></ref> |
− | + | * '''운영방식''' | |
− | 소스에 하드코딩된 검증자 공개키가 설정된 노드인 검증자노드 vn[0], vn[1], vn[2], vn[3], vn[4] | + | : 소스에 하드코딩된 검증자 공개키가 설정된 노드인 검증자노드 <math>vn[0]</math><math>,</math> <math>vn[1]</math><math>,</math> <math>vn[2]</math><math>,</math> <math>vn[3]</math><math>,</math> <math>vn[4]</math>가 있고, 일반 [[채굴노드]] <math>n[0]</math><math>,</math> <math>n[1]</math><math>,</math> <math>n[2]</math><math>,</math> <math>n[3]</math>이 있다고 가정하면, [[검증노드]]와 [[채굴노드]]는 모두 새로운 블록이 생성되었다는 정보를 수신함과 동시에 다음 블록을 만들 준비를 시작한다. 블록의 첫 번째 트랜잭션은 생성된 블록에 대한 보상을 주는 코인베이스 트랜잭션이라 하는데, 자신을 수신자로 하여 생성하고, 블록에 포함시킬 나머지 트랜잭션을 선택하여 [[해시 값]]을 산출하며, 이 값이 목표값보다 작은 경우 블록 정보가 완성되어 배포할 수 있게 된다. 그러나 새로 만들 블록이 10번째 블록에 해당한다면 일반 채굴노드들은 자신을 수신자로 하는 코인베이스 트랜잭션을 생성할 수 없다. 반면, 검증자 노드 중 하나인 <math>vn[0]</math>가 블록을 생성한다면, 코인베이스 트랜잭션의 출력부에 자신의 공개키를 넣고, 이 트랜잭션의 내용을 자신의 개인키로 서명한 정보를 [[블록헤더]]에 담는다. 이 정보를 담기 위해 VchBlockSig라는 필드를 추가했고 이 트랜잭션의 형태가 일반적인 코인베이스 트랜잭션과 다르므로 이를 코인온라인 트랜잭션이라 칭한다. 블록수신시 10번째 블록에 해당한다면 첫 번째(코인온라인) 트랜잭션의 출력부에 기록된 공개키가 검증자 노드 목록 중에 있는지 확인한 다음, 이 공개키로 VchBlockSig의 내용을 [[복호화]]한 데이터가 코인온라인 트랜잭션의 정보와 일치하는지 확인함으로써 정당한 검증자가 서명한 온라인증명 블록임을 확인한다.<ref name="기술백서"></ref> |
− | + | : 이러한 논리로 공격자는 <math>%n</math>으로 정의된 수 미만의 블록만 보유할 수 있으므로, 네트워크 해시파워를 장악하더라도 악의적인 [[이중지불]] 공격을 할 수 있는 충분한 시간을 확보할 수 없어진다. 모든 블록의 채굴자들은 재단이 운영하는 시드노드와 연결이 되어 있음을 해당 블록에서 확인할 수 있다. | |
− | + | * '''채굴자와의 합의''' | |
− | + | : 온라인증명 블록의 서명을 재단이 함으로써 채굴자에게는 그만큼의 기회가 없어지므로, 적절한 <math>%n</math>값의 설정이 필요하다. 20블록마다 서명을 확인하도록 설정한 경우 채굴자는 1/20 만큼의 채굴의 기회가 사라진다. 보상 방법으로 <math>%n</math> 블록에 대해서는 채굴보상을 지급하지 않음으로써 채굴자의 역차별을 제거한다.<ref name="기술백서"></ref> | |
− | + | * '''위험에 대한 대비''' | |
− | 온라인이 되어 있음을 확인하는 공개키 주소의 제공은 기본적으로 | + | : 온라인이 되어 있음을 확인하는 공개키 주소의 제공은 기본적으로 하드 코딩된 주소를 이용하며, 추후 검증자가 추가되거나 권한의 이양이 필요한 경우, 검증자들에게만 주어진 권한을 이용하여 과반수 이상의 공동 서명을 통해 새로운 검증자를 추가하고, 이 내용은 각 노드의 [[클라이언트]] 내부 [[데이터베이스]]에 보관된다. 만약 재단에서 운영하는 노드가 중단되었을 경우 모든 블록체인은 해당 블록이 생성되기를 기대하며, 기타 작업증명 블록을 받아들이지 않아, 전체 블록은 운영이 중단되는 상황이 만들어질 수 있다. 이를 보완하기 위한 방법으로 <math>%n</math>번째 블록이 기대 되어지는 블록타임의 2배를 넘어설 경우 <math>%n</math>번째 블록은 일반 블록을 받아들일 수 있도록 설계되었다. 최악의 경우 검증자 노드 전체의 운영이 멈추더라도, 해당 블록체인은 지정된 블록의 채굴 시간이 늦어질 뿐 전체 운영의 장애가 발생하지는 않는다.<ref name="기술백서"></ref> |
− | + | * '''구현방식''' | |
− | 재단의 운영자는 검증자 공개키의 과반수가 넘는 노드에서 | + | : 재단의 운영자는 검증자 공개키의 과반수가 넘는 노드에서 온라인증명 채굴을 항상 유지해야 하며, 그 구현 방법은 다음과 같다. 일반적인 블록의 첫 번째 트랜잭션인 <math>tx[0]</math>는 채굴에 대한 보상인 코인베이스 트랜잭션이나, 온라인증명 블록의 <math>tx[0]</math>는 이를 변형한 형태이며 코인온라인 트랜잭션이라 칭한다.<ref name="기술백서"></ref> |
− | |||
+ | : {| class="wikitable" width=800 style="color:balck; background-color:#F8F9FA;" | ||
|- | |- | ||
!| | !| | ||
51번째 줄: | 51번째 줄: | ||
|size()>=1 && size()<=3 | |size()>=1 && size()<=3 | ||
출력[0]==empty() | 출력[0]==empty() | ||
− | 출력[1].scriptPubkey== 제공된 | + | 출력[1].scriptPubkey== 제공된 공개키 중 하나 |
− | 출력[2].scriptPubkey = 새롭게 | + | 출력[2].scriptPubkey = 새롭게 제공되는 공개키 |
− | 공개키 | ||
|- | |- | ||
− | |Validation | + | |Validation Code |
− | Code | ||
|vin.size()==1 | |vin.size()==1 | ||
&&vin[0].prevout.IsNull() | &&vin[0].prevout.IsNull() | ||
70번째 줄: | 68번째 줄: | ||
vout.size()<=3 && | vout.size()<=3 && | ||
− | vout[1].scriptPubKey == 제공된 | + | vout[1].scriptPubKey == 제공된 공개키 중 하나&& |
− | |||
− | 하나&& | ||
vout[1].nValue== Block.nFees&& | vout[1].nValue== Block.nFees&& | ||
81번째 줄: | 77번째 줄: | ||
|- | |- | ||
|} | |} | ||
− | *(prevout : 이전 트랜잭션의 정보, vin : 입력부, vout : 출력부)<ref name="큐시티"> | + | :*(prevout : 이전 트랜잭션의 정보, vin : 입력부, vout : 출력부)<ref name="큐시티"></ref> |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
{{각주}} | {{각주}} | ||
95번째 줄: | 83번째 줄: | ||
== 참고자료 == | == 참고자료 == | ||
* 큐시티코인 공식 홈페이지 - http://www.qcitycoin.org/layout/main_page.html | * 큐시티코인 공식 홈페이지 - http://www.qcitycoin.org/layout/main_page.html | ||
− | * | + | * 큐시티 기술 백서 - http://www.qcitycoin.org/img/tech-wihtepaper_en.pdf |
− | * 영보스,〈[https://blog.naver.com/jruits/221299126904 큐시티(QCITY)에 대해 알아보자]〉, 《코인정보소》, 2018-06-15 | + | * 영보스, 〈[https://blog.naver.com/jruits/221299126904 큐시티(QCITY)에 대해 알아보자]〉, 《코인정보소》, 2018-06-15 |
− | * Qcity,〈[https://qcitycoin.blog.me/221367661343 PoO(Proof Of Online)-51% attak에 맞설 솔루션]〉, 《큐시티코인 블로그》, 2018-09-29 | + | * Qcity, 〈[https://qcitycoin.blog.me/221367661343 PoO(Proof Of Online)-51% attak에 맞설 솔루션]〉, 《큐시티코인 블로그》, 2018-09-29 |
− | * 윤병찬 기자,〈[http://biz.heraldcorp.com/view.php?ud=20181116000175 국내 개발진이 최초로 제시한 51% 공격에 대한 대비책-PoO]〉, 《헤럴드경제》, 2018-11-16 | + | * 윤병찬 기자, 〈[http://biz.heraldcorp.com/view.php?ud=20181116000175 국내 개발진이 최초로 제시한 51% 공격에 대한 대비책-PoO]〉, 《헤럴드경제》, 2018-11-16 |
− | |||
== 같이보기 == | == 같이보기 == | ||
− | |||
* [[큐시티]] | * [[큐시티]] | ||
{{합의 알고리즘|검토 필요}} | {{합의 알고리즘|검토 필요}} |
2019년 8월 26일 (월) 15:55 기준 최신판
온라인증명(Proof of Online; PoO)은 한국의 블록체인 개발 전문기업 ㈜이트라가 개발한 알고리즘으로, 새로운 블록의 전파 과정에서 해당 블록이 온라인상에서 생성된 것인지 검증하는 과정을 추가하여 블록보류공격(BWA)을 원천적으로 차단하는 합의 알고리즘이다. 온라인증명 합의 알고리즘을 채택한 코인으로는 큐시티(Qcity)가 있다.
개요[편집]
비트코인의 합의 알고리즘 방식인 작업증명(PoW) 방식을 채택한 수많은 알트코인들이 51% 공격의 일종인 블록보류공격(BWA ; Block Withholding Attack)에 의해 2018년에만 약 2천만 달러, 한화 227억 원을 탈취당했다. 블록보류공격은 전체의 51%에 해당하는 해시파워를 가진 노드가 온라인 블록에서 자금을 빼돌린 뒤 오프라인상에서 쌓은 긴 블록을 전파하여 이를 무효화하는 방식으로 해킹이 진행되는데, 이를 해결하기 위해서는 온라인에서 생성된 블록만이 유효한 것으로 받아 들여져야 한다. ㈜이트라는 이러한 문제를 해결하기 위해 새로운 블록의 전파과정에서 해당 블록이 온라인상에서 생성된 것인지 검증할 수 있는 과정을 추가하여 원천적으로 블록보류공격을 차단하는 온라인증명 합의 알고리즘을 개발했다.
㈜이트라의 유영근 대표는 기존 작업증명 방식에 온라인증명 방식을 추가로 적용하면 비트코인 계열의 많은 알트코인들이 51% 공격으로부터 안전할 수 있다고 설명하며, 직접 개발한 큐시티(Qcity)에 11월1일자로 적용하여 블록 안정성 검토까지 마친 상태라고 밝혔다. 2018년 11월 12일 특허청으로부터 특허결정을 통보받았고, 현재 많은 알트코인들에 적용하여 블록체인에 대한 안정성을 높이는데 기여할 수 있도록 비트코인 커뮤니티 공론화를 거쳐 BIP(Bitcoin Improvement Proposal)에 제안 준비를 하고있다.[1]
활용[편집]
큐시티[편집]
큐시티(Qcity)는 전 세계 어디에서나 즉시 전송, 지불, 교환이 가능한 디지털 통화용 암호화폐이자 비즈니스 플랫폼이다. 큐시티는 중소상공인을 위해 개발됐다. 큐시티는 큐코인(Qcoin)이라는 거래 화폐를 가지고 있으며 큐플랫폼 내 현지 법정통화 1:1 가치를 유지한다. 큐코인은 암호화폐의 변동성 문제를 해결하며 중소상공인, 가맹점에 전송 지연문제를 해결한다. 이용자는 큐코인이 필요하면 큐시티를 통해 큐플랫폼에서 충전하며, 가맹점은 큐플랫폼 자율 계약에 따른 공제 기금으로 큐시티를 예치한다.[2]
기존의 블록보류공격 방식은 블록을 생성한 결과를 주변 노드에 전파하지 않고 오프라인 상태에 있다가 수익을 얻은 이후 온라인에 연결하여 기존의 거래들을 무산시키는 방식이기 때문에, 처음부터 오프라인 상태에서는 일정 길이 이상을 블록을 생성할 수 없게 하는 게 온라인증명 합의 알고리즘의 핵심이다. 예를 들어, 블록타임이 1분이 큐시티의 경우 10번째에 해당하는 매 블록은(10, 20, 30…) 검증자 권한을 가진 특별한 노드들만 생성할 수 있으며, 이를 온라인증명 블록이라 부른다. 결과적으로 오프라인에서 공격을 시도하더라도 길이가 10인 블록 이내, 즉 10분 이내에 자금회수가 어려우므로 공격 시도를 원천적으로 차단하게 되는 것이다. 만약, 검증자 노드가 모두 잠시라도 멈추는 상황이 발생하게 된다면 블록이 더 이상 생성되지 않는 상황이 발생할 수 있으므로, 온라인증명 블록 차례에서 기준 블록타임의 2배인 2분이 넘을 경우 일반 블록으로 대체 가능한 알고리즘을 포함하여 네트워크의 안정성을 최우선으로 하게끔 설계됐다.[3]
재단에서 운영하는 검증자 노드는, 신규 노드가 최초로 블록 정보를 탐색할 시작점을 안내하기 위해 재단이 운영하는 시드노드를 코어 소스에 하드코딩하여 관리하는 것과 동일한 방식으로 관리된다. 네트워크가 발전됨에 따라 초기 세팅된 검증자 목록이 변경되야 하는 상황이 생길 수 있으므로, 이후에 공동 서명을 통해 새로운 검증자를 추가하거나 자신의 검증자 권한을 이양할 수 있는 기능을 추가할 예정이다. 온라인증명 합의 알고리즘의 도입으로 기존 채굴자들은 10번중 1번의 채굴 기회를 잃게 된다. 이에 대한 피해를 최소화하기 위해 온라인증명 블록은 채굴 보상을 없애고 트랜잭션을 위한 최소한의 수수료만 보상으로 책정하였다. 일반 블록에서 채굴보상을 코인베이스 트랜잭션이라 하는데, 온라인증명 블록은 헤더에 검증자의 서명 정보를 담아야 하고, 보상 구조가 다르기 때문에 이를 구별하여 코인온라인 트랜잭션이라 칭한다.[3]
- 트랜잭션
- 기존의 블록체인 트랜잭션은 코인베이스 트랜잭션과 일반적인 트랜잭션 두 가지로 나눌 수 있다. 일반적인 트랜잭션에는 전송자와 수신자가 존재하며, 전송자의 주소(공개키)는 입력부에, 수신자의 주소(공개키) 정보는 출력부에 들어간다. 전송자는 거래 내용을 개인키로 서명(암호화)하고, 수신자는 이를 전송자의 공개키로 해독하여 실제로 자격이 있는 해당 공개키의 개인키를 소유한 사람이 생성한 거래인지를 확인한다. 이에 비해 코인베이스 트랜잭션은 채굴된 코인의 첫 번째 트랜잭션으로서 수신자만 존재하므로 서명정보가 필요 없다. 그러나 온라인증명 블록에서는 별도로 정해진 검증자들만 블록을 생성할 수 있고, 이에 대한 확인을 위해 서명정보가 필요하므로 코인온라인(CoinOnline)이라는 새로운 형태의 트랜잭션 구조를 갖는다.[4]
- 온라인증명 블록
- 블록체인의 번째 블록을 온라인증명 블록이라 칭하며, 항상 특정 서명자가 서명한 블록을 포함하도록 한다. 큐시티는 으로 하여 매 10번째 블록 즉, … 이 온라인증명 블록이 된다. 여기서 특정 서명자라 함은 해당 블록체인을 초기 설계하거나, 해당 블록체인을 운영하는 재단 또는 조직이 소유한 계정으로 검증자라 칭하며, 공개된 주소의 비밀키로 온라인증명 블록에 서명함으로써 해당 블록이 네트워크에 동기화되어 있음을 제공한다. 기타 모든 노드들은 온라인증명 블록이 재단이 공개한 주소로 서명이 되었음을 확인하여, 해당 블록을 받아들인다.[4]
- 검증자 공개키
- 일반적인 블록체인 재단 등에서는 운영하는 노드들을 프로그램 소스에 반영하거나, 시드DNS(seed DNS)에 최우선적으로 등록하여, 네트워크상의 대부분의 노드들이 기본적으로 접속을 하고, 기타 네트워크를 찾는 시드(seed)가 되게 하는 시느도느(seed node) 방식을 사용한다. 이 방식을 따라서 재단이 운영하는 검증자 공개키 목록을 프로그램 소스에 반영하고, 온라인증명을 위한 블록 추가 작업은 검증자 공개키에게만 서명 권한을 부여한다.[4]
- 운영방식
- 소스에 하드코딩된 검증자 공개키가 설정된 노드인 검증자노드 가 있고, 일반 채굴노드 이 있다고 가정하면, 검증노드와 채굴노드는 모두 새로운 블록이 생성되었다는 정보를 수신함과 동시에 다음 블록을 만들 준비를 시작한다. 블록의 첫 번째 트랜잭션은 생성된 블록에 대한 보상을 주는 코인베이스 트랜잭션이라 하는데, 자신을 수신자로 하여 생성하고, 블록에 포함시킬 나머지 트랜잭션을 선택하여 해시 값을 산출하며, 이 값이 목표값보다 작은 경우 블록 정보가 완성되어 배포할 수 있게 된다. 그러나 새로 만들 블록이 10번째 블록에 해당한다면 일반 채굴노드들은 자신을 수신자로 하는 코인베이스 트랜잭션을 생성할 수 없다. 반면, 검증자 노드 중 하나인 가 블록을 생성한다면, 코인베이스 트랜잭션의 출력부에 자신의 공개키를 넣고, 이 트랜잭션의 내용을 자신의 개인키로 서명한 정보를 블록헤더에 담는다. 이 정보를 담기 위해 VchBlockSig라는 필드를 추가했고 이 트랜잭션의 형태가 일반적인 코인베이스 트랜잭션과 다르므로 이를 코인온라인 트랜잭션이라 칭한다. 블록수신시 10번째 블록에 해당한다면 첫 번째(코인온라인) 트랜잭션의 출력부에 기록된 공개키가 검증자 노드 목록 중에 있는지 확인한 다음, 이 공개키로 VchBlockSig의 내용을 복호화한 데이터가 코인온라인 트랜잭션의 정보와 일치하는지 확인함으로써 정당한 검증자가 서명한 온라인증명 블록임을 확인한다.[4]
- 이러한 논리로 공격자는 으로 정의된 수 미만의 블록만 보유할 수 있으므로, 네트워크 해시파워를 장악하더라도 악의적인 이중지불 공격을 할 수 있는 충분한 시간을 확보할 수 없어진다. 모든 블록의 채굴자들은 재단이 운영하는 시드노드와 연결이 되어 있음을 해당 블록에서 확인할 수 있다.
- 채굴자와의 합의
- 온라인증명 블록의 서명을 재단이 함으로써 채굴자에게는 그만큼의 기회가 없어지므로, 적절한 값의 설정이 필요하다. 20블록마다 서명을 확인하도록 설정한 경우 채굴자는 1/20 만큼의 채굴의 기회가 사라진다. 보상 방법으로 블록에 대해서는 채굴보상을 지급하지 않음으로써 채굴자의 역차별을 제거한다.[4]
- 위험에 대한 대비
- 온라인이 되어 있음을 확인하는 공개키 주소의 제공은 기본적으로 하드 코딩된 주소를 이용하며, 추후 검증자가 추가되거나 권한의 이양이 필요한 경우, 검증자들에게만 주어진 권한을 이용하여 과반수 이상의 공동 서명을 통해 새로운 검증자를 추가하고, 이 내용은 각 노드의 클라이언트 내부 데이터베이스에 보관된다. 만약 재단에서 운영하는 노드가 중단되었을 경우 모든 블록체인은 해당 블록이 생성되기를 기대하며, 기타 작업증명 블록을 받아들이지 않아, 전체 블록은 운영이 중단되는 상황이 만들어질 수 있다. 이를 보완하기 위한 방법으로 번째 블록이 기대 되어지는 블록타임의 2배를 넘어설 경우 번째 블록은 일반 블록을 받아들일 수 있도록 설계되었다. 최악의 경우 검증자 노드 전체의 운영이 멈추더라도, 해당 블록체인은 지정된 블록의 채굴 시간이 늦어질 뿐 전체 운영의 장애가 발생하지는 않는다.[4]
- 구현방식
- 재단의 운영자는 검증자 공개키의 과반수가 넘는 노드에서 온라인증명 채굴을 항상 유지해야 하며, 그 구현 방법은 다음과 같다. 일반적인 블록의 첫 번째 트랜잭션인 는 채굴에 대한 보상인 코인베이스 트랜잭션이나, 온라인증명 블록의 는 이를 변형한 형태이며 코인온라인 트랜잭션이라 칭한다.[4]
CoinBase CoinOnline 입력(0) size()== 1, prevout == null size()==1,prevout == null 출력 size()>=1 size()>=1 && size()<=3 출력[0]==empty() 출력[1].scriptPubkey== 제공된 공개키 중 하나 출력[2].scriptPubkey = 새롭게 제공되는 공개키
Validation Code vin.size()==1 &&vin[0].prevout.IsNull()
vin().size()==1&& &&vin[0].prevout.IsNull()
vout.size()>=1 &&
vout[0].isEmtpty() &&
vout.size()<=3 &&
vout[1].scriptPubKey == 제공된 공개키 중 하나&&
vout[1].nValue== Block.nFees&&
vout[2].scriptPubKey == isvalid()
&&vout[2].nValue== 0
- (prevout : 이전 트랜잭션의 정보, vin : 입력부, vout : 출력부)[3]
각주[편집]
- ↑ 윤병찬 기자, 〈국내 개발진이 최초로 제시한 51% 공격에 대한 대비책-PoO〉, 《헤럴드경제》, 2018-11-16
- ↑ 영보스, 〈큐시티(QCITY)에 대해 알아보자〉, 《네이버 블로그》, 2018-06-15
- ↑ 3.0 3.1 3.2 Qcity, 〈POO(Proof Of Online) - 51% attack에 맞설 솔루션〉, 《네이버 블로그》, 2018-09-29
- ↑ 4.0 4.1 4.2 4.3 4.4 4.5 4.6 큐시티 기술 백서 - http://www.qcitycoin.org/img/tech-wihtepaper_en.pdf
참고자료[편집]
- 큐시티코인 공식 홈페이지 - http://www.qcitycoin.org/layout/main_page.html
- 큐시티 기술 백서 - http://www.qcitycoin.org/img/tech-wihtepaper_en.pdf
- 영보스, 〈큐시티(QCITY)에 대해 알아보자〉, 《코인정보소》, 2018-06-15
- Qcity, 〈PoO(Proof Of Online)-51% attak에 맞설 솔루션〉, 《큐시티코인 블로그》, 2018-09-29
- 윤병찬 기자, 〈국내 개발진이 최초로 제시한 51% 공격에 대한 대비책-PoO〉, 《헤럴드경제》, 2018-11-16
같이보기[편집]