728x90

https://school.programmers.co.kr/learn/courses/30/lessons/178870#

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

처음에는 이중 for문으로 풀었다. 테스트 코드는 통과하였으나 

시간 초과가 났다. 

 

어떻게 애들을 더해서 k를 비교할까 고민하다가 

처음에 이중for문으로 생각한 방법은 이렇게 시작 인덱스를 줄여서 더해가다가 k 값과 비교해서 해야지~였다.

def solution(sequence, k):
    answer = []
    min_difference = float('inf')
    selected_numbers =None
    for i in range(len(sequence)):
        total_sum =0
        for j in range(i, len(sequence)):
            total_sum+= sequence[j]
            if total_sum ==k: 
                if (abs(j-i) < min_difference):
                    min_difference = abs(j-i)
                    selected_numbers = (i,j)
                    break

    return selected_numbers

 

문제는 조회하는 배열의 최대 길이가

 

5 ≤ sequence의 길이 ≤ 1,000,000

 

였기에 이중포문을 하면 이차시간으로 계산되어 제곱이 되어 초과된다. 

 

시간복잡도 참고)

출처:&nbsp;https://jeleedev.tistory.com/70

그다음에 for문을 사용하지 않고 어떻게 맨앞자리 인덱스를 줄일지 고민했다. 

여기서 오래 막혔다. 

시간초과 없애려고 이중포문 없애고 해봤는데

i부터 j까지 계속 더해지는거 i를 조작못했다.

 

2차 시도 (사실 2차는 아니긴한데..)

    index = 0
    start = 1
    
    for i in range(start, len(sequence)):
        sequence[index] += sequence[i]
        print("sequence[index]:",sequence[index])
        if i == len(sequence)-1:
            index += 1
            start +=1

    return selected_numbers

이 코드는 그저 처음부터 끝까지 더하기만 한다. 

 

 

처음에 포인터로 시작과 끝을 가리키는 방법을 쓰려했는데 for문으로 어차피 다 조회하니까 시작만 

가리키면 되겠다고 생각해서 반복문에 집착한 것이 나의 실수였다..결국 한참 헤매다가 답지를 봤다.

 

최종 코드 

def solution(sequence, k):
    answer =[]
    start = 0
    end =0
    min = 1000000000
    total = sequence[0]
    while (start <= end < len(sequence)):
        if (total == k):
        
            if min > end- start+1:
                min = end - start+1
                answer =[start, end]
            total -= sequence[start]
            start += 1
        elif (total < k):
            end+= 1
            if end< len(sequence):
                total += sequence[end]  
        elif (total > k):
            total -= sequence[start]
            start += 1
          
    return answer

1.  start end 시작과 끝 두 포인터의 관계 설정이 중요

start <= end

시작포인터와 끝포인터는 같은 곳에서 시작하고 만나서 같을 수는 있어도 넘어서는 안된다. 

나는 계속 전체 배열의 길이만 넘지 말라고 맞춰서 리스트에서 벗어나는 에러가 발생했다. 

 

2. 전체 배열의 값을 더하는 total을 어떻게 처리할지

total 정의할 때 sequence[0] 첫번째 값을 할당하고 시작하면 된다. 

total은 구하고자 하는 k값을 기준으로 나뉜다. 

 

<바로 생각하기 힘들었던 부분>

1. total == k일 때 시작과 끝 두사이 거리가 최소인 값을 찾고 나서 

배열 끝까지 다시 시작과 끝을 움직여야 하는데 

end를 움직여도 될거라 생각했다. 

그렇게 한 결과 end값이 먼저 배열범위보다 커져버려서 테스트 통과를 못했다. 

전체에서 start인덱스의 값을 빼주고 start인덱스를 옮기는 것으로 수정했다. 

 

2. while범위에서 배열의 범위만큼 돌라고 했으니 문제 없을거라 생각했지만

end를 하나씩 추가하고  그 값을 sequence의 인덱스로 넣기 위해 조건을 안 걸면 저렇게 에러가 났다. 

 

 

 

결론 반복문에 그만 집착하고 효율적인 풀이를 생각해보자

컴퓨터가 우리 뇌구조랑 비슷하겠다는 생각을 했다. 생각한게 맞을 수도 있으니 포기말고 구현해봐라

 

