자바스크립트로 블록체인 구현 강좌6 - 나만의 비트코인 발행하기

저번 시간에 포스팅한 sha256 암호화 값 리턴 함수가 어떻게 사용되는지 보겠다. 일단 test.js 부분을 다 지운다. 

그리고 아래 코드를 넣어준다. bitcoin 객체의 hashBlock 함수는 3개의 인자값을 받는다. 1. 이전 블락의 hash 2.현재 블록의 거래 데이터 3.nonce 값


//blockchain.js 모듈을 이곳에서 가져다 쓰겠다.
const Blockchain = require('./blockchain');


//위에서 가져온 모듈의 객체를 만든다.
const bitcoin = new Blockchain();

const previousBlockHash = "abcdedferefa"
const currentBlockData = [
{
amount: 10,
sender: 'PACKadffaaf',
recipient: 'HONGllalflks'

},
{
amount: 20,
sender: 'PACKadffaaf',
recipient: 'HONGllalflks'

},
{
amount: 30,
sender: 'PACKadffaaf',
recipient: 'HONGllalflks'

}
]

const nonce = 100;


console.log(bitcoin.hashBlock(previousBlockHash,currentBlockData,nonce))


//859096659fb3a8b0f053eb068c4b11ee24ba38fecaf6ea629ff301d14feeae84


blockchain.js에서 만든 hash 함수를 테스트 해보았다. console.log  를 찍어보면 해쉬 함수가 리턴 한 값을 볼 수가 있다. 여기서.

sender 보내는 사람이 PACK... 인데 여기서 P를 B로만 바꿔 보겠다. 그리고 실행해보자.


//blockchain.js 모듈을 이곳에서 가져다 쓰겠다.
const Blockchain = require('./blockchain');


//위에서 가져온 모듈의 객체를 만든다.
const bitcoin = new Blockchain();

const previousBlockHash = "abcdedferefa"
const currentBlockData = [
{
amount: 10,
sender: 'BACKadffaaf',
recipient: 'HONGllalflks'

},
{
amount: 20,
sender: 'PACKadffaaf',
recipient: 'HONGllalflks'

},
{
amount: 30,
sender: 'PACKadffaaf',
recipient: 'HONGllalflks'

}
]

const nonce = 100;


console.log(bitcoin.hashBlock(previousBlockHash,currentBlockData,nonce))


//ec90a89a8364d8762ec3d365f2c8c91b1547af493e068009c119356b41f9699b




문자가 하나만 달라졌는데도 해쉬 값은 완전히..전혀 다른 해쉬값이 리턴되는 것을 볼 수 있다.

자바스크립트로 블록체인 구현 강좌5 - 나만의 비트코인 발행하기


이번 포스팅에서는 sha256 해시생성기와 npm을 이용해서 sha256 모듈을 설치해서 사용해보도록하겠다.

일단.

sha256 은 암호화 알고리즘의 하나이다. 음..엄청쉽게 말해서 '어떤 입력값이든 고정된 길이의 임의의 문자열값으로 출력한다' 라고 알고 있으면 쉽다.

예를 들면 abc 값을 sha256 알고리즘에 넣고 돌리면

BA7816BF8F 01CFEA4141 40DE5DAE22 23B00361A3 96177A9CB4 10FF61F200 15AD

이값이 생성이된다. 길이를 보자.

abcdef를 넣으면?

BEF57EC7F5 3A6D40BEB6 40A780A639 C83BC29AC8 A9816F1FC6 C5C6DCD93C 4721

같은 길이의 임의의값이 출력이 된다.

 

https://passwordsgenerator.net/sha256-hash-generator

이곳에 들어가서 직접 값을 넣어봐도 된다.


그리고 한번 암호화 한건 다시 되돌리기 힘들다는 것이다. 어려운 말로 복호화가 어렵다고 하는데 그냥 아 한번 암호화 해버리면 다시 원래 값으로 되돌리기가 거의 빌게이츠가 삼와머니에서 돈빌릴 확률 보다 낮다고만 알아두자.


그러면 계속해서 코드를 작성해보자. 이번에는 인자값을 받으면 그것을 이용해서 암호화 한다음 리턴해주는 함수를 작성해보도록 한다. 


1.구글에서 npm sha256 모듈 검색 후 다운로드 하기

https://www.npmjs.com/package/sha256 여기 들어가면 npm i sha256 --save 이렇게 생긴 녀석을 볼 수 있다


2.터미널 열고 자신의 개발폴더(blockchain)로 가서 위의 명령어를 쳐준다.



3.확인해보기


3.모듈을 변수에 할당

