frjadezh-CNhien
본문 바로가기
New IT tech/Study

이더리움 암호화폐 로컬 서버 구현 [ 윈도우 10 ]

by Vellena 2023. 12. 13.
반응형

 
 
 

book and coffe

 
 
안녕하세요 요즘 암호화폐가 핫한 주제로 떠오르고 가격이 올랐다가 떨어졌다 반복을 하는 것 같습니다. 이러한 암호화폐가 정확히 어떻게 구현되는지 안다면 가치를 알게 되고 좋은 기술에 투자할 수 있게 되지 않을까 해서 공부를 하고 공유해보려고 합니다.
 
!!주의 : 기술적인 내용이 많이 들어가 있습니다. 오류가 있거나 이상한 부분이 있다면 댓글에 남겨주시면 저도 같이 공부하면서 찾아보겠습니다!
 
 
 
 
 
 
우선 윈도우에 폴더를 만듭니다. 그리고 Node.js를 바탕으로 Ganache, Web3 라이브러리를 다운로드하여서 사용할 겁니다.
 

Node.js

JavaScript로 브라우저 밖에서 서버를 구축하는 등의 코드를 실행할 수 있게 해주는 런타임 환경입니다.
빈번한 I/O처리에 있어서의 우수한 성능, 서버 확장의 용이성, 무엇보다도 JavaScript라는 프런트엔드 필수 언어로 백엔드까지 작성할 수 있다는 엄청난 장점 때문에 사용되고 있습니다.
 

Ganache

가나슈(Ganache)란 테스트 목적으로 PC에 설치해서 사용할 수 있는 일종의 간이 블록체인입니다. 간이 블록체인이기 때문에 네트워크와 연결할 필요 없이 로컬에서 작동시킬 수 있어, 계약을 손쉽게 배포 및 테스트해 볼 수 있습니다. 개발을 위해 게스(geth) 또는 패리티(parity) 같은 클라이언트를 사용하면 각 트랜잭션을 실행하는 데 15초씩 걸리기 때문에 개발 속도가 느려질 수 있습니다. 이 문제를 해결하기 위해 일반적으로 개발 목적으로 가나슈(ganache)라는 메모리 내 블록체인을 사용할 수 있습니다.
 

Web3

web3.js는 이더리움 네트워크와 상호작용할 수 있는 다양한 메서드를 제공하는 자바스크립트 라이브러리입니다.

이더리움을 사용해 dApp을 만드는 것은, 솔리디티 언어로 스마트 컨트랙트를 개발하거나, 블록체인과 상호작용하는 클라이언트를 개발하는 것을 의미합니다. 이중에 후자를 위해서 사용하는 라이브러리가 web3.js입니다.

web3.js는 이더리움 블록체인과 JSON RPC(Remote Procedure Call)를 이용해 소통합니다.
이더리움에서는 클라이언트가 JSON RPC의 형식에 맞춰서 이더리움 노드에 데이터를 요청합니다.
web3.js와 연결된 노드를 provider라고 합니다.
 
 

에러가 많이 나는곳

Web3는 2018년에 나온 Ganache랑 맞는 버전을 찾는 게 어렵습니다. 심지어 최근에 Ganache-cli가 Ganache로 아예 바뀌여서 버전이 호환이 잘 안 됩니다. 그래서 최신버전으로 설치를 하면 코드가 잘 적용이 안되는 것 같습니다.
 

express version : 4.18.2
node.js version :  v20.9.0
ganache-cli version : 6.1.0
web3 version : 1.10.3

 
작업을 실행할 폴더에서 명령 프롬프트로 위의 4개를 npm 설치 명령어로 다운로드합니다. 
 
 

설치 후 코드 작업

- package.json에 아래를 추가합니다. npm으로 작업을 위해서 아래 작업을 진행합니다.

"scripts": {
	"start": "node index.js",
    "test": "echo \"Error: no test specified\" && exit 1"
},

 

 
ganache는 사용하지 않고 ganache-cli를 사용합니다.
 
 
- 코드 추가 index.js
 

const express = require('express');
const app = express();
const port = 8080;
const Web3 = require('web3');

function getWeb3() {
  	const web3 = new Web3(new Web3.providers.HttpProvider('http://127.0.0.1:8545'));
  	return web3;
}

