웹에서 Javascript | web3.JS를 사용하여 

블록체인에 접근하기

 

 

 

 

 

 

 

 

앞선 포스팅에서 WAMP를 설치 했었는데

 

이보다 더 간단하게 할 수 있는 방법을 찾아

 

다른 방법을 사용하려고 합니다!

 

 

 

 

 

 

제가 했던 소스들과 버전들이 몇달 전 것들이라

 

바껴서 실행이 안될 가능성이 있기 때문에

 

저 또한 처음부터 

 

하나하나 해 나가다가 

 

중간에 오류가 발생하

 

방향을, 소스를 고쳐가며 합니다.

 

 

 

제 생각에는 차근차근 따라 하신다면

 

무리없이 원활하게 잘 되리라 생각합니다.

 

 

 

 

 

 

 

우선

 

먼저 저희는 npm을 사용 할 것이기에

 

npm이 깔려 있는지부터 확인해줍니다.

 

 

 

 

 

 

 

만약 버전이 낮으신 분들은

 

npm update를 하셔서

 

진행하시면 됩니다.

 

 

 

 

 

 

 

 

 

깔려있지 않다면

 

아래에 접속하여 다운로드를 받으세요.

 

https://nodejs.org/en/

 

 

 

 

 

 

 

 

그다음

 

제가 WAMP대신 사용한다던 서버를 깝니다.

 

npm install live-server -g

 

http-server를 아시는 분들은 비슷하다고 생각하시면 됩니다.

 

만약 호스팅 중인 파일이 저장이 되면 

 

자동으로 리로드를 하여 번거로움을 없애줍니다.

 

 

 

 

 

 

 

 

 

이 서버를 실행하는 방법은 

 

원하는 폴더 루트에 들어가

 

cmd창에서 live-server를 입력해 주시면 

 

아래와 같이 간단히 실행이 됩니다.

 

 

 

Ready for chnages가 뜨고 가만히 있다면 

 

잘 실행 된 겁니다

 

아래의 Change detected ~~ 는 

 

파일을 저장 했을 시, 감지하여 이를 리로드 시켜줍니다.

 

 

 

 

 

 

그리고 bower을 설치해 줍니다.

 

npm install -g bower

 

 

 

 

 

여기서 git도 필요할겁니다 (아마?)

 

그러므로 git도 설치해 줍시다.

 

https://git-scm.com/

 

 

깃 설치 중에 이러한 창이 뜰텐데

 

가운데 옵션을 선택해 주시면 됩니다.

 

1. git을 설치하면 함께 설치되는 git bash에서만 git을 사용할 경우

2. git을 윈도우의 cmd창에서도 사용할 경우 - 자동으로 환경변수 추가

3. unix 명령어까지도 사용할 경우

 

나머지는 기본값으로 셋팅해 주시면 됩니다.

 

 

 

 

 

 

 

 

이제 저희가 html파일을 생성할 

 

폴더를 하나 만들어 그 위치에 들어가서

 

bower install web3를 터미널에 입력해

 

web3.js를 사용하기 위해 설치합니다.

 

파일경로\bower_components\web3\dist에 

 

web3.js파일이 존재합니다. ( 추후 재언급 )

 

 

 

 

 

* 원래 npm으로 npm install web3를 사용해 깔았었는데,

 

  자잘한 오류들이 너무 많이 떠 bower로 바꾸었습니다.

  

  bower_components 폴더 안에 보시면 

 

  example도 있으니 한번 훑어 보시기 바랍니다.

 

 

 

 

 

 

 

 

이제  기본적인 셋팅은 다 끝났습니다.

 

블록체인을 실행해 주셔야 접근이 가능하며

 

실행옵션을 아래와 같이 주시고 실행 해 주시기 바랍니다.

 

geth --datadir "블록체인 데이터 저장 디렉토리" --rpc --rpcaddr 127.0.0.1 --rpcport "8545" --networkid 15 --rpccorsdomain "*" console

 

* 접속이 안되시는 분들은 rpcaddr을 0.0.0.0으로 해주시면 됩니다.

 

 

 

 

 

 

 

 

그리고 아래 소스를 그대로  html파일로 복사 붙여넣기 하셔서

 

방금 만든 폴더 안에 만들어 줍니다.

 

 

 

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<!-- web3.js를 사용하기 위해 bower를 통해 설치한 web3.js 경로를 추가해 줍니다. -->

<script type="text/javascript" src="../bower_components/web3/dist/web3.js"></script>

<title>go-ethereum 블록체인 실습</title>

</head>

<body>

 

<!-- 저희가 만든 geth 블록체인의 데이터를 들고 오겠습니다. -->

<h1>Private Blockchain Network</h1>

<hr>

 

<!-- 계정목록을 들고 옵니다. -->

<div style="background-color:azure">

<h2>Accounts</h2>

<p id = "accounts"></p>

</div>

 

<!-- 채굴시 이더(wei)가 들어가는 이더(코인)베이스 계정입니다. -->

<div style="background-color:aquamarine">

<h2>Etherbase Account</h2>

<p id = "etherbase"></p>

</div>

 

<!-- 코인베이스의 이더량(wei)를 확인합니다. -->

<div style="background-color:bisque">

<h2>Balance of Coinbase Account</h2>

<p id = "getbal"></p>

</div>

 

<!-- 현재까지 채굴 된 블록의 갯수를 나타냅니다. -->