728x90

'코딩테스트 > 프로그래머스' 카테고리의 다른 글

프로그래머스 Lv.3 최고의 집합  (1) 2023.09.07
728x90

state변경할 때 모든 code들은 항상 다시 실행됨

근데 api가져와서 쓸때를 예를 들면 매번 다시 가져오면 번거로워지지

 

몇몇 코드를 처음에 딱 한번만 실행되고 다시 실행안되게 하고 싶음

 

useEffect(우리가 실행시킬함수,[변경되는지 지켜볼애])

 

 

 

 

처음 렌더링됐을 때 한번만 실행되고

버튼 눌러서 state바뀔 때 실행되지 않음

 


+코드제어

 

클릭할때 keyword 검색코드 다시 실행안되게 막기

키워드를 검색할 때만 실행되게 하기

[keyword]로 넣어서 이 keyword  state값이 변경될때만 이 코드 실행됨

조건으로 keyword가 비어있고 keyword길이가 5이상일때만 실행되게 하였음

 

 

 

처음에는 실행안됐고

검색창에 6자넣으니까 실행됨 

 

 

 

---

[] 아무것도 지켜보지 않거나

[keyword] 키워드 변경하는지 보거나

[keyword, counter] 둘다 변경하는지 보거나 (둘중 하나 변경될때 실행)

이렇게 쓸 수 있음

728x90
728x90

https://dukdukz.tistory.com/entry/210604-Sequelize-auto-%EB%A1%9C-%ED%85%8C%EC%9D%B4%EB%B8%94-%EC%83%9D%EC%84%B1-%EA%B5%AC%EB%AC%B8-%EB%A7%8C%EB%93%A4%EA%B8%B0

https://www.hanumoka.net/2018/11/23/node-20181123-express-setting-sequelize/

 

Node Express에 sequelize를 이용해 mysql접속하기

들어가기Express 프로젝트에 sequelize(시퀄라이저)를 이용하여 로컬에 있는 mysql에 접속하는 예제를 정리해본다. 미리 로컬에 mysql을 설치하고, 스키마와 계정을 생성 해놨다. 테스트용 Express 프로젝

www.hanumoka.net

MySql에서 워크벤치로 테이블구성을 다 하고 

코드에서 시퀄라이즈 연동을 하려니까 번거로웠다. 뿐만 아니라 타입이 일치한데 해당하는 테이블을 찾을 수 없다고 연결이 안돼서 답답했다. 찾아보니 역시 자동으로 구성된 테이블 코드를 짜주는 방법이 있었다!!

 

나는 EER 에서 다이어그램으로 테이블을 먼저 짰다.

그리고 Forward Enginner를 누르면 

만든 다이어그램이 테이블로 생성이 된다. (Synchronize Model하면 기존에 있는 테이블을 수정하고 업데이트할 수 있다.)

 

 

이제 코드에서 만져보자

 

시퀄라이즈 세팅을 먼저 한다. 

(npm i express

npm i -D nodemon

)

npm i sequelize //시퀄라이즈

npm i mysql2   //mysql과 시퀄라이즈를 이어주는 드라이버이다. 

npm i sequelize-cli   //시퀄라이즈 명령어를 실행하기 위한 패키지다

 

npx sequelize init //하면 기본 폴더가 생성된다.

이제 자동으로 db테이블 코드가져와주는

npm i sequelize-auto

를 깐다. 

 

터미널에 명령어를 입력한다.

npx sequelize-auto -o "./models" -d nodejs -h "localhost" -u "root" -p "3306" -x "비밀번호" -e mysql

 

 

-o "경로"
-d "db 이름"
-h "url"->localhost
-u "root"
-p "port"
-x "password"
-e "mysql"

 

 

그럼 필요한 user, music,artist 코드가 자동으로 생긴다. 

근데 문제는 코드가 좀 다르다 function이다.

 

내가 db구조 짤때 참고한 nodejs책에서는 class로 해서 

안에 내용을 기존에 참고했던 식으로 바꿔줬다. 큰틀만 바꾸면 됨

artist.js

그리고 init-model.js도 생겼는데

나는 index.js로 작업하고 잘모르겠고 구조도 바꿔줘서 

