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

core > BlockChainStarter

package core;

public class BlockChainStarter {
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		Block block1 = new Block(1, null, 0, "데이터"); // 블록 아이디, 이전 블록의 해시 값, 채굴을 위한 정답, 블록에 들어가는 데이터
		block1.mine();
		block1.getInformation();
		
		Block block2 = new Block(2, block1.getBlockHash(), 0, "데이터");
		block2.mine();
		block2.getInformation();
		
		Block block3 = new Block(3, block2.getBlockHash(), 0, "데이터");
		block3.mine();
		block3.getInformation();
		
		Block block4 = new Block(4, block3.getBlockHash(), 0, "데이터");
		block4.mine();
		block4.getInformation();
	}
}

core > Block

package core;

import util.Util;

public class Block {

	private int blockID; // 블록 아이디
	private String previousBlockHash; // 이전 블록의 해시 값
	private int nonce; // 채굴을 위한 정답
	private String data; // 블록에 들어가는 데이터
	
	public Block(int blockID, String previousBlockHash, int nonce, String data) {
		this.blockID = blockID;
		this.previousBlockHash = previousBlockHash;
		this.nonce = nonce;
		this.data = data;
	}
	
	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 String getData() {
		return data;
	}
	
	public void setData(String data) {
		this.data = data;
	}
	
	public String getBlockHash() { // 해당 블록의 해시 값
		return Util.getHash(nonce + data + previousBlockHash);
	}
	
	public void getInformation() { // 특정한 한 개의 블록이 있을 때 이 블록에 대한 정보를 출력
		System.out.println("----------------------------------");
		System.out.println("블록 아이디 : " + getBlockID());
		System.out.println("이전 블록의 해시 값: " + getPreviousBlockHash());
		System.out.println("채굴 정답 : " + getNonce());
		System.out.println("블록 데이터 : " + getData());
		System.out.println("블록의 해시 값 : " + getBlockHash());
		System.out.println("----------------------------------");
	}
	
	public void mine() {
		while(true) {
			if(getBlockHash().substring(0, 4).equals("0000")) { // nonce + data + previousBlockHash의 해시 값이 "0000"으로 시작할 때 채굴에 성공 // 채굴 난이도 고정
				System.out.println(blockID + "번째 블록의 채굴에 성공했습니다.");
				break;
			}
			nonce++;
		}
	}
}

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 해시를 적용한 결과 리턴
	}
}

 

<정상적인 경우>

<특정 블록의 데이터 변조>

 

<블록체인 해킹이 불가능한 이유>

1. 특정 블록의 데이터가 변조된다면 이후 모든 블록의 해시 값이 달라진다.

즉, 특정 블록의 데이터 변조를 위해서는 이후 모든 블록에 대한 채굴을 다시 수행해야 한다는 것

2. 이후 모든 블록에 대한 채굴을 다시 수행하여 이전에 발생했던 트랜잭션 정보를

변조하는데 성공했다고 하더라도 전체 네트워크에서 50% 이상의 컴퓨팅 파워를 갖고 있지 않은 이상

올바른 블록체인으로 인정받을 수 없다.

해커의 블록체인 vs 그 외 모든 사람들(과반수)의 블록체인 => 해커의 블록체인은 무시됨

'Block Chain' 카테고리의 다른 글

