2024. 6. 5. 18:00ㆍ@dev.formegusto
습관처럼 하는 말 중에서 강한 힘을 발휘하는 문장이 있으신가요? 저는 "이거는 하게 될 일 없겠다." 가 있는데요. 프로그래밍과 인공지능 그리고 블록체인이라는 기술을 처음 만났을 때, 이런 말을 하곤 했었답니다. 한번 입 밖으로 꺼낸 이 문장은 자의식이 아닌 노력으로 시작해서 재미를 느끼는 순간들을 맞이하게 해줬는데요. 감사함과 억울함을 동시에 내포한 애증의 문장입니다. 이렇게 보니, 소프트웨어 공학을 알아갈수록 만나게 되는 기술들과의 필연적인 만남을 알리는 문장일지도 모르겠네요. 😌😌
🪙 Learning Point
- Blockchain Overview
- Bitcoin Paper Review
제가 경험한 신기술 중에서 블록체인은 가장 독특했던 것 같아요. 타 신기술인 IoT는 센서, 딥러닝은 신경망과 같이 명확한 특징을 가지고 있는데, 블록체인은 여러 기술의 집합체로 구성되어 있어, 아직까지도 많은 의문을 불러일으키는 분야로 보이기만 합니다. 그러나 개발의 관점에서 보았을 때, 자료구조, 암호화 그리고 네트워킹 등의 다양한 구현 경험을 가져다 줬던 걸로도 기억하는데요. 이번 스터디에서는 현대 블록체인 실용화의 시작점에 있는 비트코인의 구성요소를 개념부터 구현까지 진행해 보면서 개발 스펙트럼을 함께 넓혀보도록 하겠습니다. 😎😎
🗃️ Blockchain Overview
블록체인이라는 개념의 기술적인 면은 생소할지 몰라도, 디지털 화폐 분야에서의 비트코인이나 이더리움이라는 단어는 매스컴을 통해 익히 들어보셨을 거라고 생각하는데요. 이러한 점에서 우리는 블록체인이 금융의 주제를 중점으로 발전한 기술이라는 것을 알 수 있습니다.
개인의 자산이 관리 및 거래되는 금융 분야에서의 주요 관심사는 아무래도 보안과 관련된 부분 일텐데요. 해당 영역은 기밀성과 무결성 그리고 가용성의 특징으로 구분지어 전반적인 배경을 설명할 수 있으며, 이에 맞는 기술과 신뢰도를 보유한 기관을 통해 안전한 제어가 이루어 질 수 있습니다. 그럼에도 소비자 입장에서는 타인이 관리한다는 점이 불가피한 불안감을 조성 시키는데요. 블록체인은 이를 해결하기 위한 데이터베이스 시스템을 제안합니다.
블록체인의 데이터 단위인 블록에 입력되는 주요 데이터는 화폐 발행 혹은 거래 정보를 포함한 트랜잭션 입니다. 각 트랜잭션은 사용자가 직접 관리하기를 기대하는, 고유 비대칭키를 사용한 인증 방식으로 기밀성을 갖춥니다.
블록체인의 저장 구조는 블록과 블록이 해시 암호화로 연결된 리스트 형태를 가지는데요. 이는 암호학적인 방법으로 데이터 간의 연쇄적인 연관성을 부여한 자료구조를 형성하고, 수정과 삭제에 대한 민감도를 높여 무결성을 보장합니다.
블록체인의 데이터는 특정 신뢰 기관이 아닌 참여형 네트워크 방식으로 유지됩니다. 모든 네트워크 참여자는 동일한 데이터베이스를 보유한 서버 역할을 하게 되며, 네트워크 상의 모든 활동을 공유하여 기밀성과 무결성을 더욱 강화하고, 분산형 인프라가 가지는 가용성의 장점을 보장합니다.
이러한 블록체인의 기술적 목표는 보안성, 탈중앙성 그리고 확장성, 세 가지로 구성되는데요. 정보보호의 3원칙과 연관 지어, 보안성은 기밀성과 무결성, 탈중앙성은 가용성과 관련을 가질 수 있고, 확장성은 블록체인 시스템의 기능 혹은 네트워크가 확장되었을 경우의 전체적인 성능을 다룹니다.
해당 목표들은 아주 단단한 상충관계를 가지고 있어요. 대표적인 예시로는, 보안성과 탈중앙성을 강하게 갖춘 시스템에서는 확장성 저하가 나타나고, 확장성이 높은 시스템에서는 보안성 혹은 탈중앙성이 어느 정도 희생되어야하는 등과 같은 현상이 있으며, 트릴레마(Trilemma) 문제의 특징을 가집니다.
그렇기에 굉장히 극복하기 어려운 문제이지만, 지난 몇 년 사이에 블록체인의 기술적 가치는 많은 인정과 관심을 받았고, 블록체인 분야에서의 훌륭하신 기술자분들이 각자만의 접근 방식으로 솔루션을 제안하고 발전시켜 나가고 있습니다. 앞으로도 계속 써내려가질 블록체인의 발전사를 재미있게 경험하려면, 어느정도 지식을 갖추고 있으면 좋을 것 같아요.
그래서 블록체인 기술의 개념을 정립하고 실현화한 대표적인 사례인 비트코인을 살펴보려고 합니다. 2008년, 사토시 나카모토 님의 "Bitcoin: A Peer-to-Peer Electronic Cash System" 에서 소개되었으며, 이후 등장한 많은 블록체인 플랫폼들에게 영감을 주었는데요. 옛날엔 읽다가 덮어버린 자료인데, 이번에는 성공적으로 읽을 수 있기를 희망하며 리뷰 시작해 보겠습니다. 🍀🍀
📰 Bitcoin Paper Review
🏦 Abstract, Introduction
We propose a solution to the double-spending problem using a peer-to-peer network.
비트코인은 개인 대 개인 온라인 거래 솔루션 입니다. 신뢰 기관의 중앙 제어를 통해 이루어지는 기존 신뢰 기반 온라인 거래 모델의 가역성 혹은 불확실성 문제를 지적하고, 이를 해결하기 위한 비트코인의 접근법을 아래와 같이 설명합니다.
- 암호학적 증명 (Cryptographic proof)
- 분산 타임스탬프 서버 (Distriubuted timestamp server)
위 특징을 통해 완전한 개인 대 개인 온라인 거래를 실현하고, 거래 시간순의 제 삼자 예치 방법인, 전산적 증명 메커니즘을 포함시켜 철회 불가능한 시스템을 구성함으로써 송금자와 수금자를 보호합니다.
요약과 서론에서는 보편적인 서버 운영 관리 방법인 중앙 집권식 구조에서 제공되는 온라인 거래 서비스의 문제점에 대응하기 위한 비트코인 블록체인의 보안성과 탈중앙성의 목표를 갖춘 전반적인 시스템 구조를 파악할 수 있는데요. 해당의 내용을 구체화하는 본론의 내용으로 들어가보도록 하겠습니다. 🏃🏻🏃🏻
🤝🏻 Transactions
We defined a electronic coin as a chain of digital signatures.
"본론:Transactions"에서는 비트코인의 화폐 형태를 다음의 주요 정보를 포함한 트랜잭션 데이터 그리고 유통 방법을 전자서명체인 메커니즘으로 설명합니다.
- 공개키 (Public key)
- 해시값 (Hash)
- 전자서명 (Signature)
각 화폐의 소유자는 직전 거래와 다음 소유자의 공개키를 해시 처리한 값에 전자서명을 진행하고, 화폐 끝에 추가해 송금하며, 수금자는 서명을 검증해 화폐 소유권을 확인하고 주장할 수 있습니다.
트랜잭션이라는 데이터가 비트코인에서 화폐의 가치를 가지는 데이터로 파악할 수 있는 부분인데요. 현재 주인을 명시하는 공개키와 직전 화폐 주인의 트랜잭션을 해싱하고, 여기에 전자서명을 포함시킨 형태로 소유권이 양도되는 특징을 가지고 있습니다.
/** A Local */
// Remittance Information
const welcomeTransaction: Transaction = {
owner: newBPublicKey,
prevTransaction: ATransaction,
};
// Hashing
const hash = createHash(welcomeTransaction);
welcomeTransaction["hash"] = hash;
// Digital Signature
const signature = sign(welcomeTransaction["hash"], APrivateKey);
welcomeTransaction["signature"] = signature;
/** newB Local */
// Identify
const owner = welcomeTransaction["owner"];
console.log(owner); // new B Public Key
// verify
const isVerify = verify(welcomeTransaction, APublicKey);
console.log(isVerify); // true
그 중에서 공개키와 전자서명에 사용되는 개인키는 비대칭키 암호화 알고리즘의 구성요소로, 온라인 상에서 공개키만을 공개하고 개인키는 은닉시켜 송신된 데이터에 대한 식별 및 검증 체계를 구축할 수 있게 해줍니다.
공개키와 직전 화폐 주인의 트랜잭션을 해싱하는 작업은 현재 데이터에 "이전 데이터 다음" 이라는 의미를 암호학적으로 연관되게 하여, 데이터의 순서를 보장하는 데에 의미를 가집니다. 이렇게 되면 가장 앞서 있는 트랜잭션만이 거래에서 사용할 수 있는 유일한 데이터가 되고, 뒤 따르는 거래 시도를 무시하여 이중 지급 방지책이 될 수 있을 것 같네요.
To accomplish this without a trusted party, transactions must be publicly announced, and we need a system for participants to agree on a single history of the order in which they were received.
그러나 신뢰 기관의 역할은 이렇게 쉽게 대체되지 않는 것 같은데요. 이중 지급 문제와 같은 신뢰성의 빈자리를 채워나가기 위한 이야기 전개를 "공개적으로 알리는", "합의하는 시스템"과 같은 키워드를 통해 예고합니다.
🕰️ 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.
"본론:Timestamp Server"에서는 블록체인 네트워크 메커니즘의 기초를 정의하며, 이에 포함되는 타임스탬프 서버의 역할을 아래와 같이 설명합니다.
- 타임스탬프 작업이 완료된 과거 블록의 해시값을 로드
- 해시값과 새 블록에 입력할 항목을 병합하여 해시 처리
- 새롭게 생성된 블록을 네트워크에 배포
각 타임스탬프 작업은 이전 타임스탬프 작업의 해시값과 블록에 포함시킬 데이터를 함께 해시처리하여 시간적 흐름을 증명하고, 이는 암호화 기반의 체인을 형성하여 강화됩니다.
전체적인 내용으로 보아 타임스탬프 서버는 참여자들의 컴퓨팅 노드로 해석할 수 있을 것 같습니다. 여기서의 핵심은 블록체인의 "블록"과 "체인" 그리고 "네트워크"의 포괄적인 개념이 등장했다는 것 인데요.
const block = {
prevHash,
items: [item1, item2],
};
const hash = createHash(block);
블록은 어떠한 항목을 담고 있는 데이터로 설명되어 있고, 체인은 새롭게 생성하려는 현재 블록에 가장 최신 블록의 해시값을 포함시켜 해싱하는 작업을 이야기 하고 있습니다.
const msg = "hello";
const badMsg = "bello";
// Only Verify
const hash1 = createHash(msg);
console.log(verify(hash1, msg)); // true
console.log(verify(hash1, badMsg)); // false
// Sensitive Output
const hash2 = createHash(badMsg);
console.log(hash1); // 5aa762ae383fbb727af3c7a36d4940a5b8c40a989452d2304fc958ff3f354e7a
console.log(hash2); // 9488aec7343e9f1ee51fb33bfa89b704171923f3e38e33d217011ecc1a4f25dd
여기서도 트랜잭션 섹션에서 언급된 해시 암호화가 등장했습니다. 그 만큼 시스템의 주요 개념인 것 같아요. 해당 암호화의 독특한 점을 설명드리자면, 암호문에 대한 복호화는 불가능하고 검증만 가능하며, 입력값에 따라 민감하게 출력값이 변화한다는 특징을 가지고 있습니다.
이를 블록체인에서는 변조된 데이터를 쉽게 파악할 수 있도록 시퀀스 자료구조 형성에 응용하였는데요. 앞서 언급한 트랜잭션과 마찬가지로, 데이터 구조 자체로 검증이 가능하도록 설계하여 거래의 순서와 같은 정보의 무결성을 보장합니다.
또한, 생성된 블록의 해시는 네트워크에 배포되어 참여자들이 다음 블록을 생성할 수 있도록 한다는 점에서, 신뢰 기관이 보장해주던 보안과 가용성을 네트워크 참여자들의 협업을 통해 보완해 나간다는 점도 알 수 있습니다.
⛏️ Proof-of-Work
The proof-of-work involves scanning for a value that wen hashed, such as with SHA-256, the hash begins with a number of zero bits.
"본론:Proof-of-Work" 에서는 블록체인 데이터 무결성을 더욱 강화시키기 위하여 작업증명이라는 알고리즘을 제안하며, 이를 진행하기 위해 블록에 포함되는 항목을 다음과 같이 정의합니다.
- 직전 블록의 해시 (Prev Hash)
- 임시값 (Nonce)
- 거래 (Tx)
블록의 해시에 필요한 zero-bits를 주는 값이 발견될 때 까지 블록 안에 임시값을 증분하는 것으로 작업증명을 구현했습니다. 블록의 해시값은 내부 정보를 변경할 경우에 해당 작업을 재수행 해야하며, 뒤에 이어진 블록의 해시도 재구성해야 하는 연산까지 포함 합니다.
익명의 사용자들을 대상으로 하는 블록체인의 참여형 분산 네트워크 환경에서는 다양한 성향의 참여자가 존재할 것 인데요. 제안된 작업증명은 악의적인 성향의 참여자로부터 데이터를 보호하기 위한 알고리즘입니다.
/** Target Hash Value is 00000~ */
const REQUIRED_ZERO_BITS = 5;
const TARGET_ZERO_BITS = "0".repeat(REQUIRED_ZERO_BITS);
const block = {
prevHash,
nonce: 0,
transactions: [transaction1, transaction2, transaction3, transaction4],
};
/** Try */
block["nonce"] = 1;
const bits1 = convertBits(createHash(block)); // 0010011101~
console.log(hashBits1.startsWith(TARGET_ZERO_BITS)); // false = fail,,
block["nonce"] = 35;
const bits35 = convertBits(createHash(block)); // 0000001010~
console.log(hashBits35.startsWith(TARGET_ZERO_BITS)); // true = Success!!
알고리즘의 메커니즘은 간단합니다. 네트워크에 배포된 생성 타겟 블록에서 요구하는 갯수만큼, zero-bits를 가지는 해시값을 찾으면 되는데요. 항목에 포함되는 임시값 변수를 수정하는 방식으로 진행할 수 있습니다.
while (true) {
const bits = convertBits(createHash(block));
if (bits.startsWith(TARGET_ZERO_BITS)) break;
block["nonce"]++;
}
해시 암호화는 앞서 설명한 것처럼, 입력값에 따라 출력값이 민감하게 변화하는 특징을 가지고 있어, 적절한 해시를 출력하기 위한 임시값을 예측하는 것은 어렵습니다. 그래서 작업증명 수행은 0부터 하나씩 증분시키는 것 말고는 마땅한 접근 방법이 없는데요.
반복적인 증분 프로세스의 연산량은 요구되는 zero-bits에 따라 기하급수적으로 증가될 것 이며, 자연스럽게 컴퓨팅 파워에 기반이 되는 전기 에너지 소모도 무시하지 못 할 정도로 높아질 것 입니다.
이렇듯, 실물 자원의 사용이 저극 동원되는 하드웨어 연산 기반 메커니즘인 작업증명은 소프트웨어 기반 시스템에 비해 조작된 행동을 취하기가 어려워, 모든 참여자들에게 공정한 블록 생성 기회를 제공할 수 있게 됩니다.
작업증명을 통해 생성된 블록은 더욱 강화된 시퀀스 연결을 실현시키며, 블록체인 데이터가 기존에 가지던 민감한 변조 탐지를 넘어서, 수정과 삭제 자체가 어려운 자료구조를 형성하게 되는데요.
해당 자료구조는 정직한 노드 혹은 집단이 네트워크 환경에서 컴퓨팅 파워의 주도권을 차지하고 있다는 전제 조건이 갖추어지면, 참여자들이 가장 긴 체인을 신뢰할 수 있는 데이터로 식별하고 유지할 수 있는 체계를 구축할 수 있게 합니다.
또한, 저자님은 참여자의 증가와 CPU 성능 발전에 따른 시스템의 지속가능성도 고려하여, 평균 블록 생성 시간을 유지하기 위해 요구되는 zero-bits의 값이 증가하거나 감소하도록 하는, 난이도 조절 개념을 추가합니다.
📢 Network
Nodes always consider the logenst chain to be the correct one and will keep working on extending it.
"본론:Network"에서는 블록체인 네트워크의 각 노드가 데이터의 유지와 작업증명을 수행하는 방법을 Transactions, Timestamp Server, Proof-of-Work에서 정의한 개념을 기반으로 하여, 6개의 단계로 설명합니다.
-
Transaction:Broadcast
특정 노드에서 트랜잭션이 발생하면 모든 참여 노드에게 이를 전송합니다.
-
Transaction:Collect
트랜잭션 수신 노드는 자신의 블록에 저장하며, 모든 네트워크 참여자가 동일한 데이터를 유지하도록 합니다.
-
Proof-of-Work
현재 타겟 블록의 항목과 이전 블록의 해시값을 병합하고 작업증명을 진행합니다.
-
Block:Broadcast
적절한 임시값을 찾은 노드는, 이를 포함한 블록을 모든 참여 노드에게 전송합니다.
-
Block:Verification
블록 데이터 수신 노드는 포함된 모든 항목의 유효성을 검증합니다.
-
Block:Chaining
검증까지 원활하게 수행하였다면 블록을 채택하여 체인에 연결하고, 다음 블록을 생성 하는 작업을 계속해서 진행합니다.
블록체인 네트워크 상에서는 거래 및 블록 데이터를 전파하는 방식으로 개인 대 개인 거래가 진행되는 것을 알 수 있는데요. 거래의 사실을 네트워크 참여자들에게 알림으로써, 다수의 증인과 데이터 유지력을 확보합니다. 그러나 참여자가 많아짐에 따라 발생할 수 있는 많은 예외 상황에 대비해야 할텐데요.
우선, 두 개 이상의 올바른 블록이 전파되고 채택된 충돌 상황의 경우에는, 체인 흐름에 블록별 분기를 만들고 이후에 더 길어지는 분기의 체인을 메인으로 전환시키는 방식을 통해 해결합니다.
또한, 불특정한 노드별 통신 성능에 대비하여 거래 및 블록 데이터의 수신 누락을 허용합니다. 블록의 검증 작업은 해시가 잘 이루어졌는지를 주요하게 확인 할 것 이며, 그러면 블록 항목의 오류 사항을 빠르게 파악할 수 있게 됩니다. 누락된 항목에 대해서는 다른 네트워크 참여자에게 요청하여 받아볼 수 있겠죠.
💎 Incentive
By convention, the first transaction in a block is a special transaction that starts a new coin owned by the creator of the block.
"본론:Incentive"에서는 컴퓨팅 파워를 통해 체인 무결성 강화에 기여한 작업증명 완수 노드에게 제공되는 보상(Reward) 체계를 다루는데요. 다음과 같은 화폐의 특징들을 다룹니다.
- 화폐의 발행 (A new coin)
- 거래 수수료 (Transaction fees)
- 정직한 행동 (Stay honest)
비트코인에서 화폐의 가치를 가지는 트랜잭션은 일반적인 포인트 데이터와는 다른 생성 메커니즘을 가집니다. 블록 창조자에게 작업증명에 소모된 시간과 에너지 비용에 따른 보상으로 시스템에서 직접 생성하며, 해당 데이터는 전자서명체인에서 특정 화폐의 유통 엔트리 포인트가 됩니다.
/** After proof-of-work success */
const rewardTransaction = {
owner: newBPublicKey,
currency: 10,
};
const hash = createHash(rewardTransaction);
rewardTransaction["hash"] = rewardTransaction;
block.transactions = [rewardTransaction, ...block.transactions];
발행 데이터는 위와 같이, 수금자의 공개키와 화폐량을 포함시켜 나타내볼 수 있을 것 같네요. 이는 블록 트랜잭션 리스트에 가장 첫 번째 부분에 위치하게 되며, 송금 혹은 거래소에서 코인 구매 등과 같이 화폐의 활용이 일어나기 이전에 발생합니다.
여기에 화폐의 공급이 거래량보다 늘어나는 인플레이션 문제에 대응하여 시스템에 발행량을 초기에 정해놓고, 모든 화폐의 발행이 끝났을 때는 수수료의 형태로 전환해서 지속적인 보상 체계를 통한 체인의 보안성을 강화시킬 수 있도록 합니다.
또한, 보상 체계는 긴 체인을 형성하여 보안이 강화된 블록체인 네트워크 상에서 악의적인 성향의 참여자가 공격보다는 새로운 블록을 생성하여 화폐를 제공받는 것이 합리적임을 느끼게 해줌로써 참여자의 정직한 행동을 이끌어 내는 방향으로도 작용할 수 있습니다.
💾 Reclaiming Disk Space
Once the latest transaction in a coin is buried under enough blocks, the spent transactions before it can be discarded to save disk space.
"본론:Reclaiming Disk Space"에서는 네트워크 참여자들의 다양한 저장 환경을 고려하여, 트랜잭션 리스트를 머클트리(Merkle Tree) 알고리즘을 통해 축소시키는 방법을 설명합니다.
머클트리는 기존 데이터를 해시 처리한 후, 순차적으로 2개씩 짝 지어 병합과 해시 처리를 반복하여 최종적으로는 하나의 해시 암호화 기반으로 형성된 이진트리 자료구조를 생성하는데요.
이를 트랜잭션 리스트에 적용하여, 출력된 머클 트리 루트 노드의 해시값은 "직전 블록의 해시 값", "임시값"과 함께 헤더 그룹으로 묶여진 형태의 블록에 저장 됩니다.
이미 블록체인 상에 연결된 블록의 트랜잭션 리스트는 변화할 일이 없기 때문에, 이로 만들어진 머클 트리는 필요한 분기만을 남기고 나머지는 삭제하여도 정직한 트랜잭션 리스트를 구분시킬 수 있습니다.
A block header with no transactions wouble be about 80 byes.
const header = {
prevHash: "8aa2...d806", // 64 length hex string = (1/2)Byte * 64 = 32Byte
nonce: 35, // Integer = 4byte
difficulty: 5, // Integer = 4byte
timestamp: 1716104975698, // Integer = 4Byte
merkleRoot: "51f5...2f2d", // 32Byte
}
본문에서 언급되는 "80 bytes"의 경우에는 모든 분기 및 거래 기록을 삭제하고, 헤더만을 남긴 블록의 크기를 이야기합니다. SHA-256을 기반으로 보았을 때, 직전 블록의 해시 값(32Byte) + 임시값(4Byte) + 난이도(4Byte) + 타임스탬프(4Byte) + 머클 루트 해시(32Byte) = 블록 헤더 크기(76Byte) 정도가 될 수 있겠네요.
🔍 Simplified Payment Verification
A user only needs to keep a copy of the block headers of the longest proof-of-work chain, which he can get by querying network nodes until he's convinced he has the longest chain, and obtain the Merkle branch linking the transaction to the block it's time stamped in.
"본론:Simplified Payment Verification"는 머클 트리를 활용하여 거래 내역을 검증하는 방법을 설명합니다. 자신이 정직한 블록체인 데이터를 유지하고 있다는 조건 하에 네트워크의 다른 참여 노드에게 특정 트랜잭션이 포함된 머클 트리의 분기를 요청하는 프로세스인데요.
결제 검증의 가장 간단한 접근법은 특정 트랜잭션의 타임스탬프를 포함한 블록에 포함된 모든 트랜잭션을 불러오고, 리스트에서의 존재 여부와 블록 해시값 검증을 수행하는 방법일 텐데요.
머클트리는 특정 트랜잭션이 머클 루트 해시까지 진행한 분기만을 받아 진행할 수 있습니다. 이는 디스크 공간의 절약을 유지하면서, 검증을 위한 데이터의 빠른 로드 및 탐색을 제공합니다.
세부 사항은 기재되어 있지 않지만, 네트워크 내 누군가는 검증을 위한 트랜잭션과 머클 트리를 유지해야 한다는 점을 알 수 있는데요. 아마도 자신이 거래한 내용에 대한 분기 쯤은 보유하려 하지 않을까요? 아니면 초기 블록체인의 강화를 위해 동원된 노드가 그 역할을 할 수도 있구요. 오늘날의 풀노드와 라이트노드로 불리우는 개념과 연관성을 가질 것으로 유추해볼 수 있습니다.
해당의 방법이 실현되려면, 정직한 노드가 블록체인 네트워크의 주도권을 잡아야 한다는 점을 다시 한번 강조합니다. 그러면서 유효하지 않은 블록이 탐지되면 정직한 블록과의 일치 여부를 판단하게 하는 번거로운 작업을 방어대책으로 소개하는데요. 그렇게 된다면, 많은 거래가 오가는 큰 집단일수록 보안과 빠른 검증을 위해 네트워크에서 기대하는 프로세스에 한정하여 행동하게 할 수 있습니다.
🎰 Combining and Splitting Value
To allow value to be split and combined, transactions contain multiple inputs and outputs.
"본론:Combining and Splitting Value"에서는 "본론:Incentive"에서 발행된 화폐를 거래의 흐름에서 송금액과 잔액으로 관리하는 방법을 정의합니다.
우리가 사용하는 실물 화폐는 특정 단위를 가지고 있는데요. 이를 블록체인에서 정의한 발행과 트랜잭션으로 관리하려면 매우 복잡한 시스템이 될 것 입니다. 거래에 필요한 송금액을 구성하는데에 정해진 단위로 거스름돈을 지불할 수 있는 화폐를 구성하여야 하며, 1과 같이 모든 단위를 총괄할 수 있는 단위를 사용한다 했을 때는 사용하지 않은 화폐의 탐색 시간이 증가합니다.
const transaction = {
transactionIns: [
{
coin5,
signature: ASignature,
}, // Input Currency
],
transactionOuts: [
// Output Currency
{
owner: newBPublicKey,
coin3,
}, // Remittance
{
owner: APublicKey,
coin2,
}, // Rest Currency
],
};
그래서 비트코인에서는 유동적인 화폐의 값을 채택합니다. 거래에 사용되지 않은 화폐의 총합이 송금액과 같거나 높은 값을 가지도록 수집하여, 입금 데이터를 형성 시키고 송금자가 수금자에게로 전송한 송금액과 나머지 잔액으로 구성된 출금 데이터를 형성 시킵니다.
새로운 화폐 데이터가 만들어지는 것으로 이해하면 쉬울 것 같아요. 발행 시점의 화폐는 시스템이 입금하여 작업증명 수행자에게 출금으로 전달되고, 이후에는 거래를 통해 입금과 출금을 반복하며, 한번 사용된 화폐 데이터는 새로운 화폐 데이터로 생성됩니다.
이는 거래 데이터 구조가 발행처로부터 시작된 화폐가 송금액과 잔액으로 분할되는 부채꼴의 구조를 가지도록 하는데요. 저자님은 해당 특징이 문제가 되지 않음을 언급합니다. 어짜피 단위가 정해져 있지 않기 때문에, 가장 최근 거래 부터 입금의 정보에서 이미 사용된 거래 데이터를 기록 및 출금 데이터의 화폐량 합산의 프로세스를 진행하면서 내려와 송금액을 맞추면 되거든요.
🪪 Privacy
The necessity to announce all transactions publicly precludes this method, but privacy can still be maintained by breaking the flow information in another place.
"본론:Privacy" 에서는 전통적인 은행 모델과 비트코인의 개인 정보 보호 체계를 비교합니다.
은행에서는 거래를 진행하려면 개인 정보를 제시하여 신원을 확인하며, 거래 내역 조회를 공개된 환경으로부터의 접근을 제어하여 개인 정보를 보호하는데요. 반면에 비트코인은 거래를 진행하는데에 개인 정보를 요구하지 않습니다. 애초에 개인 정보 수집을 요구하지 않음으로써 유출을 방지하는 것이죠.
대신, 거래를 공개하게 되는데 여기에는 익명자를 식별하기 위한 최소 정보인 공개키와 전자서명을 위한 개인키의 생성을 필요로 합니다. 신뢰받는 제삼자가 관리해주는 개인 정보 대신에, 개인의 키 관리라는 책임 요소가 생기는 것이죠.
🧮 Calculations
We consider the scenario of an attacker trying to generate an alternate chain faster than the honest chain.
"실험:Calculations" 에서는 악의적인 성향의 노드가 데이터를 변조시킬 확률을 계산하여 보안성을 검증합니다. 블록체인에서 데이터를 변조하기 위해서는 네트워크에서 유지중인 체인보다 더 긴 체인을 만들어내는 것 인데요. 이러한 시나리오 환경은 아래의 통계적 개념을 통해 정의됩니다.
- Binomial Random Walk
- Gambler's Ruin
- Poisson Distribution
우선, Binomial Random Walk는 2개의 결과 중 하나가 발생하는 사건을 설명하는 개념입니다. 본 논문에서의 시나리오는 정직한 노드와 공격자간의 블록체인 길이 경주 이며, 여기서 발생 가능한 사건들을 정의하는데에 사용되었는데요.
let p = 0.5;
let n = 100;
let S = 0;
for (let i = 0; i < n; i++) {
/** attacker success < 0.5 <= honest node success */
const X = Math.random() >= p ? 1 : -1;
S += X;
}
console.log(`Status is ${S} after ${n} step.`);
두 노드간의 체인길이 격차를 변수로 두었을 때에, 사건은 (1) 정직한 노드가 체인의 길이를 늘리거나, (2) 공격자가 체인의 길이를 늘리거나로 정의할 수 있겠으며, (1)의 경우에는 +1 이 되며, (2)의 경우에는 -1이 됩니다.
/**
* ex) Unfair Coin Flipping
* p = casino win probability
* q = gambler win probability
* P_1 = casino ruin probability
* P_2 = gambler ruin probability
* n_1, n_2 = initial money
*/
function unfairCoinFlipping(p, q, n_1, n_2) {
const P1 = (1 - (p / q) ** n_2) / (1 - (p / q) ** (n_1 + n_2));
const P2 = (1 - (q / p) ** n_1) / (1 - (q / p) ** (n_1 + n_2));
return [P1, P2];
}
다음으로, Gambler's Ruin은 카지노와 도박꾼의 관계에서, 게임의 승리 확률과 초기 자산이 높은 카지노와 도박꾼의 승부는 도박꾼이 자산을 계속 잃고, 파산의 확률이 점차 높아져, 결국에는 도박꾼의 파산으로 끝난다는 것을 정리한 개념인데요.
/**
* p = probability an honest node finds the next block
* q = probability the attacker finds the next block
* q_z = probability the attacker will ever catch up from z blocks behind
* z = honest node block length - attacker block length
*/
function attackerCatchUpProbaility(p: number, z: number) {
const q = 1 - p;
const q_z = p <= q ? 1 : (q / p) ** z;
return q_z;
}
이를 블록체인 시스템에 적용했을 때의 변수에 대입할 수 있는 값은 Binomial Random Walk에서 정의한 체인 길이 격차 그리고 컴퓨팅 파워의 우세 등과 같이, 다음 블록을 찾아낼 확률에 영향을 주는 요소가 있겠습니다.
정직한 노드가 네트워크 내에서 컴퓨팅 파워 및 블록체인 길이의 우세를 펼치게 된다면, 블록체인 네트워크 시스템은 자신을 장악 노드에게 유리하게 작동하는 특징을 가지고 있기 때문에 공격자가 정직한 노드의 체인을 따라잡을 확률은 낮으며, 이는 시간의 흐름에 따라 체인 길이 격차는 계속해서 증가하여 기하급수적으로 감소하게 될 것 입니다. 마치, 카지노에 들어와 도박꾼의 자산이 점차 줄어드는 것과 같은 현상으로 말이죠.
하지만 컴퓨팅 파워에서 우세를 가진 공격자가 선점하게 된다면, 체인 길이의 격차가 높다하더라도 블록체인 데이터는 변조될 수 있습니다. 이는 Gambler's Ruin에서도 언급되는 예외 상황인, 무한한 자산을 가진 도박꾼의 이야기와 같은 맥락이죠.
function poissonDistribution(lambda: number, k: number) {
let k_factor = 1;
for (let i = 2; i <= k; i++) k_factor *= i;
return (lambda ** k * Math.exp(-lambda)) / k_factor;
}
마지막으로, Poisson Distribution은 특정 시간과 공간에서 발생하는 사건의 평균 발생 비율을 ƛ(lambda)로 정의하여, 𝑘(expected value)번의 사건이 발생할 확률을 모델링하는 확률론 개념입니다.
function attackerSuccessProbability(q: number, z: number) {
const p = 1.0 - q;
const lambda = z * (q / p);
let sum = 0;
for (let k = 0; k <= z; k++)
sum += poissonDistribution(lambda, k) * (1 - (q / p) ** (z - k));
return 1 - sum;
}
여기에 앞서 설정한 체인 길이 격차에 따른 공격자가 따라잡을 확률에 유동적인 변화의 특징을 추가하여, 공격자가 지속적으로 각 격차 단계의 확률을 깨고 변조 블록체인의 대체를 성공하는 상황의 확률을 구하는 수식을 정의하는데요. 이를 통해 정직한 노드가 네트워크의 우세를 장악했다는 조건하에, 우수한 보안성과 안정성을 갖춘 시스템의 운영이 가능하다는 것을 검증합니다.
🪐 Conclusion
We have proposed a system for electronic transactions without relying on trust.
"결론"에서는 지금까지 설명한 시스템의 주요 구성 요소들의 특징과 기대 효과를 요약하는 내용이 포함되어 있습니다. 이에 대한 내용을 아래와 같이 정리하며, 신뢰 기관에 의존하지 않는 개인 대 개인 온라인 거래 솔루션, 비트코인의 논문 리뷰를 마무리하도록 하겠습니다. 😊😊
🖍️ Highlight
- Digital Signature
- provides strong control of ownership.
- Proof-of-Work
- becomes computationally impractical for an attacker to change.
- honest nodes control a majority CPU power.
- vote with their CPU power.
- expressing their acceptance of valid blocks by working on extending them.
- rejecting invalid blocks.
- any needed rules and incentives can be enforced with this consensus mechanism.
- Peer-to-Peer Network
- unstructured simplicity.
- work all at once with little coordination.
- since messages are not routed any particular place.
- only need to be delivered on a best effort basis.
- nodes can leave and rejoin the network.
- accepting the proof-of-chain.
📚 References
- S. Nakamoto, "Bitcoin: A peer-to-peer electronic cash system," 2008.
- Bitcoin: A Peer-to-Peer Electornic Cash System [Internet]. Available: https://bitcoin.org/bitcoin.pdf
- 비트코인: 개인 대 개인 전자 화폐 시스템 [Internet]. Available: https://bitcoin.org/files/bitcoin-paper/bitcoin_ko.pdf
- Random walk [Internet]. Available: https://en.wikipedia.org/wiki/Random_walk
- Gambler's ruin [Internet]. Available: https://en.wikipedia.org/wiki/Gambler%27s_ruin
- Poisson distribution [Internet]. Available: https://en.wikipedia.org/wiki/Poisson_distribution
여기까지, 비트코인 논문 리뷰를 진행하면서 현대 블록체인 시스템이 나아가야할 방향성을 단단히 다져놓은 주요 구성요소들을 확인해보았습니다. 처음 보았을 때는 어렵게만 느껴졌던 내용이었는데, 다시 읽어보니까 설정과 정의부터 확장까지, 제안하는 시스템의 구조를 명확하게 파악할 수 있도록 잘 작성된 논문이라는 것을 느꼈어요.
제목 | 내용 | 흐름 |
Introduction |
신뢰 기반 모델의 가역성 및 불확실성 | 배경 설정 |
암호학적 증명 | 주요구성 설정 | |
전산적으로 철회 불가능한 거래 | ||
제삼자 예치 방법 | ||
Transaction | 전자 화폐의 구조 정의 | 주요구성 정의 |
Timestamp Server | 공개 및 합의 메커니즘 기초 | |
Proof-of-Work | 합의 메커니즘 구체화 | |
Network | 공개 메커니즘 구체화 | |
Incentive | 합의 메커니즘 특징에 따른 화폐 발행 | 주요구성 확장 |
Reclaming Disk Space | 전자 화폐 유통 데이터 간소화 방법 | |
Simplified Payment Verification | 간소화된 유통 데이터 활용 | |
Combining and Splitting Value | 효율적인 전자 화폐 유통 메커니즘 | |
Privacy | 개인 정보 보호 요소 | |
Calculations | 체인 공격 시나리오 | 검증 |
또한, 각 목차의 내용은 구현적인 면이 많이 강조되었기 때문에 친숙하게 읽혀졌습니다. 이러한 점을 참고하여 진행하고자 하는 개발 방식에 따라 체계적으로 재구성할 수도 있을 것 같다는 자신감이 생기면서, 직접 구현해볼 준비가 된 것 같아요. 여러분도 같은 마음이 되셨기를 바랍니다. 다음에 다시 찾아뵐게요. 오늘 하루도 수고 많으셨습니다. 🥰🥰
'@dev.formegusto' 카테고리의 다른 글
섬세한 머신러닝과 딥러닝의 차이점 (2) Mechanism Perspective (0) | 2024.04.17 |
---|---|
섬세한 머신러닝과 딥러닝의 차이점 (1) Chaos: Machine Learning? Deep Learning? (0) | 2024.02.21 |
Typescript로 구현해 보는 KMeans (4) KMeans With UI Interaction (1) | 2024.02.07 |
Typescript로 구현해 보는 KMeans (3) KMeans++ with Typescript (0) | 2024.01.17 |
Typescript로 구현해 보는 KMeans (2) KMeans and KMeans++ Difference (1) | 2024.01.10 |