<div style="background-color:aliceblue">

<h2>Mined block Number</h2>

<p id = "mined"></p>

</div>



</body>

</html>

 

<script>

// 우선 web3를 사용하기위해 선언해줍니다.

var web3 = new Web3();

 

//geth 실행시, localhost / rpcport번호로 지정해 주었던 8545번으로 설정해 줍니다.

web3.setProvider(new Web3.providers.HttpProvider('http://localhost:8545'));



/* 명령어 창에서 eth.accounts[0] 이런식으로 사용했듯이

* web3를 앞에 붙여 web3.eth.accounts[0] 이렇게 간단히

* 사용 할 수 있으나, callback 함수는 추가적인 사용법이 필요합니다.

*/

 

// 모든 계정을 불러와 출력합니다.

for(i=0; i<web3.eth.accounts.length;i++){

document.getElementById("accounts").append( web3.eth.accounts[i] + "\n");

}

 

// 코인베이스 계정을 들고와 출력합니다.

document.getElementById("etherbase").append("coinbase Account : " + web3.eth.coinbase + "\n");

 

// 코인베이스의 이더량을 출력합니다.

document.getElementById("getbal").append("balance of coinbase : " + web3.eth.getBalance(web3.eth.coinbase) + "\n");

 

// 현재까지 채굴 된 블록의 갯수를 나타냅니다. 추가적인 사용법이 있습니다.

web3.eth.getBlockNumber(

function(a,blocknum){

document.getElementById("mined").append(blocknum);

}

);

// 또한 이렇게 사용 할 수도 있습니다.

// (async ()=> {await web3.eth.getBlockNumber(console.log) })()

 

 

// web3에 대한 무수히 많은 정보가 들어 있습니다.

// 개발자도구 ( 윈도우는 F12 )에 들어가셔서 콘솔창에서 확인 하실 수 있습니다.

 

console.log(web3);

</script>

 

 

 

 

 

 

주저리주저리 주석을 장황하게 달아 

 

길어 보이는데

 

정말 간단한 소스입니다.

 

 

 

 

 

 

 

 

주석을 자세히 달아놓아

 

따로 설명은 하지 않겠습니다.

 

 

 

 

 

 

 

 

 

 

위 파일과 같이

 

bower을 통해 web3.js를 다운받았고,

 

소스파일을 긁어 html파일에 넣었으며

 

제네시스 파일 및 geth 실행옵션 등등 잘 셋팅 하여

 

블록체인 네트워크를 실행중이고

 

live-server를 파일 경로에서 실행 하셨다면

 

아래와 같은 화면을 보실 수 있으실 겁니다.

 

 

 

 

Accounts

 

모든 계정 리스트

 

 

 

Etherbase Account 

 

이더베이스 계정

 

 

 

Balance of Coinbase Account

 

이더베이스의 이더량

 

 

 

Mined block Number

 

현재까지 채굴된 블록의 수 

 

 

 

 

 

 

 

만약 위 조건을 다 만족하여 실행을 하였는데도

 

위의 화면이 아닌 아래와 같은 화면만 뜬다면

 

 

 

개발자도구의 console창을 확인해 보시면

 

에러의 이유를 알 수 있습니다.

 

 

 

 

 

 

예를 들어

 

 

 

위와같은 화면은

 

web3.js파일을 찾을 수 없고,

 

그로인해 Web3를 정의 할 수 없다고 합니다.

 

 

 

 

 

 

따라서 경로 문제이기 때문에 

 

<head>태그 안의 

 

 

<script type="text/javascript" src="../bower_components/web3/dist/web3.js"></script>

 

 

web3.js 파일의 경로를 

 

아래와 같이 

 

절대경로로 설정해 주시면 됩니다.

 

 

<script type="text/javascript" src="C:\Users\taegyu\Desktop\ttttest\bower_components\web3\dist/web3.js">

</script>

 

 

 

 

 

 

 

 

이 외에도 자잘한 에러가 뜰 수 있는데,

 

구글링을 하시면 쉽게 해결 하실 수 있으실 겁니다.



웹에서 나의 블록체인에 접근하기 위한

WAMP 설치

 

 

 

 

 

 

 

 

 

 

 

 

 

이제까지 블록체인 네트워크를 

 

각자의 PC 혹은 VM위에 

 

구성하였습니다.

 

 

 

 

 

 

 

 

앞으로 포스팅 할 주제는

 

에서 블록체인에 접근하여

 

블록체인에 있는 정보

 

 띄우는 것 입니다.

 

 

 

 

 

 

먼저, 웹을 사용하기 위해

 

저희는 서버 설치하겠습니다.

 

 

 

 

 

 

 

 

 

우선 HTML, javascript, php 등을 사용하여

 

웹을 만들어 실행하기위해

 

웹 서버를 설치합니다.

 

 

 

 

 

 

Bitnami WAMP를 설치하겠습니다.

 

WAMP

 

Windows Apache Mysql Php의 약자로

 

윈도우에서 apache 서버, mysql DB, PHP를

 

모아놨다 라고 생각하시면 됩니다.

 

 

 

 

 

고로 WAMP말고도

 

Linux에서 사용하는 LAMP

 

Mac에서 사용하는 MAMP 

 

등이 있습니다.

 

 

 

( 제가 설치한 버전은 bitnami-wampstack-7.1.24-1-windows-x64 입니다. )

 