[Block Chain] Java 실습-3  (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

core > BlockChainStarter

package core;

import util.Util;

public class BlockChainStarter {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		// STEP 1. 해시 알고리즘은 입력 값이 조금만 바뀌어도 결과는 완전히 다른 값이 나온다. 채굴의 원리는 이러한 눈사태 효과에서 출발한다.
		System.out.println(Util.getHash("이승엽")); // 0c2bc0396e93dcc356680303162ced49c0fe2fed31ed1da7753113e413a2c06a
		System.out.println(Util.getHash("이승엽1")); // 55868675c69c4009a2dc5baa44b5326f93429b587b10828a622de61bca097bd7
		
		// STEP 2. 작업 증명(Proof of Work) : 비트코인에서 사용되고 있는 채굴 방식
		int nonce = 0;
		
		while(true) { // 채굴
			
			// 16진수 6자리 => 16 x 16 x 16 x 16 x 16 x 16 => 2의 24승(난이도)
			if(Util.getHash(nonce + "").substring(0, 6).equals("000000")) { // 어떠한 숫자 nonce를 문자열 형태로 바꾼 후 이것의 해시 값이 "000000"으로 시작할 때 채굴에 성공
				System.out.println("정답 : " + nonce); // 665782
				System.out.println("해시 값 : " + Util.getHash(nonce + "")); // 0000000399c6aea5ad0c709a9bc331a3ed6494702bd1d129d8c817a0257a1462
				break;
			}
			
			nonce++; // nonce 1씩 증가
		}
		// 작업 증명이라는 합의 알고리즘을 사용하는 블록체인 시스템은 이처럼 무작위의 입력값을 대입하여 정답(nonce)을 구하는 방식으로 채굴이 가능하도록 설계가 되어있다.
	}
}

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 실습-3  (0) 2022.12.21
[Block Chain] Java 실습-2  (0) 2022.12.21
[Block Chain] 암호화폐  (0) 2022.12.01
[Block Chain] 해시  (0) 2022.12.01
[Block Chain] 쉽게 이해하기  (0) 2022.11.30

그동안 블록체인에는 어떤 문제가 있었길래 세상에 나오지 못했던 걸까?
그리고 비트코인은 그 문제를 어떻게 해결했을까?

단체 대화방에 사람이 많으면 많을수록 거래는 안전하고 신뢰도 높아진다고 했다.
그렇기 때문에 사기 치는 것은 점점 불가능해진다.
하지만 문제는 어떻게 그 많은 사람을 단체 대화방에 모으느냐 하는 것이다.
A와 B가 누군지도 모르는데 누가 남의 거래를 안전하게 해주려고 굳이 단체 대화방에 들어오겠는가?
사람이 없으면 블록체인은 사실 아무런 의미가 없는 기술이다.
사람을 모으려면 인센티브가 있어야 된다고 생각했다. 그것은 바로 돈이다.
현실에서 쓰는 진짜 돈을 주는 것이 아니고 이 시스템 안에서 만든 일종의 포인트 같은 것을 주는 것이다.
그게 바로 비트코인이다.


실제로 많은 사람들이 이 비트코인을 얻기 위해 모여들었다.
요즘 비트코인 같은 암호화폐, 디지털 가상화폐가 이천 개가 넘는데
그중에서 비트코인이 가장 유명한 이유는
블록체인을 처음으로 실현시켰다는 상징성 때문이다. 비트코인은 최초의 암호화폐이다.

어떻게 하면 이 비트코인을 얻을 수 있을까?
참여하는 건 어디까지나 응모이다.
당첨이 되려면 응모를 해야 하지만 응모한다고 다 당첨되는 건 아니다
블록체인에 참여해서 어떤 조건을 달성해야 비트코인을 받을 수 있다.
이 비트코인을 얻는 것을 채굴이라고 부른다.

예전에는 연예인들이 나와서 퀴즈를 푸는 프로가 많았다.
답을 맞히려면 버튼을 누르거나 구호를 외쳐야 하는데
그걸 빨리해야 정답 기회가 주어졌다.
정답을 맞히면 인형이나 점수를 얻고 틀리면 다음 사람에게 기회가 넘어간다.
누군가 정답을 맞히면 모두에게 정답이 공개되면서 그 문제는 끝이 난다.

이 간단한 방식에 채굴의 비밀이 들어가 있다.
비트코인 시스템에 어떤 정보 블록이 만들어졌다고 해보자

블록이 만들어지면 그 블록은 최대한 많은 컴퓨터와 사람들에게 퍼져야 한다.
근데 블록이 하나 만들어졌다고 바로 다 퍼져나가는 게 아니다.
그전에 아주 중요한 절차가 있다. 그 절차가 퀴즈프로와 비슷하다.
블록이 만들어지면 바로 퍼지는 게 아니고 블록에 암호가 걸린다.
즉, 암호가 걸린 블록이 만들어지게 되는 것이다. 이 블록이 하나의 퀴즈 문제가 되는 것이다.
그리고 그 퀴즈를 블록체인에 참여한 컴퓨터들이 푸는 것이다.

 

비트코인 블록의 경우
버전(version), 이전 블록의 해시(previous block hash), 블록 생성 시간(time), 난이도(bits), 넌스값(nonce), 거래내역 해시(merkle root hash) 등의 정보가 담긴다.

 

