이더리움 Dapp 개발 - 2. 사설 네트워크 실행과 채굴하기

    이전 포스팅에서는 Geth(Go-Ethereum)를 설치 하고, 실행하는 것까지 해보았습니다. Geth를 실행하면, 이더리움(Ethereum)의 공용 네트워크(Public Network)에 들어가게 되는데 지금 우리가 해야 할 것은 Dapp(Decentralized Application)을 만드는 것이기 때문에, Private Network 즉, 테스트용 개인 네트워크를 만들어서 이더리움에 대해서 습득하고, 채굴이 어떤식으로 돌아가고 있는지를 익혀보도록 하겠습니다.


    Geth를 실행할 때, 다양한 파라미터(옵션)들이 존재하는데 필요한 옵션들을 익혀야 우리가 원하는 형태로 클라이언트를 구동 시킬 수 있습니다. 옵션을 어떻게 주느냐에 따라서 공용 네트워크에 들어갈 수도 있고, 사설 네트워크를 만들수도 있습니다.




    사설 네트워크 설정


    사설 네트워크를 구축하기 위해서, 몇가지 준비물들이 있습니다. 첫번째는 Genesis 블록에 대한 정보가 담겨진 JSON 파일, 그리고 Geth 옵션들의 이해 정도라고 하면 되겠네요. Genesis블록을 일일히 타이핑하는건 매우 비효율적이기 때문에, 아래 텍스트를 복사해서 genesis.json 이라는 파일을 만드시거나, 링크에 있는 파일을 다운로드 하여, 사용하셔도 됩니다.


    genesis.json


    {

        "config": {

            "chainId": 15,

            "homesteadBlock": 0,

            "eip155Block": 0,

            "eip158Block": 0

        },

        "nonce": "0x0000000000000042",

        "timestamp": "0x00",

        "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",

        "extraData": "0x00",

        "gasLimit": "0x800000",

        "difficulty": "0x400",

        "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",

        "coinbase": "0x3333333333333333333333333333333333333333",

        "alloc": {}

    }


    우선 사설 네트워크를 실행하기 위해서, 옵션들을 어느정도 이해를 하셔야 됩니다. 




    중요한 옵션에 대해서 정리를 해본 그림입니다. 여기서 사용할 옵션들을 정리한 것으로, 더 많은 것을 알고 싶으시면, https://github.com/ethereum/go-ethereum/wiki/Command-Line-Options 에서 자세히 나와 있습니다. 일단 표에 적은 옵션 기반으로 geth를 기동 시키며, 해당 옵션에는 "--"을 붙여야 옵션이 실행됩니다.



    private_start.bat


    geth --nodiscover --identity "etherPrivate" --datadir "c:\ether\data" --port "30303" --rpc --rpcaddr 0.0.0.0 --rpcport "8545" --rpccorsdomain "*"  --networkid 1980 --rpcapi "admin,db,eth,net,web3,debug,miner,shh,txpool,personal" console


    위는 옵션들을 이용한 실행 배치 내용입니다. 저는 private_start.bat 파일을 만들어서 사용하고 있는데 링크에 있는 파일을 다운로드 받으셔서 사용하셔도 됩니다. 



    계좌 생성


    이제 계좌를 생성해보도록 하겠습니다. 계좌를 생성하는 방법은 2가지가 존재하는데

    1. 사설 네트워크를 실행하기 전, geth 명령어로 계정을 생성하는 방법
    2. 사설 네트워크에 접속 후, console 창에서 계정을 생성하는 방법
    위 2가지가 존재합니다. 우선, 사설 네트워크를 실행하기 전 계좌를 생성해보도록 하겠습니다.

    1
    2
    3
    4
    5
    6
    7
    8
    C:\>geth --datadir "c:\ether\data" account new
    INFO [08-01|16:21:11.022] Maximum peer count                       ETH=25 LES=0 total=25
    Your new account is locked with a password. Please give a password. Do not forget this password.
    Passphrase:
    Repeat passphrase:
    Address: {c67cb7f861e51ecc7d2d17c67f1e66666f539b78}
     
    C:\>
    cs

    geth --datadir "저장경로" account new


    저는 저장경로를 c:\ether\data로 설정을 하였는데, 편하시는 경로로 설정을 하시면 되겠습니다. 명령어를 입력하면 계정의 비밀번호를 입력하라고 나오는데 원하는 비밀번호를 입력하면, 계정 주소가 생성이 됩니다. 화면에서 보는 것처럼 저한테 생성된 계좌 주소는 "c67cb7f861e51ecc7d2d17c67f1e66666f539b78" 입니다.



    계좌가 생성되면, 위 스샷처럼 폴더가 생성이 된 것을 볼 수 있습니다. "C:\ether\data\keystore" 폴더에는 날짜값과 계좌값으로 구성이 된 파일이 존재하게 됩니다. 해당 파일을 열어보게 된다면 계좌정보에 대한 JSON구조의 값이 들어가 있습니다.


    UTC--2018-08-01T07-22-51.445000000Z--c67cb7f861e51ecc7d2d17c67f1e66666f539b78

    {

    "address":"c67cb7f861e51ecc7d2d17c67f1e66666f539b78",

    "crypto":{

    "cipher":"aes-128-ctr",

    "ciphertext":"6d702793c8da3b431e84be320802baec1b218ea13e557a2d4f129f06d95fa912",

    "cipherparams":{"iv":"b740ee6eb72d2ef965e20e791edf4820"},

    "kdf":"scrypt",

    "kdfparams":{

    "dklen":32,

    "n":262144,

    "p":1,

    "r":8,

    "salt":"d0989d58e78f939f9058d80025fd857b08bbe6d10837ac37e3ef51be77ef0161"

    },

    "mac":"a23a5c45189a385f24534fc3b27f2914e98f77d8ed9654af27a6acec4a40d639"

    },

    "id":"ef54d67c-3453-4d87-ac44-84dcd6bcd686",

    "version":3

    }



    최초 블록(Genesis Block) 생성


    네트워크를 구동하기 전에 최초 블록인 Genesis Block을 생성해야 합니다. 처음 준비과정에 만든 genesis.json 파일을 "c:\ether" 파일에 복사를 합니다.



    복사가 완료되면, 아래 명령어를 입력해서, c:\ether\data 폴더에 genesis 블록을 생성합니다.


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    C:\>geth --datadir "c:\ether\data" init "c:\ether\genesis.json"
    INFO [08-01|16:51:09.486] Maximum peer count                       ETH=25 LES=0
    total=25
    INFO [08-01|16:51:09.611] Allocated cache and file handles         database=c:\\
    ether\\data\\geth\\chaindata cache=16 handles=16
    INFO [08-01|16:51:09.632] Writing custom genesis block
    INFO [08-01|16:51:09.637] Persisted trie from memory database      nodes=0 size=
    0.00B time=0s gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B
    INFO [08-01|16:51:09.646] Successfully wrote genesis state         database=chai
    ndata                        hash=a13c0c…c8e2d7
    INFO [08-01|16:51:09.654] Allocated cache and file handles         database=c:\\
    ether\\data\\geth\\lightchaindata cache=16 handles=16
    INFO [08-01|16:51:09.673] Writing custom genesis block
    INFO [08-01|16:51:09.676] Persisted trie from memory database      nodes=0 size=
    0.00B time=0s gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B
    INFO [08-01|16:51:09.685] Successfully wrote genesis state         database=ligh
    tchaindata                        hash=a13c0c…c8e2d7
     
    C:\>
    cs


    위와 같은 메세지가 출력이 되었다면, data 폴더에 블록정보가 저장이 된 것을 확인할 수 있습니다.





    사설 네트워크 구동


    모든 준비가 완료되었다면, private_start.bat를 실행하거나, 직접 명령어를 입력하여(윗 내용 복사) 사설 네트워크를 실행합니다. 




    채굴 해보기


    사설 네트워크가 실행이 되었다면, 이제 채굴을 진행해보도록 합니다. 

    console창에서 miner.start()를 입력합니다.


    정상적으로 채굴이 되고 있는 화면


    채굴 중단을 원하면, miner.stop()을 입력합니다. 윈도우 콘솔창에는 miner.stop()을 입력하는 것과 동시에 채굴 화면이 화면위로 밀려가지만, 무시하고 명령어를 입력합니다.


    붉은색 네모에 있는 부분처럼, 명령어와 함께 콘솔 내용이 겹쳐서 이상하게 보입니다.


    참고로 마이닝을 진행하실 때, miner.start(thread개수) 이기 때문에, miner.start(1) 이런식으로 하면, 적은 스레드로 채굴을 진행하게 됩니다. 컴퓨터에 부하가 있으시다면, miner.start(1)로 명령어를 실행하는 것을 권유드립니다.



    계좌 잔고 확인


    이더리움을 정상적으로 채굴하고 있는지 확인하기 위해, 잔고를 확인해보도록 하겠습니다.


    eth.getBalance(eth.accounts[0])

    eth.getBalance("주소직접입력")


    처음 생성된 계좌는 0번이고, 그 다음부터 생성되는 계좌는 +1씩 올라가게 됩니다. 계좌를 사설 네트워크 실행전에 만든것 하나 밖에 없기 때문에 1번을 입력하게 되면 없는 계좌이기에, 아래와 같이 에러메세지를 출력하게 됩니다.


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    > eth.getBalance(eth.accounts[0])
    645000000000000000000
    > eth.getBalance(eth.accounts[1])
    Error: invalid address
        at web3.js:3930:15
        at web3.js:5025:28
        at map (<native code>)
        at web3.js:5024:12
        at web3.js:5050:18
        at web3.js:5075:23
        at <anonymous>:1:1
    cs

    계좌 카운트를 입력하는 방법도 있으나, 계좌 주소를 직접 입력해서 잔고를 확인하는 방법도 존재합니다.


    1
    2
    3
    > eth.getBalance("0xc67cb7f861e51ecc7d2d17c67f1e66666f539b78")
    645000000000000000000
    >
    cs

    계좌 주소를 입력할 때는 꼭 쌍따옴표(더블 쿼테이션)을 입력해야 합니다. 이더리움 보유수량이 너무 많이 나오는 이유는 Wei라는 단위로 출력하기 때문에 많아 보이는 것인데 메소드를 사용해서, ether로 변환하여 다시 출력해보도록 하겠습니다. 참고로 이더리움은 여러가지 단위(Unit)가 있습니다.(아래 그림 확인)


    이더리움 단위, http://ethdocs.org/en/latest/ether.html


    web3.fromWei(eth.getBalance(eth.accounts[0]), "ether")


    1
    2
    3
    > web3.fromWei(eth.getBalance(eth.accounts[0]), "ether")
    645
    >
    cs


    Wei를 Ether 단위로 변환을 하니 645개의 이더수량으로 보입니다. 채굴해서 늘어나는 것이 맞는지 확인하기 위해 다시 miner.start(1)로 마이닝을 수행해보겠습니다.



    채굴이 어느정도 진행이 된 후, 다시 수량을 확인해보니 645 -> 705로 이더 보유량이 늘어난 것을 확인할 수 있습니다. 다음에는 Mist 브라우저를 통한 계좌 생성 및 이더리움 이체 등의 정보를 포스팅 하도록 하겠습니다.



    동영상으로 따라하기


    위의 내용을 동영상으로 찍어보았습니다. 최대한 자세히 적었다고 생각하지만, 잘 안되시는 분들은 동영상의 내용을 그대로 따라해보세요.





    댓글

    Designed by JB FACTORY