설치 경로 -> https://bitnami.com/stack/wamp

 

 

 

 

Windows 64-bit를 설치합니다. ( 각자 컴퓨터에 맞게 )

 

 

 

간간히 오류가 뜨기도 하는데

 

그러면 google에 로그인 하여 

 

다운로드 하시면 잘 됩니다.

 

 

 

 

 

 

 

스크린샷을 첨부한 설정창 말고는

 

기본 셋팅값으로 해 주시면 됩니다.

 

 

 

여기서는 모두 사용하지 않으므로 

 

다 체크해제 해 주시면 됩니다.

 

 

 

 

 

 

 

 

 

위 화면은

 

mysql에 사용할 비밀번호를 설정하는건데

 

추후 제가 mysql을 사용 할 지는 모르겠습니다.

 

여튼 6글자 이상의 패스워드를 설정해 줍니다.

 

 

 

 

쭉쭉 진행 하셔서

 

아래와 같은 화면이 나오면 다 설치된 겁니다.

 

 

 

 

 

 

 

 

 

그리고 잘 설치 되었는지 확인하기 위해

 

주소창에 

 

localhost를 입력하시면,

 

 

 

위와 같은 화면을 보실 수 있습니다.

 

 

 

 

 

 

 

이 화면은 index.html화면인데,

 

Bitnami WAMP 설치시, 따로 경로 설정을 해 주지 않았으면 보통

 

C:\Bitnami\wampstack-7.1.24-1\apache2\htdocs

 

위 경로가 기본 루트이며, 위 경로에 있는

 

index.html파일이 위의 웹 페이지를 나타냅니다.

 

 

 

 

 

 

 

저흰 앞으로 여기서 HTML 및 PHP 파일을 만들어

 

블록체인에 접근하여 정보를 들고 올 것입니다.

 

 

 

 

 

 

 

 

몇일간 R언어를 포스팅 한다고 

 

블록체인 글을 이어 못 썻는데

 

빠르게 포스팅 하여 끝마치겠습니다.

 

 

 

 

 

 

 

감사합니다.

 

클릭밖에 모르는 사람들을 위한

윈도우에서 블록체인 네트워크 구성하기

 

 

 

 

 

 

 

 

 

윈도우 OS위에

 

Virtual box를 사용하여 

 

ubuntu 16.04를 설치해

 

그 위에서 geth를 설치 및 구동해 보았습니다.

 

 

 

 

 

 

 

보통 리눅스 서버에서 돌리기에

 

이렇게 해 보았는데,

 

윈도우에서도 

 

어떻게 설치하는지 

 

여쭈어 보시는 분들도 계셔서

 

따로 윈도우에서 블록체인 네트워크

 

구성하는 법을 포스팅 하려고 합니다.

 

 

 

 

 

 

 

윈도우에서 블록체인 네트워크를 구성하는것은

 

리눅스보다 쉽습니다 ! 

 

 

 

 

 

 

 

제가 올 해 초에 윈도우에서 해 보려고 했을때는

 

여기저기서 많은 오류가 있었는데

 

지금 다시 해 보니

 

정말 간단하고 빠르게 구동이 되더라구요

 

 

 

 

 

 

 

 

자, 이제부터 

 

윈도우에서 

 

geth 블록체인 네트워크 

 

설치, 구동을 시작합니다.

 

 

 

 

 

 

먼저 아래 사이트에서 

 

윈도우용 geth를 다운로드 해 줍니다.

 

https://geth.ethereum.org/downloads/

 

 

 

 

 

 

 

 

다운 후, 실행하여 

 

모두 기본 셋팅값으로 "다음"을 진행해 주시면 됩니다.

 

*추후 이더리움 블록체인 네트워크 삭제를 원하시는 분들은

 

설치중에 볼 수 있는 아래 화면에 보이는 

 

경로에 있는 Geth 폴더를 삭제해 주시면 됩니다.

 

 

 

 

 

 

 

 

 

원하시는 루트에 

 

블록체인 데이터들을 저장할 폴더 파일을 생성해 주시고

 

genesis.json파일도 생성해 줍니다.

 

 

 

genesis.json 파일의 생성 = https://pmgreviewer.tistory.com/7

 

geensis.json 파일의 옵션 = https://pmgreviewer.tistory.com/11

 

( 저는 바탕화면 ( ~/Desktop/ )에 private-blockchain이라는 폴더

 

  및 genesis.json파일을 생성해 주었습니다. )

 

 

 

 

 

 

 

 

 

그 뒤, cmd창을 열어 

 

(윈도우키 + S로 실행 창을 열어 cmd 입력하시면 됩니다. )

 

리눅스에서 했듯이 똑같이

 

geth --datadir "private-blockchain" init genesis.json

 

을 실행하여 제네시스 블록을 지정해 주고

 

geth --datadir "private-blockchain" --networkid 15 console

 

을 실행하여 블록체인 네트워크에 접속합니다.

 

 

네 정말 이게 끝입니다 !

 

 

 

 

 

 

 

 

이로써 윈도우에 geth 블록체인 네트워크를 구축하였습니다.

 

 

 

블록체인 네트워크 명령어를 

 

우분투와 동일하게 사용하시면 됩니다 !

 

명령어 사용하기 -> https://pmgreviewer.tistory.com/8 

 

 

 

 

 

 