blockchain.js 맨위에 작성

//sha256 모듈을 가져다 쓰겠다.
const sha256 = require('sha256');



4.Blockchain.prototype 함수들 이어서 맨아래 작성

//해쉬 값 리턴 함수
Blockchain.prototype.hashBlock = function(previousBlockHash,currentBlockData,nonce){
const dataAsString = previousBlockHash + nonce.toString() + JSON.stringify(currentBlockData);
const hash = sha256(dataAsString);
return hash
}


다음 포스팅에서 작성한 해쉬함수를 어떻게 사용하는지 테스트 해보도록하자.





자바스크립트로 블록체인 구현 강좌3 - 나만의 비트코인 발행하기



이번포스팅에서는 마지막 블록을 얻는 함수, 새로운거래가 발생할때 거래 트랜잭션 데이터를 생성하는 함수를 만들어 보도록 하겠다.

먼저 blockchain.js 로가서 이어서 코드를 작성해보자.


Blockchain.prototype.createNewBlock  ... 생략. 이 코드 아래에 마지막 블록을 가져오는 함수를 작성한다.


//마지막 블록 얻기 - chain 배열에는 블록데이터가 들어간다. 맨마지막 블록을 가져와라.
Blockchain.prototype.getLastBlock = function(){
return this.chain[this.chain.length - 1];
}


그 밑에 새로운 트랜잭션이 발생했을 때 작동되는 함수를 작성한다.

참고로 거래가 발생할때 마다 생성되는 데이터를 트랜잭션이라고 하는데, 중요한건 트랜잭션은 거래로 인해 발생한 어떤 것이지 블록이 아니다. 블록이 되려면 채굴자들이 마이닝, 즉 컴퓨팅 파워로 채굴을 해야 한다. 그래서 아직 완결이 안된 데이터라고도 할 수 있다. 우리는 맨위에 function Blockchain(){} 데이터 구조에서 this.newTransaction = [] 배열을 생성했다. 이 이름을 좀 더 직관적으로 pendingTransaction으로 바꿔주도록 하자. 아직 대기상태의, 미완결된 값이기 때문에 이렇게 작명을 해주겠다. 전부다 바꿔주도록 하자.

//새로운 트랜젝션(거래)가 발생했을 때 작동되는 함수
//인자값으로, 총액수, 보내는사람, 받는사람이 들어간다.
Blockchain.prototype.createNewTransaction = function(amount,sender,recipient){
const newTransaction = {
amount: amount,
sender: sender,
recipient: recipient
}

//맨위 트랜잭션 배열에 값을 넣어준다.
this.pendingTransaction.push(newTransaction);

//마지막 블록의 index 에서 + 1
return this.getLastBlock()['index'] + 1
}


blockchain.js의 전체 코드는 아래와 같다. 다음 포스팅에서는 test.js에서 이번 포스팅에서 만든 함수들이 어떻게 출력이되는지 찍어보도록 하겠다. 

//블록체인 데이터 구조
function Blockchain(){
this.chain = [];
this.pendingTransaction = [];
}


//블록체인 프로토 타입 함수 정의
Blockchain.prototype.createNewBlock = function(nonce,previousBlockHash,hash){
//새 블록 객체
const newBlock = {
index: this.chain.length + 1,
timestamp: Date.now(),
transactions: this.pendingTransaction,
nonce:nonce,
hash:hash,
previousBlockHash:previousBlockHash
};

//다음 거래를 위한 거래내역 배열 비워주고 새로운 블록을 chin 배열에 추가
this.pendingTransaction = [];
this.chain.push(newBlock);

return newBlock;

}

//마지막 블록 얻기 - chain 배열에는 블록데이터가 들어간다. 맨마지막 블록을 가져와라.
Blockchain.prototype.getLastBlock = function(){
return this.chain[this.chain.length - 1];
}

//새로운 트랜젝션(거래)가 발생했을 때 작동되는 함수
//인자값으로, 총액수, 보내는사람, 받는사람이 들어간다.
Blockchain.prototype.createNewTransaction = function(amount,sender,recipient){
const newTransaction = {
amount: amount,
sender: sender,
recipient: recipient
}

//맨위 트랜잭션 배열에 값을 넣어준다.
this.pendingTransaction.push(newTransaction);

//마지막 블록의 index 에서 + 1
return this.getLastBlock()['index'] + 1
}

//Blockchain 모듈화
module.exports = Blockchain;



