×
Crocus
공부한 내용을 정리하는 블로그로 시작한
Crocus는 2014년 1월 14일 부터 시작하여
현재 월 6만명, 총 1,499,763명의 방문자 수를 기록하고 있습니다.
Donation
이제 많은 사용자들이 이용하는 만큼
더 다양한 서비스 개발/제공을 위해 후원금을 모금하고자 합니다.
후원을 해주시는 분들은 Donators 명단에 성명, 후원금을 기입해드리며
Crocus 블로그가 아닌 다른 곳에 정리해둔 저만의 내용을 공유해 드리고자 합니다.
Account
예금주 : 고관우
신한은행 : 110-334-866541
카카오뱅크 : 3333-01-7888060

👉 후원 페이지 바로가기 Donators
익명 : 5000원(Crocus응원합니다.)
busyhuman: 5000원(유용한 지식 감사합니다.)
익명 : 5000원(알고리즘 학습러)

이더리움 코어를 이용하여 퍼블릭 블록체인을 형성해보고자 한다.


이때 공부해보며 느낀 것은 퍼블릭 블록체인과 프라이빗 블록체인은 개념의 차이일 뿐 


블록체인 네트워크 주소를 숨기면 프라이빗이 되고, 네트워크 주소를 사람들에게 공개하면 퍼블릭이 되는 것 같다.


우선 geth와 mist가 설치되어있다는 가정하에 시작하려 한다.




geth를 이용하여 퍼블릭 네트워크(블록체인) 구동



우선 블록체인 파일을 구성할 디렉토리를 설정한다.


필자는 바탕화면에 Ethereum이라는 파일을 만들었고 경로는 C:\Users\kkw56\Desktop\Ethereum와 같다.



genesis.json파일을 적당한 위치에 만들어둔다. 이 json 파일은 제네시스 블록을 만드는데 이용된다.



genesis.json


genesis 블록의 json파일은 위의 파일과 같고 아래 내용으로 이루어져 있다.


{

"config": {

        "chainId": 40039298,

        "homesteadBlock": 0,

        "eip155Block": 0,

        "eip158Block": 0

          },

"difficulty" : "0x20000",

"gasLimit"   : "0x2fefd8",

"alloc"      : {},

"coinbase"   : "0x0000000000000000000000000000000000000000",

"extraData"  : "",

"nonce"      : "0x0000000000000042",

"mixhash"    : "0x0000000000000000000000000000000000000000000000000000000000000000",

"parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",

"timestamp"  : "0x00"

}



그 후 cd 명령어를 통해 해당 디렉토리로 이동하고 geth가 존재하는 디렉토리를 복사해둔 뒤 다음과 같은 명령어를 입력한다.


D:\Geth\geth --datadir private-network init genesis.json


필자의 Geth는 d:\Geth에 있기에 경로를 저렇게 지정했는데 이 글을 보는 분들의 Geth경로를 설정해주면 되고 그 뒤로 geth --datadir~~부터는 위의 내용대로 적어주면 된다.


이때 private-network도 폴더명으로 생성되기에 원하는 이름으로 설정해도 된다.


그리고 genesis.json 파일이 존재하는 경로를 설정해주어야 한다.(필자는 Geth에 있기에 그대로 상대경로를 이용했다.)




그 후 cd를 통해 이동하고 해당 위치에서 다음과 같이 명령어를 입력한다.


d:\Geth\geth --datadir private-network --networkid 40039298 console


이때 networkid는 genesis.json의 neworkid와 같아야하고 필자는 40039298이라는 숫자를 이용했다.


(0~15정도까지는 많은 사람들이 쓰는 networkid이므로 피해야 한다. 네트워크 아이디를 저렇게 설정하면 블록 싱크를 맞추기 위해 대량의 파일을 다운받기 시작한다. 그리고 이때 0번은 이더리움 메인넷으로 알고 있다.)


그리고 console라는 의미는 이 터미널에서 자바스크립트 콘솔을 이용하겠다는 의미가 된다.


마지막으로 Welcome to the Geth JavaScript console!가 나타나면 우리는 이제 퍼블릭 네트워크(블록체인)를 geth를 통해 형성하게 된 것이다.





이번에는 콘솔에 personal.newAccount()를 입력하고 비밀번호를 입력해보면 다음과 같이 Public Key가 나타난다.