일명 블록의 암호를 맞춰라 게임이 시작되는 것이다.
그럼 언젠가 제일 먼저 이 암호를 푸는 컴퓨터가 나올 것이다.
그 컴퓨터에게 정답을 맞힌 보상을 주는 것이다. 여기서 이 보상이 비트코인이다.
암호를 푼 컴퓨터만 비트코인을 받고, 나머지는 아무것도 못 받는다.
다음 문제를 기약해야 한다.
블록의 암호가 풀리면 그제야 모든 컴퓨터로 블록이 공유된다.
이렇게 블록의 암호를 푸는 것을 바로 채굴이라고 한다.

비트코인을 얻는 방법은 두 가지가 있다.
이렇게 채굴해서 비트코인을 얻는 방법과 누가 채굴한 비트코인을 돈 주고 사는 방법

나도 채굴할 수 있지 않을까? 라고 생각한다면 다시 생각해 봐야 한다.

거액의 상금이 걸린 과학퀴즈쇼에 나간다고 해보자
근데 출전한 참가자들이 아인슈타인, 뉴턴같은 천재들이다.
이때 과연 우리 같은 사람들이 우승할 확률이  얼마나 될까?
참가하지 않는 게 더 나을 수도 있다.
현재 비트코인 채굴이 바로 이런 상황이라고 보면 된다.

열 명 정도 모아서 게임을 한다고 해보자
게임은 간단하다.
숫자 두 자리를 만들어놓고 정답을 맞추는 것이다.
정답은 00~99까지 숫자 중 하나이다.
제일 먼저 맞추는 사람이 점수를 얻는다.
여기엔 특별한 방법이 없다 계속 찍어서 맞춰야 한다.
이렇게 10명의 사람들이 숫자를 부르다 보면
언젠가는 분명 답이 나올 것이다.
이런 게임이 계속 반복되고 있다고 해보자
그러던 중 어떤 참가자가 이런 생각을 한다.
어떻게 하면 남들보다 정답을 더 많이 맞출 수 있을까?
누가 나랑 같이 풀어주면 더 빨리 풀 수 있지 않을까?
그래서 이 참가자는 친구 한 명을 데리고 와서 문제를 같이 풀기 시작한다.
다른 9명은 혼자서 풀고, 이 사람은 둘이서 풀면
아무래도 이 사람이 답을 맞힐 확률이 더 높을 것이다.
결과적으로 정답률이 확 높아진다.
다른 9명이 바보가 아니고서야 그걸 계속 보고 있을 리가 없다.
자기들도 사람들을 데리고 와서 문제를 풀려고 할 것이다.
어떤 사람은 3명, 4명까지 데리고 와서 풀려고 할 것이다.
난이도는 그대로지만 참가자가 많아져 문제 푸는 시간이 상당히 짧아질 것이다.
다시 말해 문제가 상대적으로 쉬워지는 것이다.
이러면 게임이 재미가 없어진다.
문제 출제자는 문제 난이도를 올릴 수 있다.
이번엔 세 자리를 만들어놓고 정답을 맞추게 한다.
그러면 참가자들은 답을 빨리 맞히기 위해 사람들을 더 불러 모을 것이다.

 

 

이 블록 암호는 이 숫자 게임과 똑같은 원리로 설계되어 있다.
다만 비트코인 채굴에선 사람이 아니라 컴퓨터가 그 암호를 푼다.
컴퓨터도 성능이 좋으면 좋을수록 이 암호를 빨리 풀어 낸다.
어려워진 암호를 풀려면 컴퓨터 성능이 더 좋아져야 된다.
2009년 비트코인이 처음 나오고 지금까지 13년 동안 이 과정이 계속 반복되어 온 것이다.
그렇다면 지금쯤 얼마나 더 어려워졌을까?
비트코인 초창기 암호는 일반 가정 컴퓨터로도 충분히 풀어낼 수 있었다.
하지만 이 과정이 10년 넘게 이어져 오면서
요즘 암호는 처음에 비해 무려 2조배나 어려워졌다고 한다.
그래서 슈퍼메가울트라 컴퓨터를 갖춘 전문 업체까지 등장했는데
대규모 공장단지를 만들어서 어마어마한 컴퓨터를 갖다 놓고 채굴을 하고 있다.
채굴 성공률은 오로지 컴퓨터 성능에 달려있다.
그러니 요즘엔 이런 작업장을 갖출 수 있는 채굴 전문 업체들이
거의 모든 비트코인을 쓸어가고 있다.
3대 채굴업체가 절반이 넘는 비트코인을 채굴하고 있다.
상위 10개 업체가 90%를 차지한다고 한다.
말 그대로 그들만의 리그인 셈이다.