바로 다음 포스팅에는

 

javascript를 사용해

 

제 컴퓨터 (윈도우 OS)에 설치한

 

블록체인 네트워크를 에서 접근하여

 

어떻게 사용하는지,

 

어떻게 블록체인 네트워크의 정보를 

 

들고 오는지 알아보겠습니다.

 

 

 

 

 

 

 

감사합니다.



제네시스 블록

블록체인의 시작

 

 

 

 

 

 

 

제네시스 블록

 

블록체인 네트워크의

 

"첫번째" 블록이며 

 

수많은 블록체인 네트워크들을 분별하는

 

하나의 "" 역할을 합니다.

 

 

 

 

 

 

그러므로,

 

같은 블록체인 네트워크를 연결하려면

 

이 파일은 "무조건" 같아야 하며

 

특히나 이 제네시스 파일의

 

chainId값을 가지고 구분한다 생각 하시면 됩니다.

 

 

 

 

 

아래는 geth 블록체인을 형성 시 필요한

 

genesis.json 파일의 내용이며

 

안의 값이 어떤 것을 의미하는지에 대한

 

설명을 추가적으로 적어 놓았습니다.

 

 

 

{ "config": { "chainId": 15, "homesteadBlock": 0, "eip155Block": 0, "eip158Block": 0 }, "difficulty": "20", "gasLimit": "2100000", "alloc": { "bbc34675b938a3bc565e64a4a0050ebc1b2d1d827": { "balance": "3100000" }, "19abbcc9ae680c1aa7819bdfa47a623b7b77dade": { "balance": "2100000" } } }

 

 

 

“config”

 

블록체인 구성을 의미합니다.

 

 

 

 

 

 

 

“chainId”

 

권한이 없는 사용자의 유입을 막기 위한 

 

일종의 방 번호라고 생각하시면 됩니다. 

 

권한이 없는 "공격자"로부터의 

 

공격 (replay attack) 을 보호를 합니다. 

 

 

 

 

 

 

 

 

예를 들어 

 

chainId에 따라 달라지는 

 

특정 값을 일치시켜 작업을 검증하는 경우 

 

공격자는 다른 ID로 

 

동일한 값을 쉽게 얻을 수 없습니다.

 

 

 

 

 

 

그냥 chainId의 값이 다르면  (genesis.json파일이 다르면)

 

접근이 불가능하다 

 

라고 생각 하시면 됩니다

 

*chainId의 값은 고유한 값으로 설정하는게 좋습니다

 

예를들면 ab6da98c7bfd7b68876fd987c7ba8d6f786c 등과 같은 //

 

 

 

 

 

 

“homesteadBlock”

 

Homestead는 ethereum의 두번째 release입니다. 

 

* 첫번째 release는 Frontier 입니다.

 

 

 

 

 

 

 

 

 

homesteadBlock값이 0인 것은

 

이 release를 사용함을 의미합니다.

 

고로, 0으로 두시면 됩니다.

 

*참조 : https://github.com/ethereum/go-ethereum/blob/feeccdf4ec1084b38dac112ff4f86809efd7c0e5/params/config.go#L71

 

 

 

 

 

 

 

“difficulty”

 

마이닝(채굴)의 난이도 입니다.

 

블록을 채굴 하기위해 난이도를 조절하는데,

 

말 그대로 값을 낮게 잡아두면

 

빠르게 마이닝이 됩니다.

 

 

 

 

 

 

 

“gasLimit”

 

한 블록 당 gas 비용을 제한합니다.

 

 

 

 

 

 

보통, 저희처럼 테스트 할 때는

 

제한되지 않도록 하기 위해

 

이 값을 높게 잡아둡니다.

 

 

 

 

“alloc”

 

생성되어 있는 계정에 balance를 지정해줍니다.

 

즉, 계정에 "일정량의 돈을 미리 쥐어준다." 라고

 

제네시스 블록에 "셋팅" 해준다고 생각하시면 됩니다.

 

 

 

 

 

이 계정은 40자리의 16진수 문자열로 구성됩니다.

 

* 이 셋팅을 하기 전에 미리 계정을 생성 해 놓고 

 

그 계정을 여기 다시 적어주어야 합니다.

 

생성되지 않은 계정을 등록해 봤자 소용없습니다.

 

 

 

 

 

 

 

 

 

예)

 

-> geth --datadir private-blockchain init genesis.json console

 

으로 1차적으로 geth를 실행하여 

 

personal.newAccount()로 계정을 하나 생성해 줍니다.

 

 

 

 

 

그 계정을 복사 해 두어

 

geth 콘솔창을 나간 뒤

 

genesis.json파일을 편집해

 

방금 복사해 놓은 계정값을 

 

alloc에 추가하고

 

balance값을 적어 줌으로써

 

셋팅이 완료됩니다.

 

 

 

 

 

 

 

 

이로써 

 

블록체인의 "시작"인

 

제네시스 블록

 

genesis.json파일을 알아보았습니다.

 

 

 

 

 

제가 알고있는 한도 내의 

 

블록체인 잡지식이 떨어져 갑니다.

 

곧 끝날것 같습니다,,

 

 

 

 

 

조만간 웹에서 

 

블록체인 네트워크에 연결하여

 

데이터를 불러와 띄우는 작업을 

 

진행해 보겠습니다.

 

 

 

감사합니다.