async function getAccounts() {
  	try {
      	const accounts = await getWeb3().eth.getAccounts();
      	return accounts;
    } catch (e) {
      	console.log(e);
      	return e;
    }
}

app.get('/', (req, res) => {
	getAccounts().then( (accounts) => {
      	res.send(accounts);
    })
});
app.listen(port, () => {
	console.log('Listening...');
});

async function getGasPrice() {
  	try {
      	const gasPrice = await getWeb3().eth.getGasPrice();
      	console.log(gasPrice);
      	return gasPrice;
    } catch (e) {
      	console.log(e);
      	return e;
    }
}

app.get('/gasprice', (req, res) => {
  	getGasPrice().then( (gasPrice) => {
      	res.send(gasPrice);
    })
})

async function get Block() 
	try {
      	const getBlock = await getWeb3().eth.getBlock("latest");
      	console.log(getBlock);
      	return getBlock;
    } catch (e) {
      	console.log(e);
      	return e;
    }
}

app.get('/getblock', (req, res) => {
  	getBlock().then( (getBlock) => {
      	res.send(getBlock);
    })
})

 
 
 

코드 해석

1. 웹 서버 생성

const express = require('express');
const app = express();
const port = 8080;

app.get('/', (req, res) => {
	res.send('Hello Node.js!');
});
app.listen(port, () => {
	console.log('Listening...');
});

 
이 코드는 Node.js의 Express 라이브러리를 사용하여 간단한 웹 서버를 생성하는 코드입니다.

  1. const express = require('express');: Express 라이브러리를 불러옵니다.
  2. const app = express();: Express 애플리케이션을 생성합니다. 이를 통해 우리는 웹 서버를 구성할 수 있습니다.
  3. const port = 8080;: 서버가 사용할 포트 번호를 지정합니다.
  4. app.get('/', (req, res) => { ... });: HTTP GET 요청에 대한 처리기를 설정합니다. 여기서 '/'는 루트 경로를 의미하며, 루트 경로에 요청이 들어오면 이 핸들러가 실행됩니다. 요청(req)을 받고, 응답(res)을 보냅니다. 이 코드에서는 단순한 문자열인 'Hello Node.js!'을 응답으로 보냅니다.
  5. app.listen(port, () => { ... });: 서버가 지정한 포트에서 요청을 수신하기 시작합니다. 서버가 시작되면 콘솔에 'Listening...'이라는 메시지가 표시됩니다.

이 코드는 루트 경로로 요청이 들어오면 'Hello Node.js!'라는 텍스트를 반환하는 간단한 HTTP 서버를 생성합니다. 이 코드를 실행하고 나면, 해당 포트(8080 포트)에서 서버가 실행되고, 누군가 해당 서버에 접속하면 브라우저에 'Hello Node.js!'가 표시됩니다.
 
 
 
2. Web3 사용하여 이더리움 테스트 작업

const Web3 = require('web3');

function getWeb3() {
  	const web3 = new Web3(new Web3.providers.HttpProvider('http://127.0.0.1:8545'));
  	return web3;
}

