이 글은 블록체인 동작 메커니즘 이해하고자 하는 싶은 분을 위해 핵심 개념만 간단히 개발하는 과정을 공유한다.
좀 더 자세한 내용은 아래 링크를 참고한다.
좀 더 자세한 내용은 아래 링크를 참고한다.
우선 요구사항을 정해보자
블록체인 개발전에 블록체인 개념을 내포하는 몇가지 요구사항을 정의해야 한다.
- 가상화폐: 가치 교환을 위한 디지털 가치 보관 수단
- 지갑: 개인이나 조직 가상화폐를 보관하는 전자 계정
- 트랜잭션: 데이터의 변화를 기록한 단위
- 블록: 트랜잭션을 기록한 단위. 데이터 변조를 막기 위해 해쉬 암호화 사용
- 마이닝: 블록을 관리하는 컴퓨팅 소모 자원에 대한 대가 지급
- 스마트 계약: 상호간 거래시 계약 불이행을 방지하기 위한 수단
간단히 만들어 보는 블록체인
우선 요구사항을 바탕으로 아키텍처를 디자인해보자.
요구사항에 해당하는 객체를 모두 클래스화한다. 그리고, 각 클래스간 관계를 디자인한다. 예를 들어, 코인과 화폐는 서로 관계가 있다.
코인은 가치를 보관하는 개념이다. 트랜잭션은 쌍방간의 계약중 하나이며, 가치의 변경을 담는 역할이다. 블록은 트랜잭션의 변화를 기록한다. 블록은 링크드리스트(linked list) 자료구조로 정의된다. 블록의 위변조는 해쉬값으로 알 수 있다. 블록체인은 블록을 생성하고 관리한다. 스마트계약은 트랜잭션을 발생시킨다.
앞의 디자인을 반영해 중요한 부분만 코딩하면 다음과 같다.
우선 요구사항을 바탕으로 아키텍처를 디자인해보자.
요구사항에 해당하는 객체를 모두 클래스화한다. 그리고, 각 클래스간 관계를 디자인한다. 예를 들어, 코인과 화폐는 서로 관계가 있다.
코인은 가치를 보관하는 개념이다. 트랜잭션은 쌍방간의 계약중 하나이며, 가치의 변경을 담는 역할이다. 블록은 트랜잭션의 변화를 기록한다. 블록은 링크드리스트(linked list) 자료구조로 정의된다. 블록의 위변조는 해쉬값으로 알 수 있다. 블록체인은 블록을 생성하고 관리한다. 스마트계약은 트랜잭션을 발생시킨다.
이를 디자인하면 다음과 같다.
클래스 디자인(UML)
앞의 디자인을 반영해 중요한 부분만 코딩하면 다음과 같다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | class coin { public: double value = 0; } class wallet { public: string accountAddress; coin coin; } class transaction { public: string fromAcccount, toAccount; coin trasnferValue; string calculateHash() {return SHA256(this)}; } class block { public: const int MAX_BLOCK_TRANSCTION 40 int countTransaction = 0; transaction[MAX_BLOCK_TRANSACTION]; block* previousBlock = NULL; block* nextBlock = NULL; int insertTransaction(transaction& t); string calculateHash(); } class blockChain { public: block* createGenesisBlock(); coin* miningBlock(int hash, block& block); block* insertBlock(block* b); } class smartContract { public: void setScript(string code); bool execute(); private: string code; python contractScript; } |
style by hilite
마무리
이 글은 블록체인과 스마트 계약 구현 원리를 이용해 보기 위해 간단히 아키텍처를 디자인해보고, 코드로 구현해 보았다. 사실, 이외 여러 기능과 구성요소가 필요하나, 다양한 블록체인 플랫폼의 핵심적인 내용은 비슷하다. 좀 더 상세한 내용은 다음 레퍼런스를 참고하길 바란다.
레퍼런스