2년전부터 블록체인 기술에 관심이 생겨서 이것저것 찾아보면서 지식을 쌓았다. 이론만 공부하면 뜬구름 잡는 이야기처럼 들릴 수 있기 때문에 개발자라면 직접 구현을 한번 해보는것이 중요하다. 블록체인을 구현할 수 있는 언어들이 많지만 그중에서 가장 접근성이 쉬운 자바스크립트를 이용해서 개발을 해보겠다. 일단 자바스크립트와 node .js에 대한 기초 지식은 있어야 한다.


자바스크립트로 블록체인 구현 강좌1 - 나만의 비트코인 발행하기

1.셋팅

바탕화면에 개발 폴더를 만든다. 예를 들면 blockchain폴더를 만들었다고 하자. 그 폴더 위치에서 npm init을 해준다. 그러면 node js 서버를 구축 할 수 있는 기본 셋팅이 완료 된다. blockchain 폴더 안에 dev 폴더를 만들고 그안에 test.js blockchain.js 폴더를 만들자. 아래 그림과 같다.


2. 기초지식 - 자바스크립트 데이터 구조

본격적으로 들어가기전에 자바 스크립트로 데이터를 주고 받을 데이터 구조에 대한 개념을 살펴보자. 일단 데이터 구조는 function 키워드로 만든다. 


function User(name,age){

this.name = name;

this.age = age;

}


이렇게 구조를 만들었으면 이 구조를 이용해서 객체를 생성할 수 있다.


var user1 = new User('길위의 개발자', '30');

....

var user50000 = new User('스티브잡스', '31');


이런식이다. 이렇게 user의 수천 수만건의 name, age 데이터를 컨트롤 할 수 있다.


3.기초지식  - 자바스크립트 프로토타입 객체

프로토타입은 아주 쉽게 말해서 함수에 속성이나 기능을 공통적으로 추가하는 객체를 이야기 한다. 엄청간단하게 말하면 그렇다. 예를 들면

위에서 만든 User 함수에 

User.prototype.emailDomain = "@google.co.kr";

이라고 설정해주면 User 로 만든 모든 객체들이 예를들면 user1....user5000까지 emailDomain 속성을 가지게 되고 그 값으로 @google.co.kr 을 가진다.

user50000.emailDomain; 이라고 쳐보자 위에서 대입한 이메일 값이 나올것이다. 이렇게 속성 값을 공통으로 지정해 줄 수 있을 뿐 아니라 기능도 추가해 줄 수 있다.


User.prototype.getEmailAddress = function(){

return this.name + this.age this.emailDomain;

}

이런식으로!


그리고 

user50000.getEmailAddress(); 라고 쳐보자 어떤 값이 나오는지! 유저 객체의 이름과 나이, 이메일 값을 리턴하는 것을 볼 수 있을 것이다.


3.블록체인 데이터 구조 만들기

위의 내용을 기초로 블록체인 데이터 구조를 만들어 보자. blockchain.js 파일을 열고 아래와같은 코드를 넣어준다.

//블록체인 데이터 구조
function Blockchain(){
this.chain = [];
this.newTransactions = [];
}


클래스를 이용해서 아래처럼 만들 수 있지만 위에 데이터 구조를 이용하겠다.

//클래스를 이용한 블록체인 데이터 구조 위와 동일하다...
class Blockchain{
constructor(){
this.chain = [];
this.newTransactions = [];
}
}


3.블록체인 프로토타입 함수 정의하기

위에서 블록체인 데이터 구조를 정의 했으면 이번에는 프로토 타입 함수를 이용해서 블록체인 객체에 새로운 블록생성 기능을 담당하는 함수를 정의한다. 새로운 블록이 생성될때 발생하는 시간데이터, 순번 데이터, hash 데이터들을 담을 newBlock 객체를 만들어 주었다.

nonce, hash 는 블록체인 이론에 대해서 설명을 해야 되기 때문에 이번 포스팅에서는 넘어가도록 하자. 아직까지 이해가 안갈 수 있는데 나중에 이 함수가 어떻게 출력이 되는지 직접 데이터를 찍어보겠다.

//블록체인 프로토 타입 함수 정의
Blockchain.prototype.createNewBlock = function(nonce,previousBlockHash,hash){
//새 블록 객체
const newBlock = {
index: this.chain.length + 1,
timestamp: Date.now(),
transactions: this.newTransactions,
nonce:nonce,
hash:hash,
previousBlockHash:previousBlockHash
};

//다음 거래를 위한 거래내역 배열 비워주고 새로운 블록을 chin 배열에 추가
this.newTransactions = [];
this.chain.push(newBlock);

return newBlock;

}



여기까지 정리하면 아래 그림과 같다



+ Recent posts

티스토리 툴바