Geth 

실행 옵션

 

 

 

 

 

 

geth를 실행 할 때 필요한 옵션의 종류에 어떤것들이 있는지

 

알아보도록 하겠습니다.

 

 

 

 

 

geth help를 치면,

 

아래와 같은 결과창을 볼 수 있습니다.

* 훨씬 더 많습니다.

 

 

 

 

그 중 자주 쓰이는 명령어 몇개만 소개 하도록 하겠습니다.

 

console 

     - 콘솔창으로 블록체인에 명령을 줄 수 있게 합니다.

 

init 

     - genesis.json파일을 등록하여 제네시스 블록을 설정해 줍니다.

 

--datadir

     - geth의 데이터베이스들과 키 스토어를 위한 데이터 디렉터리를 지정합니다.

 

--dev

     - 빠르고 손쉽게 블록체인 네트워크를 구성, 실습을 할 수 있는 옵션이라 생각하시면 됩니다.

       마이닝 하지 않아도 많은 양의 Balance값이 들어가 있습니다.

 

--rpc 

     - HTTP-RPC를 사용 가능하게 합니다.

 

--rpcaddr

     - RPC를 listen하는 IP address값을 지정해 줍니다.. (default : "localhost")

 

--rpcport

     - RPC를 listen하는 Port값을 지정해 줍니다. (default : 8545)

 

