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



마지막으로 이렇게 만들어진 세 쌍의 키를 이용해 다양한 트랜잭션을 생성하고 검증하도록 프로그램을 수정해보자. 아래 소스코드에는 총 세 개의 지갑(Wallet) 객체가 사용된다. 각각의 지갑들은 시간 순서에 따라 다른 지갑에게 가상화폐를 전송한다. 


또한 예시 소스코드는 총 4건의 트랜잭션을 포함하며 만약 특정한 트랜잭션의 서명이 정상적이지 않다면 블록에 추가되지 않는다. 오직 정상적인 트랜잭션에 한해서 블록에 트랜잭션 정보가 추가된다는 특징이 있다.


[소스코드 5] BlockChainStarter.java


package core;


import java.security.Security;

import java.util.ArrayList;


import org.bouncycastle.jce.provider.BouncyCastleProvider;


public class BlockChainStarter {


  public static void main(String[] args) throws Exception {

    Security.addProvider(new BouncyCastleProvider());

    Wallet wallet1 = new Wallet();

    wallet1.setFromFile("private1.pem", "public1.pem");

    Wallet wallet2 = new Wallet();

    wallet2.setFromFile("private2.pem", "public2.pem");

    Wallet wallet3 = new Wallet();

    wallet3.setFromFile("private3.pem", "public3.pem");

    

    Block block1 = new Block(1, null, 0, new ArrayList());

    block1.mine();

    block1.showInformation();

    

    Block block2 = new Block(2, block1.getBlockHash(), 0, new ArrayList());

    

    // 지갑1에서 지갑2로 코인을 전송했다는 의미를 가진 트랜잭션을 생성합니다.

    Transaction transaction1 = new Transaction(wallet1, wallet2.getPublicKey(),

      1.5, "2018-05-03 23:05:19.5");

    block2.addTransaction(transaction1);

    

    // 지갑2에서 지갑3으로 코인을 전송했다는 의미를 가진 트랜잭션을 생성합니다.

    Transaction transaction2 = new Transaction(wallet2, wallet3.getPublicKey(),

      3.7, "2018-05-04 14:12:09.5");

    block2.addTransaction(transaction2);

    

    block2.mine();

    block2.showInformation();

    

    Block block3 = new Block(3, block2.getBlockHash(), 0, new ArrayList());


    // 지갑1에서 지갑3으로 코인을 전송했다는 의미를 가진 트랜잭션을 생성합니다.

    Transaction transaction3 = new Transaction(wallet1, wallet3.getPublicKey(),

      2.3, "2018-05-06 17:09:21.5");

    block3.addTransaction(transaction3);

    

    // 지갑2에서 지갑3으로 코인을 전송했다는 의미를 가진 트랜잭션을 생성합니다.

    Transaction transaction4 = new Transaction(wallet2, wallet3.getPublicKey(), 

      1.4, "2018-05-07 02:11:19.5");

    block3.addTransaction(transaction4);

    

    block3.mine();

    block3.showInformation();

  }

}



이제 위 소스코드를 실행해보자. 실행 결과를 두 그림으로 나누어 확인하면 다음과 같다. 우리 프로그램에서는 가장 먼저 세 쌍의 키를 모두 활용해 세 개의 지갑 객체를 생성한다. 결과적으로 프로그램의 초반에는 다음과 같이 모든 키 데이터를 불러와 지갑 정보를 초기화하는 것을 알 수 있다.



이후에 다음과 같이 총 3개의 블록이 차례대로 채굴(Mining)된다. 각 블록에는 여러 개의 트랜잭션(Transaction) 정보가 포함되는데 각 트랜잭션은 언제 어떠한 지갑에서 다른 지갑으로 몇 개의 코인이 전송되었는지를 나타내는 것을 알 수 있다. 또한 실행(F11) 버튼을 눌러 프로그램을 새롭게 시작할 때마다 각 트랜잭션의 서명 값 및 채굴 변수 값(Nonce)는 변경되지만 특정한 지갑에서 다른 지갑으로 데이터가 전송된 시간, 코인의 개수, 지갑 주소들은 항상 일정하다는 특징이 있다.



이제 우리의 프로그램은 실제 상용 블록체인과 키 관리, 트랜잭션 처리 등에 있어서 상당히 흡사한 구조를 가지게 되었다. 다만 현재 우리의 블록체인 프로그램에는 채굴에 따른 보상(Reward) 및 수수료 지급의 개념이 적용되어 있지 않다. 실제 블록체인에서는 채굴을 수행하는 컴퓨터가 채굴 변수 값(Nonce)을 찾으면 블록을 형성하고 그에 대한 보상으로 가상화폐를 지급받는다. 또한 이후에 그러한 보상을 기준으로 실제로 트랜잭션(Transaction)을 수행하고 수수료를 지급할 수 있다. 이러한 기능들도 추후의 강좌에서 함께 구현해보도록 하자.


다음 호에 계속...

1
기사수정

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

http://www.bitweb.co.kr/news/view.php?idx=1045
기자프로필
프로필이미지
나도 한마디
※ 로그인 후 의견을 등록하시면, 자신의 의견을 관리하실 수 있습니다. 0/1000
현재의견(총 3 개)
  • kcjen2018-07-04 08:57:09

    계속 다음호를 기다리고 있으며 응원합니다.^^

  • fx13572018-06-26 23:05:39

    정말 잘 설명된 강의입니다~! 다음 강의는 더 이상 안 하시나요?

  • jogilsang2018-06-03 23:36:11

    ㅎㅎㅎ 좋은 정보 감사합니다

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