일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- node.js path
- cookie-parser 만들어보기
- 라우터와 미들웨어
- JWT 만들어보기
- next 매개변수
- ws 라이브러리
- OAuth 카카오
- 라우터미들웨어 분리
- 시퀄라이즈 기본설정
- 라우트 매개변수
- express실행
- 세션으로 로그인 구현
- useEffect clean up
- Uncaught Error: could not find react-redux context value; please ensure the component is wrapped in a <Provider>
- JWT 하드코딩
- FormData()
- css기초
- 비동기파일업로드
- useContext
- 라우터 분리
- JWT 로그인 기능 구현
- express router
- javascript기초
- nodejs파일업로드
- express.static
- 블록 만들기
- 아이디 중복체크기능
- mysql wsl
- express session
- buffer.from
- Today
- Total
목록분류 전체보기 (110)
즐코
https://yjleekr.tistory.com/80 이전 포스팅에서는 지갑 생성까지만 했었다면, 이번엔 fs를 이용해서 지갑을 생성할 때마다 특정 폴더에 저장할 것이다. 그리고 저장된 지갑의 목록을 불러와서 지갑 디테일 확인 및 해당 지갑의 개인키를 이용하여 서명도 만들고, 서명과 함께 트랜잭션을 블록체인 서버쪽에 보낼 것이다. 지갑과 지갑서버 1. 지갑 저장 및 생성된 지갑 내용 화면에 뿌리기 파일 저장 시엔 각 지갑의 계정을 파일명으로, 파일 내용엔 개인키가 들어가게끔 코드를 작성했다. Wallet 클래스를 만들 때 생성자메소드의 인자를 받지 않았었는데, 추후 지갑들 목록에서 지갑을 가져올 때 개인키를 넣고 나머지 값을 불러올 것이므로, 인자로 개인키를 받아주는 걸로 수정한다. (실제론 요청/응답..
저번 포스팅에 이어서 트랜잭션에 대해 간단히 정리하고자 한다. 1. transaction 1/ Transaction 여러개의 input과 여러개의 output으로 구성되어 있다. 그렇기 때문에 transaction의 interface는 각각의 거래인풋들과 거래아웃풋들을 가지고 있는 배열 형태로 만들어줄것이다! - transaction 내 hash가 나타내는 값? txins와 txouts를 합쳐서 hash하여 거래 고유 인덱스값을 나타낸다. // wallet/transaction.ts interface ITransaction { hash: string; txins: ITxIn[]; txouts: ITxOut[]; } 이 트랜잭션 input과 output이 어떻게 생기는지 간단한 예로 풀어써보면 아래와 같다..
1. HTTP 기본 인증 - Basic 서버는 사용자를 식별하여 작업이나 리소스에 접근할 권한을 결정한다. 보통은 사용자 이름과 비밀번호를 입력해서 인증하는데, HTTP는 uri로 자체적인 인증 관련 기능을 제공한다. 밑의 uri 구조에서 auth과 관련된 부분이 있는데, 사용자명:비밀번호를 입력하여 특정 영역의 접근 권한을 얻을 수 있다. 현재 chrome 브라우저에선 이런 Basic 이 보안에 좋지않아 사용하지 못한다고하지만, 블록체인 네트워크의 인증에선 아직까지도 이 basic 방식이 쓰인다고 한다. HTTP 기본 인증 흐름 (Basic) 1. 클라이언트->서버 : GET 요청으로 url을 던진다. (인증 정보가 없는 상태) 2. 서버->클라이언트 : 사용자에게 아이디와 비밀번호를 제공하라는 의미..
지갑, 트랜잭션에 대해 이해하려면 개인키/공개키를 알아야하므로 이와 관련된 암호화 개념부터 시작한다. 1/ 암호화 기법 지갑에 대해서 알려면 우선 암호화기법에 대해 가볍게 짚고 넘어가야한다. 우선 암호화를 하는 가장 중요한 이유는 바로 무결성이다. 어떠한 정보나 데이터가 원본으로부터 조작되지 않았는지 무결성을 체크하는데 있어서 이 해시알고리즘이 쓰인다고 보면 된다. 1. 양방향암호화 - 대칭형 대칭키 하나로 암호화/복호화가 가능하다. 암호화한 정보를 다른 사람에게 보낼 때 이 대칭키도 같이 보내야하기때문에 대칭키의 보안이 매우 중요하다. 2. 양방향암호화 - 비대칭형 암호화하는데 있어서 공개키(public key)를 사용하고 나중에 복호화 시 개인키(private key)를 쓴다. (반대로도 가능하다!)..
1/ P2P 네트워크란? Peer To Peer 기존에 배웠던 서버-클라이언트로 구분된 통신이 아닌 노드-노드간의 통신으로 블록체인의 탈중앙화 개념과 일맥상통하다. 한 컴퓨터가 서버가 되기도 하고 클라이언트가 되기도 하기 때문에, 이전에 frt/back을 나눠서 코드를 작성해준 것과 달리 서버쪽 코드와 클라이언트쪽 코드를 같이 한 파일 안에서 작성해줌으로써 P2P 네트워크를 구축한다. 2/ P2P 네트워크 구축하기 1. BlockChain 클래스 정의 우선, 기존에 만들어둔 Chain 클래스를 사용해서 블록체인 클래스를 새로 정의해준다. 해당 블록체인 클래스를 사용해서 클래스 내부의 메소드를 사용해 블록체인 내용을 조회해보는 api 나 블록 채굴 api를 서버 쪽에 만들어줄 수 있다. // src/cor..
저번 포스팅에 이어서 블럭에 논스를 추가하고 블럭들 간의 난이도를 조절하는 과정을 추가한다. 그리고 이 업데이트한 블록을 같은 배열안에 넣어 블록 체인 형태를 만들어보고자 한다. 1. 난이도 조절을 위한 설정값 만들기 난이도라는 건 목표값보다 낮은 해시를 찾기 위한 논스값을 연산하는 데 얼마나 오래 걸리냐이다. 즉, 새로운 블록 생성 시간이 난이도와 연관되어 있다. 늦게 생성되면 난이도가 어렵다는 것이고, 빨리 생성되면 난이도가 낮다는 것이다. (관련 개념 포스팅 : https://yjleekr.tistory.com/75?category=1284408) 그렇기때문에 난이도의 평균시세(?)를 구하기 위해서 2가지 상수가 필요하다. 1/ 이상적으로 생각하는 블록의 평균 생성 시간 2/ 난이도 측정에 필요한 ..
저번 블록 만들기 포스팅에는 블록 상에 논스와 난이도가 빠져있는데, 여기서 추가한다. 1. 제네시스 블록 따로 만들어주기 저번 포스팅에선 블록을 생성할때 테스트 코드에다가 이전 블럭으로서 제네시스 블록을 만들어서 넣어주었다. 이젠 테스트 코드가 아닌 config.ts 상에서 제네시스 블럭을 선언해놓고 쓰려고한다. // src/core/config.ts export const GENESIS: IBlock = { version: "1.0.0", height: 0, hash: "0".repeat(64), timestamp: 1231006506, previousHash: "0".repeat(64), merkleRoot: "0".repeat(64), nonce: 0, difficulty: 0, data: ["He..
작업증명, 논스, 난이도 개념이 헷갈려서 우선 전체적으로 개념 정리를 간단하게 해보았다. 1/ 작업증명 POW (Proof Of Work) - 새로운 블록을 블록 체인에 추가하는 작업을 완료했음을 증명하는 것 - 블록을 블록체인에 추가하려면 새로운 블록의 블록 해시를 계산해내야하는데, 그 블록의 헤더 정보 중 하나인 nonce 값을 구해야 그 블록 해시를 구할 수 있기 때문에 결국 nonce를 구하는 게 작업 증명이다. 2/ nonce - number used only once 한번만 쓰인 숫자를 뜻함 - 최초 0에서 시작하여 조건을 만족하는 해시값을 찾아낼 때까지 1씩 증가시키면서 반복적으로 계산한 블록 해시값이 특정 숫자보다 작은 값이 나오면 그 때의 nonce 값으로 계산한 블록 해시가 그 블록의 ..
기본적으로 ts 를 쓰기 위한 세팅은 완료하고 시작한다. (해당 블록엔 아직까지 논스와 난이도에 대한 개념이 들어가지 않은 상태이고, 이건 추후 다른 포스팅에서 추가할 예정) 1. 블록의 타입 지정하기 - @types 폴더 만들고 그 안에 Block.d.ts 파일 생성 1/ block header 정의 : version, height, timestamp, previousHash 2/ block 정의 : 우선 블럭 자체가 블럭헤더를 품고 있기 때문에 extends 키워드로 IBlockHeader를 상속받아오기 - merkleRoot : 바디의 data를 해싱한 값이기 때문에 block에서 만들어줘야함 - hash : block header의 해싱값과 block body 데이터의 해싱값인 merkleRoot..
Generic이란 ? - 데이터의 타입을 일반화한다(generalize) - 데이터 타입을 확정지어놓지 않고 유동성 있게 여러 타입을 사용할 수 있게 해줌 - 선언 시점이 아니라 생성 시점에 타입을 명시하여 고정된 타입이 아니라 다양하고 유동성있는 타입을 사용할 수 있도록 해준다. - 한번의 선언으로 다양한 타입에 '재사용'이 가능하다는 장점이 있다. any가 Generic과 다른 점 - 함수의 반환 타입을 유추하기 어려움 - 매개변수의 프로퍼티를 체크할 수 없다 제네릭 함수 쓰는 방법 - 함수명 뒤에 를 추가 (Type의 T에서 따온 거고, 아무 문자나 적어도 된다) - 해당 T를 매개변수의 타입이나 반환 타입으로 설정이 가능하다. // @types/Failable.d.ts declare type Re..