--rpcapi

     - rpc를 통해 사용 가능한 API들을 셋팅해 줍니다. (default : eth, db, net, web3

       추가적으로는 admin, mining, personal 등을 적어주면 추가적으로 사용 가능하다.

 

-- port 

     - Listen Port를 지정해 줍니다. (default : 30303)

 

--nodiscover

     - 자동으로 피어를 찾지 않게 만듭니다. 

 

--fast

     - syncing을 빠르게 만듭니다.

 

 

 

 

 

 

 

 

저같이 간단히 실행 정도만 해보고 싶은 분들에게는

 

이정도의 옵션으로 

 

충분히 구현이 가능합니다.

 

 

 

 

 

 

 

 

감사합니다.



정말 기초적인 geth 명령어를 사용하여

       블록체인에 데이터 저장하기

 

                    

 

 

앞선 포스팅의 내용을 이어서 작성하겠습니다.

 

 

 

 

사실 이전 포스팅에 있는

 

coinbase 계정을 다 적을 필요는 없습니다.

 

네 

 

낚이셨습니다.

 

성격이 급하신 분들은 급하신 대로 이 글을 보시고 편하게 하실겁니다.

 

geth 에서는 위와같이 아주 편리한 작업이 가능합니다.

 

eth.accounts[0]은 첫번째로 생성된 account를 나타내주고

 

eth.coinbase는 coinbase 계정, 즉 첫번째로 생성된 account를 나타내 줍니다.

 

 

 

 

 

4. 트랜잭션 발생하기( 보내기 )

 

 

 

이제 돈이 충분한 것을 알게 되었으니 

 

간단한 트랜잭션을 발생 해 보겠습니다.

 

 

eth.sendTransaction({

from:eth.accounts[0],

to:eth.accounts[1],

value:'10000000000'

})

 

 

 

ether로 보내고 싶으신 분들은

 

eth.sendTransaction({

from:eth.accounts[0],

to:eth.accounts[1],

value: web3.toWei(1, "ether")

})

 

* gas를 따로 기입해주셔도 되는데 

 

기입을 따로 하지 않을시, 자동으로 gas가 소모됩니다.

 

 

 

 

 

 

위 명령을 통해 트랜잭션을 발생하여 

 

eth.accounts[0] 즉, coinbase 계정에서 

 

eth.accounts[1] 계정으로 

 

10000000000 Wei

 

혹은

 

1 Ether

 

만큼의 balance값을 전송해 줍니다.

 

 

 

 

 

 

 

 

 

 

 

그리고 eth.accounts[1] 계정의 balance값을 확인해 보시면,

 

 

네, 없습니다.

 

아직 트랜잭션 풀에만 등록이 되었고 

 

채굴을 통해 배포되지 않았기 때문입니다.

 

 

 

 

 

 

 

 

 

 

위와 같이 eth.pendingTransactions를 사용해

 

트랜잭션 풀에 저장되어 있는 트랜잭션 정보를 확인 할 수 있습니다.

 

 

 

 

 

이제 채굴을 통해 

 

저 트랜잭션 풀에 위치한 트랜잭션을 채굴 해 봅시다.

 

 

다시 말씀드리지만, --dev 옵션으로 인해 정말 빠른속도로 채굴이 됩니다.

 

--dev옵션 없이 채굴을 진행하시면 몇분이 몇십분이 걸린다는걸 알 수 있습니다.

 

위와 같이 채굴을 통해 트랜잭션 풀에 위치해 있던 트랜잭션을

 

채굴해 내어 eth.pendingTransactions를 통해 확인하시면 

 

[ ] 를 확인하여 채굴 된 것을 알 수 있습니다.

 

 

 

이제 거래가 성사되고 (트랜잭션이 발생하고 이 트랜잭션이 채굴 되고)

 

accounts[1] 계정의 balance를 확인해 보시면

 

 

 

정확히 보낸 값인 10000000000이 보내진 것을 알 수 있습니다.

 

 

 

 

 

 

5. 원하는 데이터를 블록체인에 저장하기

 

 

 

이제 원하는 데이터(문자)를 트랜잭션에 실어 

 

전송해보도록 하겠습니다.

 

 

data 변수에 저장할 문자를 저장합니다.

 

* 굳이 이렇게 저장 할 필요는 없습니다.

 

 

 

 

 

그 뒤, eth.sendTransaction({}) 함수 안의 data에 

 

저장 할 문자를 입력 해 주고 채굴을 해줍니다.

 

직접 기입을 원하시는 분들은

 

  data : "datadatadata" 이렇게 적어주시면 됩니다.

 

*from만 존재해도 transaction은 전송이 됩니다.

 

 

 

 

 

 

 

 

방금 채굴된 트랜잭션의 정보를 확인해 봅시다.

 

먼저 eth.blockNumber로 현재 채굴된 블록의 갯수를 알아봅시다.

 

 

 

아마 저처럼 진행 하셨으면 2개의 블록이 채굴 되었을 겁니다.

 

 

 

 

 

 

그리고 이 블록의 정보를 보시면,

 

 

위와 같은 2번 블록의 정보를 상세히 보실수 있습니다.

 

여기서 보이시는 값중에

 

gasUsed : 90000     // 이 블록을 채굴 시 90000의 가스가 소모 되었다.

 

number : 2            // 2번째로 채굴된 블록이다.

 

transactions : [ ~ ]  // 이 블록안에 있는 트랜잭션들은 ~ 이 있다.

 

등의 상세한 정보를 알 수 있습니다.

 

 

 

 

 

몇번째 블록에 원하는 트랜잭션 존재하는지 알아 냈으니,

 

이제 트랜잭션의 정보를 추출하여

 

저장된 데이터를 불러와 보겠습니다.

 

 

 

 

eth.getTransactionFromBlock( )을 사용해 

 

원하는 트랜잭션이 존재하는 해당 블록의 숫자를 입력해 줍니다.

 

그리고

 

input 칸을 보시면

 

저희가 방금 전 넣었던 값인 

 

0xaaaaaaa~ 00000이 보이는걸 확인 하실 수 있습니다.

 

좀 더 깔끔하게 보기를 원하시는 분들은

 

 

위와같이 

 

eth.getTransactionFromBlock( ).input 을 사용하셔서

 

input 값만을 추출 할 수 있습니다.

 

 

 

 

 

 

 

물론 다른 정보들도 뒤에 .@ 로 사용하셔서 

 

추출하여 아래와 같이 확인 하실 수 있습니다.

 

 

 

 

 

 

 

 

 

 

이로써 제가 콘솔 창에서 사용했던 웬만한 

 

"간단한" 명령어들을 함께 확인해 보았습니다.

 

 

 

 

 

 

 

 

앞으로의 포스팅에서는 

 

멀티노드 구성을 하여 

 

여러 컴퓨터(virtual box)를 사용하여 블록체인을 서로 연결하여

 

블록체인 네트워크를 형성해 보도록 하겠습니다.

 

 

 

 

 

 

 

좀 더 상세한 정보를 원하시는 분들은

 

https://web3js.readthedocs.io/en/1.0/web3-eth.html 

 

위 사이트에 들어가시면

 

원문으로 상세한 정보를 얻을 수 있습니다.

 

정말 기초적인 geth 명령어를 사용하여

블록체인에 데이터 저장하기

 

 

                     

 

 

 

 

이번에는 geth 블록체인에서 사용 할 수 있는 

 

간단한 명령어들을 사용해 보겠습니다.

 

이전 포스팅(2020/08/30 - [IT/블록체인] - geth | Part_2 누구나 쉽고 빠르게 이더리움 블록체인 구성하기)

에서 geth 구축까지 완료 하였는데요

 

이전 포스팅과 이어서 진행 하도록 하겠습니다.

 

 

 

 

 

 이더리움의 정말 간단한 동작 과정을 설명하겠습니다.

 

트랜잭션(거래) 발생 -> 트랜잭션 풀에 담음 -> 채굴 -> 블록체인 네트워크에 저장

 

 

 

 

 

 

그리고 이 간단한 동작 과정을 

 

간단한 명령어로 알아보도록 하겠습니다.

 

 

* 제가 geth를 설치하여 구동 해보며 받아들인 생각이니

 

  전문적인 지식은 전문적인 블로그에서 습득하시는것을 권장합니다.

 

 

 

 

 

 

먼저, 트랜잭션을 발생하기 위해서는 "gas" 라는 일종의 "수수료"가 필요합니다.

 

비트코인의 수수료 개념과는 다른 좀 더 업그레이드 된 개념이나,

 

저희는 그냥 "수수료"라고 생각을 하고 넘어가도록 하겠습니다.

 

이 수수료 제도가 생긴 이유는 악의적인 생각을 가진 사람들이 

 

무한한 양의 트랜잭션을 발생 시켜 마비시키는 등

 

공격을 감행 할 때, 이를 방지하기위해  트랜잭션을 발생 할 때 

 

"수수료"를 지불하도록 합니다.

 

 

 

 

 

이 gas라는 것은 "채굴"을 통해 얻을수 있는데, 

 

채굴을 하기위해선 채굴을 통해 지급받을 계정이 필요한데

 

이 계정을 etherbase 계정 이라고 합니다.

 

 

 

 

우선 

 

etherbase를 생성해주고

 

이를 통해 채굴을 한 뒤,

 

다른 계정으로 트랜잭션을 발생해 balance(돈)을 보내고

 

트랜잭션 안에 원하는 데이터(문자)를 저장해봅시다.

 

 

 

 

 

 

1. etherbase 생성

 

 

 

personal.newAccount() 함수를 통해 새로운 계정을 생성해 줍니다.

 

뒤에 나오는 passPhrase는 일종의 비밀번호와 같은 것이라 생각하시면 됩니다.

 

 

 

 

 

 

 

 

처음 생성된 계정(Account)은 자동적으로 Etherbase가 되며

 

eth.coinbase() 로 확인이 가능합니다.

 

 

 

 

 

 

 

2. 생성된 Etherbase로 채굴 하기

 

 

 

채굴은 광부가 하는겁니다.

 

네, 광부가 채굴을 합시다

 

고로 명령어는 miner.start()로 가능합니다.

 

miner.start( )에서 ( ) 괄호 안에 숫자를 입력해 스레드 수를 지정 할 수 있습니다.

 

 

 

 

 

 

 

아래처럼 null이 뜬다고 해서 에러가 아니라 잘 실행되는 겁니다.

 

 

 

 

 

 

그래도 미심쩍다.

 

나는 의심이 많은 사람이다 !!

 

나는 이걸 두 눈으로 꼭 확인 해 봐야겠다 !!

 

eth.mining을 입력하여 현재 채굴중인지 확인이 가능합니다.

 

 

 

 

 

 

 

 

3. etherbase 계정의 Balance(Wei) 확인하기

 

 

 

저희는 geth를 실행 할 때,

 

--dev 라는 옵션을 주었습니다.

 

개발을 위한 옵션이라고 보시면 되는데,

 

이 때문에 마이닝을 할 필요없이

 

balance가 엄청나게 주어져서

 

채굴을 하지 않으셔도 balance를 확인 하시면 

 

많은 돈이 들어와있다는걸 확인 하실 수 있습니다.

 

* --dev옵션 때문에 채굴을 굳이 하실 필요는 없습니다.

 

 

 

 

* balance의 기본 값은 ether가 아닌 Wei 인데,

 

1 Wei = 0.000000000000000001 Ether

 

즉, 1000000000000000000Wei = 1 Ether 로써

 

엄청 많아 보이는데 계산하기 귀찮으니

 

숫자는 커 보이나 ether로써는 작구나 라고 생각하시면 됩니다.

 

 

 

 

 

 

 

우선 마이닝을 중단하고 

 

현재 얼마나 많은 양의 ""이 들어와 있는지

 

확인 하도록 하겠습니다.

 

 

miner.stop( )으로 마이닝을 중단 한 뒤,

 

eth.accounts를 실행하는데 

 

이는 현재 생성된 계정들의 목록을 모두 나타내 주게 됩니다.

 

아마 여러분들은 personal.newAccount()를 한번만 해 주셔서

 

하나의 계정만이 존재 할 겁니다.

 

 

 

 

추후에 트랜잭션의 전송을 위해 다른 계정을 하나 더 만들어 놓도록 합시다.

 

그리고 eth.getBalance("etherbase 계정")을 입력해서

 

마이닝을 하여 얻은 돈을 확인해봅시다.

 

* etherbase account를 적을 때 토씨 하나 틀리지 않게 

 

조심해서 작성해 주시고 아래로 내려 진행을 합시다.

 

 

 

 

 

 

 

 

나머지 부분은 다음 파트에 

 

이어서 포스팅 하겠습니다.

 

 

 

 

 

 

 

좀 더 상세한 정보를 원하시는 분들은

 

https://web3js.readthedocs.io/en/1.0/web3-eth.html 

 

위 사이트에 들어가시면

 

원문으로 상세한 정보를 얻을 수 있습니다.

 

 

 

 

 

 

 

 

감사합니다.

 

geth ( go - ethereum ) 

프라이빗 블록체인 멀티노드 구성

 

            

 

 

 

 

go언어를 기반으로 한 ethereum 블록체인인 geth를 구축하겠습니다.

 

제가 공모전에서 사용한 OS는 (Ubuntu 16.04 / MAC _ high sierra 10.13.5 ) 이고

 

현재 구축하면서 사용할 OS는 Virtualbox에서 돌리는 Ubuntu 16.04 입니다.

 

 

 

 

 

빠르게 본론으로 들어가겠습니다

 

 

 

 

 

1. geth설치

 

    1) https://github.com/ethereum/go-ethereum

        - 이 링크로 접속하여 소스코드를 다운받아 압축파일을 원하는 위치에 풀어줍니다.

       

 

     2) git clone https://github.com/ethereum/go-ethereum.git

