본문 바로가기
Ethereum/부동산 Dapp

부동산Dapp_(1)Genesis Block 생성 및 Node 초기화

by rooney-l3 2019. 8. 22.

[STEP 1]

1.  window Powershell 을 사용해서 GenesisBlock을 생성합니다. (윈도우키 + R 누른후 Powershell입력후 실행)

 

2. 새로운 디랙토리를 만든 후 만든 디렉토리 안에서 작업을 진행합니다. 저는 Blockchain이라는 디렉토리를 만들어서 실습을 진행하였습니다. 

 

3. puppeth을 입력하여 GenesisBlock을 생성하도록 합니다.  puppeth는 geth를 설치할때 같이 설치되는 tool입니다. 이를 이용하여 간편하게 GenesisBlock을 생성할 수 있습니다.

 

 

[STEP 2]

 

1. Please specify a network name to administer

  - 네트워크 이름을 입력합니다.  공백 또는 대문자는 입력이되지 않으니 주의하도록 합니다. 

 

2. What would you like to do?

  - puppeth에서 제공하는 기능 중 어느 기능을 사용할지 선택해줍니다. 우리는 genesisBlock을 생성할 것이므로 2번을 선택하도록 합니다. 

 

3. Which consensus engine to use? 

  - 어떤 합의 알고리즘을 사용할지 선택합니다. 우리는 ethereum을 사용할 것이므로 PoW(작업증명)을 선택합니다. 

 

4. Which accounts should be a pre-funded?

  -  어떤 계정에 미리 금액을 지불할지 선택합니다. 아무것도 입력하지 않고 넘어가도록 합니다. 

 

5. Specify your chain/network ID if you want an explicit one

  - 계정 ID를 입력해줍니다.

   -네트워크 ID 는 1(메인네트워크), 2(모던 테스트 네크워크 , 현재 안씀), 3(Ropsten 테스트 네트워크), 4(Rinkeby 테스트 네트워크), 42(Kovan 테스트 네트워크) 를 사용할 수 없습니다. 이 5가지를 제외한 아무 숫자나 입력해주면 됩니다. 우리는 7306이라는 ID를 부여하여 진행해보도록 하겠습니다. 

 

6. What would you like to do?

  -  두번 다 2번을 선택해 주도록 합니다. 

 

7. Exported existing genesis block 이르는 문구가 보이면 정상적으로 genesis block이 생성 된것입니다. 

 

8. 앞서 만든 Blockchain 디렉토리에 들어가서  mynetwork.json이 생성되었는지 확인해 봅니다. 

 

 

[STEP 3]

 

 

1. mynetwork.json 파일을 열어 내용을 확인해봅니다. powersell 에서 code mynetwork.json이라고 명령어를 입력하면 열리게 됩니다. (VSC가 설치되어있어야 합니다.)

 

2. 각 요소들에 대해 간단하게 살펴봅니다. 

 - chainId : 우리가 genesis block생성시 입력했던 networkId가 입력되어있습니다. 

 - ethash :  PoW를 합의 알고리즘으로 선택한것을 확인 할 수 있습니다. 

 - timestamp : 이더리움 네트워크에서 블록생성의 난이도를 조절하는데 사용됩니다. 연속되는 블록들의 timestamp 차이가 작으면 난이도는 올라가게 됩니다. 반대로 차이가 크게되면 난이도는 내려가게 됩니다. 

 - gasLimit : 블록내의 transaction이 소비할 수 있느 최대 가스값입니다. 각 블록마다 transaction을 몇개나 처리할것인가 제한을 두어 블록사이즈를 조절 할 수 있습니다. 

 - difficulty : 블록의 유효성을 검사할 때 쓰이는 난이도를 말합니다. 

 - alloc : 어떤 지갑주소에 미리 자금을 할 당 할때 씁니다. 

 - number : 블록번호입니다. genesis블록은 '0'번입니다. 

 - gasused : 블록내에서 여러 transaction 을 처리하면서 소모한 가스값의 총합 입니다. 

 - parentHash : 부모 블록의 해쉬 정보를 담고 있습니다. genesis블록은 부모 블록이 없으므로 '0'입니다. 

 

[STEP 4]

 

1. mynetwork.json 파일이 genesisblock임을 명시합니다.

 

 

2. genesis block을 명시하면 geth 디렉토리와 keystore 디렉토리가 생성됩니다. geth 디렉토리에는 모든 체인에 관한 데이터가 저장됩니다. keystore 디렉토리에는 앞으로 우리가 만들 계정들을 저장할 공간으로 사용됩니다.

 

[STEP 5]

1. 계정을 생성해줍니다. 비밀번호는 간단하게 abcd로 입력하였습니다. 

