core > BlockChainStarter
package core;
import java.util.ArrayList;
public class BlockChainStarter {
public static void main(String[] args) {
// TODO Auto-generated method stub
Block block1 = new Block(1, null, 0, new ArrayList<Transaction>());
block1.mine();
block1.getInformation();
Block block2 = new Block(2, block1.getBlockHash(), 0, new ArrayList<Transaction>());
block2.addTransaction(new Transaction("이승엽", "홍길동", 1.5));
block2.addTransaction(new Transaction("이근혁", "홍길동", 0.7));
block2.mine();
block2.getInformation();
Block block3 = new Block(3, block2.getBlockHash(), 0, new ArrayList<Transaction>());
block3.addTransaction(new Transaction("리로이", "다니엘", 8.2));
block3.addTransaction(new Transaction("홍길동", "이승엽", 0.4));
block3.mine();
block3.getInformation();
Block block4 = new Block(4, block3.getBlockHash(), 0, new ArrayList<Transaction>());
block4.addTransaction(new Transaction("다니엘", "리로이", 0.1));
block4.mine();
block4.getInformation();
}
}
core > Block
package core;
import java.util.ArrayList;
import util.Util;
public class Block {
private int blockID; // 블록 아이디
private String previousBlockHash; // 이전 블록의 해시 값
private int nonce; // 채굴을 위한 정답
private ArrayList<Transaction> transactionList; // 블록에 들어가는 데이터(해당 블록이 생성되기 전까지 발생한 신규 트랜잭션들의 정보)
public Block(int blockID, String previousBlockHash, int nonce, ArrayList<Transaction> transactionList) {
this.blockID = blockID;
this.previousBlockHash = previousBlockHash;
this.nonce = nonce;
this.transactionList = transactionList;
}
public int getBlockID() {
return blockID;
}
public void setBlockID(int blockID) {
this.blockID = blockID;
}
public String getPreviousBlockHash() {
return previousBlockHash;
}
public void setPreviousBlockHash(String previousBlockHash) {
this.previousBlockHash = previousBlockHash;
}
public int getNonce() {
return nonce;
}
public void setNonce(int nonce) {
this.nonce = nonce;
}
public void addTransaction(Transaction transaction) {
transactionList.add(transaction);
}
public String getBlockHash() { // 해당 블록의 해시 값
String transactionInformations = "";
for(int i = 0; i < transactionList.size(); i++) {
transactionInformations += transactionList.get(i).getInformation();
}
return Util.getHash(nonce + transactionInformations + previousBlockHash);
}
public void getInformation() { // 특정한 한 개의 블록이 있을 때 이 블록에 대한 정보를 출력
System.out.println("----------------------------------");
System.out.println("블록 아이디 : " + getBlockID());
System.out.println("이전 블록의 해시 값: " + getPreviousBlockHash());
System.out.println("채굴 정답 : " + getNonce());
System.out.println("트랜잭션 개수 : " + transactionList.size() + "개");
for(int i = 0; i < transactionList.size(); i++) {
System.out.println(transactionList.get(i).getInformation());
}
System.out.println("블록의 해시 값 : " + getBlockHash());
System.out.println("----------------------------------");
}
public void mine() {
while(true) {
if(getBlockHash().substring(0, 4).equals("0000")) { // nonce + transactionInformations + previousBlockHash의 해시 값이 "0000"으로 시작할 때 채굴에 성공 // 채굴 난이도 고정
System.out.println(blockID + "번째 블록의 채굴에 성공했습니다.");
break;
}
nonce++;
}
}
}
core > Transaction
package core;
public class Transaction {
String sender;
String receiver;
double amount;
public Transaction(String sender, String receiver, double amount) {
this.sender = sender;
this.receiver = receiver;
this.amount = amount;
}
public String getSender() {
return sender;
}
public void setSender(String sender) {
this.sender = sender;
}
public String getReceiver() {
return receiver;
}
public void setReceiver(String receiver) {
this.receiver = receiver;
}
public double getAmount() {
return amount;
}
public void setAmount(double amount) {
this.amount = amount;
}
public String getInformation() {
return sender + "이(가) " + receiver + "에게 " + amount + "개의 코인을 보냈습니다.";
}
}
util > Util
package util;
import java.security.MessageDigest;
public class Util {
public static String getHash(String input) { // 단순 문자열 input
StringBuffer result = new StringBuffer();
try {
MessageDigest md = MessageDigest.getInstance("SHA-256"); // Secure Hash Algorithm // 256비트로 구성 // 64자리 문자열 반환
md.update(input.getBytes());
byte bytes[] = md.digest();
for(int i = 0; i < bytes.length; i++) {
result.append(Integer.toString((bytes[i] & 0xff) + 0x100, 16).substring(1));
}
} catch(Exception e) {
e.printStackTrace();
}
return result.toString(); // SHA-256 해시를 적용한 결과 리턴
}
}
'Block Chain' 카테고리의 다른 글
[Block Chain] Java 실습-2 (0) | 2022.12.21 |
---|---|
[Block Chain] Java 실습-1 (0) | 2022.12.19 |
[Block Chain] 암호화폐 (0) | 2022.12.01 |
[Block Chain] 해시 (0) | 2022.12.01 |
[Block Chain] 쉽게 이해하기 (0) | 2022.11.30 |