주석처리했다. 

대신 관계정의할 때 필요한 것들은 참고해서 넣었다.

artist.js

수정한다음에 혹시몰라서 

워크벤치에 있는 database를 삭제하고

 

npx sequelize db:create로 다시 db를 만들고

npm start 실행했다. 

 

연결잘된다. 

 

 

(

문제는 내가 원하는건 user랑 artist의 1대1관계인데

분명 user에 hasOne, artist에 belongsTo로 줬는데 

왜 다이어그램을 뽑아보면 1대다로 나오는지 모르겠다....)

 

 

 

 

그리고 일대다에도 종류가 두개있어서 놀람

https://jins-dev.tistory.com/entry/RDBMS%EC%9D%98-%EA%B4%80%EA%B3%84-Identifying-NonIdentifying-Relationship-%EC%97%90-%EB%8C%80%ED%95%98%EC%97%AC

 

RDBMS의 관계 - Identifying & Non-Identifying Relationship 에 대하여

 RDB에서 관계를 맺는데 있어서 식별관계(Identifying Relationship)와 비식별관계(Non-Identifying Reltationship)가 존재한다. 정확히는 RDBMS에서 나누는 관계가 아닌 ER Diagram 상에서 논리상 나누는 개념이..

jins-dev.tistory.com

 

이건그냥 공식문서 필요할때 보라고 넣어둠

https://sequelize.org/master/manual/legacy.html

 

Manual | Sequelize

Working with Legacy Tables While out of the box Sequelize will seem a bit opinionated it's easy to work legacy tables and forward proof your application by defining (otherwise generated) table and field names. Tables class User extends Model {} User.init({

sequelize.org

 

728x90
728x90

설명출처: https://www.youtube.com/watch?v=NnZ0KOy2yJY&list=PLJQKWHLhBrxI43w0DU4uQrhWv4Pm1OFlx&index=37 

 

특징

1. 송금하기

2. 외부 스마트컨트랙 함수 부르기

3. 가변적인 gas

4. 이스탄불 하드포크, call 사용권장 가스가격 상승해서

5. re-entrancy 재진입

 

call vs Delegate call

 

 

Delegate call:

1. msg.sender가 본래의 스마트 컨트랙 사용자를 나타낸다.

2. delegate call이 정의된 스마트 컨트랙(즉 caller)이 외부 컨트랙의 함수들dmf 마치 자신의 것처럼 사용하고

(실질적인 값도 caller에 저장된다)

 

조건 

외부 스마트컨트랙과 caller 스마트컨트랙은 같은 변수를 갖고 있어야한다

 

 

 

 

 

 

블록체인 특성상 이미 배포된 코드를 수정할 수 없다.

Delegate Call를 사용하면 B코드에 적힌 코드로 적립된 포인트가 A에 저장된다.

그래서 스마트컨트랙B 기존꺼를 끊고 새로운 스마트컨트랙B2를 이어준다.

 

 

728x90
728x90

알아본다면 당신은 천재임 (못알아봐도 천재)

각 노드, 참여자 컴퓨터에

3001이 관리자 

6001이 노동자..

http서버는 모든 걸 보여주기 용으로 돌리는거

 

라고 대충이해했는데.. 이후에 db서버랑, 리액트서버랑 얘네가 어떻게 맞물리는지 사실 아직도 서버관계를 정확하게 모르겠다! 

 

일단 코드 여기요 (지금까지 한 것만 포크해놓음)

 

https://github.com/jsoyun/4th-project-YunminBlock

 

GitHub - jsoyun/4th-project-YunminBlock: 4th BlockChain Project

4th BlockChain Project. Contribute to jsoyun/4th-project-YunminBlock development by creating an account on GitHub.

github.com

 

 

각 컴퓨터 참여자로 노드 만들어서 

p2p서버 전달 확인해봄

 

참고로 실행할 때는 

node node1/r_httpServer.js

이렇게 했다

 

 

두 서버 각각 열고 

3001
3002

 

 

get 요청인 blocks로 들어가보면

둘다 제네시스 블록이 잘 들어가 있음요 

 

서버 연결!!

post addpeers로 

3002한테 요청하는거임 

 

