일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- next 매개변수
- cookie-parser 만들어보기
- buffer.from
- 라우터와 미들웨어
- 세션으로 로그인 구현
- useEffect clean up
- 아이디 중복체크기능
- useContext
- JWT 로그인 기능 구현
- JWT 하드코딩
- mysql wsl
- Uncaught Error: could not find react-redux context value; please ensure the component is wrapped in a <Provider>
- 라우트 매개변수
- express.static
- express session
- FormData()
- 비동기파일업로드
- 시퀄라이즈 기본설정
- javascript기초
- 라우터 분리
- 블록 만들기
- css기초
- ws 라이브러리
- express실행
- 라우터미들웨어 분리
- express router
- JWT 만들어보기
- OAuth 카카오
- node.js path
- nodejs파일업로드
- Today
- Total
즐코
geth로 네트워크 돌려보기 / private 네트워크 구축해보기 본문
geth로 네트워크 돌려보기
이번 포스팅에선 이전에 설치한 geth를 실행시켜 실제 이더리움 메인넷과 연결하고 프라이빗 네트워크도 만들어보고자한다.
( geth 설치 관한 이전 포스팅 : https://yjleekr.tistory.com/87 )
Geth를 실행시키면 우리의 컴퓨터는 하나의 노드, 즉 이더리움 클라이언트가 되어 이더리움 네트워트에 참여하게 된다.
이렇게 각 노드들은 트랜잭션들로 새로운 블럭을 채굴하여 보상을 받으며 연결된 다른 노드들에게 이를 보내준다. 이 새로운 블럭을 받은 노드들은 블럭의 유효성을 검증하고 자신들의 db에 추가한다. 이 각각의 블럭에서 제공하는 정보는 geth가 state(상태-이더리움 내 각각의 계정의 ETH 잔량)를 업데이트하는데 쓰인다.
블록체인과 상호작용하기 위해서 geth는 JSON-RPC API를 제공해주며 이걸 사용자가 쓰기 쉽게 만들어준 라이브러리가 web3인 걸 배웠다. 여기에 geth는 web3 라이브러리를 사용할 수 있는 자바스크립트 콘솔을 제공해준다.
이번 포스팅에선 한 터미널에선 geth를 실행하고, 다른 터미널에선 자바스크립트 환경을 열어 사용자가 web3를 사용하여 geth와 상호작용하는 법을 정리해본다. 이 자바스크립트 환경을 geth와 연결시켜주는데는 2 개의 통신 프로토콜을 쓸 수 있다. 하나는 http, 다른 하나는 IPC 이다. 우린 IPC 방식으로 geth와 통신할 것이다.
IPC
Inter-Process Communication 프로세스간의 통신
한 컴퓨터 내에서 서로 다른 프로세스가 통신 하는 것을 뜻한다고 한다.
위에서 설명한 geth 실행 터미널 (geth 노드)<--->자바스크립트 콘솔 터미널 간의 연결을 IPC 통신이라고 보면 될듯하다.
블럭 동기화 방법
이더리움 메인넷에 제대로 참여하려면 모든 이더리움 블록체인의 데이터를 다 다운받아줘야한다. 이를 블록 동기화(sync)라고 한다. geth의 sync mode엔 대표적으로 3가지가 있는데, default값은 fast sync라고 한다.
- full sync : 메인넷의 모든 블럭 (헤더, 거래내용, 영수증) 을 받아와서 모든 트랜잭션을 재실행, 제네시스부터 모든 블럭을 검증하여 블록체인 상태를 생성한다. 따라서 매우 오래걸린다.
- fast sync : 메인넷의 모든 블럭 (헤더, 거래내용, 영수증) 을 받아와서 모든 블럭 헤더만을 검증하고, 최신 상태를 다른 노드에게서 직접 받아온다. 한번 동기화되면 full sync모드로 전환되어 트랜잭션을 직접 실행하면서 state를 만들어 나간다.
- light sync : 모든 블럭 헤더, 블럭 데이터를 가져와서 랜덤하게 검증한다. 최근 상태만을 가져옴!?!?!? 해당 모드에선 채굴은 할 수 없고 트랜잭션을 만들어 요청 보내는 정도의 기능만 가능하다.
여기서 transaction receipt은 트랜잭션의 결과물을 기록한 것이라고 하는데, 아래와 같은 형태로 되어있다고 하니 대충 알고만 있는걸로..
full sync나 fast sync 모드는 light 모드보다 용량도 크고 오래 걸리므로 light sync로 메인넷과 동기화해본다.
참고로, 새로운 터미널에서 시작할때 source 명령어로 .bash_profile 내의 geth 지역변수를 적용해줘야 geth 명령어가 먹힌다.
$ source ~/.bash_profile
$ geth --syncmode light
이렇게 아래와 같이 콘솔이 찍히는데, 여기서 Allocated cached and file handles database=경로가 뜬다.
이 database의 경로에 블록체인 데이터가 들어간다. 다만 우리는 light 모드에서 돌리고 있기 때문에 해당 디렉토리 상에는 블록 헤더만을 저장해두었을 것이다. (OS 마다 저장 경로가 달라진다)
또한, geth를 실행시키면 이더리움 메인넷과 동기화되면서 geth.ipc가 생성된다.
이 geth.ipc를 통해서 ipc 통신으로 네트워크 접속이 가능해진다.
아래와 같이 geth 실행창에 IPC endpoint opened 가 찍힌걸 확인할 수 있다.
geth 제공 자바스크립트 콘솔 실행하여 web3 라이브러리 써보기
이제, 이더리움 메인넷과의 상호작용을 위해 web3를 사용할 수 있는 geth에서 제공해준 자바스크립트 콘솔창을 쓰고자 한다.
자바스크립트 콘솔과 geth노드의 연결을 위해 ipc를 사용하는데, 이 geth 실행 시 자동으로 생성된 geth.ipc를 사용하는 것이다.
$ geth attach ~/Library/Ethereum/geth.ipc
동기화가 완료되었나 확인해보기 syncing
$ web3.eth.syncing
false 출력 : 현재 geth가 이미 최신 상태이며 더이상 동기화할 게 없다는 뜻이다.
Admin
내 노드의 정보를 모두 조회해주는 명령어
admin을 출력해보면 아래 스크린샷처럼 긴 객체가 나온다.
ipc를 통해 peer간의 연결을 해야한다면 내 노드의 주소를 줘야한다. 그게 바로 enode이다.
$ admin.nodeInfo.enode
personal
여러 메소드를 가진 객체가 나온다.
계정 생성 메소드
내 노드 상에 새로운 계정을 생성해준다. 이 때 비번을 설정해주면 아래와 같이 계정을 생성해줌과 동시에 개인키를 저장해준다.
$ personal.newAccount
개인키는 ~/Library/Ethereum/keystore 에 저장되면서 파일이 생성된다.
우리가 메타마스크에서 계정을 추가할때 개인키 자체를 넣었는데, geth를 통해서 만들어진 아래의 json파일을 넣는 방법도 있다.
이때 메타마스크 상에 비번을 넣어야하는데 위에서 설정한 비번을 넣어주면 된다.
private 네트워크 구축
이더리움 네트워크와 코드는 같지만 메인넷 즉 public 네트워크에 연결되있지 않은 독립된 새로운 체인을 만드는 것이 private 네트워크를 만드는 것이다.
위에서 정리한 geth --syncmode light 로 geth를 실행시키면 아래 초록색 표시한대로 chain ID가 1번, 즉 메인넷에 연결되어서 sync하고 있음을 알 수 있다. 근데 지금의 목적은 메인넷과 같은 퍼블릭 네트워크가 아닌 프라이빗 네트워크를 만들어 보는 것이다.
=> geth 기능은 가져가고 제네시스 블록만 바꿔주면 프라이빗 네트워크를 생성할 수 있다!
1/ 바꿔줄 제네시스 블럭에 대한 속성값을 genesis.json 파일을 만들어 작성해준다.
geth를 실행하면 해당 genesis.json 정보를 바탕으로 제네시스 블록을 생성할 것이다.
// genesis.json
{
"difficulty": "200000",
"gasLimit": "3100000",
"alloc": {},
"config": {
"chainId": 7722,
"homesteadBlock": 0,
"eip150Block": 0,
"eip155Block": 0,
"eip158Block": 0
}
}
2/ 아래 명령어를 통해 genesis.json 정보를 읽어서 앞으로 만들 블록체인 데이터가 저장될 공간인 node라는 이름의 datadir 디렉토리를 새로 만들어준다.
$ geth --datadir node init genesis.json
3/ 해당 노드를 실행하기 위해 아래 명령어를 쳐준다.
geth --datadir node --nodiscover 옵션은 아래서 설명하겠다.
$ geth --datadir node
# 또는
$ geth --datadir node --nodiscover
IPC endpoint opened !
해당 url(경로)상에 ipc 통신을 하게끔 도와주는 geth.ipc 파일이 node 폴더에 저장된걸 확인할 수 있다.
위에서 배운대로 자바스크립트 콘솔과 geth 노드와의 ipc 통신을 위해 geth attach 를 해준다.
$ geth attach ~/DeskTop/workspace/blockchain/ethereum/geth_conn/node/geth.ipc
admin을 쳐보면 nodeInfo - ports - discovery에 포트정보가 있는데, 다른 사람이 내쪽에 연결하는 걸 방지하기 위해서 내쪽에서만 연결할 수 있게끔 쳐주는 명령어라고 한다. 내가 직접 peer연결을 하지 않는 이상 다른 노드와 연결되지 않는다. ..? 이건 다시 정리할 필요가 있음....
private 네트워크이기 때문에 light sync 모드로 가져온 메인넷과 달리 모듈상에 miner 가 생긴다.
속성 및 메소드 정리
아래의 여러 속성, 메소드를 통해서 자바스크립트 콘솔창에서 geth 노드에 요청을 보내서 특정 데이터를 가져올 수도 있고, peer 통신도 가능하다. 우선 현재까지 써본 속성, 메소드들만 정리해본다.
- personal.newAccount() : keystore 상에 개인키가 생성된다, 동시에 콘솔 창에는 해당 계정이 찍힌다.
- eth.accounts : 노드에 존재하는 모든 계정 목록 조회가 가능하다.
- eth.coinbase : 코인베이스 계정 즉, 채굴자 계정 확인 가능
- miner.setEtherbase(eth.accounts[1]) : 인자로 계정을 넣어주면 코인베이스 계정이 변경되어 마이닝 시 해당 인자로 들어간 마이너 노드에게 코인 보상이 떨어진다.
- eth.getBalance(eth.coinbase) : 인자로 계정을 넣어주면 밸런스를 조회할 수 있다.
- web3.fromWei(eth.getBalance(eth.coinbase), 'ether') : wei 단위를 ether 단위로 변환해준다.
- miner.start(1) : 채굴 시작 명령어 - 인자로 채굴에 사용할 thread 수를 넣어주면 된다.
해당 콘솔창에선 null이 뜨지만 geth 실행 중인 터미널을 확인해보면 아래와 같이 채굴을 하고 있다!
- miner.stop() : 채굴 중단 명령어
- admin.nodeInfo.enode : geth 노드 정보 중 enode라는 ip주소같은 걸 얻게 됨/ 해당 값으로 peer간 연결이 가능
- admin.addPeer(연결하고자 하는 노드의 enode값) : peer간 연결 명령어
- admin.peers : 현재 연결된 peer들에 대한 정보 조회
- net.peerCount : 연결된 peer 수
피어 연결하다가 실패해서 연결부분은 내일 해볼것,,,
'BlockChain' 카테고리의 다른 글
solidity 시작 - 스마트 컨트랙트 배포와 실행 (1) | 2022.07.11 |
---|---|
RPC 로 geth와 통신 / puppeth / 메타마스크-private 네트워크 연동 (0) | 2022.07.02 |
React프론트-메타마스크 연동 (ft.WEB3) (0) | 2022.06.30 |
json-rpc 프로토콜 / web3 라이브러리 / GAS 란?! (0) | 2022.06.28 |
이더리움 / 스마트 컨트랙트 (EVM?!) / MAC Geth 설치 (1) | 2022.06.28 |