본문 바로가기

블록체인_9기/⛓ BlockChain

55강_230901_Blockchain(블록체인이란?, 블록체인 4대 요소 기술, 블록의 구성, 블록체인 알고리즘, 유저 로그인 서비스 전략패턴)

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