제네시스 블록

블록체인의 시작

 

 

 

 

 

 

 

제네시스 블록

 

블록체인 네트워크의

 

"첫번째" 블록이며 

 

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

 

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

 

 

 

 

 

 

그러므로,

 

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

 

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

 

특히나 이 제네시스 파일의

 

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 

 

위 사이트에 들어가시면

 

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

 

 

 

 

 

 

 

 

 

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

윈도우에서 리눅스 실행하기

 

 

 

리눅스 OS에서 geth를 설치하려고 합니다.

 

 

 

리눅스 OS를 사용하기 위해서는 윈도우 OS를 삭제하고 리눅스 OS를 새로 설치하거나

 

멀티부팅을 사용해서 두가지 OS를 사용하는 방법,

 

이 방법 말고 윈도우에서 가상의 컴퓨터를 하나 만들어 리눅스 OS를 설치하여

 

리눅스를 사용하는 방법이 있습니다.

 

 

저희는 가상의 컴퓨터를 사용하여 리눅스를 설치하겠습니다.

 

 

 

 

위 사진에 적혀있는 Oracle사의 Virtualbox 라는 도구를 사용할겁니다.

 

 

 

 

 

1) https://www.virtualbox.org 로 접속을 하여 먼저 virtualbox를 설치합니다.

 

 

 

 

 

 

2. http://releases.ubuntu.com/16.04 로 접속을 하여 iso파일을 설치합니다.

 

desktop   = GUI         /        server     = terminal

amd64    = 64bit        /        i386       = 32bit

 

저는 server-amd64.iso를 설치했습니다.

 

 

 

 

 

 

 

 

3. virtualbox를 실행해 줍니다.

 

 

 

1) 새로만들기

2) 이름 : 만들 컴퓨터의 이름 (아무거나 상관 없습니다)

3) 종류 : linux 

4) 버전 : ubuntu (64-bit)      

    * 만약 iso파일을 i386으로 설치 하였을 시, ubuntu (32-bit)로 해주셔야 합니다.

 

계~속 다음을 눌러 주면 이와같이 생성 된 것을 볼 수 있습니다.

 

 

 

 

 

 

 

 

4. 더블클릭하여 실행 합니다.

 

 

그 후 동그라미 친 폴더 그림을 클릭하여 ubuntu-*.iso 파일을 선택하고

 

시작을 눌러줍니다.

 

 

 

 

     5. 아래와 같은 창이 뜰텐데 이제부터 빠르게 말로 하며 넘어가겠습니다.

         * 빨간글씨만 보셔도 무방합니다.

 

 

 

 

 

위의 창 부터 시작

 

 

 

English 

Install Ubuntu Server

English - English

United States             --> 나중에 자동으로 한국을 잡아줍니다.

No

English (US)

English (US)

 

 

 

 

여기까지 하면 아마 이러한 로딩창이 뜰겁니다

 

 

 

 

 

 

- 로딩이 다 끝나면 hostname과 usernamepassword를 적으라 하는데

 

  원하시는 것을 적어주시면 됩니다.

 

- (password를 짧게하면 use week password? 라며 짧은 비밀번호를 사용할 지 되묻습니다.)

 

- Encrypt your home directory? 

-> 암호를 걸지 말지에 대한 질문인데 No를 해주시면 됩니다.

 

 

 

 

 

그 후 , 아래와 같은 로딩창이 한번 더 뜨게 됩니다.

 

 

 

 

 

 

아까 설정했던 United States가 상관없는게, 여기서 자동으로 Asia/Seoul로 잡아주게 됩니다.

 

 

 

yes를 눌러주시고,

 

로딩창이 또 뜹니다.

 

뒤에 나오는 2번의 선택 창에서 기본으로 설정된대로 2번의 엔터를 더 해주시고

 

 

 

이 화면이 나오면 Yes를 선택해 주시면 됩니다.

 

 

 

 

 

 

다음 이 가상의 컴퓨터에 할당 해 줄 용량을 선택해주게 되는데, 큰 작업을 하지 않으니

 

있는 그대로 Continue를 해주시면 됩니다.

 

 

 

 

 

 

여기서도 Yes를 눌러주시면 로딩창이 뜨게됩니다.

 

 

 

 

 

 

 

 

 

아무것도 기입하지 않고 Continue를 해주시면 됩니다.

 

로딩창이 또 지나가게 되고,

 

뒤에 나오는 모든 것들에게 엔터를 해 줍니다.

 

 

 

 

 

 

 

이창에서도 Yes를 해주시고,

 

로딩 후, 마지막으로 나오는 화면에서 엔터를 눌러주시면 

 

 

 

 

 

 

 

 

이런 화면을 거쳐

 

 

 

 

 

 

 

표시 해 둔곳에 아까 설정한 login과 password를 입력하시고 

 

위와 같은 출력문들이 나오면 성공한겁니다.

 

 

 

 

 

다음번엔 바로 go언어 및 geth 설치 , 구축을 진행하겠습니다

 

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

 

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

 

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

 

 

 

 

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

 

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

 

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

 

 

 

 

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

 

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

 

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

 

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

 

 

 

 

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

 

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

 

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

 

 

 

 

이 공모전에서 

 

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

 

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

 

 

 

 

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

 

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

 

+ Recent posts