async function getAccounts() {
  	try {
      	const accounts = await getWeb3().eth.getAccounts();
      	return accounts;
    } catch (e) {
      	console.log(e);
      	return e;
    }
}

 
이 코드는 web3 라이브러리를 사용하여 Ethereum 네트워크에서 계정을 가져오는 기능을 수행하는 것으로 보입니다.

  1. const Web3 = require('web3');: web3 라이브러리를 가져옵니다.
  2. function getWeb3() { ... }: getWeb3() 함수는 HTTP 프로바이더를 사용하여 로컬 Ethereum 네트워크(http://127.0.0.1:8545)에 연결된 web3 인스턴스를 생성합니다. 이 함수는 web3 인스턴스를 반환합니다.
  3. async function getAccounts() { ... }: getAccounts() 함수는 getWeb3() 함수를 호출하여 Ethereum 계정을 비동기적으로 가져옵니다. getWeb3()를 사용하여 eth.getAccounts()를 호출하고, await 키워드를 통해 비동기적으로 계정을 기다립니다. 성공적으로 계정을 가져오면 해당 계정을 반환하고, 오류가 발생하면 오류를 콘솔에 기록하고 해당 오류를 반환합니다.

이 코드는 Ethereum 블록체인 네트워크에 연결하여 해당 네트워크의 계정 정보를 가져오는 비동기 함수를 정의합니다. 함수를 호출하면 해당 네트워크의 계정이 반환되거나, 오류가 발생할 경우 오류를 반환합니다.
 
 
 
3. Gas 가격 확인
 

async function getGasPrice() {
  	try {
      	const gasPrice = await getWeb3().eth.getGasPrice();
      	console.log(gasPrice);
      	return gasPrice;
    } catch (e) {
      	console.log(e);
      	return e;
    }
}

app.get('/gasprice', (req, res) => {
  	getGasPrice().then( (gasPrice) => {
      	res.send(gasPrice);
    })
})

 
이 코드는 Express를 사용하여 /gasprice 엔드포인트를 생성하고, 이 엔드포인트에 대한 요청이 들어왔을 때 Ethereum 네트워크의 가스 가격을 가져와 응답으로 반환하는 기능을 수행합니다.

  1. async function getGasPrice() { ... }: getGasPrice() 함수는 Ethereum 네트워크의 가스 가격을 가져오는 비동기 함수입니다. getWeb3() 함수를 사용하여 eth.getGasPrice()를 호출하고, await 키워드를 사용하여 가스 가격을 비동기적으로 기다립니다. 성공적으로 가스 가격을 가져오면 가격을 콘솔에 출력하고 반환합니다. 오류가 발생하면 콘솔에 오류를 기록하고 해당 오류를 반환합니다.
  2. app.get('/gasprice', (req, res) => { ... } ): Express 애플리케이션에서 HTTP GET 요청을 처리하는 핸들러입니다. /gasprice 엔드포인트에 대한 GET 요청이 오면, getGasPrice() 함수를 호출하여 가스 가격을 얻고, 해당 결과를 응답(res)으로 보냅니다. then() 메서드를 사용하여 비동기 작업이 완료되면 반환된 가스 가격을 응답으로 전송합니다.

 
4. 이더리움 블록 정보
 

async function getBlock() {
	try {
      	const getBlock = await getWeb3().eth.getBlock("latest");
      	console.log(getBlock);
      	return getBlock;
    } catch (e) {
      	console.log(e);
      	return e;
    }
}

app.get('/getblock', (req, res) => {
  	getBlock().then( (getBlock) => {
      	res.send(getBlock);
    })
})

 
이 코드는 Express 애플리케이션에서 /getblock 엔드포인트를 만들어 최신 블록 정보를 가져오는 기능을 구현합니다.

  1. async function getBlock() { ... }: getBlock() 함수는 최신 블록 정보를 가져오는 비동기 함수입니다. getWeb3() 함수를 사용하여 eth.getBlock("latest")를 호출하고, await 키워드를 사용하여 최신 블록 정보를 비동기적으로 기다립니다. 성공적으로 최신 블록 정보를 가져오면 해당 정보를 콘솔에 출력하고 반환합니다. 오류가 발생하면 콘솔에 오류를 기록하고 해당 오류를 반환합니다.
  2. app.get('/getblock', (req, res) => { ... } ): Express 애플리케이션에서 HTTP GET 요청을 처리하는 핸들러입니다. /getblock 엔드포인트에 대한 GET 요청이 오면, getBlock() 함수를 호출하여 최신 블록 정보를 얻고, 해당 결과를 응답(res)으로 보냅니다. then() 메서드를 사용하여 비동기 작업이 완료되면 반환된 최신 블록 정보를 응답으로 전송합니다.

 

구현 

 1. 명령프롬프트에  'ganache-cli'  명령어를 입력하여 ganache 실행
 
 

ganache-cli on window 10 cmd

 
 
 
 
 
2. npm start를 다른 명령프롬프트에서 명령어로 입력
- 로컬 서버에 계정 출력 확인
 
 

local server block-chain

 
 
 
3. 가스 가격 확인하기
 

gasprice on blockchain local server

 
 
 
4. 블록 정보 확인하기
 

block information on blockchain localserver

 

 

 

 

 

반응형