3002가 6001 웹소켓으로  상대 웹소켓 주소 ws 6001로 연결

문 똑똑

 

 

 

 

peers로 연결된거 확인!

 

 

이제 둘이 연결됐으니

3002에서 채굴해보겠음 

3002 채굴돼서 들어왔지?

 

 

그렇다면 3001을 새로고침해보면 3002랑 연결되어있고 그블록의 길이가 더 길어서 추가됨

 

 

연결되어있으니까 3002에서 연속 2개 추가해도 업데이트 됨

 

 

 

 

 

 

 

3001에서 블록채굴해도 마찬가지로 3002에서 업뎃됨 

연속으로 4,5 값 넣어서 블록추가함


서버 통신 코드

 

 

 

httpServer.js

post로 보내면 

data로 이름지어서 "data" : 웹소켓 주소 가능한거임

 

이 웹소켓 주소 data가 connectToPeers함수로 들어감 얘가 웹소켓 연결해줌

P2PServer.js

 

소켓에 넣고 메세지 핸들러 함수쓰고

얘네가 보내주는거 관리하는거임 

 

 

메세지 핸들러는 이렇게 여기서 변수로 지정해줬음 

(그 검증할 때 변수 10으로 다 잡아서 블록10개 이전과 비교해서 생성시간 알아내는 거 있잖아

이거요 blockchain.js

걔랑 비슷한 원리인듯

신기한게 컴퓨터는 바보라서 걍 숫자 넣어서 계산하는 거기 때문에 시간인지 뭔지 안적어도 가능했음)

 

 

대신 쓸때는 위처럼 MessageType.QUERY_LATEST 이런식으로 해야 얘가 찾겠지?

 

 

연결됐을 때 채굴하면 broadcast로 연결되어있는애들 전부한테 뿌려주는 거

(근데 생각해보니까 마지막 최신블록 담아서 보내주는거 말고도 아예 많이 다르면 전체 교체해야되는 replace함수 써야되는데 broadcast(initMessageHandler(ws)) 이걸로 해줘야 되는거 아닌가....? 흠 정리하고 다시 수정해봐야겠다. )

 

 

 

중간에 맞이했던 에러들

브로드캐스트에 저 함수를넣지 않은 것 말고도 있음

 

갑자기 이거 뜸

(node:11496) Warning: Accessing non-existent property 'Blocks' of module exports inside circular dependency
(Use `node --trace-warnings ...` to show where the warning was created)
(node:11496) Warning: Accessing non-existent property 'getLastBlock' of module exports inside circular dependency                                                                     cular dependency
(node:11496) Warning: Accessing non-existent property 'createHash' of module exports inside circular dependency                                                                       de circular dependency
(node:11496) Warning: Accessing non-existent property 'isValidTimestamp' of module exports  circular dependency
inside circular dependency

이게 찾아보니까 순환참조? a스크립트에서 만든 함수 내보내고 b에서 a의 함수 가져왔는데 또 가져와서? 생기는 뭐 중복돼서 그런거라고 했는데 

이전에 안뜨다가 갑자기 떠서 당황... 작동은 되는데 불안하죠잉

 

결국 전역변수에 있는 애들 다 지역변수로 넣어서 함... 

 

이런식으로.. 

 

 

 

 

 

 

아 그리고 블록체인 에 

 

이 부분 틀렸다는데 

흠 내가 이해한 거는 새블럭을 현재 시간이랑 어느정도 오차범위까지는 인정하는 코드라고 봤거든 책도 그 얘기고..

 

 

흠..어렵군!!

 

 

 

 

 

728x90
728x90

참고로 나는 이 두 에러가 스벅의 부실한 와이파이 때문이었음.. 

응아니고 mariadb 실행안해서였음요!!  기존에 쓰던 mysql는 초기설정으로 자동실행되게 설정해놓은 거라 마리아디비는 쓸라면 실행해줘야됐음!!!!!! ()

 

ConnectionError [SequelizeConnectionError]: connect ETIMEDOUT 

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)   

 

 


+자동실행되는 설정

출처:&nbsp;&nbsp;https://codecoco.tistory.com/category

 


db연결하는 법 

mysql과 같음 이 코드 mysql연결하는거 보고 한거임(시퀄라이즈가 다른 sql데이터베이스들도 호환가능해서)

