1. geth 개념
(1) private network
가상 사설망이란 뜻인데 회사 조직에서 독립적으로 사용하는 네트워크(인트라넷)라고 생각하면 된다.
그 가상 사설망으로 우리는 geth를 사용한다.
(2) chaindata, keystore
chaindata 폴더 : 블록 헤더 내용, 블록의 바디 트랜잭션의 내용이 들어있다.
keystore 폴더 : geth에서 관리하는 계정들의 정보가 들어있다.
이런 내용들을 geth로 다운 받는것을 동기화라고 부른다.
(3) geth 실행 옵션
full sync : 제네시스 블록부터 지금 현재 블록까지 모든 블록을 동기화
fast sync : 블록 헤더 정보 동기화, 블록 바디 마지막 트랜잭션 기준(1024개 트랜잭션 데이터만 동기화)
light sync : 블록헤더 정보와 마지막 snapshot 동기화
※snapshot : 데이터를 파일이나 이미지로 저장한다.
디폴트 값 : fast sync
light sync로 실행 하고 싶다면
geth --syncmode light
light sync 동기화 할때는 lightchaindata 폴더에 값이 저장된다.
2. IPC(Inter-Process Communication)
IPC는 실행중인 프로세스간에 데이터를 주고받는 것이다.
프로세스는 할당된 메모리 내의 정보에만 접근할수 있고 이를 벗어날 경우
안정성을 위해서 운영체제가 자기 프로세스의 메모리에만 접근하도록 하고 있기 때문에 오류를 발생시킨다.
이런 부분들 때문에 IPC를 사용해서 다른 프로세스간의 데이터를 주고 받아야 한다.
geth.ipc파일을 사용해서 geth와 IPC 통신을 할수 있게 된다.
(1) IPC의 종류
메시지 전달 : 메시지 전달은 커널이 제공하는 API를 사용해서 커널 공간을 통해 통신한다.
소켓 로컬에서도 통신이 가능하다.
메모리 공유 : 프로세스끼리 공통의 메모리 영역을 공유하고 상호간 통신 하는 방법이다.
데이터 자체를 공유하도록 지원한다.
(2) 통신해보기
관리자 실행으로 터미널 열어서 geth 실행
geth --syncmode light
터미널 하나 더 열고 geth에 접근
geth attach ~/.ethereum/geth.ipc
이러면 go언어로 만들어 놓은 자바스크립트 콘솔창에 접속된다.
자바스크립트로 호출해서 사용할수 있게 끔 만들어 놓은것이다.
ctrl + c 로 실행중인 프로그램을 종료할 수 있다.
3. 자바스크립트 콘솔창에서 메소드
(1) personal
personal.newAccount : 계정생성
이따 puppeth 설정시 써야할 일이 생기니 계정을 생성해놓고 비밀번호, 계정주소를 따로 적어둔다.
(2) admin
admin.nodeinfo : 노드의 정보 조회
admin.nodeinfo.enod : enode 값을 이용해서 peer를 맺는다.
admin.datadir : admin 관련 데이터의 폴더 경로
(3) eth
eth.syncing : 동기화 여부(true, false 값으로 구분)
eth.chainId : 체인 ID 조회
eth.accounts : 노드에 존재하는 계정 목록 확인
eth.coinbase : 코인베이스 계정 (첫번째 계정)
(4) web3
web3.fromWei(eth.getBalance(account),"ether") : 웨이 -> 이더 단위 변환
(5) miner
miner.start(스레드갯수) : 스레드갯수에 따라 채굴속도가 결정된다. 채굴하는것
miner.stop : 채굴 중지
miner.setEtherbase(계정) : 채굴계정 설정
4. private network 구축
geth를 실행해보면 맨위 chain ID 가 있다.
geth가 실행되고 있는 이더리움 메인넷 Chain ID : 1(mainnet)에 연결된 노드로 동기화가 이루어지고 있다는 것이다.
private network를 만드는데 geth의 기능은 사용하지만 최초블록을 교체해서 자체적인 네트워크를 구축할 것이다.
(1) /.ethereum
genesis.json 파일 작성
const genesis = {
// nonce 값을 발견할 난이도 설정
difficulty: "200000",
// 블록체인 블록당 가스 제한량
gasLimit: "3100000",
// 제네시스 블록 생성시 지정한 지갑에 할당된 양의 정보
alloc: {},
config: {
// 블록체인 네트워크 체인 아이디
chainId: 1234,
// 이더리움 release 버전
homesteadBlock: 0,
// eip : Ethereum Improvement Proposal을 의미하고
// 적용할지 여부를 확인할수 있다. 기본값 0
eip150Block: 0,
eip155Block: 0,
// eip는 이더리움 개선안
// 이더리움 커뮤니티 구성원들이 추진하는 이더리움 암호화폐와
// 스마트 컨트랙트의 발전을 위해 제안하는것
},
};
파일을 /.ethereum 경로에 복사해준다.
(2) 제네시스 블록 설정값 적용
실행시키던 geth 종료 후 .ethereum 경로로 가주기
// 제네시스 블록 설정값 적용
geth --datadir node init genesis.json
// 실행 명령어
geth --datadir node
geth를 다시 키면 chain ID 가 내가 설정한 ID로 변해있는걸 확인 할 수 있다.
(3) puppeth
puppeth는 이더리움 노드 배포를 쉽게 도와주는 프로그램이다.
기존 빌드는 make geth로 했지만 geth이외에 go ethereuem까지 모든 파일도 빌드되는 make all로 빌드할 것이다.
실행시키던 geth를 끄고 /Ethereum/go-ethereum 폴더에 경로를 맞춰준 후 make all 로 빌드한다.
그 후 터미널창에 puppeth를 입력하면 아래와 같은 화면이 나온다.
bit.json 파일을 만들기 위해 설정을 해준다.
bit 입력 -> 2(configure new genesis) -> 1(create new genesis from scratch) -> 1(Ethasg-proof-of-work) -> 자바스크립트 콘솔창에서 생성한 계정 주소중 앞 0x를 제외한 값 붙여넣기 -> yes -> 만들고 싶은 chain ID(1234) -> 2(Manage existing genesis)
위와 같은 순서로 입력하면 루트 경로에 .puppeth라는 폴더가 생긴다
폴더 경로에 \\wsl$ 를 치면 우분투의 폴더를 볼수 있다.
(4) geth 실행 옵션
--http.addr"0.0.0.0" : 모든 ip 허용
--http.port 8000 : 사용할 포트 8000으로 설정
--http.corsdomain"*" : cors설정 모든 도메인 허용
--http.api"admin,txpool,web3" : 외부 모듈을 사용할수 있게 설정
--syncmode full : 동기화 모드 full
--networkId : 체인 아이디와 동일한 값 입력 해주면 된다.
geth 실행 시키기
.puppeth 경로에서 아래 코드 집어 넣기
geth --datadir node --http --http.addr "127.0.0.1" --http.port 8000 --http.corsdomain "*" --http.api "admin,miner,txpool,web3,personal,eth,net" --syncmode full --networkid 1234
위코드는 8000번 포트에서 chain : 1234로 열어줌으로써 프라이빗 네트워크가 형성되고 통신할수 있는 상태가 되었다.
nodejs나 메타마스크에서 프라이빗 네트워크에 통신하는것이 가능한 상태가 된것이다.
5. 마이닝(채굴)
geth실행 후 다른 터미널 창에서 접속하기
geth attach http://127.0.0.1:8000
마이닝 테스트를 위해 계정을 미리 2개 만들어준다.
personal.newAccount()
마이닝은 블록을 만들어주고 보상으로 코인을 받는 것이다.
누군가 돈을 보냈을때 그 트랜잭션을 만들어주는것이라고 생각하면된다.
(1) 마이너 설정해주기
miner.setEtherbase(eth.accounts[0])
(2) 마이닝 시작
miner.start(1)
(3) 잔고 확인
eth.getBalance(eth.coinbase)
6. 트랜잭션 보내기
트랜잭션을 보내기 전 --allow-insecure-unlock이라는 geth실행 옵션을 추가하여 계정의 잠금을 해제해야한다.
geth --datadir node --http --allow-insecure-unlock --http.addr "127.0.0.1" --http.port 8000 --http.corsdomain "*" --http.api "admin,miner,txpool,web3,personal,eth,net" --syncmode full --networkid 1234
(1) 지갑 잠금 해제
personal.unlockAccount(eth.accounts[0])
(2) 트랜잭션 보내기
eth.sendTransaction({from : eth.accounts[0], to : eth.accounts[1], value : web3.toWei(10,"ether")})
(3) 트랜잭션 풀
트랜잭션 풀을 보면 pending이 1개 걸려있을것이다.
이는 트랜잭션을 보내고 마이닝을 통해 블록을 생성하여 트랜잭션을 생성해줘야 한다.
txpool //트랜잭션 풀 확인
(4) 마이닝
'개발 > BlockChain' 카테고리의 다른 글
[BlockChain] 스마트 컨트랙트 배포 (0) | 2022.12.05 |
---|---|
[BlockChain] solidity 컴파일 (0) | 2022.12.05 |
[BlockChain] React 메타마스크 연결하기 (0) | 2022.11.21 |
[BlockChain] RPC web3 테스트 (0) | 2022.11.21 |
[BlockChain] ubuntu 환경 설정 (0) | 2022.11.21 |