[Xangle Digest]
※해당 컨텐츠는 지난 6월~7월 외부에서 기발간 된 컨텐츠입니다. 컨텐츠에 대한 추가적인 주의사항은 본문 하단에서 확인해주세요.
지난달 31일 비트코인은 탄생 14주년을 맞았다. 2008년 그날 사토시 나카모토가 작성한 백서를 읽어보자.
[목차]
- 서론
- 트랜잭션
- 타임스탬프 서버
- 작업증명(Proof-of-Work)
1. 서론
Commerce on the Internet has come to rely almost exclusively on financial institutions serving as trusted third parties to process electronic payments. While the system works well enough for most transactions, it still suffers from the inherent weaknesses of the trust based model. Completely non-reversible transactions are not really possible, since financial institutions cannot avoid mediating disputes. The cost of mediation increases transaction costs, limiting the minimum practical transaction size and cutting off the possibility for small casual transactions, and there is a broader cost in the loss of ability to make non-reversible payments for non- reversible services. With the possibility of reversal, the need for trust spreads. Merchants must be wary of their customers, hassling them for more information than they would otherwise need. A certain percentage of fraud is accepted as unavoidable. These costs and payment uncertainties can be avoided in person by using physical currency, but no mechanism exists to make payments over a communications channel without a trusted party.
전자 거래를 위해선 제 3자의 개입(trusted third parties)이 필수적입니다. 제 3자는 거래 참여자들의 신뢰(trust)를 확보하고, 이들의 거래 기록을 장부로 남깁니다. 이를 통해, 거래 참여자들은 서로 직접적인 신뢰 관계가 없더라도 제 3자가 보증해 주는 신뢰를 통해 안전하게 거래를 할 수 있게 되죠(the trust-based model).
전자거래에 참여하는 사람들은 ‘내가 누구랑 거래할지는 모르지만 장부는 믿을 수 있다’라는 사실에 동의한다는 겁니다.
이러한 신뢰의 밑바탕엔 거래를 강제할 수 있는 수단이 있습니다. 국가한텐 법이 있듯 결국 이 ‘수단’에 대한 믿음 때문에 모르는 사람과 거래할 수 있게 되는 거죠. 이처럼 신뢰와 제 3자의 권력은 동전의 양면과 같은 존재입니다.
이 ‘수단’은 권력이면서 의무이기도 합니다. 제 3자는 이를 이용해서 거래 당사자 간 분쟁이 발생했을 시 중재하는 역할을 수행해야 하며, 그 과정에서 거래 비용(transaction costs)을 발생시킵니다. 또한, 거래를 중재하기 위해 이미 발생한 거래를 되돌릴 수 있다는 점에서 거래는 가역적(reversible)이게 됩니다.
카드사의 예를 들자면, 문제 발생 방지를 위해 구매자의 지급 능력을 평가하는 것부터, 카드 분실 시 지급을 정지하고 카드를 재발급 하는 것, 분쟁이 발생했을 경우 조정 결과에 따라 지불을 유보하거나 진행 시키는 것 등 카드시스템 구축을 위해 다양한 비용이 발생하게 됩니다.
이처럼 실제 중재를 하기 위해 비용이 발생하기도 하지만, 실제 문제가 발생하지 않았는데도 비용이 발생합니다. 그리고 이렇게 발생한 금전적·사회적 비용은 결국 거래 당사자들에게 전가되고요.
이러한 거래 비용의 증가는 거래 비용 미만의 작은 거래(small casual transcations)를 어렵게 합니다. 아프리카 같은 개발도상국가를 예로 들 수 있습니다. 카드사나 은행 입장에서 보면, 거래 당사자들의 거래에서 얻어지는 수수료보다 금융 시스템을 구축을 위해 들어가는 비용이 더 클 것이기 때문에 적자가 예상되어 금융 시스템 구축을 할 경제적 동기가 생기지 않습니다.
또한, 가역적인 결제 시스템은 비가역적인 용역(non-reversible services)에 본질적으로 맞지 않는 시스템입니다. 넷플릭스를 예로 들 수 있을 텐데요. 악의를 가진 고객이 서비스를 이용한 후 교묘하게 환불을 받더라도, 넷플릭스에서 이미 제공한 서비스는 되돌릴 수가 없습니다. 이를 방지하기 위해 고객의 정보를 필요 이상으로 수집해야 하고, 대응할 절차와 인력도 필요합니다. 그렇게 하더라도 발생하는 손실 분(이미 사용해서 되돌릴 수 없는 서비스)은 금전적·사회적 비용을 초래하게 됩니다.
한 마디로 요약하자면, 현재 전자 결제 시스템엔 제 3자의 개입이 필수적이고, 이러한 개입 때문에 금전적·사회적 비용이 발생한다는 겁니다. 또한, 거래 금액이 커지는 만큼 제 3자가 책임지고 관리할 범위가 늘어나면서, 그만큼 권력도 중앙화됩니다. 도시가 커지는 만큼 관공서 크기도 커지는 것과 같다고 생각하시면 될 것 같습니다.
여기서 모든 문제의 원인이 되는 ‘신뢰 기반’이라는 연결 고리를 끊어, 비용과 중앙화의 문제를 해결하고자 하는 것이 비트코인의 목표입니다.
What is needed is an electronic payment system based on cryptographic proof instead of trust, allowing any two willing parties to transact directly with each other without the need for a trusted third party. Transactions that are computationally impractical to reverse would protect sellers from fraud, and routine escrow mechanisms could easily be implemented to protect buyers. In this paper, we propose a solution to the double-spending problem using a peer-to-peer distributed timestamp server to generate computational proof of the chronological order of transactions. The system is secure as long as honest nodes collectively control more CPU power than any cooperating group of attacker nodes.
비트코인은 앞서 설명한 ‘신뢰’를 거래 참여자들에 의한 암호학적 증명(cryptographic proof)으로 전환한 거래 체계를 말합니다.
거래 참여자들 모두가 스스로 장부를 작성했는데 그 장부가 무결하다면, 신뢰도 필요 없을 것이고, 이러한 신뢰를 담보했던 제 3자의 권력과 의무도 사라질 겁니다. 그리고 당연히 이를 대가로 치렀던 비용도 사라지겠죠.
거래 참여자들이 만드는 장부는 어떻게 믿을 수 있을까요? 먼저, 거래 참여자들의 악의를 제거할 수 있는 방법이 있어야 하고, 그들의 기록 과정이 무결해야 하며, 기록된 장부의 수정이 불가능해야 합니다. 이 세 가지 조건을 달성하기 위해 ‘암호학적 증명’이라는 도구를 사용하는 것이지요.
거래를 시간 순서대로 배열하고, 거래 참여자들이 이를 정직하게 기록하여 보상받고, 암호학적인 방식을 활용해 비가역적인 형태로 구성할 수 있는 공유 장부 시스템(peer-to-peer distributed timestamp server)이 바로 신뢰를 대체할 암호학적 증명, 다시 말해 비트코인입니다.
2. 트랜잭션
We define an electronic coin as a chain of digital signatures. Each owner transfers the coin to the next by digitally signing a hash of the previous transaction and the public key of the next owner and adding these to the end of the coin. A payee can verify the signatures to verify the chain of ownership.
전자 화폐란 전자 서명 체인(a chain of digital signatures)입니다. 전자 화폐는 전자 서명으로 지불을 할 수 있으며, 이러한 전자 서명이 연결된 구조라는 겁니다. 그렇다면 전자 서명으로 어떻게 지불을 한다는 걸까요? 연결된 구조라는 건 무슨 의미일까요?
물리적인 세계에선 지갑에 보유하고 있는 화폐를 내가 상대방에게 건넴으로써 지불 행위가 이뤄집니다. 전자 화폐는 물리적인 존재가 없으므로, 지불을 위해선 두 가지가 충족되어야 합니다. 이해를 위해 물리적인 화폐 지불 상황과 대칭 시켜 보겠습니다.
- 내가 상대방에게 건넴: 거래가 나에 의해 만들어졌다는 인증이 필요
- 지갑에 보유: 전자 화폐를 내가 보유하고 있었다는 소유권이 있음
인증의 경우, 비대칭 암호 방식을 활용한 전자 서명을 통해 가능합니다. 비대칭 암호 방식의 원리에 대해 간단하게 설명드리자면:
- 비공개키-공개키가 쌍으로 존재한다(a-a’).
- 비공개키(a), 공개키(a’)로 각각 문서를 암호화할 수 있다.
- 비공개키(a)로 암호화된 문서는 공개키(a’)로, 공개키(a’)로 암호화된 문서는 비공개키(a)로 복호화 할 수 있다.
- 비공개키(a)는 소유자 본인만 알고 있으며, 공개키(a’)는 모든 사람이 알 수 있도록 공유된다.
자 이런 비대칭 암호 방식을 이해한 채로 A가 B에게 송금을 하는 상황을 가정해 보겠습니다:
- A는 거래 내역(‘A가 B에게 n을 보냄’)을 본인의 비공개키(a)로 암호화한다.
- B는 거래 내역을 받아 A의 공개키(a’)로 복호화 한다.
2에서 거래 내역이 A의 공개키로 복호화가 된다면, 해당 거래 내역은 A에 의해서 만들어진 것임을 알 수 있습니다. A의 공개키가 아닌 다른 공개키로는 해당 거래 내역 복호화가 불가능하기 때문이죠.
그렇다면 애당초 A의 소유권은 어떻게 증명할까요? A가 타인으로부터 받았던 거래 내역이 곧 소유권이 됩니다. 수많은 거래가 기록된 가상의 장부엔 ‘X가 A에게 n만큼을 보냄’이라는 기록이 있을 것이고, 이후 A가 n을 소비하지 않았다면 A는 장부에 기록된 거래 중 n만큼의 소유권을 주장할 수 있는 겁니다.
그런데 앞에서 거래 내역은 어떻게 생성된다고 했죠? 바로 전자 서명을 통해 생성됩니다. A는 B에게 n만큼을 보낸 후 전자 서명을 하고, B는 C에게 m만큼을 보낸 후 전자 서명을 하고, 이러한 거래 내역들이 연결된 구조가 바로 전자 서명 체인(a chain of digital signatures)이라는 겁니다.
재밌는 건, 여기서 전자 화폐 자체는 실제 화폐처럼 움직이지 않았다는 겁니다. 장부 상에 소유권만 움직인 것이죠. 한 마디로, 전자 화폐에서 지불이란 ‘장부 상에서 내가 소유권을 가진 부분을 타인에게 넘기는 과정’입니다.
The problem of course is the payee can’t verify that one of the owners did not double-spend the coin. A common solution is to introduce a trusted central authority, or mint, that checks every transaction for double spending. After each transaction, the coin must be returned to the mint to issue a new coin, and only coins issued directly from the mint are trusted not to be double-spent. The problem with this solution is that the fate of the entire money system depends on the company running the mint, with every transaction having to go through them, just like a bank.
We need a way for the payee to know that the previous owners did not sign any earlier transactions. For our purposes, the earliest transaction is the one that counts, so we don’t care about later attempts to double-spend. The only way to confirm the absence of a transaction is to be aware of all transactions. In the mint based model, the mint was aware of all transactions and decided which arrived first. To accomplish this without a trusted party, transactions must be publicly announced [1], and we need a system for participants to agree on a single history of the order in which they were received. The payee needs proof that at the time of each transaction, the majority of nodes agreed it was the first received.
그런데 이러한 전자 화폐 시스템에서 A가 n만큼의 전자 화폐에 대해 ‘A가 B에게’, ‘A가 C에게’, ‘A가 D에게’ 등 여러 사람에게 지불을 한다면 어떻게 될까요? 해당 메세지를 받은 B, C, D 모두 자기가 돈을 받았다고 할 건데 누구의 손을 들어줘야 할까요? 이처럼 송신자가 악의를 갖고 여러 사람에게 지불하는 것을 이중지불(double-spend)이라 합니다.
이와 같은 이중지불 문제를 해결하기 중앙화된 주체가 거래를 검증하는 과정을 추가할 순 있습니다. 좀 더 자세히 단계 별로 설명하자면:
- A가 거래 내역에 전자 서명한 후 중앙 기관에 거래 내역을 송신
- 중앙 기관은 A의 공개키로 소유권을 확인
- 새롭게 생성된 거래 내역과 장부에 기록된 거래 내역 전체를 대조하여 이중 지불이 발생하지 않았는지 확인
- B에게 송금
이중지불을 막는 가장 확실한 방법은, 가장 빠르게 들어온 거래(the earliest transaction)만 인정하고 나머지는 무시하는 것입니다. ‘A가 B에게’, ‘A가 C에게’, ‘A가 D에게’라는 거래가 들어온다면, 시간 상 가장 앞선 하나의 거래를 인정한다는 것이죠. 이를 위해선 모든 거래가 기록에 남아야 합니다. 그런데, 이 과정을 중앙화된 주체에 맡기면 결국 기존 시스템과 다를 게 없습니다.
거래를 기록하고, 검증하는 과정을 탈중앙화 하려면, 몇 가지 해결 과제가 있습니다. 먼저, 모든 거래 내역이 공개적으로 알려져야 하고(publicly announced), 해당 시스템의 참여자들 다수가 무결한 하나의 기록에 동의(agree on a single history) 해야 합니다. 기존 시스템은 거래 내역이 비공개되어 있으며, 중앙화된 기관에 의해서만 기록되었죠? 여기서부터 탈중앙화가 시작되는 겁니다.
3. 타임스탬프 서버
앞서 탈중앙화 된 장부를 만들기 위해선 모든 거래 내역이 공개적으로 알려져야 하고(publicly announced), 해당 시스템의 참여자들 다수가 무결한 하나의 기록에 동의(agree on a single history) 해야 한다고 설명드린 바 있습니다. 이를 달성하기 위한 솔루션으로 먼저 Timestamp Server가 나옵니다.
The solution we propose begins with a timestamp server. A timestamp server works by taking a hash of a block of items to be timestamped and widely publishing the hash, such as in a newspaper or Usenet post [2–5]. The timestamp proves that the data must have existed at the time, obviously, in order to get into the hash. Each timestamp includes the previous timestamp in its hash, forming a chain, with each additional timestamp reinforcing the ones before it.
Timestamp Server 설명에 앞서 해싱에 대한 이해가 필요할 것 같습니다. 해싱은 암호화 방식이자 데이터 처리 방식이기도 합니다. 일단 용어 정리부터 하자면:
- 해싱: 데이터를 암호화 처리하여 해시(값)를 추출하는 과정
- 해시(값): 데이터가 암호화 처리되어 나온 결과
- 해싱함수: 해싱을 하기 위해 사용한 함수
그리고 해시에는 몇 가지 특징이 있습니다:
- 어떤 데이터든 특정 길이의 문자열로 치환됨
- 데이터가 변하면 해시값은 무작위로 변한다(눈사태 효과)
- 해시로부터 원본 데이터를 복원하는 것은 불가능하다(비가역성)
1번의 특징 때문에 해시는 데이터 처리 방식으로 용이하며, 2번, 3번 특징 때문에 데이터를 보호할 수 있는 암호화 처리 방식이 될 수 있습니다.
여기까지 이해가 되셨나요? 이제 앞선 챕터에서 나왔던 그림을 완전히 이해할 수 있게 되었습니다. 전자 화폐에서 지불을 한다는 건, 이전 거래의 해시(Hash)와 수신인의 주소(Public Key)를 해싱하여 비공개키로 서명하는 행위인 겁니다!
그렇다면, 이러한 데이터에 시간(Timestamp)을 포함 시키면 어떻게 될까요? 데이터와 시간이 해싱 되어 나온 해시가 다음 데이터에 포함되는 방식이 앞으로 계속 반복될 겁니다.
앞서 데이터가 변하면 해시값이 무작위로 변한다고 설명드렸었는데요. 만약 누군가가 장부에 기록된 특정 데이터의 Timestamp를 바꾼다면 이후 생성된 모든 해시값이 다 변할 겁니다. 추후에 설명드릴 테지만, 이렇게 변조된 내역은 장부에서 탈락됩니다.
Timestamp Server는 거래 내역들의 묶음(Block)을 Timestamp와 함께 해싱하여 기록한 공간입니다. 그리고 이 공간은 신문처럼 누구나 열람할 수 있습니다.
누군가 신문에 어떤 내용을 싣는다는 가정을 해보겠습니다. 신문에 정보를 올리는 사람은 시간과 비용을 들이면서 정보를 올렸을 것이고, 그 사실을 아는 독자들은 해당 정보가 충분히 믿을만한 것으로 간주할 겁니다. 해당 정보를 접한 구독자들(구성원)끼리는 그 정보를 이제 서로 아는 정보로 생각하고 얘기할 겁니다. ‘XXX가 파산했다더라’, ‘부동산 담보 대출이 힘들어진 대더라’라는 식으로 말이죠.
이처럼 공개적인 공간에 기록되는 정보는 누구나 열람할 수 있기 때문에 조작이 어렵고, 공표되는 순간 구성원 전체가 본다는 전제가 있기 때문에 사후에 수정하기가 매우 어렵습니다.
해싱 기술을 활용한 정보를 공개된 공간에 기록하여 비가역적이고 탈중앙화 된 장부를 만들었습니다. 하지만 누군가 처음부터 악의를 갖고 잘못된 정보를 올린다면요? 공개된 공간이라고 한들, 잘못된 정보가 올라가는 순간 해당 장부는 아무도 택하지 않을 겁니다.
4. 작업증명(Proof-of-Work)
장부를 탈중앙화 하기 위한 두 가지 조건이 있습니다. 첫 번째는 장부가 신문처럼 공개되어야 한다는 것, 두 번째는 그 기록 과정이 무결해야 한다는 것입니다.
앞서 우리는 장부를 어떻게 공개하는지, 어떤 이점이 있는지 살펴봤습니다. 그렇다면 장부의 무결성은 어떻게 달성할 수 있을까요?
장부가 무결하다는 것은 두 가지를 의미로 쪼개 볼 수 있습니다. 첫 번째는 기록하는 사람의 악의가 없다는 것, 두 번째는 그러한 기록에 참여자 다수가 동의해야 한다는 것입니다.
To implement a distributed timestamp server on a peer-to-peer basis, we will need to use a proof-of-work system similar to Adam Back’s Hashcash [6], rather than newspaper or Usenet posts. The proof-of-work involves scanning for a value that when hashed, such as with SHA-256, the hash begins with a number of zero bits. The average work required is exponential in the number of zero bits required and can be verified by executing a single hash.
For our timestamp network, we implement the proof-of-work by incrementing a nonce in the block until a value is found that gives the block’s hash the required zero bits. Once the CPU effort has been expended to make it satisfy the proof-of-work, the block cannot be changed without redoing the work. As later blocks are chained after it, the work to change the block would include redoing all the blocks after it.
논스(Nonce)의 역할부터 얘기를 시작해 볼까 합니다. 글을 다 읽고 논스가 왜 필요한 지 이해가 되신다면, PoW에 대해 충분히 이해했다고 볼 수 있을 것 같습니다.
앞서 Timestamp Server(이하 ‘블록체인’)는 Timestamp가 포함된 거래 내역들(이하 ‘블록’)을 해싱 한 후 엮은 구조란 것을 설명드렸습니다. 그런데 이 블록에 왜 논스를 집어넣을까요? 거래 기록만 넣어도 아까운 용량일 텐데 말이죠.
블록에는 논스가 포함되어 있습니다.
자, 우리는 앞서 해싱에 대해 간단히 살펴봤습니다. 원본 데이터가 변하면 해싱 후의 해싱값도 무작위로 변한다는 것도 알고 있죠(산사태 효과). 그렇다면, 블록(데이터)에 포함되어 있는 논스가 변하면요? 해당 블록을 해싱한 해싱값도 무작위로 변할 겁니다.
이 블록에 포함되어 있는 논스를 하나씩 바꿔가면서(incrementing a nonce in the block) 특정 해시값을 추출하는 게 바로 Proof-of-Work(이하 ‘PoW’)입니다
구체적으로 노드(node)는 논스를 하나씩 올리면서(1, 2, 3, 4…) 특정 해시(예: 앞자리 수 10개가 0으로 시작하는 해시)를 만들어야 합니다. 해시를 찾아내는 데에 성공하면, 블록체인으로 올라가고, 해당 블록의 해시값은 다시 다음 블록의 일부가 되고, 위의 과정이 반복됩니다.
개별 노드의 입장에서 보자면, 이렇게 논스를 계속 바꿔가면서 만들어진 블록을 바꾸는 것은 거의 불가능합니다. 먼저, 해당 블록만 바꾸려고 해도, 사용된 CPU 파워(CPU effort) 만큼의 비용과 시간을 다시 투여해야 합니다.
그런데 그 작업을 하는 사이에 해당 블록이 다음 블록과 이어져 체인을 형성하면, 블록은 이전 블록의 해시를 포함하기 때문에, 해당 블록 이후의 모든 블록들(all the blocks after it)을 다 바꿔야 합니다.
The proof-of-work also solves the problem of determining representation in majority decision making. If the majority were based on one-IP-address-one-vote, it could be subverted by anyone able to allocate many IPs. Proof-of-work is essentially one-CPU-one-vote. The majority decision is represented by the longest chain, which has the greatest proof-of-work effort invested in it. If a majority of CPU power is controlled by honest nodes, the honest chain will grow the fastest and outpace any competing chains. To modify a past block, an attacker would have to redo the proof-of-work of the block and all blocks after it and then catch up with and surpass the work of the honest nodes. We will show later that the probability of a slower attacker catching up diminishes exponentially as subsequent blocks are added.
To compensate for increasing hardware speed and varying interest in running nodes over time, the proof-of-work difficulty is determined by a moving average targeting an average number of blocks per hour. If they’re generated too fast, the difficulty increases.
이번엔 다수의 노드들을 상정해 봅시다. 노드들이 PoW에 열심히 참여해서 체인이 만들어지고 있습니다. 그런데, 모종의 이유로 블록의 기록이 나눠질 수가 있습니다(동시에 논스를 찾았을 때). 이렇게 분기가 생기게 되면, 노드들은 어떤 쪽으로 이어나갈지 투표를 해야 할 텐데요.
만약 투표의 기준이 IP 당 한 개(one-IP-address-one-vote)라면, 너무나 조작이 쉬울 겁니다. 하지만 PoW에선 컴퓨팅 파워에 비례하여 투표권(one-CPU-one-vote)을 행사할 수 있습니다. 컴퓨팅 파워가 많을수록 더 빨리 블록을 만들 수 있기 때문이죠. 이를 통해, 많은 컴퓨팅 파워를 가진 쪽이 체인을 계속 이어나가게 되고, 선택되지 않은 체인(컴퓨팅 파워가 부족한 체인)은 더 이상 블록이 이어지지 않아 자동으로 폐기가 됩니다.
이를 통해 가장 긴 체인엔 가장 많은 컴퓨팅 파워가 투입되었음을 유추할 수 있습니다. 다시 말해, ‘가장 긴 체인=다수에 의해 선택된 장부’라는 것이죠.
그리고 정직한 기록을 하려는 노드들(honest nodes)이 이러한 컴퓨팅 파워의 대다수를 차지한다면, 정직한 체인(the honest chain)이 가장 빠르게 성장하고 유일하게 살아남을 겁니다.
여기까지 이해한 내용들을 정리해 보겠습니다:
- PoW 시스템에선 블록 생성을 위해 컴퓨팅 파워를 소모한다.
- 블록이 동시에 생성되어 체인이 갈라질 경우, 결국 더 빨리 블록이 이어지는 체인 하나만 살아남는다.
- 가장 긴 체인은 가장 많은 컴퓨팅 파워가 소모되었음을 의미한다.
- 해당 체인의 기록을 바꾸는 것은 사실상 불가능하다.
여기서 ‘컴퓨팅 파워’만 ‘투표권’으로 바꾸면, ‘가장 긴 체인=가장 많은 투표를 받은 유일한 장부’라는 것을 알 수 있습니다. 서두에 말씀드렸던 ‘다수에 의한 단일한 장부’는 이처럼 PoW라는 기록 방식을 통해 구현이 가능합니다.
PoW의 기능은 여기서 그치지 않습니다.
비트코인은 블록 생성 시간을 상수로 두고, 컴퓨팅 파워의 변화에 따라 난이도를 조절 시킵니다. 컴퓨팅 파워는 세월이 지나면 점점 증가할 것이기 때문에, 자연스럽게 난이도도 증가하게 됩니다. 이를 통해 목표한 비트코인 발행량을 유지할 수 있게 되죠.
다른 문제들과 마찬가지로, PoW도 역시 특정 해시를 찾는 난이도(문제)와 논스(답)가 핵심입니다. 이제 논스가 왜 필요한지 이해가 되셨나요?
그런데 아직 해결하지 못 한 과제가 있습니다. 정직한 노드들이 컴퓨팅 파워의 대부분을 차지하게 하려면 어떻게 해야 할까요? 다시 말해서, 노드들의 악의를 어떻게 제거할 수 있을까요? (하)편에서 이어 설명드리겠습니다.
-> '비트코인 백서 읽기(상)' 원문 보러가기