- 혹은 터미널 창에 이 명령어를 통해 geth를 다운받습니다.

        

          * home 디렉토리 ( cd ~/ ) 에 다운받는것을 권장드립니다.

 

        * 혹시 git이 깔려 있지 않다면 sudo apt install git 명령어를 통해 설치가 가능합니다.

        * 또한 에러 발생 시, sudo apt-get update를 통해 업데이트를 하시면 될겁니다.

 

 

 

 

 

 

 

 

 

 

 

 

2. go언어 설치 및 환경변수 설정

 

     1) wget https://storage.googleapis.com/golang/go1.10.1.linux-amd64.tar.gz

        - 터미널에 입력하여 go 1.10.1 압축파일을 깔아줍니다 ( linux버전 입니다. )

 

       * 1.9.2 버전을 깔았었는데 나중에 알고보니 에러가 떠서 버전을 바꿉니다.

 

 

 

 

 

     2) sudo tar -C /usr/local -xzf go1.10.1.linux-amd64.tar.gz 

     - 터미널에 입력해 압축파일을 /usr/local에 풀어줍니다.

      * sudo는 관리자 권한이라고 보시면 됩니다.        

      * 처음 실행시, 패스워드를 입력해라 하는데

        이전 포스트에서 설정한 패스워드를 입력 하시면 됩니다.

 

 

 

 

 

     3) sudo nano /etc/profile 

       - 터미널에 입력해 환경변수 설정을 위해 /etc/profile에 들어갑니다.

          * 꼭 sudo를 적어 관리자권한으로 접근을 해야 합니다.

 

 

 

 

 

 

     4) 제일 아랫줄에 

        export PATH=$PATH:/usr/local/go/bin            // go 경로 설정

        위 명령어를 입력해줍니다.

 

        그후 ctrl + x , y , 엔터키를 차례로 눌러 저장을 합니다.

 

      

 

 

 

 

 

     5) go version을 터미널에 입력해 버전 확인을 합니다.

        * 만약 go를 깔아라는 에러 메세지가 뜬다면

          터미널에 바로 5)번의 명령어(export PATH ~~ )를 적어주시면 됩니다.

 

 

 

     1.10.1 버전의 go가 깔린것을 확인할 수 있습니다.

    

 

 

 

 

    

 

 

 

 

