블록체인2021. 7. 5. 00:51

이더리움 keystore에 대해서는 아래 한글과 영문자료로 우선 전체를 이해할 필요가 있다.

 

https://julien-maffre.medium.com/what-is-an-ethereum-keystore-file-86c8c5917b97

 

What is an Ethereum keystore file?

The barrier to entry to manage your Ethereum private keys is high, mostly because Ethereum clients hide a big part of the cryptographic…

julien-maffre.medium.com

결국 둘다 같은 내용이다.

 

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

 

 

그러면 이 둘에 해당하는 key들을 직접 생성할 수 없을까?

linux에서 openssl정도로 가능한데, 아래 자세히 설명되어 있다.

 

https://kobl.one/blog/create-full-ethereum-keypair-and-address/

 

Create full Ethereum wallet, keypair and address

Create full Ethereum wallet, keypair and address Generating a usable Ethereum wallet and its corresponding keys Contents This article is a guide on how to generate an ECDSA private key and derive its Ethereum address. Using OpenSSL and keccak-256sum from a

kobl.one

key생성하는 전체 코드(Complete example, linux가정)

# Generate the private and public keys

# openssl을 통해 타원곡선 사용해 개인키/공개키를 생성한다

> openssl ecparam -name secp256k1 -genkey -noout | openssl ec -text -noout > Key

 

# Extract the public key and remove the EC prefix 0x04

# Key에서 공개키를 추출하고 prefix를 제거한다

> cat Key | grep pub -A 5 | tail -n +2 | tr -d '\n[:space:]:' | sed 's/^04//' > pub

 

# Extract the private key and remove the leading zero byte

# Key에서 개인키를 추출하고 앞의 00 byte를 없앤다

> cat Key | grep priv -A 3 | tail -n +2 | tr -d '\n[:space:]:' | sed 's/^00//' > priv

 

# Generate the hash and take the address part

# 해쉬값을 생성해서 주소를 만들어 낸다

# linux에서는 $ git clone https://github.com/vkobel/ethereum-generate-wallet 한 후에 ethereum-generate-wallet/lib/x86-64/keccak-256sum을 활용한다

 

> cat pub | keccak-256sum -x -ltr -d ' -' | tail -c 41 > address

  *0xdcc703c0E500B653Ca82273B7BFAd8045D85a470 처럼 생긴 주소는 비어있는 공개키로 생성된 것이라 주의해야 한다.

  재미있게도 이렇게 잘못 생성한 주소로 돈을 보낸 사람이 적지 않다. 여기서 볼 수 있다. etherscan

   ex> $ touch empty; cat empty | keccak-256sum -x -l | tr -d ' -' | tail -c 41

 

# (Optional) import the private key to geth

# geth로 개인키를 가지고 실제 맞는지 검증해볼 수 있다

 

> geth account import priv

 

ex> $ ./geth --datadir "/Users/neibc/dev/geth/data2" --networkid 2125 account import prv  #prv파일에 위 prv 저장 가정

        출력되는 geth의 address가 상기의 생성한 address와 맞는지 확인한다.

 

 

 