이런 작업을 채굴이라고 하는 이유는?
블록 암호는 점점 어려워진다고 했다.
그럼 더 좋은 성능의 컴퓨터가 필요하다.
근데 성능을 높이려면 그만큼 비용이 많이 들어간다.
쉽게 말해 암호가 어려워질수록 채굴 비용도 높아진다는 뜻
상식적으로 볼 때 어려운 문제를 풀었으면 보상도 그만큼 커야 된다.
하지만 비트코인은 그렇지 않다.
문제는 점점 어려워지는데 보상받는 비트코인은 갈수록 줄어들게 되어있다.
왜 그런지는 아무도 모른다.
비트코인을 만든 사람이 처음부터 그렇게 설계했기 때문
이 비트코인 시스템은 일정 기간마다 암호 난이도는 높아지고
보상은 점점 반으로 줄어들게 설계가 되어 있다.
그래서 지난 10년 동안 계속 반으로 줄어들어 왔다.
언젠가는 보상이 0에 가까워질 것이다.
이때가 되면 암호를 풀어도 보상이 하나도 없다.
보상이 하나도 없다는 말은 고갈됐음을 의미한다.
더 이상 비트코인을 만들 수 없다는 것이다.
다시 말해, 비트코인은 처음 세상에 나올 때부터
만들 수 있는 비트코인의 총량이 정해져 있었다는 것이다.
그 총합이 바로 2,100만 비트코인이다.
비트코인을 만든 사람 또는 단체가 처음부터 그렇게 만들었기 때문이다.

왜 비트코인을 얻는 게 퀴즈게임보단 채굴에 더 가까운지 이해가 됐을 것이다.
예를 들어 어떤 광산에 다이아몬드 원석이 묻혀있다고 해보자
광부들이 원석을 캐기 시작하면 그때부터 이런 일들이 벌어진다.
1. 매장된 원석의 양은 계속 줄기 시작한다.
2. 원석을 캐는 비용이 갈수록 증가한다.
굴을 깊게 파면 팔수록 원석을 캐서 옮기기 더 힘들어지기 때문이다.
결과적으로 채산성이 점점 떨어지는 것이다.
비트코인도 똑같다.
발행할 수 있는 비트코인의 총합이 2,100만 코인으로 이미 정해져있다.
그리고 암호는 점점 어려워지지만 반대로 보상은 계속 줄어든다.
바로 이런 요소 때문에 비트코인 얻는 것을 채굴이라고 하는 것이다.

개발자는 블록체인의 한계를 해결하기 위한 수단으로 코인을 만들었다.
하지만 블록체인은 온데간데없고 사람들은 오직
이 비트코인 사고파는 데만 관심을 갖는다.
이렇게 주객이 뒤바뀌다 보니 예상치 못한 문제들이 생기기 시작했다.
우선, 채굴 업체가 등장한 거 자체가 블록체인의 취지에 맞지 않는다.
중앙에 집중되어 있는 시스템을 해결하기 위해 나온 것인데
소수 채굴업체가 비트코인을 전부 독식하면 이것은 중앙 시스템이랑 별반 바를 게 없다.
블록체인은 많은 참여자가 있어야 더 탄탄해지는 기술이다.
하지만 거대 채굴업체가 버티고 있으면 다수의 순수한 참여자는 여기에 들어갈 이유가 없어진다.
그렇다면 채굴업체들은 영원히 여기 있어줄까? 이 업체들은 순전히 돌을 벌기 위해 들어온 것이다.
언젠가 버는 돈보다 채굴 비용이 높아지면 그땐 여기서 손을 뗄 것이다. 그럼 그땐 어떻게 될까?
암호 난이도는 저세상 난이도로 높아져있는데 이걸 풀 수 있는 컴퓨터가 없는 것이다.
그럼 더 이상 블록이 만들어지지 못한다. 그때도 과연 비트코인이 정상적으로 작동할지에 대해서는 생각해 봐야 한다.

 