2. 계정 생성 후 keystore 디렉토리에 들어가면 계정이 3개 생성된것을 확인 할 수 있습니다. 

 

 

3. 위와 같은 명령어를 입력하면 계정이 생성된 순서대로 확인 할 수 있습니다. 참고로 0번째 계정에 모든 채굴보상이 들어가게 됩니다. 

 

[STEP 6]

 

nodestart.cmd
password.sec

1. node를 초기화 하기 위해여 nodestart.cmd 파일과 password.sec 파일을 Blockchain디렉토리에 만들어주도록 합니다.

2. nodestart.cmd에 입력하는 파라디터들에대해 간략하게 살펴보도록 하겠습니다. 

 - geth : geth로 실행시킨다는 명령어 입니다. 

 - mine : 이 노드에서 채굴을 시작하겠다는 파라미터 입니다. 

 - minerthreads : 몇개의 thread에서 채굴을 할것인지 정해주는 파라미터 입니다. 내 컴퓨터의 코어 갯수에 맞게 설정하는것이 좋습니다. 

  - datadir : 어느 디렉토리에 체인파일을 저장할것인지 정해주는 파라미터 입니다. 

  - nodiscover : 탐색프로토콜을 해지하는 파라미터입니다. 다른 노드가 우리 체인에 연결하지 못하게 합니다. 테스트 할때 붙이는 파라이터입니다. 

  - rpc : rpc엔드포인트를 설정하는 파라미터 입니다. 나중에 메타마스트등에서 접속가능하게 하기위해 설정해 줍니다. 

  - rpcport : 어떤 포트에 접속해야 하는지 설정하는 파라미터입니다. 

  - rpccorsdomain "*" --nat "any" : 아무 도메인에서나 우리 rpc 엔트포인트에 접속할 수 있도록 하는 파라미터입니다.

  - rpcapi : 명시한 api들을 라이브러리처럼 사용가능하게 해주는 파라미터 입니다. 

  - unlock 0 : 첫번째 계정이 보상을 받기 위해서 unlock되어야하기 때문에 설정해주는 파라미터 입니다. 

  - password : 첫번째 계정의 비밀번호가 저장된 password.sec파일의 위치를 설정해주는 파라미터 입니다. 

 

[STEP 7]

1. nodestart.cmd 파일을 실행시키면 노드가 초기화되며 DAG파일을 내려받게 됩니다. DAG는 방향성 비순환 그래프로 에타쉬 채굴 알고리즘에서 필요로 하는 데이터 구조입니다. 노드를 맨처음 실행했을때 DAG파일을 먼저 생성하게 됩니다. 노드가 채굴을 하기 위해서 이 DAG파일이 먼저 생성되어야합니다. 

DAG파일 생성
DAG파일 생성
DAG파일 생성 완료

2. Ethash 디렉토리에 들어가면 DAG파일이 받아진것을 확인 할 수 있습니다. 

 

[STEP 8]

1. nodestart.cmd 파일을 실행시킨 powersell을 켜둔채로 새로운 powersell을 열어 geth attach ipc:\\.\pipe\geth.ipc 명령어를 입력합니다. 입력하면 아래 사진과 같이 JavaScript console이 열리게 됩니다. 앞선 nodestart.cmd파일에서 우리가 rpcapi 파라미터에 추가한 eth, personal, web3 를 해당 콘솔에서 라이브러리처럼 사용할 수 있습니다. 

 

2. miner.stop() 명령어를 입력해여 현재 진행중인 채굴을 중지시킬 수 있습니다.

 

3. miner.start() 명령어를 입력하여 다시 채굴을 시작 할 수 있습니다. 괄호안의 숫자는 몇개의 Thread에서 채굴 할 것인지 명시하는것 입니다. 

 

4. eth.coinbase 명령어를 입력하여 채굴시 보상을 받게되는 계정을 확인 할 수 있습니다.  

 

5. eth.accounts 명령어를 입력하여 현재 노드에 생성된 계정을 모두 확인할 수 있습니다. 

 

6. eth.getBalance(계정주소)를 입력하여 해당계정의 잔고를 확인 할 수 있습니다. 잔고 확인시 Wei단위로 계정 잔고를 확인 할 수 있습니다. 만약 ether로 계정 잔고를 확인하고 싶은 경우 web3.fromWei(eth.getBalance(eth.coinbase), "ether") 명령어를 입력하면 ether로 계정 잔고를 확인 가능합니다. 

 

7. 계정간의 ether를 송금 할 수 있습니다. 

 

 

 

블록체인 공부중에 있습니다. 잘못된 정보가 있으면 댓글로 남겨주세요. 한번 더 배우겠습니다. 

감사합니다. 

댓글