출처는 책임 | Node.js 교과서 | 조현영 p.315

 

 

 

package.json에 npm start하기 위해 넣기

start 노드몬 앱 넣기

시작할거를 main에 app.js로 

{
  "name": "4th-project-yunminblock",
  "version": "1.0.0",
  "description": "소윤이 보아라",
  "main": "app.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "nodemon app"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "express": "^4.17.2",
    "morgan": "^1.10.0",
    "mysql2": "^2.3.3",
    "nunjucks": "^3.2.3",
    "sequelize": "^6.13.0",
    "sequelize-cli": "^6.3.0",
  },
  "devDependencies": {
    "nodemon": "^2.0.15"
  }
}

 

시퀄라이즈에 필요한 모듈패키지설치

npm i express morgan nunjucks sequelize sequelize-cli mysql2

npm i -D nodemon

 

 

설치 완료 후

 

npx sequelize init

 

하면 

config, models, migrations, seeders폴더가 생성됨

models폴더 안에는 index.js가 있음

 

몇개는 지금 블록체인중이라서 넣은거라 안따라해도 됨

index.js 를 이렇게 수정고우

const Sequelize = require("sequelize");
const env = process.env.NODE_ENV || "development";
const config = require(__dirname + "/../config/config.json")[env];
const db = {};

//기존
const sequelize = new Sequelize(
  config.database,
  config.username,
  config.password,
  config
);

db.sequelize = sequelize;

module.exports = db;

 

이제 시퀄라이즈 통해 express앱과 mysql연결할거임

app.js 파일 만들고 안에 코드 넣기

const express = require("express");
const path = require("path");
const morgan = require("morgan");
const nunjucks = require("nunjucks");

const { sequelize } = require("./models");

const app = express();
app.set("port", process.env.PORT || 3307);
app.set("view engine", "html");
nunjucks.configure("views", {
  express: app,
  watch: true,
});

sequelize
  .sync({ force: false })
  .then(() => {
    console.log("데이터베이스 연결성공");
  })
  .catch((err) => {
    console.log(err);
  });

app.use(morgan("dev"));
app.use(express.static(path.join(__dirname, "public")));
app.use(express.json());

app.use(express.urlencoded({ extended: false }));

app.use((req, res, next) => {
  const error = new Error(`${req.method} ${req.url} 라우터가 없습니다.`);
  error.status = 404;
  next(error);
});

app.use((err, req, res, next) => {
  res.locals.message = err.message;
  res.locals.error = process.env.NODE_ENV !== "production" ? err : {};
  res.status(err.status || 500);
  res.render("error");
});

app.listen(app.get("port"), () => {
  console.log(app.get("port"), "번 포트에서 대기중");
});

마리아db포트가 3307로 되어 있어서 이렇게 했는데

사실 상관없는거같긴함 (서버는 계속 헷갈리는데 db서버가 3307포트인건 알겠고 여기서 넣는 포트는 아마 localhost:로 화면에 띄워주는 포트라고 이해함요..네.. )

여기서 3001로 바꿔도 잘됨 config에 port주소가 3307로 잘들어가 있기만 하면 문제없는듯 그거는 마리아db연결용 이건 보여주는포트용으로이해햇음

 

 

이제 중요한거.

config 내용임!!!

 

나는 마리아 디비쓰니까 그 유저네임이랑 그 비번 그 host로 적어줘야 한다

마리아 디비의 port랑

그래서 이렇게 했다

{
  "development": {
    "username": "mariatest",
    "password": "1234",
    "database": "mariadb",
    "host": "localhost",
    "dialect": "mysql",
    "port": "3307"
  },
  "test": {
    "username": "mariatest",
    "password": "1234",
    "database": "database_test",
    "host": "0.0.0.0",
    "dialect": "mysql"
  },
  "production": {
    "username": "mariatest",
    "password": "1234",
    "database": "database_production",
    "host": "0.0.0.0",
    "dialect": "mysql"
  }
}

아마 두세번째 애들은 상관없을듯 혹시나 해서 저렇게 넣어둔거임

 

 

 

이제 npm start하면 끝!!!

 


 

 

사실 위에도 말했지만 나는 연결안된다고 에러떴었음