마지막으로 또 재미있는 것은 0x7e5f4552091a69125d5dfcb7b8c2659029395bdf 라는 주소이다. 이 지갑주소는 private key가 알려져있다. 아래를 참조해보자. ( https://lsongnotes.wordpress.com/2018/04/30/manually-decrypting-ethereum-keystore-file/ )

 

Ex>

$ echo "0000000000000000000000000000000000000000000000000000000000000001" > plain_key1.txt
$ geth –datadir . account import plain_key1.txt

 

etc...

$ echo "3141592653589793238462643383279502884197169399375105820974944592" > plain_key2.txt
$ geth –datadir . account import plain_key2.txt

$ echo "2718281828459045235360287471352662497757247093699959574966967627" > plain_key3.txt
$ geth –datadir . account import plain_key3.txt

 

이렇게 하면 위 주소가 나온다. 신기하게도 누군가 이 계좌로 소액을 입금하고 있으며, 입금 즉시 곧바로 출금한다.

https://www.blockchain.com/eth/address/0x7e5f4552091a69125d5dfcb7b8c2659029395bdf

 

 

반응형
Posted by 작동미학
블록체인2021. 7. 4. 17:01

앞서의 여러가지 mainet이나 사설로 geth를 구성하는 방법을 가이드 했었다. 그렇게 일단 구성을 한다.

ubuntu linux와 geth 1.10.4버전하에서 수행하였으나 대부분의 linux에서 잘 작동하리라고 믿는다.

 

그리고 나서 아래와 같이 geth를 실행한다. miner.etherbase는 채굴한 금액이 입금될 지갑주소이다.

 

$ cd geth설치폴더

$ ./geth --datadir "/work/neibcprv" --allow-insecure-unlock --http --miner.etherbase "0xb98df66662a586461b668e9ab81383d2b0d341da" console

 

이렇게 하면 http://127.0.0.1 인터페이스를 통해 ethminer를 구동할 수 있다.

(다만 저 allow-insecure-unlock옵션은 내부 태스트용일때만 사용하자, 다른 안전한 방법을 확인중이다)

 

ethminer는 이더리움 전용 채굴 툴이다. 해당 툴의 gpu구성이나 설치는 사실 다른 강의를 참조하면 된다.

https://blog.boxcorea.com/wp/archives/3012

 

ubuntu 리눅스에 ethminer 설치하기.

ubuntu 18.04 ethminer 설치하기. ethminer 는 이더리움을 채굴하는 커맨드라인 기반 프로그램이다. * 사전 준비사항. nvidia 드라이버 및 cuda 설치가 되어 있어야 한다. cmake, libdbus-1-dev, build-essential 패키지

blog.boxcorea.com

 

설치가 모두 끝났다면 아래와 같이 입력한다. 물론 geth가 실행된 상태여야 한다. 상기 콘솔에서도 miner도 시작해주고 거래도 일으키자.

 

> miner.start()

 

이후에 아래처럼 ethminer를 실행시켜 준다.

 

$ ./ethminer -P http://127.0.0.1:8545

ethminer 0.19.0-17+commit.ce52c740
Build: linux/release/gnu

 i 16:54:29 ethminer Configured pool 127.0.0.1:8545
 i 16:54:29 ethminer Selected pool 127.0.0.1:8545
 i 16:54:29 ethminer Established connection to 127.0.0.1:8545
 i 16:54:29 ethminer Spinning up miners...
cu 16:54:29 cuda-0   Using Pci Id : 01:00.0 GeForce GTX 1070 (Compute 6.1) Memory : 6.90 GB
 X 16:54:29 ethminer Got code:-32000 message:no mining work available yet  from 127.0.0.1:8545
 m 16:54:34 ethminer 0:00 A0 0.00 h - cu0 0.00
..

cu 17:00:51 cuda-0   Job: 2fe6ca74… Sol: 0x5e2c787b34bdc0a0
 i 17:00:51 ethminer **Accepted   9 ms. 127.0.0.1:8545
 i 17:00:51 ethminer **Accepted  29 ms. 127.0.0.1:8545
cu 17:00:51 cuda-0   Job: 2fe6ca74… Sol: 0x5e2c787b34d2809f
cu 17:00:51 cuda-0   Job: 2fe6ca74… Sol: 0x5e2c787b34d451d2
 i 17:00:51 ethminer **Accepted   2 ms. 127.0.0.1:8545
 i 17:00:51 ethminer **Accepted  12 ms. 127.0.0.1:8545

..

 

이후 nvidia-smi같은 tool로 GPU가 실제 작동하고 있는지 확인한다. GPU로 채굴하는 것을 알 수 있다.

 

 

반응형
Posted by 작동미학
블록체인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 작동미학