private network를 구동시키기 전에 준비해야 할 것이 두 가지가 있습니다. 첫 번째는 private network에서 사용할 계좌이고 두 번째는 제네시스 블록 정보입니다. geth를 사용해서 새로운 계좌를 생성해보도록 하겠습니다
<h2>1. 계좌 생성하기 <p dir="auto">geth --datadir “./data” account new <p dir="auto">--datadir 옵션은 network가 구동될 때 블록정보, 계좌정보를 저장할 폴더를 지정하는 옵션입니다. (사용하려는 폴더 생성해서 지정하면 됩니다. 지정하지 않을 때에는 default로 $HOME/.ethereum 폴더에 저장됩니다.) <p dir="auto">--datadir “./data” 의미는 data폴더에 network에서 구동하는 정보를 저장해라라는 의미입니다. <p dir="auto">account new 는 새로운 계좌를 생성하라는 의미입니다. <p dir="auto">geth 명령어의 구조는 아래와 같이 구성되어 있으며 geth help로 확인할 수 있고<br /><span> <a href="https://github.com/ethereum/go-ethereum/wiki/Command-Line-Options" target="_blank" rel="nofollow noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">https://github.com/ethereum/go-ethereum/wiki/Command-Line-Options 해당 위키에 가면 확인할 수 있습니다. <pre><code>geth [options] command [command options] [arguments...] <p dir="auto">계좌 생성명령어를 치면 계좌의 비밀번호를 설정을 묻는 문구가 나오고 비밀번호를 입력하면 생성된 계좌주소를 보여줍니다. --datadir 옵션에 설정한 폴더를 들여다보면 생성된 계좌주소를 확인할 수 있습니다. <p dir="auto"><img src="https://images.hive.blog/768x0/https://ipfs.busy.org/ipfs/QmWcvxq6h5kCre7YUSmvSr6erRxCuSrJCUNhkG4HzSwEMx" alt="01.png" srcset="https://images.hive.blog/768x0/https://ipfs.busy.org/ipfs/QmWcvxq6h5kCre7YUSmvSr6erRxCuSrJCUNhkG4HzSwEMx 1x, https://images.hive.blog/1536x0/https://ipfs.busy.org/ipfs/QmWcvxq6h5kCre7YUSmvSr6erRxCuSrJCUNhkG4HzSwEMx 2x" /> <p dir="auto">그냥 넘어가면 심심하니까 생성된 계좌주소 리스트로 출력하는 거 해보고 넘어가겠습니다. ㅋㅋㅋㅋㅋ <pre><code>geth --datadir “./data” account list <p dir="auto">생성된 계좌의 리스트가 출력됩니다. <p dir="auto"><img src="https://images.hive.blog/768x0/https://ipfs.busy.org/ipfs/QmQqvVvSN8eqKhKGeoHQJVmbf77zvdihNUvvnucZwhUTQL" alt="02.png" srcset="https://images.hive.blog/768x0/https://ipfs.busy.org/ipfs/QmQqvVvSN8eqKhKGeoHQJVmbf77zvdihNUvvnucZwhUTQL 1x, https://images.hive.blog/1536x0/https://ipfs.busy.org/ipfs/QmQqvVvSN8eqKhKGeoHQJVmbf77zvdihNUvvnucZwhUTQL 2x" /> <p dir="auto">account 관련 옵션은 아래 링크에서 확인할 수 있습니다.<br /><span> <a href="https://github.com/ethereum/go-ethereum/wiki/Managing-your-accounts" target="_blank" rel="nofollow noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">https://github.com/ethereum/go-ethereum/wiki/Managing-your-accounts <h2>2. 제네시스(Genesis) 블록 생성하기 <p dir="auto">private network를 구동하기 위해서는 첫 번째 블록을 생성해야 합니다. 이더리움에서는 json 파일 형태로 작성해서 geth를 이용해서 생성할 수 있습니다. <p dir="auto">제네시스 블록을 만들 때 필요한 json파일의 구성은 아래와 같습니다. <pre><code>{ "config": { "chainId": 15, "homesteadBlock": 0, "eip155Block": 0, "eip158Block": 0 }, "difficulty": "200000000", "gasLimit": "2100000", “coinbase”: "0x7df9a875a174b3bc565e6424a0050ebc1b2d1d82", "alloc": { "0x7df9a875a174b3bc565e6424a0050ebc1b2d1d82": { "balance": "1000000000000000000000000" }, } } <ol> <li><p dir="auto">config 는 생성할 private network의 버전을 정하는 설정입니다. chainId, homestreadBlock, eip155Block, eip518Block 속성 모두 이더리움 속성과 관련된 설정이며 chainId는 replay protection을 사용하는 설정입니다. homestead는 이더리움의 두 번째 메인 릴리즈를 사용하기 위해 설정하는 속성이고 0으로 설정하면 해당 릴리즈를 사용합니다. eip155은 gas 비용에 관련된 하드포커 설정이며 eip158은 state cleanig과 관련된 설정입니다. 관련 설정에 대해서 더 알고 싶으신 분은 아래 링크에서 확인해보세요~ (저도 아직 다..못 읽었다는 ^^;;)<br /><br /><span> eip155 - <a href="https://github.com/ethereum/EIPs/issues/150" target="_blank" rel="nofollow noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">https://github.com/ethereum/EIPs/issues/150<span> eip158 - <a href="https://github.com/ethereum/EIPs/issues/158" target="_blank" rel="nofollow noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">https://github.com/ethereum/EIPs/issues/158 <li><p dir="auto">difiiculty 는 이더리움에서 채굴의 난이도를 설정하는 옵션입니다. 난이도가 낮을 수록 채굴속도가 빨라집니다. <li><p dir="auto">gas limit은 한 블록이 담을 수 있는 gas의 수치를 말합니다. gas 수치가 높을 수록 한 블록이 담을 수 있는 거래가 많아집니다. 그러면 거래가 빨라지겠죵? <li><p dir="auto">coinbase는 network를 구동할 때 기본으로 사용할 계좌를 설정하는 옵션입니다. 채굴을 할 때 코인을 받을 계좌입니다. <li><p dir="auto">alloc는 private network를 구동할 때, 미리 계좌에 이더를 입금시킬지를 설정하는 옵션입니다. 설정하기 원하는 계좌와 이더 값을 명시합니다. 여기에 적는 이더금액은 wei 단위입니다. 10의 18승 wei는 1 ether입니다. (1 ether = 10^18 wei) <p dir="auto">자, private network genesis block을 생성해보겠습니다. <p dir="auto">geth --datadir “./data” init “./genesis.json”<br /> init 명령어와 genesis.json파일의 위치를 명시해주면 됩니다.<br /> 성공적으로 genesis block이 생성되면 아래와 같은 문구가 출력됩니다. <p dir="auto"><img src="https://images.hive.blog/768x0/https://ipfs.busy.org/ipfs/QmevC9mJDxztyABLpdggZnWjDmcJAudVnFAYuipZRq95jE" alt="03.png" srcset="https://images.hive.blog/768x0/https://ipfs.busy.org/ipfs/QmevC9mJDxztyABLpdggZnWjDmcJAudVnFAYuipZRq95jE 1x, https://images.hive.blog/1536x0/https://ipfs.busy.org/ipfs/QmevC9mJDxztyABLpdggZnWjDmcJAudVnFAYuipZRq95jE 2x" /> <h2>3. Private network 구동하기 <p dir="auto">첫 번째 블록을 만들었으니 이제 네트워크를 실행시켜 보겠습니다. private network를 구동할 때 유의해야할 옵션은 --networkid 입니다. networkid 를 1로 지정시 메인 이더리움에 연결이 됩니다. 2는 테스트 네트워크로 사용중입니다. 1과 2를 제외한 수를 지정해야 합니다. <p dir="auto">또한 --identity 옵션을 사용해서 네트워크에 이름을 지정할 수 있습니다. networkid와 identity는 node들간에 연결할 때 사용되는 옵션입니다. networkid와 identity가 같은 노드는 서로 연결할 수 있습니다. <p dir="auto">아래는 현재 사용되고 있는 network id 정보들입니다. <p dir="auto">0: Olympic, Ethereum public pre-release testnet<br /> 1: Frontier, Homestead, Metropolis, the Ethereum public main network<br /> 1: Classic, the (un)forked public Ethereum Classic main network, chain ID 61<br /> 1: Expanse, an alternative Ethereum implementation, chain ID 2<br /> 2: Morden, the public Ethereum testnet, now Ethereum Classic testnet<br /> 3: Ropsten, the public cross-client Ethereum testnet<br /> 4: Rinkeby, the public Geth PoA testnet<br /> 8: Ubiq, the public Gubiq main network with flux difficulty chain ID 8<br /> 42: Kovan, the public Parity PoA testnet<br /> 77: Sokol, the public POA Network testnet<br /> 99: Core, the public POA Network main network<br /> 7762959: Musicoin, the music blockchain<br /> [Other]: Could indicate that your connected to a local development test network. <p dir="auto">위의 networkid를 피해서 1988로 설정하고 identity는 “Mynetwork”를 사용하겠습니다. <p dir="auto">그리고 --mine 옵션을 설정해서 geth를 구동했을 때 채굴을 할 수 있게 합니다. --nodiscover 옵션을 사용해서 다른 노드를 찾는 설정을 끕니다. console 커맨드를 설정해서 geth 콘솔 환경에 접속하겠습니다. 실행할 명령어는 아래와 같습니다. <p dir="auto">geth --networkid 1988 --identity “Mynetwork” --datadir “./data” --nodiscover console <p dir="auto">아래와 같이 geth 콘솔창이 나오면 성공입니다 :) <p dir="auto"><img src="https://images.hive.blog/768x0/https://ipfs.busy.org/ipfs/QmYQqd3woVzNtSoK1AqjHQkA9wyer5ckuy7pLLxjgAVLNc" alt="04.png" srcset="https://images.hive.blog/768x0/https://ipfs.busy.org/ipfs/QmYQqd3woVzNtSoK1AqjHQkA9wyer5ckuy7pLLxjgAVLNc 1x, https://images.hive.blog/1536x0/https://ipfs.busy.org/ipfs/QmYQqd3woVzNtSoK1AqjHQkA9wyer5ckuy7pLLxjgAVLNc 2x" /> <p dir="auto">geth 콘솔에서 계좌 조회를 해보겠습니다.<br /> eth.accounts 를 입력합니다. 현재 생성되어 있는 계좌들이 출력됩니다. eth.accounts[0]과 같이 입력하면 해당 계좌 중 첫 번째로 생성된 계좌를 출력할 수 있습니다. 그리고 해당 계좌가 가지고 있는 이더 잔고 조회도 해보겠습니다. 잔고조회를 할 때는 eth.getBalance()함수를 사용하고 인자로 계좌주소를 적어줍니다. eth.getBalance("0x7df9a875a174b3bc565e6424a0050ebc1b2d1d82") 이런 식으로 사용할 수도 있고 eth.getBalance(eth.accounts[0]) 와 같이 사용할 수도 있습니다. <p dir="auto"><img src="https://images.hive.blog/768x0/https://ipfs.busy.org/ipfs/QmW5sz1ZAwuAP5WEphiJuacvam716TQF6DjkkyVc8773cc" alt="05.png" srcset="https://images.hive.blog/768x0/https://ipfs.busy.org/ipfs/QmW5sz1ZAwuAP5WEphiJuacvam716TQF6DjkkyVc8773cc 1x, https://images.hive.blog/1536x0/https://ipfs.busy.org/ipfs/QmW5sz1ZAwuAP5WEphiJuacvam716TQF6DjkkyVc8773cc 2x" /> <h3>3.1 geth 안에서 계좌 생성과 이더 전송하기 <p dir="auto">자 그럼 geth 콘솔안에서 계좌를 하나더 생성해보겠습니다. personal.newAccount()를 입력합니다. 그러면 비밀번호를 물어봅니다. 비밀번호를 설정하면 새로운 계좌가 짠~<br /> eth.accounts를 입력해보면 새롭게 생성된 계좌가 추가된 걸 확인할 수 있습니다. <p dir="auto"><img src="https://images.hive.blog/768x0/https://ipfs.busy.org/ipfs/QmR4j2UVQZ6ZJB6qTNYhvkpKjhRZvzXQ1Gm4BpD6fg8TWh" alt="06.png" srcset="https://images.hive.blog/768x0/https://ipfs.busy.org/ipfs/QmR4j2UVQZ6ZJB6qTNYhvkpKjhRZvzXQ1Gm4BpD6fg8TWh 1x, https://images.hive.blog/1536x0/https://ipfs.busy.org/ipfs/QmR4j2UVQZ6ZJB6qTNYhvkpKjhRZvzXQ1Gm4BpD6fg8TWh 2x" /> <p dir="auto">계좌가 두 개가 생겼으니 이더를 한 번 전송해보겠습니다. 첫 번째 계좌에서 두 번째 계좌로 100wei를 보내겠습니다. 이더를 전송하기 전에 반드시 해야하는 작업이 하나 있습니다. 이더를 전송하려는 계좌의 락을 풀어줘야 합니다!!!!!!!!!!!!!!!! 명심명심!!!!!!!!!!! <p dir="auto">personal.unlockAccount(eth.accounts[0])를 입력하고 비밀번호를 입력해서 락을 풀어줍니다.<br /> eth.sendTransaction({from: eth.accounts[0], to:eth.accounts[1], value:100}) 을 입력합니다. <p dir="auto"><img src="https://images.hive.blog/768x0/https://ipfs.busy.org/ipfs/QmQdFfErf7fpb7aFPvt2SC9F9PqNuKL25RujhEqsb968uo" alt="07.png" srcset="https://images.hive.blog/768x0/https://ipfs.busy.org/ipfs/QmQdFfErf7fpb7aFPvt2SC9F9PqNuKL25RujhEqsb968uo 1x, https://images.hive.blog/1536x0/https://ipfs.busy.org/ipfs/QmQdFfErf7fpb7aFPvt2SC9F9PqNuKL25RujhEqsb968uo 2x" /> <p dir="auto">전송을 하고 나서 잔고를 조회해보면 잔고에 변화가 없다는 걸 볼 수가 있습니다. 블록체인이니까 채굴이 되어야 위에서 발생된 거래가 적용됩니다. 채굴을 시작하겠습니다. <p dir="auto">miner.start()를 입력하면 채굴이 시작됩니다. 처음 채굴을 시작하면 DAG라고 하는 파일을 이더리움이 만들기 시작하는 데 이 과정이 조금 걸립니다. (아니 꽤 걸립니다) <p dir="auto"><img src="https://images.hive.blog/768x0/https://ipfs.busy.org/ipfs/QmSoBgo3jUdh34aM1tSPzzCZzGdQ2cWfh6xGDo2oBEk6N9" alt="08.png" srcset="https://images.hive.blog/768x0/https://ipfs.busy.org/ipfs/QmSoBgo3jUdh34aM1tSPzzCZzGdQ2cWfh6xGDo2oBEk6N9 1x, https://images.hive.blog/1536x0/https://ipfs.busy.org/ipfs/QmSoBgo3jUdh34aM1tSPzzCZzGdQ2cWfh6xGDo2oBEk6N9 2x" /> <p dir="auto">채굴이 시작되고 조금 시간이 지난 후에 minet.stop() 명령어를 사용해서 채굴을 멈추고 계좌조회를 해보면 위에서 입력한 거래가 성공적으로 반영된 것을 확인할 수 있습니다. <pre><code>eth.getBalance(eth.accounts[1]) <p dir="auto"><img src="https://images.hive.blog/768x0/https://ipfs.busy.org/ipfs/QmRECAMEJu6or76WF3DeC2mA7J9dQKSPKzM6hPfFfqf5v7" alt="09.png" srcset="https://images.hive.blog/768x0/https://ipfs.busy.org/ipfs/QmRECAMEJu6or76WF3DeC2mA7J9dQKSPKzM6hPfFfqf5v7 1x, https://images.hive.blog/1536x0/https://ipfs.busy.org/ipfs/QmRECAMEJu6or76WF3DeC2mA7J9dQKSPKzM6hPfFfqf5v7 2x" /> <p dir="auto">geth 콘솔에서 나올 때는 exit를 입력하면 됩니다. <p dir="auto">이 번편에서는 private network를 구동할 때 설정해야할 genesis 파일 설정 방법, network 구동에 관련된 geth 옵션과 geth 콘솔에서 이더 전송 법 등을 알아봤습니다. <p dir="auto">다음 편에서는 private network와 이더리움 클라이언트 앱들(mist, remix 등) 연결 방법과 사용법을 알아보겠습니다~~~
이벤트 참여 감사합니다ㅎㅎ
보팅 꾹 누르구 가용~^^
감사합니다 :)