티스토리 뷰
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. 결과
'Java' 카테고리의 다른 글
date_time 값 처리 하기 (LocalDateTime) (0) | 2021.01.27 |
---|