필자는 1234라는 비밀번호를 이용하여 생성하였다. 추후 keystore라는 폴더에 저장된 파일이 Private Key가 된다.





이제 현재 내가 만든 퍼블릭 블록체인 내에서 채굴을 하기위해 miner.start(1)을 입력한다.


이때 miner.start(숫자)에서 숫자는 채굴에 이용될 스레드 개수이다. 채굴을 멈추기 위해서는 miner.stop()를 이용하자.


그리고 eth.blockNumber를 입력하면 현재 채굴된 블록의 개수를 알 수 있다.





mist를 이용하여 geth와 연동


geth의 사용법은 이제 그만하고 mist를 어떻게 쓰는지 살펴보자.

우선 새로운 터미널을 열어뒀는데 이전에 아까 Welcome to the Geth JavaScript console!가 나타난 부분의 url=~~~이부분의 값을 복사해두자.


즉, \\\\.\\pipe\\geth.ipc를 복사해야하는데 이때 //./pipe/geth.ipc로 변형해서 복사해야한다.


그 이유는 c언어를 배우면 printf를 통해 \를 출력하려면 \\로 입력해야했듯이 여기서도 콘솔에 출력하기위해 \\로 적어두었는 것이다.


위의 내용을 이해하지 못했더라도 \\대신 /로 치환하면 된다는 것이다.





이제 새로운 터미널을 열어 다음과 같이 명령어를 입력한다.


d:\Mist\Mist\mist --rpc //./pipe/geth.ipc


이때 필자의 mist가 설치된 부분의 경로가 d:\Mist\Mist\이기에 위와같이 하였고 사용자의 mist가 설치된 경로를 이용하면 된다.


이때 rpc를 이용하여 geth와 mist를 연결해주는 역할을 한다.






이렇게 위의 명령어를 치고 나면 mist와 연동되어 계정이 갱신되어 있음을 알 수 있게 된다.


이제 이를통해 GUI로 다양한 송금, 컨트랙트 추가, 사용 등등을 진행 할 수 있다.



컨트랙트



mist에서 컨트랙트 탭으로 이동하여 신규 컨트랙트 설치 버튼을 누른다.


 


자신이 만든 솔리디티 코드를 입력한 후 설치한 컨트랙트를 선택해준다(컨트랙트 명으로 되어있다.)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
pragma solidity ^0.4.19;
 
contract TimeUintSample{
 
    uint public startTime;
 
    function start() public {
        startTime = now;
        startTime = block.timestamp;
    }
    
    function minutesAfter(uint min) public view returns (bool){
        if(startTime == 0)
            return false;
 
        return ((now - startTime) / 1 minutes >= min);
    }
    
    function getSeconds() public view  returns (uint){
        require(startTime > 0);
 
        return (now - startTime);
    }
}
cs


이때 필자가 심은 코드는 위와 같으며 now(현재시간)으로부터 내가 컨트랙트를 만든 시간이 몇분 지났는지 확인해보는 컨트랙트이다.






해당 어카운트의 비밀번호를 입력해주고 SEND TRANSACTION을 선택한다.




이제 아까전의 geth 콘솔로 넘어와서 miner.start(1)를 해준다.

그리고 채굴이 되면 miner.stop()를 해준다.




위의 화면을 보면 컨트랙트가 승인받았음을 알 수 있다.


보통 이더리움 네트워크에서는 12컨펌이 되어야 절대적으로 안전한 트랜잭션이라 판단하기에 mist에 생성된 컨트랙트의 승인 과정을 보면 12승인까지 받도록 되어있다.


현재 우리가 만드는 네트워크는 프라이빗이므로 2컨펌만 나도 안전하다 가정하고 진행해도 무방하다.





이제 다시 컨트랙트로 들어와 우리가 방금 생성한 컨트랙트를 클릭한다.







현재 위의 코드에서 실행가능한 함수는 start밖에 없으므로 start를 선택하고 실행을 한 후 위의 그림처럼 비밀번호를 입력 후 트랜잭션을 보낸다.


현재 그림은 컨트랙트에 트랜잭션을 보내는 과정이 된다.





이제 miner.start(1)을 geth 콘솔에서 다시 실행시키면 mist의 화면에서 Get seconds가 늘어남을 알 수 있다.




최종적으로 1분이 지났을때 1을 입력하면 yes가 나타남도 파악 할 수 있다.