728x90
BLOCKCHAIN
블록이라고 하는 소규모 데이터들이 P2P 방식을 기반으로 생성된 체인 형태의 연결고리 기반의 분산 데이터 저장 환경에 저장하며 누구든 임의로 수정할 수 없으며 누구나 변경의 결과를 열람할 수 있는 분산 컴퓨팅 기술 기반의 원장 관리 기술
BLOCK 이란?
- 다수의 트랜젝션을 하나로 관리하기 위한 묶음.
- 위에서 말하는 소규모 데이터는 '트렌젝션'을 말한다.
- 트랜젝션은 간단히 말해서 거래정보.
- 송금이나 등등의 거래가 이뤄지면 그 정보를 기록한다.
트랜젝션?
- 쪼갤 수 없는 업무처리 최소 형태
P2P
- peer to peer 방식
- 중앙 집중식 관리 시스템이 아닌, 컴퓨터 간에 직접 연결을 통해 정보를 주고 받는다.
- 서로가 서로에게 클라이언트이며 서버이다.
원장 관리
- 원장이란, 원본 장부, 거래에 대한 정보를 기록한 원본 문서이다.
- 원장 관리란, 거래에 대한 기록을 관리하는 기술을 말한다.
비트코인 백서
- 비트코인은 개인 대 개인 전자 화폐 시스템이고
- P2P 직접 거래를 제안한다.
- 개인과 개인간에서 전자 화폐 송금 시스템을 제안한다.
- satoshi Nakamoto(사토시 나카모토)가 개발했다고 전해진다. 누군지는 모른다...
- 개발자 이전에 경제학으로도 지식을 가지고 있었을 것으로 추측된다.
개인 대 개인 거래
- 개인 대 개인 버전 전자 화폐는 금융기관을 거치지 않고 한 쪽에서 다른 쪽으로 직접 전달되는 온라인 결제를 실현한다.
- 우리가 사용하고 있는 금융 시스템은 금융기관을 통해서만 한 쪽에서 다른 쪽으로 전달되는 온라인 지불이었다.
- 기존에는 개인간에 직접 돈을 전달하기 위해서는 오프라인으로 만나서 직접 현금을 지불하면 직접 전달이 가능하지만
- 온라인의 경우 개인과 개인 간의 구축된 시스템을 거치지 않는 이상 다른 방법은 존재하지 않는다.
- 비트코인은 어떤 중앙 기관 없이 내가 가진 자산을 다른 사람에게 직접 전달할 수 있는 시스템을 구현한다고 보면 된다.
게인 대 개인 거래의 문제점 해결
- 이중지불을 막기위해 신뢰할 수 있는 제 3자가 필요했고 이중 지불 문제를 해결하기 위해서 중앙화된 기관 없이 이중지불을 막기 위해 블록 타임스탬프(생성시간)를 기록하고 거래 내용을 해싱하고 해시 기반 작업증명을 연결한 사슬로 만들어서 작업 증명을 재 수행하지 않으면 변경할 수 없는 기록을 만든다.
- 블록체인이라는 단어가 여기서 나오는 것이다. '연결한 사슬이라는 것'이 블록들의 타임스탬프를 기록하고 데이터의 위변조 없이 안전한 데이터 해시 기반 작업을 증명한다.
가장 긴 사슬 (롱기스트 체인 룰)
- 개인 대 개인간의 네트워크이고 중앙 기관이 없이 체인이 여러 개로 나누어질텐데 가장 긴 체인을 선택해서 하나의 체인을 유지할 수 있는 기반을 만들어 놓은 것이다.
비트코인이 왜 생겼을까
- 사토시 나타모토는 2008년 금융 위기를 보면서 현재 우리가 신뢰하는 중앙 기관이 실제로는 신뢰하기 어려운 기관이라 생각했고 비트코인을 제안하게 되었다.
블록체인의 4대 요소 기술
1. 블록과 트랜젝션
- 트랜젝션은 사용자의 송금 내역이 있고 송금 내역들을 하나의 블록에 포함 시켜야지만 안정성을 보장할 수 있는 기반을 만들 수 있다.
- 그 블록들이 해시 알고리즘과 블록채굴(POW, POS, POA)을 통해서 연결하는 형태가 블록체인
2. 분산 네트워크
- 사용자들이 언제든 네트워크에 참여할 수 있고 나갈 수 있는 것이다.
3. 암호화
- 거래가 위변조 되지 않았다고 증명할 수 있다.
4. 합의 알고리즘
- 분산 네트워크에서 중앙화된 기관이 없으니까 하나의 체인을 구성하는 것이 매우 중요하고 그리고 분산화된 네트워크에서 모든 사용자들이 납득할 수 있는 하나의 거래내역이 필요한데 이걸 하나로 정리해주는 것이 합의 알고리즘이다.
블록의 구성
- 블록은 특정 정보를 담아 놓은 객체라고 보면된다.
- 블록을 생성할 때, Header와 Body를 나눠서 생성하는 것이 아니고 블록에 대한 이해를 쉽게 하기 위해서 Header와 Body로 구분해 놓은 것.
블록의 헤더
- 버전 정보
- 이전 블록의 해시
- 몇 번째 블록인지 정보(높이)
- 블록의 생성 시간의 정보(타임스탬프)
- 블록의 해시
- 블록의 body의 내용을 해싱한 값(머클 루트)
- 채굴의 난이도 5
- 연산한 값이 결과가 00000
- 난이도의 값은 연산한 값의 결과에서 0의 개수가 값의 이상일 경우
- 블록 생성 시간이 짧으면 난이도를 상승하고 느리게 생성되면 난이도가 하락.
- 논스 = 블록을 채굴하기 위해서 연산 작업을 몇 번 반복했냐
블록의 바디
- 블록에 저장할 데이터(트랜젝션 내용)
블록체인 알고리즘
작업 증명 POW(proof of work)란
- 비트코인의 합의 알고리즘(최초의 합의 알고리즘) 연산 작업을 기반으로 합의한다.
- 새로운 블록을 블록체인에 추가하려면 난이도에 따른 값을 찾는 반복작업을 해야한다. 그 작업을 완료했다는 작업의 증명방식
- 높은 에너지 소비 환경 오염
지분 증명 POS(proof of stake)란
- 담보 같은 느낌. 보상을 받기 위해 암호화 토큰을 스테이킹(예치)하고 예치한 양애 비례한 퍼센트(확률)로 채굴 권한을 받는다. 확률은 스테이키한 토큰의 양에 비례한다.
- 비잔틴 결함의 이론적인 위협은 있다. 팀을 구성해서 네트워크를 방해하는 경우
- 환경 친화적 전력소비를 줄일 수 있다.
권위 증명 POA(proof of Athority)
- 권위 증명 방식은 권위 있는 기관에서 조건에 맞는 노드를 증명해서 이들간의 합의를 이루는 방식이다. 두나무 블록체인 서비스(DBS는 권위 증명 방식을 사용한다.)
- 네트워크에 참여한 멤버들한테 네트워크 운영에 참여할 권리를 주고 전원이 해당 권한을 위임에 투표를 진행한다.
블록체인의 거래정보 변경이 불가능한 이유
- 블록의 머클루트 계산에 이전 블록의 해시가 포함되어 있기 때문에 하나의 블록의 내용이 변경되면 변경된 블록부터 다음 블록들의 해시 변경으로 이어지기 때문에
- 거래 정보 변경 -> 머클루트 -> 머클루트 변경으로 블록 해시 변경
- 쉽게 말해서 블록의 거래정보를 변경하기 위해서 거래 정보를 변경한 블록부터 이후의 블록을 순서대로 다시 채굴을 진행해야 하기 때문에 그 동안 블록도 생성되고 있고, 양자 컴퓨터가 개발되지 않는 이상 현시점에서 불가능하다.
유저 로그인 서비스 전략패턴
#. 폴더의 경로는 다음과 같다.
1. user/interface/login.request.ts_유저 정보 객체 구조 정의
// 유저 정보 객체 구조 정의
export interface UserParams {
email: string;
password: string;
}
2. user/strategy/Authenticator.ts_응답 정보 및 검증객체 구조 정의
import { UserParams } from "../interface/login.request";
// 응답 정보 객체 구조 정의
export interface AuthenticatonResponse {
success: boolean;
// message : 옵셔닝. 키가 있어도 되고, 없어도 되는 구조이다.
message?: string;
}
// 검증 객체 구조 정의
export interface Authenticator {
// 로그인 검증을 할 함수선언
authentcate(credentials: UserParams): Promise<AuthenticatonResponse>;
}
3. user/strategy/email.strategy.ts_이메일 로그인 검증 클래스 정의
import { UserParams } from "../interface/login.request";
import { AuthenticatonResponse, Authenticator } from "./Authenticator";
// 이메일 로그인 검증 클래스 정의
export class EmailAuthenticator implements Authenticator {
async authentcate(credentials: UserParams): Promise<AuthenticatonResponse> {
// 이메일 로그인 로직 부분
console.log("email login 성공");
return { success: true };
}
}
4. user/strategy/google.strategy.ts_구글 로그인 검증 클래스 정의
import { UserParams } from "../interface/login.request";
import { AuthenticatonResponse, Authenticator } from "./Authenticator";
//검증 객체 구조 상슥
export class GoogleAuthenticator implements Authenticator {
async authentcate(credentials: UserParams): Promise<AuthenticatonResponse> {
// 구글 로그인 로직 작성 부분
console.log("Google login 성공");
console.log(credentials);
// 반환값의 객체는 AuthenticatonResponse 인터페이스로 구조 정의 해놓은 것이다.
return { success: true , message : "ㅊㅋㅊㅋ 구글 로그인 성공이다" };
}
}
5. user/strategy/kakao.strategy.ts_카카오 로그인 검증 클래스 정의
import { AuthenticatonResponse, Authenticator } from "./Authenticator";
import { UserParams } from "../interface/login.request";
// 검증 객체 구조 상속
export class KakaoAuthenticator implements Authenticator {
async authentcate(credentials: UserParams): Promise<AuthenticatonResponse> {
// 카카오 로그인 로직
console.log("kakao login 성공");
return { success: true };
}
}
6. user/strategy/strategy.ts_전략패턴 구조와 서비스 로직을 담은 클래스를 정의
import { UserParams } from "../interface/login.request";
import { AuthenticatonResponse, Authenticator } from "./Authenticator";
// 전략 패턴 객체 구조 정의
interface IStrategy {
// key를 문자열로 지정한다.
// key가 동적으로 추가될 수 있고
[key: string]: Authenticator;
}
// 서비스 로직들을 가질 객체 구조 정의
class Strategy {
private strategy: IStrategy = {};
// 서비스 로직을 객체에 추가할 함수
public set(key: string, authentcate: Authenticator) {
// key 값을 받고 서비스 로직 추가
this.strategy[key] = authentcate;
}
public async login(
type: string,
credentials: UserParams
): Promise<AuthenticatonResponse> {
// google, {email, password}
const result = await this.strategy[type].authentcate(credentials);
return result;
}
}
export default Strategy;
7. user/service/user.service.ts_로직에 따른 동작을 할 수 있도록 전략패턴 서비스 클래스 생성
import { UserParams } from "../interface/login.request";
import { AuthenticatonResponse } from "../strategy/Authenticator";
import Strategy from "../strategy/strategy";
// 유저 서비스 로직 클래스 정의
class UserService {
// 전략패턴 유저 로그인 서비스 로직 객체
// 이메일, 카카오, 구글 세 가지 로그인 로직을 사용할 것임
constructor(private readonly strategy: Strategy) {}
async login(
type: string,
credentials: UserParams
): Promise<AuthenticatonResponse> {
// google, {email, password}
const result = await this.strategy.login(type, credentials);
return result;
}
}
export default UserService;
8. user/user.cotroller.ts_유저 회원가입에 대한 인증 컨트롤러를 생성한다.
import { UserParams } from "./interface/login.request";
import UserService from "./service/user.service";
// 사용자 서비스 로직 클래스 정의
class UserController {
constructor(private readonly userService: UserService) {}
// ' /login/:type '해당 경로로 요청이 들어왔을 때 실행할 함수
signin() {
// signin(type) {
// req.body 유저의 정보를 받아오고
// 현재는 body에서 받아올 값이 없기 때문에 임시 객체 생성한다.
const loginParams: UserParams = {
email: "wee@naver.com",
password: "1234",
};
this.userService.login("google", loginParams);
// this.userService.login(type, loginParams);
}
// 회원가입
// ' /signup ' 경로로 요청이 들어왔을 때 실행할 함수
signup() {
// 회원가입 로직
}
}
export default UserController;
8. user/index.ts_설정한 유저 회원가입 전략을 다양하게 관리 및 실행
import UserService from "./service/user.service";
import Strategy from "./strategy/strategy";
import { GoogleAuthenticator } from "./strategy/google.stategy";
import { KakaoAuthenticator } from "./strategy/kakao.stategy";
import { EmailAuthenticator } from "./strategy/email.stategy";
import UserController from "./user.controller";
// 전략 패턴 객체 생성
const strategy = new Strategy();
// {strategy : {}, set(), login()} 해당 형식의 객체가 생성
strategy.set("email", new EmailAuthenticator());
// {strategy : {EmailAuthenticator{ authentcate }}, set(), login()}
strategy.set("kakao", new KakaoAuthenticator());
// {strategy : {EmailAuthenticator{ authentcate }, KakaoAuthenticator{ authentcate }}, set(), login()}
strategy.set("google", new GoogleAuthenticator());
// {strategy : {EmailAuthenticator{ authentcate }, KakaoAuthenticator{ authentcate }, GoogleAuthenticator{ authentcate }}, set(), login()}
// 완성된 객체를 유지 서비스. 클래스 생성자의 매개변수로 전달 및 유지 서비스 객체 생성
const userService = new UserService(strategy);
// 유저 로그인 로직 클래스 생성 및 유저 서비스 로직 객체 생성자 매개변수로 전달
const userController = new UserController(userService);
userController.signin();
// 매개변수를 받도록 설정하면 해당 방식으로 가능
// userController.signin("email");
728x90
'블록체인_9기 > ⛓ BlockChain' 카테고리의 다른 글
60강_230918_Blockchain(Transaction?) (0) | 2023.09.18 |
---|---|
59강_230912_Blockchain(블록체인 지갑, 디지털 서명, ECC를 활용한 지갑 생성) (0) | 2023.09.12 |
58강_230908_Blockchain(P2P란?, P2P 네트워크 개발) (0) | 2023.09.12 |
57강_230905_Blockchain(chain 생성) (0) | 2023.09.07 |
56강_230904_Blockchain(SHA256, merkle Tree/Root, Block 생성, TypeScript로 Block 생성) (0) | 2023.09.04 |