ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 블록체인 코드를 변경해 pseudo 암호화폐 만들기
    Cryptography 2021. 12. 14. 18:13
    반응형

    암호화폐는 블록체인에 기반하고 있다고들 합니다. 그렇다면 블록체인은 암호화폐인 것일까요? 

     

    아니라면 암호화폐는 블록체인과 어떤 점이 다른 걸까요?

     

    이번 글에서는 이전 글인 '파이썬으로 간단한 블록체인 만들어보기'에서 만든 블록체인을 변형해서 간단한 암호화폐를 만들어 보며 암호화폐를 이해해보려 합니다.

     

    • 암호화폐에는 블록체인에 어떤 부분을 추가해야 하는가
    • Flask API 추가

    암호화폐에는 블록체인에 어떤 부분을 추가해야 하는가

    암호화폐는 분산된 원장(distributed ledger)입니다.

     

    먼저, 원장이라는 부분을 고려하면 원장은 소유권, identity, 상태, 권위 등을 확정하는 데에 사용됩니다 [2]. 이러한 목적을 위해 원장은 기록 대상의 변동사항을 기록합니다. 즉, 트랜잭션(transaction) 기록이 주된 내용입니다. 

     

    또한, '분산'이라는 측면(좀 더 정확히는 탈중앙화된, decentralized [3])을 위해서 암호화폐는 시스템을 구성하는 노드라는 개념과 컨센서스를 도입합니다. 

     

    그렇기에 우리는 기본적인 블록체인에 크게 트랜잭션, 노드, 컨센서스(아래 예시에서는 제외)를 더하여 암호화폐를 만들 수 있습니다.

     

    트랜잭션의 추가

    그렇기에 아래와 같이 트랜잭션 리스트를 추가하고, 블록 생성 시에 트랜잭션 리스트를 더해줍니다. 또한, 블록 생성 시 트랜잭션 리스트에 새로운 리스트를 할당하여 초기화 해줍니다 (commit):

     

    Add transaction feature to blockchain - Image from Author

    이후에는 Blockchain 클래스에 트랜잭션을 추가하는 데 사용할 메소드를 추가해주어야 합니다. 여기서는 간단하게 트랜잭션 역시 블록과 같이 파이썬 딕셔너리로 구성하였습니다. 키(key)는 송신자, 수신자, 양(amount)으로 3가지 모두 아규먼트로 받아서 인스턴스 변수 transactions에 추가해주고 현재 블록의 인덱스를 리턴해줍니다 (commit):

     

        def add_transaction(self, sender, receiver, amount):
            self.transactions.append({
                'sender': sender,
                'receiver': receiver,
                'amount': amount
            })
    
            return self.get_previous_block()['index'] + 1

    Add add_transaction method - Image from Author

     

    노드 추가

    다음으로는 노드를 추가해줍니다 (commit):

     

    Add nodes - Image from Author

     

    비트코인의 경우 가장 긴 체인의 메인으로 남고 다른 (길이가 짧은) 체인의 블록들은 Orphan 블록이 됩니다. 유사한 기능을 추가하기 위해서 노드의 체인 길이와 다른 노드들의 길이를 비교해 길이가 더 긴 체인이 있다면 해당 노드의 체인을 긴 체인으로 교체하는 메소드를 아래와 같이 추가할 수 있습니다 (commit):

     

    Add update_chain method - Image from Author

     

     

    Flask API 추가

    위에서 더해준 암호화폐 기능들을 호출할 수 있도록 Flask API를 추가해줍니다.

     

     

    트랜잭션 추가 POST API

    POST로 sender, receiver, amount를 받아 add_transaction 메소드를 통해 트랜잭션을 추가해주는 API를 추가합니다 (commit):

    Add add_transaction POST API - Image from Author

     

    노드 추가 POST API

    역시 json 형태의 body를 받아 인스턴스 변수 nodes에 더하는 API를 추가합니다:

    Add connect_node POST API - Image from Author

     

    노드 업데이트 GET API

    마지막으로 노드 리스트를 순회하며 각 노드의 체인 길이를 확인하고, 더 길 때 update하는 update_chain을 호출하는 API를 추가합니다 (commit):

     

    Add update_chain GET API - Image from Author

     

     

    최종 코드는 이곳에 있습니다:

     

     

    Reference

    [1] https://www.udemy.com/course/build-your-blockchain-az/ 

    [2] https://medium.com/cryptoeconomics-australia/the-blockchain-economy-a-beginners-guide-to-institutional-cryptoeconomics-64bf2f2beec4

    [3] https://medium.com/@VitalikButerin/the-meaning-of-decentralization-a0c92b76a274

     

     

     

    반응형
Kaden Sungbin Cho