ConnectionError [SequelizeConnectionError]: connect ETIMEDOUT
    at ConnectionManager.connect

 

암튼 이거 몰라서 mariadb들어가서 확인해보려는데 접근이 안됨

 

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

 

 

sudo service mysql restart

이것도 해보고 계속 안되다가 

+아냐 이게 실행이야 이거 하니까 된거임!!

+

 

 

sudo mysql -u root -p

로 하니까 들어가짐

 

들어가서 문제 있나 확인함

 

흠... config랑 비교해봄 

user mariatest 인지 host localhost로 되어있나..

 

npm start했을 때 db없다길래 

npx sequelize db:create

로 생성하고

실행

npm start

 

 

안에도 잘있군

 

얏호

 

 

 

https://velog.io/@pier101/Linux-wsl-%ED%99%98%EA%B2%BD%EC%97%90%EC%84%9C-%EB%A1%9C%EA%B7%B8%EC%9D%B8%ED%9A%8C%EC%9B%90%EA%B0%80%EC%9E%85-%EB%A7%8C%EB%93%A4%EA%B8%B0nginx

 

[Linux] wsl 환경에서 로그인,회원가입 만들기(+nginx)

wsl 환경에서 node.js+react(+nginx)를 활용해 웹페이지를 만들어 보면서 ubuntu 환경에서 서버를 어떻게 구축하는지에 대한 감을 익히고 서버 구성에 대해 알아볼 것이다.📢본 작업은 wsl상에서 서버를

velog.io

 

 

 

 

 

728x90
728x90

이론 출처: https://steemit.com/kr/@yahweh87/3

코드설명:https://berrypjh.tistory.com/50

 

블록체인에서 사용되는 '블록' 일정 시간마다(비트코인의 기준으로 10분에 한 번씩 생성됩니다.)

 여러 건의 거래내역을 하나의 블록으로 묶어 기존에 생성된 블록에 체인처럼 계속적으로 연결하는 데이터 구조를 의미합니다. 

 

 

블록은 블록체인의 원소 개념으로, 다수의 거래 정보의 묶음을 의미합니다.

블록에는 블록의 이름이 있는데 Height(높이)라는 용어로 표현되고 있습니다.

한 칸 한 칸 쌓아나가 탑의 형태로 구성된다고 생각하여 Height(높이)라는 말을 쓴다고 합니다.(깊이라고 이해해도 될듯)

하지만 이 높이는 정확한 블록의 이름이 아닙니다. 

블록의 정확한 이름은 TXID라 불리는 블록의 해시값입니다. 이 블록의 해시값은 블록의 헤더 정보(블록의 버전, 이전블록해시,머클루트,타임,bits,논스 정보)를 모두 합산한 후 SHA256으로 변환된 값입니다.

bits : 난이도 해시 목표값을 의미하는 지표

nonce: 블록을 만드는 과정에서 해시값을 구할 때 필요한 재료 역할을 수행한다.

블록의 구성요소

여러 요소들이 있지만

크게 블록 헤더블록 바디로 나눌 수 있다.

블록 하나 만들기

(리눅스 우분투에서 코드 작성중)

<block.js>

lass Block{
        constructor(header, body){
		this.header = header
		this.body = body
	}
}

class BlockHeader{
        constructor(version, previousHash, timestamp, merkleRoot, bit, nonce){
	     this.version = version
	     this.previousHash = previousHash
	     this.timetamp = timestamp
	     this.merkleRoot = merkleRoot
	     this.bit = bit
	     this.nonce = nonce

	}
}

header와 body가 들어간 block클래스를 만들고 블록의 header class도 만들어준다.

npm init

버전과 모듈설치확인 위해서 package.json 파일 만들고 fs불러서 버전표시해보자

const fs = require('fs')

//버전계산하는 함수 
function getVersion(){
	const package = fs.readFileSync("package.json")
	console.log(JSON.parse(package).version)
	return JSON.parse(package).version

}

 

 

# node block.js

 

첫번째 block값 대입한다

function createGenesisBlock(){
	const version = getVersion()
	const previousHash = '0'.repeat(64)
	const timestamp = parseInt(Date.now()/1000)

}

 

version은 getVersion에서 나온 값을 대입한다.