3. go-ethereum 설치 및 환경구축

 

 

 

     1) cd go-ethereum 

         - go-ethereum으로 이동합니다.

 

 

 

 

 

 

     2) make geth

         - 본격적인 geth 설치를 합니다.

         * 그 전에 먼저 sudo apt-get install make를 통해 make를 깔아줍시다 

         * 오류가 뜬다면 gcc 문제 일 수도 있습니다.

            sudo apt-get install gcc 를 통해 설치를 해주시면 됩니다.

 

 

 

오류없이 진행 된다면 위와같은 창들이 뜨는것을 보실 수가 있습니다.

 

 

 

 

 

 

     3) 위 터미널 창의 마지막 줄에 보이시는 

        /home/ubuntu/go-ethereum/build/bin/ 경로로 이동합니다.

       (cd /home/ubuntu/go-ethereum/build/bin)

        * 다를수도 있습니다.

 

       ./geth version 을 통해 설치된 geth 버전을 확인합니다.

 

 

 

 

 

 

 

 

     5) 블록체인 데이터를 저장할 디렉토리를 만듭니다.

        mkdir private-blockchain

        *private-blockchain 말고 자신이 원하는 디렉토리 명을 하시면 됩니다.

 

 

 

 

 

     6) 제네시스 파일을 생성해 줍니다.   

         nano genesis.json                

        (저는 vim 편집기를 사용해 vim genesis.json을 했습니다.)

 

        * 글씨 1자도 틀리지않게 조심해서 작성해 주세요

{ "config": { "chainId": 15, "homesteadBlock": 0, "eip155Block": 0, "eip158Block": 0 }, "difficulty": "200000000", "gasLimit": "2100000", "alloc": { } }

 

 

 

 

 

4. go-ethereum 설치 및 환경구축

 

     1) ./geth --datadir "private-blockchain" --networkid 15 --dev console

        위 명령어를 통해 geth private 블록체인 단일노드가 생성되었습니다.

 

 

 

 

 

 

 

뒤의 포스팅에는 geth 명령어와 멀티노드의 구성을 포스팅 하겠습니다.

 

 

 

 

 

감사합니다.

 

 카테고리의 방향은 어떤 블록체인을, 어떻게 제가 공모전에서 사용하였고

 

이를 구축하면서 겪었던 어려움이나 기술적인 문제에 대해 기술 할 예정입니다.

 

블록체인에 대한 기술적, 개념적인 부분 다른 블로그에 훨씬 자세히 나와 있습니다 !!

 

 

 

 

블록체인. 최근 1년간 계속 화재거리가 되어 왔고,

 

비트코인, 이더리움, 가상화폐거래소, 탈중앙화 시스템 등 

 

많은 키워드 또한 화재가 되었습니다.

 

 

 

 

저 또한 블록체인에 대한 관심이 조금 있던 상태에서 공모전 아이디어를 생각하던 중,

 

블록체인을 활용한다면 좀 더 부각되지 않을까 생각해서 

 

이를 활용하여 공모전 아이디어를 제출

 

당선되어 프로젝트 진행을 하게 됩니다.

 

 

 

 

블록체인에 대해 알아보던 중, 

 

당시 가장 보편적이고 일반적인 이더리움에서 go언어로 진행중인 

 

geth(go-ethereum) 블록체인을 사용하였습니다.

 

 

 

 

이 공모전에서 

 

javascript의 web3 API를 사용하여 에서 사용하였고,

 

java에서는 Json rpc로 블록체인에 접근, 사용하였습니다.

 

 

 

 

추후, 이더리움 프라이빗 블록체인 멀티노드 구성 및 

 

웹과 java에서 사용한 것은 추가적으로 올리겠습니다.

 

+ Recent posts