BlockChain 5

[Typesript] 암호화폐 지갑 웹으로 구현해보기(트랜잭션&정보입력)

넌작스 다운로드 해주기. wallet/server.ts import express from 'express' import nunjucks from 'nunjucks' import { Wallet } from './wallet' import axios from 'axios' const app = express() const userid = process.env.USERID || 'podo' const userpw = process.env.USERPW || '1234' const baseurl = process.env.BASEURL || 'http://localhost:3000' const baseAuth = Buffer.from(userid + ':' + userpw).toString('base64') c..

블록체인 2022.06.17

[Typescript, 블록체인] P2P 네트워크를 통한 브로드캐스팅 구현하기

목차 -브로드캐스팅 -코드 구현 브로드캐스팅 탈 중앙화 시스템에서 거래는 '브로드 캐스팅'을 통해 이루어진다. 중앙화 시스템(우리가 사용하는 은행을 예로들면)에서는 나의 거래 데이터를 중앙 서버에 전송한다. 이에 반해 탈 중앙화 시스템에서는 나의 거래 데이터를 나와 연결된 모든 노드(피어)에게 전송한다. 이렇게 탈 중앙화 시스템에서는 시스템에 참여하는 모든 노드가 서로 데이터를 전송한다. 이론상 모든 노드가 순서는 다르지만 모두 같은 데이터를 가지고 있어야 한다. 하지만 현실에서는 네트워크의 상황이나 네트워크 오류, 피어의 관계 등에 따라(데이터 전달 속도가 다르므로) 특정 시점에 모든 노드가 가지고 있는 데이터는 서로 상의할 수 있다. 이때, 데이터를 가지고 있다고 해당 데이터가 무조건 '기록'되는 것..

블록체인 2022.06.15

[Typescript] 타입스크립트로 블록체인 마이닝(채굴) 구현하기

채굴을 위해 사용되는 mining 함수는 이전 블록의 해시값, 시간, 거래내역, 난이도(diff)를 인자로 받는다. 그리고 해당 값과 난스, 해시값을 합쳐 블록(block)을 만든다. 블록은 반복적인 해시값 계산을 통해 난이도를 통과하면 최종적으로 반환된다. 이렇게 난스를 증가시켜가며 난이도에 맞는 해시값을 발견하는게 바로 '채굴(마이닝)'이다. 따라서, 마이닝을 위해선 difficulty를 알아야하는데, 이를 위해서 일단 chain을 생성해주어야한다. chain은 쉽게 말하면 배열이다. difficulty는 지속적으로 변하는데(난이도조정), 기준이 이전 블록이므로, 연결은 반드시 이루어져 있어야한다. 코드를 작성하기 전에, 라이브러리를 설치해주는 것을 잊지말자! merkle, crypto-js, hex..

블록체인 2022.06.14

[Typescript] 타입스크립트로 블록체인 블록 검증하기

중간에 누군가 데이터를 바꿀 수도 있기 때문에 블록이 변조되지 않았는지, 검증이 필요하다. 블록을 검증하는 조건은 아래와 같이 총 3가지인데, 이를 모두 만족해야한다. 1) 새로운 블럭height 값 = 이전 블럭 height 값 + 1 : height가 1 씩 증가 2) 이전 블럭의 hash 값 = 새로운 블럭의 previousHash 값 3) 블럭의 version, merkleRoot, timestamp, height, previousHash 값을 조합해 hash를 생성했을 때, 블럭의 hash와 값과 동일한지 : 같은 데이터기 때문에 hash도 당연히 같아야한다. 1. 타입선언 @types/Failable.d.ts declare type Result = { isError: false; value: ..

블록체인 2022.06.14

[Typescript] 타입스크립트로 블록체인 블록 구현하기

루트 디렉토리에서 @types 라는 이름의 디렉토리를 하나 생성한다. 그 안에 Block.d.ts 라는 이름으로 파일을 하나 만들어주겠다. 이 파일에서 interface를 정의해줄 것이다!! (interface:타입을 전역적으로 선언하는 것이라고 보면 됨) **blockchain/Block.d.ts (typescript) declare interface IBlock { merkleRoot: string hash: string data: string[] height: number } declare interface IBlockHeader { version: string height: number timestamp: number previousHash: string } **blockchain/blockHea..

블록체인 2022.06.09