블록체인2021. 7. 4. 13:35

전번편에서 간단하 geth를 다운로드 받아 구동하는 방법을 설명하였다. 사설망용 geth도 동일한 프로그램을 다운로드 받아 구성하면 된다.

 

아래 사이트에서 tar.gz 파일을 받아 역시 압축을 풀어보자. ubuntu linux/Geth 1.10.4 64 bit를 기준으로 하자.

 

https://geth.ethereum.org/downloads/ (처음에 로딩될때 버전을 참조하느라 조금 시간이 걸린다)

 

Downloads | Go Ethereum

Retrieving packages from release server...

geth.ethereum.org

전체적인 과정은 아래를 참조했다. 공식 페이지이며 버전이 올라갈때마다 적절히 수정되는 것을 기대할 수 있다.

https://geth.ethereum.org/docs/interface/private-network

 

A. 파일을 다운로드 한 후 계정을 생성해보자.

 

$ mkdir /work/                     #프로그램 압축을 풀 폴더

$ mkdir /work/neibcprv     #이더리움 데이터 파일을 보관할 폴더

$ cd /work/

$ tar xvfz geth-alltools-linux-amd64-1.10.4-aa637fd3.tar.gz   # /work/에 다운받은 tar.gz가 복사되어 있다고 가정

$ cd geth-alltools-linux-amd64-1.10.4-aa637fd3     #설치후 짧은 이름으로 변경해서 사용해도 좋다.

$ ls

... geth ...

 

우선 geth에서 기초적으로 쓸 계좌를 2개 생성한다. 계좌를 만든다는 것은 잘 알려진대로 비밀키와 공개키, 지갑주소를 만들어 파일로 보관하는 방법이다. 비밀키는 별도의 암호를 물어 암호화하여 저장한다.

 

$ cd /work/geth-alltools-linux-amd64-1.10.4-aa637fd3

$ ./geth account new --datadir "/work/neibcprv"

 <-- 암호를 입력하면 /work/neibcprv/keystore에 해당 정보가 저장된다. 암호는 잘 보관해주자. 나중에 송금을 할때 암호를 입력해야 해당 개인key를 쓸 수 있다.

$ ./geth account new --datadir "/work/neibcprv"

 

$ ls -al /work/neibcprv/keystore
total 16
drwx------ 2 neibc neibc 4096  7월  3 16:42 .
drwxrwxr-x 4 neibc neibc 4096  7월  4 01:28 ..
-rw------- 1 neibc neibc  491  7월  3 16:42 UTC--2021-07-03T07-42-11.924219581Z--2d75914e826c023beaa98a4c05db1be808c4aaa3
-rw------- 1 neibc neibc  491  7월  3 16:42 UTC--2021-07-03T07-42-31.709155899Z--2276b96e62c9394d76fbdc59f451688a55f99d1f

 

파일을 열어보면 아래와 같이 나옴을 알 수 있다. 2개 만든 계좌중의 하나에 대한 정보이다.

 

$ cd /work/neibcprv/keystore/

