기사 메일전송
자바(Java)로 미니 블록체인 개발해봐요(9) - - SECTION 07. 개인 지갑 기능 구현하기(1) - - 필자는 안경잡이 개발자로 유명하며 현재 프리랜서로 활동중에 있다
  • 기사등록 2018-05-21 00:23:15
  • 수정 2018-05-21 00:25:53
기사수정

지난 시간에 우리는 임의의 개인키와 공개키를 생성해서 파일 형태로 저장하고 언제든지 가져올 수 있도록 해주는 파일 기반의 신원 인증 시스템을 구현하는 시간을 가졌다. 실제로 대다수 상용 가상화폐의 지갑 소프트웨어에서 한 번 만든 지갑 주소는 변경되지 않는데 이는 개인키 및 공개키가 컴퓨터에 저장되어 변경되지 않기 때문이다. 더불어 특정한 개인키로 서명한 암호문은 오직 그와 한 쌍이 되는 공개키로만 해당 암호문을 검증할 수 있다는 것도 지난 시간에 확인해보았다.


이번 시간에는 지난 시간에 만든 파일 기반의 신원 인증 시스템을 기반으로 개인 지갑 기능을 구현해 볼 것이다. 우리는 웹 사이트와 같은 인터넷(Internet) 공간에서 개인을 증명하는 식별자로 흔히 아이디(ID)를 사용한다. 이 때 아이디와 비밀번호는 개인이 원하는 대로 설정할 수 있다. 블록체인에서는 공개키가 아이디의 역할을 수행하고, 개인키가 비밀번호와 흡사한 역할을 수행한다는 특징이 있다. 뿐만 아니라 아이디와 비밀번호가 긴 문자열 형태로 기억하기 어려운 형태로 존재한다.


일반적으로 블록체인은 ‘지갑 주소’로 특정한 개인을 식별한다. 즉 아이디와 지갑 주소는 동일한 역할을 수행한다. 그렇다면 지갑 주소는 어떻게 가장 합리적으로 만들 수 있을지 알아보자. 바로 공개키에 해시(Hash)를 적용해 고정된 길이의 지갑 주소를 만들면 된다. 블록체인은 모든 사람이 서로 다른 개인키를 사용하도록 설계되어 공개키 또한 서로 다르다. 이 때 공개키로 지갑 주소를 만드므로 결과적으로 지갑 주소는 모든 사람마다 다르게 설정되어 개인을 식별하는 용도로 사용할 수 있는 것이다.



[그림 1] 개인키에서 지갑 주소가 만들어지는 과정


이제 실제로 개인키, 공개키, 지갑 주소 정보를 이용해 다른 사람과 거래를 할 수 있는 개인 지갑 기능을 구현해보자. 개인 지갑 기능이란 필요할 때마다 개인키 및 지갑 주소를 생성할 수 있으며 자신의 지갑 주소에서 다른 지갑 주소로 가상화폐를 전송할 수 있는 기능을 의미한다. 따라서 가장 먼저 한 쌍의 개인키 및 공개키 정보를 저장해 인증 처리를 수행하는 지갑(Wallet)과 클래스를 생성해보자.


이후에 Wallet.java 소스코드를 다음과 같이 작성해보자. 개인키 및 공개키를 불러와 지갑을 초기화하는 함수와 특정한 데이터를 개인키로 서명하는 함수가 포함되어 있다는 특징이 있다.


이후에 기존에 작성했던 트랜잭션(Transaction) 클래스를 실제 블록체인과 흡사한 구조를 가지도록 수정해보자. 트랜잭션이 가지는 특성을 바르게 이해하기 위해 비트코인(Bitcoin)의 521499번째 블록(https://blockchain.info/ko/block/00000000000000000016f698e901c2cd364ac570a2f4b029f08e1279c4d8baf6)에 포함되어 있는 트랜잭션 정보를 예시로 살펴보면 다음과 같다.




각 트랜잭션에는 보내는 사람의 지갑 주소, 받는 사람의 지갑 주소, 보내는 가상화폐의 양, 트랜잭션이 발생한 시간, 트랜잭션의 고유 해시(Hash) 데이터가 포함되어 있는 것을 알 수 있다. 우리의 트랜잭션도 이와 동일한 구조를 가지도록 Transaction.java 소스코드를 다음과 같이 수정해보자.


이제 트랜잭션 객체 안에 가상화폐를 송금하는 사람의 공개키 및 서명 값이 포함되므로 트랜잭션 객체 그 자체의 정보만 가지고도 해당 트랜잭션이 바르게 인증이 이루어진 트랜잭션인지 검증할 수 있다. 하나의 블록(Block)에 대한 정보를 처리하는 Block.java 소스코드를 다음과 같이 수정하여 트랜잭션을 블록에 추가하기 전에 해당 트랜잭션이 올바른 트랜잭션인지 검증할 수 있도록 하자.


이제 이렇게 구현된 클래스들을 다루어 실습해보자. 이번 예제에서는 총 세 개의 서로 다른 지갑 정보를 이용할 것이다. 따라서 먼저 BlockChainStarter.java의 소스코드를 다음과 같이 수정하여 3개의 서로 다른 이름을 가지는 키 쌍을 생성하도록 만들어보자. 각 키 쌍은 지갑과 동일하게 사용된다.




위 프로그램을 실행한 결과는 다음과 같다.



이후에 프로젝트의 물리적인 경로로 이동하면 다음과 같이 세 쌍의 키가 만들어진 것을 알 수 있다.




다음호에 계속...




0
기사수정

다른 곳에 퍼가실 때는 아래 고유 링크 주소를 출처로 사용해주세요.

http://www.bitweb.co.kr/news/view.php?idx=1001
기자프로필
프로필이미지
나도 한마디
※ 로그인 후 의견을 등록하시면, 자신의 의견을 관리하실 수 있습니다. 0/1000
현재의견(총 1 개)
  • mikael20102018-05-26 15:10:18

    감사합니다~^^
    다음 연재도 기대할께요~~

실시간 암호화폐 순위 확인하기
코인마켓캡
모바일 버전 바로가기