'Block Chain' 카테고리의 다른 글

[Block Chain] Java 실습-3  (0) 2022.12.21
[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.11.30

블록체인에서 해시 함수가 하는 역할은 암호화이며 해시값 비교를 통해서 위변조 여부를 판별, 무결성 검증에 사용

비트코인의 블록체인에 사용된 해시 함수는 SHA(Secure Hash Algorithm)-256 해시 함수

 

1. 단방향

ABCD 입력 -> s1rw2ww2k1gf12bc04fvc12nzw2 (O)

s1rw2ww2k1gf12bc04fvc12nzw2 입력 -> ABCD  (X)

 

2. 한 글자만 달라져도 완전히 다른 값

AB 입력 -> e152zwqetyqwe1weffw12zgw26shqw

AC 입력 -> ke16w2pwe123zymxnew102sm21z6

ABAC 입력 -> o1sw124n7sk5jbdk23jn21j6nh2w

 

 

사용자의 pw처럼 안전하게 저장되어야 하는 정보의 경우
Salting 작업으로 보다 안전하게 정보를 저장할 수 있다.
소금을 친다는 의미로 사용자의 pw와 salt 값을 합치고 그 값을 해싱한다.
해싱된 값과 salt 값을 사용자 테이블에 같이 저장해놓고 레인보우 테이블을 무력화 시키는 것이다.


내 암호 : 12345678
내 암호의 해시값 : q512me21l236xqw561236612

생성된 salt 값 : 9syl0

내 암호 + 생성된 salt 값 : 123456789syl0

내 암호 + 생성된 salt 값의 해시값 : s92m21stw160sq22nfswr2fsqw2

 

사용자 테이블에 salt 값인 9syl0와 해시값 s92m21stw160sq22nfswr2fsqw2이 저장되어 있다면

나는 로그인할 때 내 암호 12345678를 입력할 것이고

테이블에 저장되어 있는 값인 salt 값 9syl0이 내 암호와 합쳐져 해싱된 후

s92m21stw160sq22nfswr2fsqw2와 일치한다면 정상적으로 로그인 되는 것이다.

 

'Block Chain' 카테고리의 다른 글

[Block Chain] Java 실습-3  (0) 2022.12.21
[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.11.30

메신저 대화방에 A와 B가 있다.

A : B야 나 10만원만 빌려줘
B : 알았어
(B가 A에게 10만원을 보냈습니다.)
B : 보냈어
A : 고마워
1달 후
B : A야 빌려간 돈 10만원 언제 줄 거야?
A : 무슨 말이야? 내가 언제 돈을 빌려?
B : 너 1달 전에 나한테 10만원 빌렸잖아
A : 아니 그런 적 없는데?
B : 지난 대화 내용 봐봐
(B는 달이 바뀌면 지난달 대화방을 지우는 습관이 있다.)
(A 또한 B에게서 돈을 빌린 기록을 지우기 위해 자신의 대화방의 내용을 지웠다.)
A : 아니 그런 내용 없어
B : 야 너 나한테 이러면 안되지..
A : 아무튼 난 모르는 일이야

B는 메신저 본사 중앙 서버에 기록이 저장되어 있지 않을까 하고 메신저 본사에 찾아간다.
하지만 A는 메신저 본사의 서버 관리자였고, A는 중앙 서버의 기록도 삭제를 해버렸다.
결국 B는 A에게 빌려준 돈 10만원을 받지 못했다.

중요한 정보가 하나 혹은 소수에게 맡겨져 있다면 보안이나 안전에 취약할 수밖에 없다.
블록체인은 이러한 문제를 해결하기 위해 개발된 시스템이다.

많은 사람이 알면 알수록 그 정보의 신뢰는 높아진다.

만약 대화방에 C까지 있었다면 C의 대화방에 내용이 남아있을 것이므로 A는 사기 치기 더 어려워진다.
하지만 아직은 안전하다고 할 수 없다. A가 C를 자기편으로 만들 수 있기 때문이다.

하지만 단체 대화방에 10명이 있었다면?
A가 완전범죄를 하려면 자신과 B를 제외한 8명을 매수해야 된다.

그렇다면 대화방에 사람이 10000명이 있었다면?
A의 완전범죄는 사실상 불가능에 가깝다.
A가 B에게 돈을 빌린 사실을 증명해 줄 사람이 더욱 많아지기 때문이다.

 

어떤 정보를 최대한 많은 사람들이 나눠가지며
그 정보의 신뢰성과 보안을 높이는 기술이 블록체인이다.

 

블록은 벽돌이나 덩어리 같은 뜻이며,
체인은 연결, 고리라는 뜻이다.
블록이 정보이고 그 블록을 많은 사람들에게 공유하며
묶는다고 해서 블록체인인 것이다.

 

정보를 금고에 꼭꼭 숨겨서 지키는 것이 아니라
오히려 많은 사람들에게 나누면서 그 정보를 지키는 것
그것이 블록체인의 핵심 컨셉이다.

블록체인은 왜 나왔을까?
중앙 집중 시스템의 문제점을 해결하기 위해서였다.
우리가 쓰는 거의 대부분의 서비스가 이런 중앙 관리식으로 되어있다.
은행, K톡, Y튜브 등을 예로 들 수 있다.

 

이 방식도 장점이 있지만, 치명적인 약점이 있다.
모든 정보가 한 곳에 집중되어 있다는 것이다.

그래서 해커들은 항상 이 중앙 서버만 노린다.

이 중앙 서버를 지키는 게 보안의 핵심이고
해커들 입장에서는 이 중앙 서버를 터는 게 공격의 핵심이다.

나무문을 만들면 망치로 뚫고, 돌문을 만들면 드릴로 뚫고, 철문을 만들면 폭탄으로 뚫는 식으로
더 단단하게 막으려는 쪽과 더 뾰족하게 뚫으려는 쪽의 끝도 없는 싸움이었다.

블록체인은 그런 핵심 중앙이 없는 구조로

평등한 컴퓨터 혹은 참여자, 사람들이 모든 정보를 다 같이 공유하고 있는 것이다.
그렇기 때문에 해커들이 마땅히 공격할 곳이 없다.
만약 어딜 공격해서 그 정보를 조작했다고 해도, 수많은 참여자가 올바른 정보를 갖고 있기 때문에
그 조작된 정보가 힘을 발휘할 수 없는 것이다. A가 10000명이나 되는 사람의 메신저 대화내용을 조작할 수는 없는 일이다.
몇몇 일부의 메신저 대화내용을 조작하더라도 여전히 수많은 사람들이 원본을 갖고 있기 때문에 별 의미가 없다.

세상이 변해서 컴퓨터, 휴대폰뿐만 아니라 일상의 모든 기기들이 서로 연결되고 있다.
IOT, 초연결시대 등 여러 가지로 불리고 있는데 이렇게 연결될수록 항상 제기되는 문제가 바로 보안이다.
블록체인은 바로 이 연결과 공유를 컨셉으로 하면서도

동시에 보안까지 해결하기 때문에 새로운 기술로 각광을 받는 것이다.
정리하자면 블록체인은 어떤 정보를 다 같이 공유하는 시스템을 말한다.
정보가 새로 추가되면 그 정보도 모든 참여자에게 나눠진다.
정보는 블록 장난감처럼 만들어진 순서대로 차곡차곡 쌓이게 된다.
그 쌓인 정보 블록이 모두에게 공유되면서 안전하게 지켜지는 것이다.
블록체인은 시스템을 이런 식으로 관리하면 어떨까 하는 '컨셉과 아이디어'지
어떤 특정 제품을 말하는 것이 아니다.

 

음식으로 예를 들면 닭을 기름에 튀기는 건 다양한 요리법 중 하나일 뿐
튀김 그 자체가 어떤 특정 요리를 뜻하는 건 아니다.

이러한 블록체인 컨셉은 최근에 갑자기 개발된 것이 아니다.
이론과 아이디어는 오래전부터 있었지만 그것을 현실적으로 구현해내지 못했었다.
왜냐하면 이 블록체인에도 해결해야 할 과제가 있었기 때문이다.
그러던 중 2009년 이 블록체인을 처음으로 실현시킨 특정 상품이 등장하게 되는데
그것이 바로 비트코인이다.

'Block Chain' 카테고리의 다른 글

[Block Chain] Java 실습-3  (0) 2022.12.21
[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

+ Recent posts