$ more UTC--2021-07-03T07-42-11.924219581Z--2d75914e826c023beaa98a4c05db1be808c4aaa3 
{"address":"2d75914e826c023beaa98a4c05db1be808c4aaa3","crypto":{"cipher":"aes-128-ctr","ciphertext":"f60bbcbe58da59504a8e1cebecafaf4
0125a4fc69420d15f4e50bc58540c6461","cipherparams":{"iv":"151a19efcd65491a1839cff7994e0099"},"kdf":"scrypt","kdfparams":{"dklen":32,"
n":262144,"p":1,"r":8,"salt":"f4fb417173cb2d53cb50226c14952d8994c5b4329e8dcc244c8f4a0f7c0c166f"},"mac":"b927a65a182f79e865eb30521dad
38ea712647bd60bdba14359e32ce9465c30c"},"id":"c4ea17f1-08cd-4ba2-b8d3-d1f6bfba8a2e","version":3}

 

이더리움 계좌는 이렇게 local에서 우선 네트워크에 접속되어 있지 않고 생성되어  datadir/keystore/에 관련 정보를 남기는 게 전부이다. 이런 과정들의 세부가 궁금한가? 그러면 아래 URL을 참조해보자.

https://medium.com/hexlant/%EC%9D%B4%EB%8D%94%EB%A6%AC%EC%9B%80-keystore-%ED%8C%8C%EC%9D%BC-utc-%EC%83%9D%EC%84%B1-%EB%B0%8F-%EC%95%94%ED%98%B8%ED%99%94-%EB%B3%B5%ED%98%B8%ED%99%94-%EC%9B%90%EB%A6%AC-1-2-d417cb605bf

 

이더리움 KeyStore 파일(UTC) 생성 및 암호화/복호화 원리 (1/2)

이더리움 플랫폼에서는 본인을 확인하는 수단으로 KeyStore 파일을 사용합니다. 사용자는 KeyStore 파일을 생성할 때 입력했던 비밀번호를 통해 유효한 사용자임을 인증하고 계좌에 접근할 수 있게

medium.com

 

 

B. 다음에는 사설로 이더리움을 구성하기 위해 genesis파일을 작성하여 geth를 실행해보자.

 

ethereum 사설망은 PoW방식의 ethash모드와 좀 다른 형태(Proof of Authority)의 고속의 clique 방식이 있는데, 보통 ethereum에서는 clique을 추천한다. 하지만 여기서는 실제 사용되는 ethash모드로 진행하도록 하자.(대규모 개발 시험을 위해서는 clique로 하면 편하겠다. 상세 내용이나 파라메터에 대해서는 해당 공식 문서를 참조한다.(https://geth.ethereum.org/docs/interface/private-network)

 

ethash모드로 사설 이더리움망을 구성하려면 json파일을 하나 구성해야 하는데, genesis.json이라고 칭해보자.

간단하게 하나 만들어준다.

 

$ cat > /work/neibcprv/genesis.json

{
  "config": {
    "chainId": 2125,
    "homesteadBlock": 0,
    "eip150Block": 0,
    "eip155Block": 0,
    "eip158Block": 0,
    "byzantiumBlock": 0,
    "constantinopleBlock": 0,
    "petersburgBlock": 0,
    "ethash": {}
  },
  "difficulty": "1",
  "gasLimit": "8000000",
  "alloc": {
    "2d75914e826c023beaa98a4c05db1be808c4aaa3": { "balance": "10000000000000000000" },
    "2276b96e62c9394d76fbdc59f451688a55f99d1f": { "balance": "10000000000000000000" }
  }
}

그리고 아래와 같이 init을 해준다. 이렇게 하면 위 genesis파일에 기초하여 필요한 기초 파일을 생성해주고 초기 셋팅을 해준다. 초기 배정 금액 alloc/balance는 wei단위(10^18 wei = 1 이더리움)라서 100이더리움(100000000000000000000 wei)이 배정되었다

 

$ cd /work/geth-alltools-linux-amd64-1.10.4-aa637fd3

$ ./geth init --datadir "/work/neibcprv" /work/neibcprv/genesis.json

 

이렇게 실행하면 /work/neibcprv/에 geth폴더 등이 생긴다. 그리고 나서는? 실제로 실험을 해봐야한다.

아래와 같이 networkid 옵션에 위 genesis의 chainId인 2125를 그대로 넣어주고 여러가지 명령 수행을 위해 console이라고 입력한다. 그리고 나서 간단한 송금과 채굴을 해보자.

 

$ ./geth --datadir "/work/neibcprv" --networkid 2125 console

...

....

 

> primary = eth.accounts[0];    #여기서 만든 첫번째 계좌
"0x2d75914e826c023beaa98a4c05db1be808c4aaa3"
> secondary = eth.accounts[1];   #여기서 만든 두번째 계좌
"0x2276b96e62c9394d76fbdc59f451688a55f99d1f"

> miner.setEtherbase(primary);       #이체 채굴을 하면 첫번째 계좌로 돈이 들어간다.

> miner.start();                                  #채굴을 시작하자. 채굴을 하지 않으면 거래가 발생하지 않고 이더리움이 생기지도 않는다.

 

> personal.unlockAccount(primary);   #송금을 하기 위해 첫번째 계좌의 암호를 입력해보자.

> eth.sendTransaction({from: primary, to: secondary, value: web3.toWei(1, "ether")});  #1번계좌에서 2번계좌로 1이더리움을 송금한다.

 

> balance = web3.fromWei(eth.getBalance(primary), "ether");

첫번째 계좌의 현재 잔액이 표시된다.

> balance2 = web3.fromWei(eth.getBalance(secondary), "ether");

두번째 계좌의 현재 잔액이 표시된다.

 

 

자 간단하게 이더리움 서버를 사설로 구성하여 계좌를 만들고, 채굴도 하고, 돈을 송금하고 잔액을 확인해보았다.

마지막으로 nohup으로 백그라운드로 geth를 실행하는 예시다. mining도 실행되도록 mine옵션을 주었다.

 

$ ./geth --datadir "/work/neibcprv" --networkid 2125 --mine --minerthreads "1" 2>> /work/neibcprv/geth.log &

반응형
Posted by 작동미학