티스토리 뷰

Java

Java로 간단한 BlockChain 구현

Young_J 2020. 12. 23. 16:41

1. Block 생성

- nonce : 최초 0에서 시작하여 조건을 만족하는 해쉬값을 찾아낼때까지의 1씩 증가하는 계산 횟수

- data : 데이터

- prevhash : 블록 체인에서 바로 앞에 위치하는 블록의 블록 해쉬

- hash : 해시 함수를 통해 생성된 해시 값

더보기
package day_1223;

public class Block {
	int nonce;
	String data;
	String prevhash;
	String hash;

	public int getNonce() {
		return nonce;
	}

	public void setNonce(int nonce) {
		this.nonce = nonce;
	}

	public String getData() {
		return data;
	}

	public void setData(String data) {
		this.data = data;
	}

	public String getPrevhash() {
		return prevhash;
	}

	public void setPrevhash(String prevhash) {
		this.prevhash = prevhash;
	}

	public String getHash() {
		return hash;
	}

	public void setHash(String hash) {
		this.hash = hash;
	}

	public Block(int nonce, String data, String prevhash) {
		super();
		this.nonce = nonce;
		this.data = data;
		this.prevhash = prevhash;
	}

	@Override
	public String toString() {
		return "Block [nonce=" + nonce + ", data=" + data + ", prevhash=" + prevhash + ", hash=" + hash + "]";
	}


}

 

2. Hash 생성 함수 

- setHdate : 블록의 data와 nonce를  더해서 리턴

- sha256 : sha256을 사용하여 setHdata에서 리턴한 데이터를 해시값으로 변경

- generateBlock : 조건에 맞는 해시값 생성

더보기
import java.security.MessageDigest;

public class BcUtil {
	
	/**
	 * 
	 * 조건 : 해쉬값 앞 5자리 00000
	 * 조건에 맞게 hash값 생성후 block 을 return
	 * 
	 */
	public static Block generateBlock(Block block) {
		L: while (true) {

			String hash = sha256(setHdata(block));

			for (int i = 0; i < 5; i++) {
				if (hash.charAt(i) != '0') {
					int new_Nonce = block.getNonce();
					new_Nonce++;
					block.setNonce(new_Nonce);
					continue L;
				}
			}
			
			block.setHash(hash);
			return block;
		}

	}

	/**
	 * @param two
	 * @return h_data
	 * 블록의 데이터와 nonce값을 더해서 리턴
	 */
	public static String setHdata(Block two) {
		String h_data = two.getData().concat(Integer.toString(two.getNonce()));
		return h_data;
	}
	
	/**
	 * 
	 *문자열을 sha256을 사용하여 해시값으로 리턴 
	 * 
	 */
	public static String sha256(String data) {
		try {

			MessageDigest digest = MessageDigest.getInstance("SHA-256");
			byte[] hash = digest.digest(data.getBytes("UTF-8"));
			StringBuffer hexString = new StringBuffer();

			for (int i = 0; i < hash.length; i++) {
				String hex = Integer.toHexString(0xff & hash[i]);
				if (hex.length() == 1)
					hexString.append('0');
				hexString.append(hex);
			}

			// 출력
			return hexString.toString();

		} catch (Exception ex) {
			throw new RuntimeException(ex);
		}

	}
}

 

3. BlockChain 구현

- 생성된 블록들을 list형태로 저장 후 출력

더보기
package day_1223;

import java.util.ArrayList;

public class BlockChain {

	static ArrayList<Block> list;

	public static void main(String[] args) {

		Block genesis = new Block(0, "Genesis Block", "");
		list = new ArrayList<Block>();
		
		// genesis block 생성
		genesis.setHash(BcUtil.sha256(genesis.data));
		list.add(genesis);
		String[] data = { "Genesis Block", "2nd", "3rd", "4th" };
		int idx = 1; // 시작점
		int cnt = data.length; // 블록 개수 (저장할 데이터 개수)

		// 2번째 블록부터 cnt번째 블록까지 생성
		while (idx < cnt) {
			list.add(BcUtil.generateBlock(new Block(0, data[idx], list.get(idx - 1).hash)));
			idx++;
		}

//		 생성된 블록 확인 
		for (Block block : list) {
			System.out.println("nonce : " + block.getNonce());
			System.out.println("data : " + block.getData());
			System.out.println("prevhash : " + block.getPrevhash());
			System.out.println("hash : " + block.getHash());
			System.out.println();
		}

	}

}

 

4. 결과

BlockChain 결과

 

'Java' 카테고리의 다른 글

date_time 값 처리 하기 (LocalDateTime)  (0) 2021.01.27
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG more
«   2025/02   »
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
글 보관함