previousHash는 이전 블록이 없는 첫번째 블록이므로 64비트 '0'을 대입

timestamp는 Date써서 현재 시간 넣어두기

 

머클리루트 값을 넣기 위해 설치

 

npm i merkle

 

function createGenesisBlock(){
	const version = getVersion()
	const previousHash = '0'.repeat(64)
	const timestamp = parseInt(Date.now()/1000)
	const body = ['hello block']
	const tree = merkle('sha256').sync(body)
	const merkleRoot = tree.root() || '0'.repeat(64)
	const bit = 0
	const nonce = 0

	console.log("version : %s, timestamp: %d, body : %s",version,timestamp,body)
	console.log("previousHash : %d", previousHash);
	console.log("tree :")
	// console.log(tree)
	console.log("merkleRoot : %s", merkleRoot);
	console.log("merkleRoot : %s", merkleRoot.toString('hex'));

	// const header = new BlockHeader(version, previousHash, timestamp, merkleRoot, bit,nonce)
	// return new Block(header, body)

}

해당 모듈 설치 후 body에 들어갈 트랜잭션(거래내역)인 첫 번째 데이터로 hello block을 넣음

나머지는 0대입하고 만들어보고 실행해보기

 

node block.js

하면

(아까는 merkleRoot 안나왔는데 %d 여서 그랬음 %s 이게 string값 불러오는건가보다 둘이 똑같이 뜨네)

 

 

첫번째 블록 생성하기

function createGenesisBlock(){
	const version = getVersion()
	const previousHash = '0'.repeat(64)
	const timestamp = parseInt(Date.now()/1000)
	const body = ['hello block']
	const tree = merkle('sha256').sync(body)
	const merkleRoot = tree.root() || '0'.repeat(64)
	const bit = 0
	const nonce = 0

	console.log("version : %s, timestamp: %d, body : %s",version,timestamp,body)
	console.log("previousHash : %d", previousHash);
	console.log("tree :")
	// console.log(tree)
	console.log("merkleRoot : %s", merkleRoot);
	console.log("merkleRoot : %s", merkleRoot.toString('hex'));
     
	//헤더에 대입
	const header = new BlockHeader(version, previousHash, timestamp, merkleRoot, bit,nonce)
    return new Block(header, body)

}
//값넣어서 블록생성
const block = createGenesisBlock()
console.log(block)

위에 대입한 결과를 BlockHeader class로 정보를 전달하고 

블록헤더와 바디를 Block class에 전달하여 첫번째 블록을 생성하였다.

 

node block.js  로 실행결과보기

 

block.js 전체코드는 이와같다.

더보기
const fs = require('fs')
const merkle = require('merkle')

class Block{
        constructor(header, body){
		this.header = header
		this.body = body
	}
}

class BlockHeader{
        constructor(version, previousHash, timestamp, merkleRoot, bit, nonce){
	     this.version = version
	     this.previousHash = previousHash
	     this.timetamp = timestamp
	     this.merkleRoot = merkleRoot
	     this.bit = bit
	     this.nonce = nonce

	}
}

//버전계산하는 함수 
function getVersion(){
	const package = fs.readFileSync("package.json")
	console.log(JSON.parse(package).version)
	return JSON.parse(package).version

}


//getVersion()

function createGenesisBlock(){
	const version = getVersion()
	const previousHash = '0'.repeat(64)
	const timestamp = parseInt(Date.now()/1000)
	const body = ['hello block']
	const tree = merkle('sha256').sync(body)
	const merkleRoot = tree.root() || '0'.repeat(64)
	const bit = 0
	const nonce = 0

	console.log("version : %s, timestamp: %d, body : %s",version,timestamp,body)
	console.log("previousHash : %d", previousHash);
	console.log("tree :")
	// console.log(tree)
	console.log("merkleRoot : %s", merkleRoot);
	console.log("merkleRoot : %s", merkleRoot.toString('hex'));
     
	//헤더에 대입
	const header = new BlockHeader(version, previousHash, timestamp, merkleRoot, bit,nonce)
    return new Block(header, body)

}
//값넣어서 블록생성
const block = createGenesisBlock()
console.log(block)

 

 

 

 

 

728x90

+ Recent posts