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

티스토리 툴바