안녕하세요 마 입니다. 오늘은 블록체인 컨센서스를 이끌어내기 위한 알고리즘들에 대해 알아보도록 하겠습니다. 제가 전문 지식을 가진 사람은 아니어서 다소 틀린 부분이 있어도 양해 부탁드립니다. 또한, 인터넷에 있는 정보들을 짜집기 했기 때문에 관련 출처를 적어놓도록 하겠습니다.
목차
- 해쉬와 블럭이란?
- SHA256과 암호화 해시함수란?
- 하드포크란?
- POW
- POS
- POW/POS
- POI
- Zero-Knowledge Proof
해쉬와 블럭이란?
해쉬란 어느 것이든 그다지 「의미 없는」것이고, 컴퓨터에서는 블록 길이(block length)에 맞추기 위해서 메모리에 기입된 의미 없는 정보를 표시합니다.
해쉬의 예는 다음과 같습니다.
0000000000000756af69e2ffbdb930261873cd71
여기서 블럭은 해쉬(Hash)를 보유한 사람이 코인을 얻을 수 있는 블럭(Block)을 의미합니다.
이러한 블럭(Block)이 생성되는 시간을 일정하게 하기 위해서 '난이도'라는 개념이 존재하게 됩니다. 전체 해쉬의 양이 늘어나면 난이도가 증가하게되고, 이 난이도에 따라 블럭을 찾는데 더 많은 해쉬가 필요해지기 때문에 블럭 자체가 생성되는 시간은 일정하게 유지됩니다.
흔히 볼 수 있는 'confirm'(컨펌) 이라는 개념이 1 블럭이 발견되고 다음 블럭으로 넘어갈 때 완료가 됩니다.
하지만 코인의 분배, 블럭생성 등 많은 부분이 '해쉬'와 밀접하게 연관되어 있기 때문에 '해쉬'로 인한 문제가 발생하기 쉽습니다.
- 51% Attack : 전체 해쉬의 50%가 넘는 해쉬를 보유한 집단이 나타나면 전체 코인 이동 정보(Block Chain)에 잘못된 정보가 전달되거나 혹은 잘못된 정보를 실제정보로 만들어버리는 일이 가능해집니다.
- 탈중앙화에 반하는 중앙화 : ASIC(반도체 업체가 사용자의 주문에 맞춰 설계ㆍ제작해 주는 주문형 반도체)가 나타나면서 점점 소수의 집단으로 해쉬가 대량으로 뭉치는 현상이 강화됨에 따라 이러한 부분에 대한 우려의 목소리도 커지고 있습니다.
- 연합채굴의 모순점 : 반감기 도래, 가격하락 등의 이유로 전체 해쉬가 일정 이상 내려가게 될 경우 발생할 수 있는 보안문제를 막기위해서 연합채굴(Merged Mining) 등의 방법을 도입해서 해쉬를 유지하는 방법도 현재 사용되고 있습니다. 하지만 근본적으로 '일정 이상의 전체 해쉬 유지' 및 '소수에게 독점되지 않는 분산된(decentralized) 해쉬'가 있어야 보안적으로 문제가 발생하지 않습니다.
- 개인 채굴자의 어려움 : '일정 이상의 해쉬를 유지하는 것'이 한 개인 개인에게 점차 어려워 지기 때문에 소수에게 독점되어 가는 현상이 발생하고 이를 우려하는 목소리가 발생하고 있습니다. 또한 채굴이 완료된 시점에서도 '해쉬'가 유지되어야 코인의 전송 및 보안상의 문제점이 해결이 됩니다.
- 경제성 문제 : 하지만 채굴이 끝난 시점에서 '해쉬'를 유지하면서 얻을 수 있는 이득은 오직 거래 중계료(Transaction Fee)입니다. 하지만 거래 중계료로 얻을 수 있는 이익보다 장비를 유지하는데 들어가는 비용이 더 클 가능성이 높기 때문에 이 부분에 대한 대책이 요구되고 있습니다.
SHA256과 암호화 해시함수란?
SHA256이란 SHA 알고리즘의 일종이다. Secure Hash Algorithm, 안전한 해시 알고리즘으로 이 함수들은 서로 관련된 암호학적 해시 함수들의 모음이다.
암호화 해시함수(cryptographic hash function)는 해시 함수의 일종으로, 해시 값으로부터 원래의 입력값과의 관계를 찾기 어려운 성질을 가지는 경우를 의미한다. 암호화 해시 함수가 가져야 하는 성질은 다음과 같다.
- 역상 저항성(preimage resistance) : 주어진 해시 값에 대해, 그 해시 값을 생성하는 입력값을 찾는 것이 계산상 어렵다. 즉, 제 1 역상 공격에 대해 안전해야 한다. 이 성질은 일방향함수와 연관되어 있다.
- 제 2 역상 저항성(second preimage resistance) : 입력 값에 대해, 그 입력의 해시 값을 바꾸지 않으면서 입력을 변경하는 것이 계산상 어렵다. 제 2 역상 공격에 대해 안전해야 한다.
- 충돌 저항성(collision resistance) : 해시 충돌에 대해 안전해야 한다. 같은 해시 값을 생성하는 두 개의 입력값을 찾는 것이 계산상 어려워야 한다.
하드포크란?
하드포크라는 것은 어떤 코인에 치명적인 버그가 있거나, 핵심 알고리즘의 변화가 필요해서 기존지갑과의 호환성 단절을 감수하고 새지갑을 만드는 겁니다.
"포크"라는 건 보통 오픈소스에서 개발에서 참여하기 위해 자신만의 특정 카피본을 만드는 것인데, 여기에 "하드"가 붙는 것은 기존의 소스와 호환성이 단절된다는 것을 의미합니다.
하드포크가 된 카피본이 존재하는 상황에서 기존판을 한쪽에서 계속 사용하게 되면 두개의 호환불가능한 블럭체인이 존재하게 되고 이는 곧 그 코인의 파탄을 의미합니다.
그렇기 때문에 하드포크는 모든 풀과 사용자들의 지갑을 한꺼번에 다 업데이트해야 되는 대규모 작업이 됩니다.
POW
POW는
- 프로토콜(컴퓨터간에 정보를 주고받을 때의 통신방법에 대한 규칙과 약속.)이자 프로그램 함수입니다.
- 이는 proof-of-work의 줄임말로 작업 증명 방식을 의미합니다.
- POW는 많은 해쉬(Hash)를 보유한 사람이 코인을 얻을 수 있는 블럭(Block)을 더 많이 발견할 수 있는 시스템을 의미합니다.
- 서비스 거부 공격과 네트워크 상에서 스팸과 같은 서비스 남용들을 처리 시간을 요구하는 서비스 요청으로 몇가지 작업을 요구함으로써 마음을 접게 만드는 경제적인 수단입니다.
- 한마디로 인터넷 상에서 양아치들이 와서 장사하는데에 모래 뿌리고 훼방놓으려고하면 돈을 내야하게 만들어서 마음을 접게 만드는 방식으로 보시면 이해하기 쉬우실 것입니다.
- 현재 '채굴'이 가능한 모든 코인은 POW입니다. 또한, 현재 가장 대중적이며, 시장이 크고, 인프라가 지속적으로 확대되고 있는 코인들은 대부분 POW 방식입니다. (비트코인, 라이트코인, 도기코인 등 알고리즘을 풀어서 코인을 보상으로 얻는 개념의 모든 코인은 다 POW 코인입니다.)
- 가상화폐가 POW 코인인 비트코인에서 출발했기 때문에 현재 주류는 당연히 POW 코인이고, 시장의 규모는 POW가 POS에 비해 압도적으로 큽니다. 보유한 사람들에게도 코인의 가치가 큰 폭으로 상승하는 경향을 보여줬습니다.
POS
- 도입된 이유 : POW의 가장 큰 문제인 '채굴에 들어가는 많은 비용 및 유지비 (전력사용, 장비 구입비) 절약', '해쉬의 독점으로 인한 보안상의 문제'를 해결하고자 만들어진 방식입니다.
- 준비물 : POS의 경우 인터넷이 연결된 PC 1대만 있으면 모든 준비가 끝이 납니다. 더 좋은 CPU ? 더 좋은 GPU ? 더 이상 추가적인 필요가 없습니다.
- 코인을 얻는 방법?: 각 코인마다 얻은 방식, 양은 다르지만 기본적으로POS는 가지고 있는 코인양이 많을수록 더 많은 코인을 지속적으로 얻게 됩니다.(이자와 같은 개념으로 받아들이셔도 무방합니다.) POS라는 이름과 같이 전체 코인에 대한 많은 지분(Stake)를 보유한 사람이 추가적으로 발행되는 코인에서 많은 분량을 가져가게 됩니다.
- 해쉬의 기능의 대체물 : POW에서는 '해쉬'가 이러한 기능을 했다면, POS 는 보유한 '코인'의 양이 기준이 됩니다. 그래서 POS 방식에는 보안을 위해서 대규모의해쉬가 필요하지 않고, 각 개개인이 코인을 보유하고, 지갑을 연동시켜 놓는 것 만으로 강한 보안 장벽을 만들어낼 수 있습니다.
- Pump&Dump의 가능성 : 또한 런칭 초기에 대량의 코인이 단기간에 발행되며 차차 줄어드는 POW와는 다르게 늘 일정한 양이 조금씩 발행되기 때문에 가격의 Pump & Dump가 더 적다는 장점이 있습니다.
- 경제성 : 또한 채굴에 소모되는 대량의 전기 및 채굴기가 필요 없기 때문에 더 많은 사람이 쉽게 코인을 접하고, 사용할 수 있습니다.
- 약점 : 하지만 가격의 상승폭이 크지 않기 때문에 '대량의 자금'이 유입되지 않았다는 점(굳이 지금 보유할 필요가 적기 때문에), '자금'이 많은 사람이 쉽게 독점할 수 있다는점, 채굴을 통한 이득이 POW보다 적은 점 초기 코인의 유포가 공평하지 못한 점 등의 이유가 약점으로 존재합니다.
- 최근 대두되는 이유 : 그 동안은 큰 주목을 받지 못하다 POW 류 코인의 해쉬 상승으로 인한 보안 문제 및 유지비 문제가 점점 이슈가 되면서 다시금 재조명이 되고 있습니다.
POW/POS
- 코인 분배 방식 : POW를 통해서 일정량은 채굴을 하고 그 이후에는 POS방식을 선택해서 보유한 사람들에게 지속적으로 일정량의 코인을 배분하는 방식을 채택하는 것입니다. (Black Coin이 대표적입니다)
- 동시에 POW와 POS를 가동하는가? : PoW 와 PoS 를 동시에 유지하는게 아니라 초기 일정기간은 PoW 로 많은 마이너들이 캘 수 있도록 하고, 그 이후는 순수 PoS로 전환함으로써 PoS 장점을 유지하고자 하는 모델들이 주류를 이루고 있습니다.
- 등장하게된 배경* : 한편 전문채굴기가 빗코의 암호화 방식인 SHA256 를 넘어서서 라이트코인의 방식인 Scrypt로 확장됨에 따라 이런 전문 채굴기가 채굴하기 어려운 새로운 암호화 방식의 Pow 또는 Pow / Pos 복합 모델들이 등장하기 시작했습니다. X11 은 다크코인이 제일 먼저 도입한 암호화 방식이고, 여러 다른 새로운 방식중 아주 인기있는 방식입니다.
POI
Proof of Importance (POI)는 NEM과 같은 가상화폐에서 사용하는 새로운 해시 알고리즘입니다.
- 특징 : 알고리즘은 블록이 생성 될 때 트랜잭션의 시간을 기록하여 처리합니다. POW와 POS는 POI와 근본적으로 다릅니다. POI는 사용자가 네트워크 참여를 하게 만듭니다.
- 보상 방식 : 따라서 지갑에서 주고받는 트렉잭션에서 뿐만아니라 코인 이자도 보상을 받습니다.
- POI 시스템 : 코인을 많이 가진 사람들을 보상 해줄 뿐만 아니라 누구랑 거래하는지, 몇명이랑 거래하는지가 보상에 영향을 줍니다. 열심히 활동할 수록 시스템 내에서 중요한 사람일 수록 보상을 많이 해주는 것입니다.
- 장점 : 좋은 점은 이것이 훨씬 더 많은 부의 분배를 의미한다는 것입니다. 시스템에 기여하는 사람은코인들을 추가로 확보 할 수 있습니다. 모든 사람에게 비슷한 기회를 제공하기 때문에 좋은 시스템입니다. 주된 목표는 보통 사람들에게 권한을 부여하는 것입니다.
- 소유 확정 : 수확하려면 특정 갯수의 코인이 필요합니다. 지갑에 코인을 넣고 일정한 시간이 지나면 지갑 내의 특정한 비율의 코인이 소유가 확정됩니다. 다음번 주기에는 확정안된 코인들 중 특정한 비율로 소유가 확정됩니다. 지갑에 코인 넣으면 이러한 순환 주기가 계속 반복되며 돈을 지갑에서 빼면 확정된 코인과 안된 코인이 일정한 비율로 빠져나갑니다.
- 수확 : 충분한 확정된 코인들로 이제 수확을 할 수 있게 되는데 국지적(local)으로 수확하거나 위임하여(delegated) 수확하는 방식으로 코인을 보상받습니다. 국지적인 수확은 위임 수확보다 쉽지만 단점이 많이 있습니다. 수확은 지갑에서 할 수 있는 방식입니다.
Zero-Knowledge Proof
Zero-Knowledge Proof(영지식증명)은 Zcash가 가진 기능이다. 흥미로운 예제이니 먼저 영지식증명이 뭔지 알아보자. 귀찮으면 뛰어넘어도 좋다.
현실에서는 그런데 우리의 현실 세계에서는 정보를 공개하지는 못하지만 자신이 그것을 알고 있다는 것을 증명해야 할 경우가 많다. 검증자가 자신이 가지고 있는 비밀정보(패스워드)를 노출하는 대신 자신이 그 비밀정보를 알고 있음을 증명하여 검증하는 프로토콜로 암호학에서 매우 중요한 역할을 하는 프로토콜이다.
자신이 가진 비밀정보를 보여주면 물론 그 비밀정보를 알고 있다는 증명이 되지만, 한 번 노출시키면 그 정보는 더 이상 비밀정보가 아니다. 자신의 정보를 노출시키지 않으면서 그것을 알고 있다는 것을 증명하는 것을 영지식 증명이라고 한다.
다음의 동굴 그림은 영지식 증명을 설명하기 위해 사용되는 대표적인 예제이다. 갑순이는 동굴의 입구로부터 반대쪽에 있는 비밀문을 열 수 있는 암호를 알고 있다. 갑순이는 이 암호를 을돌이에게 알려주지 않고 이것을 알고 있다는 것을 증명하려고 한다. 어떻게 하면 이것이 가능할까?
갑순이와 을돌이는 다음과 같은 게임을 한다.
영지식 증명을 설명하는 동굴 예제
Reveal spoiler
(1)
(2)
(3)
- 을돌이를 동굴 입구에서 기다리게 하고 갑순이는 갈라지는 지점에서 A 또는 B방향을 임의로 선택하여 들어가서 비밀문 앞으로 간다. 이때 을돌이는 갑순이가 어느 방향으로 갔는지 알 수 없다.
- 을돌이는 동굴이 갈라지는 지점까지 와서 갑순이에게 A 또는 B의 어느 한 방향으로 나오도록 큰 소리로 말한다.
- 갑순이는 을돌이의 요구에 따라 A 또는 B의 방향으로 을돌이에게 간다. 갑순이는 필요한 경우 암호를 이용하여 비밀문을 열고 반대편으로 갈 수 있다.
- 1~3의 게임을 을돌이가 동의할 때까지 n회 반복한다.
여기에서 갑순이는 비밀문을 열 수 있는 암호를 알고 있으므로 을돌이가 원하는 방향으로 항상 나타날 수 있다. 그러면 을돌이는 자신이 요구하는 방향에서 갑순이가 나타나면 갑순이가 암호를 알고 있다는 것을 얼마나 믿을까? 만일 갑순이가 비밀문의 암호도 모르면서 A 또는 B의 방향을 임의로 선택하여 갔다면 을돌이의 임의의 요구에 맞춰서 나타날 수 있는 확률은 2분의 1밖에 되지 않을 것이다.
그러나 이런 게임을 n회 반복하여 갑순이가 모두 성공적으로 응답을 했다면, 갑순이가 암호를 모르면서 성공할 확률은 n번 모두 우연히 을돌이의 선택과 똑같은 선택을 하는 경우이며, 확률은 1/2n 밖에 되지 않는다. 그러므로 n번 모두 갑순이가 성공했다면 을돌이는 갑순이가 암호를 알고 있다는 것을 높은 확률로 확신하게 된다.
이러한 영지식 증명 프로토콜은 통신 프로토콜에서 사용자가 자신의 비밀정보를 알려주지 않으면서 그것을 알고 있다는 것을 보여주는 목적으로 사용된다. 비밀정보를 알려주지 않으면서 증명을 할 수 있으면 같은 비밀정보를 반복해서 사용할 수 있다. 사용자가 공개키 암호 시스템을 사용하는 경우, 개인키는 자신이 안전하게 보관하면서 공개키는 인증기관으로부터 인증을 받아 오랫동안 사용하게 되는데, 자신의 비밀키는 어떤 경우라도 남에게 보여주지 않아야 한다. 비밀키가 노출된다면 발급된 인증서를 취소하고 새로운 키 쌍을 만들어 인증서를 받아 사용해야 하는데, 이것은 관리적 측면에서도 매우 부담이 큰 과정이다.
원격 서버에 로그인할 때, 사용자는 패스워드를 직접 전송하는 것이 아니라, 공개키 암호 시스템을 이용하여 다음과 같은 질의·응답(challenge-response)방식으로 자신의 신분을 인증할 수 있다.
- 사용자는 서버에 인증을 요청한다.
- 서버는 사용자에게 사용자의 개인키를 이용하여 특정 계산을 해서 응답할 것을 요구한다.
- 사용자는 자신의 개인키를 이용하여 요청된 계산을 수행하여 그 결과를 전송한다.
- 서버는 사용자의 계산이 맞는지 사용자의 공개키를 이용하여 검증한다. 검증이 맞으면 로그인을 허용한다.
사용자는 자신의 개인키를 노출하는 것이 아니므로 반복하여 인증에 사용할 수 있다. 서버는 인증기관에 의해 인증된 공개키를 이용하여 검증을 하므로 사용자의 신분을 확신할 수 있다.
영지식 증명 기법은 두 사용자 간의 상호작용을 통하여 비밀정보를 노출하지 않고도 그 정보를 가지고 있다는 것을 상대방에게 증명하는 방법이다. 복잡한 과정을 거쳐야 하는 프로토콜 수행에서 매 단계가 원래의 약속대로 잘 진행된다는 것을 확신하게 하는 데 이용할 수 있으며, 프로토콜의 건전성·검증성·신뢰성을 보장하기 위한 용도에 사용된다.
이와 같은 기술이 어떻게 Zcash에 사용되느냐
- 장점 : Zcash는 거래가 지불 출처, 목적지 또는 금액을 공개하지 않는 별도의 개인 정보 보호 통화를 제공하는 새로운 유형의 거래를 추가하여 Bitcoin의 프로토콜을 확장 합니다.
- 별도의 통화 : Zcash는 (익명이 아닌) 기본 통화와 함께 존재하는 별도의 익명 통화를 생성합니다.이 통화는 Basecoin이라고 합니다. 각 사용자는 (익명이 아닌) Basecoin를 (익명의) Zcash 로 변환 할 수 있습니다.이 동전은 제로 코인들이라고 명명합니다.
- 사용 : 그런 다음 사용자는 zerocoins를 다른 사용자에게 보내고 자신이 보유한 zerocoins을 분할하거나 병합하여 전체 값을 보존 할 수 있습니다. 사용자는 또한 원칙적으로 이것이 반드시 필요한 것은 아니지만 Zcash를 Basecoin으로 다시 변환 할 수 있습니다. Zcash로 직접 지불이 이루어질 수도 있습니다.
- 기능 : Zerocash의 기능은 Mint transaction과 pour transaction이라는 두 가지 새로운 유형의 거래를 사용하여 실현 됩니다. Bitcoin 트랜잭션과 마찬가지로 Zerocash 트랜잭션은 브로드 캐스트되고 분산 된 원장에 추가됩니다.
- 민트 트랜잭션 : 민트 거래 (mint transaction)는 사용자가 지정된 수의 비 익명의 비트 코인 (일부 Bitcoin 주소에서)을 지정된 Zcash 지갑에 등가로 Zcash으로 변환 할 수있게합니다. 민트 트랜잭션 자체는 동전의 가치, 소유자 주소 및 (고유 한) 일련 번호를 지정하는 새로운 동전 에 대한 암호화 약정으로 구성됩니다 . 약정은 SHA-256 해시 기능 을 기반으로 하며 동전의 가치와 소유자 주소를 숨깁니다.
- Pour 트랜잭션 : Pour 트랜잭션은 zk-SNARK와 영지식증명을 이용하여 수수료를 내서 Private 거래를 하게 해줍니다.
자세한 기술적인 것은 아래에 적어두었습니다.
Reveal spoiler
개별 Zerocash 노드는 지금까지 보았던 모든 코인 약정에 Merkle 트리(해시 트리)를 유지합니다 . 그런 다음 사용자는 코인 을 넣은 소유권을 증명할 수 있습니다. 코인의 약정 된 가치와 트리의 회원 자격에 대해서 간단히 봄으로써 확인할 수 있습니다. 불행히도 이 정보를 단순히 "소유권 증명"으로 게시하는 것은 Private(다크코인의 특성)한게 아닙니다. 대신 개인 정보 보호를 위해 Pour transaction에 의존합니다. 사용자는 영지식증명을 통해 그러한 정보를 알고 있음을 증명할 수 있습니다 .
Pour 트랜잭션은 사용자가 새로운 코인을 생산하기 위해 (이 사용자가 소유 한 코인으로) 수수료를 내서 Private 지불을 할 수 있게합니다. 영지식 증명으로 수수료 제외하고 총량은 변화없이 코인을 변화시킨다.
민트 트랜잭션 (mint transaction)의 경우, 그 안에 포함 된 약정은 누구라도 약정 된 코인이 청구된 가치를 갖는다는 것을 확인할 수 있도록 구성됩니다.
Pour 트랜잭션의 경우, 누구든지 그 안에 포함 된 영지식 증명이 유효하다는 것을 (그리고 다른 몇 가지 단순한 불변성을보유하고 있음을) 확인할 수 있습니다. 그러나 효율성을 위해 Zcash는 "모두" 영 지식 증명을 사용하지는 않으나 , 특히 짧고 검증하기 쉬운 영지식증명인 '영지식 지식의 간결한 비상호적 논쟁'(zero-knowledge Succinct Non-interactive arguments of Knowledge)[zk-SNARK] 시스템을 활용합니다 . 이러한 증명 시스템은 길이가 300 바이트 미만이며 몇 밀리 초 만에 검증 할 수 있습니다.
참고자료및 출처 : http://terms.naver.com/entry.nhn?docId=824737&cid=42344&categoryId=42344(해쉬)
https://ko.wikipedia.org/wiki/%EC%95%94%ED%98%B8%ED%99%94_%ED%95%B4%EC%8B%9C_%ED%95%A8%EC%88%98(암호화 해시 함수)
https://ko.wikipedia.org/wiki/SHA(SHA)
https://www.ddengle.com/blockchain/664314(POW와 POW, 그리고 하드포크에 대하여)
https://www.ddengle.com/index.php?_filter=search&mid=bitdaily_news&search_keyword=nxt&search_target=title&document_srl=619645(POW, POW, POW/POS)
https://cryptojunction.com/glossary/proof-of-importance/(POI)
http://terms.naver.com/entry.nhn?docId=865287&cid=42346&categoryId=42346(Zero-knowledge proof)
http://terms.naver.com/entry.nhn?docId=3432516&cid=58445&categoryId=58445#TABLE_OF_CONTENT4(Zero-knowledge proof)
감사합니다.
wish i could use a translator @maa
ok soon I'll do for you
NAMASTE
Now I post it for you 'oluwoleolaid' :)
Many thanks @maa
즐겨찾기 완료. 항상 애매하게 정리되지 않던 내용들이었는데 maa님께서 깔끔하게 정리해 주셨네요
대단합니다 :)
great work! :)
@maa 잘 보고 갑니다 역시 쵝오!
리스팀 해갑니다!!!!
시간이 많이 지났지만 잘 읽었습니다 감사합니다ㅎㅎ
감사합니다! 잘보고가요~
감사합니다. 좋은 정보를 통해 배워가네요^^
POI POS 정말몰랐었는데 많이 배워갑니다
이해하지 못하는 부분들을 검색하다 몇번 걸려서 들어와 정말...몇번을 정독해서 읽어봤는데요...아직도 이해를 못함..ㅠㅠ 20번정도 더 들어와야 할것 같네요~ 너무 너무 잘봤습니다...
잘 봤습니다 감사합니다
좋은자료 감사합니다. 팔로우 하고 갑니다.