일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- css기초
- nodejs파일업로드
- FormData()
- JWT 만들어보기
- cookie-parser 만들어보기
- 세션으로 로그인 구현
- ws 라이브러리
- 시퀄라이즈 기본설정
- 비동기파일업로드
- 블록 만들기
- JWT 하드코딩
- 아이디 중복체크기능
- useContext
- useEffect clean up
- next 매개변수
- Uncaught Error: could not find react-redux context value; please ensure the component is wrapped in a <Provider>
- javascript기초
- express router
- express.static
- JWT 로그인 기능 구현
- 라우터 분리
- mysql wsl
- express session
- 라우트 매개변수
- express실행
- OAuth 카카오
- node.js path
- 라우터미들웨어 분리
- 라우터와 미들웨어
- buffer.from
- Today
- Total
즐코
RPC 로 geth와 통신 / puppeth / 메타마스크-private 네트워크 연동 본문
어젠 ipc 로 geth와 통신했으나 이번엔 http-rpc 통신하는 걸 연습함
node 라는 디렉토리를 미리 생성, 아래 명령어를 통해 node라는 디렉토리를 datadir로 정하고, 새로운 계정을 생성한다.
비번을 입력하면 keystore 디렉토리 생성되고 그 안에 새로운 계정 파일이 저장된다.
$ geth --datadir node account new
저번 포스팅에선 genesis.json 내 속성들을 하드코딩으로 넣어줬으나, 이걸 자동으로 만들어주는 라이브러리가 있다!
그게 바로 puppeth 이고 이걸 사용해서 private 네트워크를 구축해보려고한다!
Puppeth 으로 제네시스 설정 파일 생성
1. geth를 설치할 때 생성되었던 go-ethereum 디렉토리로 이동한다.
2. 여기서 저번에는 make geth해서 geth만을 빌드했었는데, 이번엔 make all 명령어로 다른 파일들도 빌드해준다.
3. 해당 빌드된 파일들은 /build/bin에 저장된다. 아래 스크린샷처럼 geth 외에 다른 많은 파일들이 생겼다! 여기서 우리가 사용할 건 puppeth 이다.
- puppeth - 설정파일(genesis.json같은 파일) 생성을 도와주는 라이브러리
- bootnode - 네트워크 p2p 노드 연결 도와주는 라이브러리
4. 여기서 source ~/.bash_profile로 전역변수 설정해주고 puppeth 명령어를 입력해준다.
근데 여기서 go-ethereum/build/bin 이 아니라 genesis 설정파일을 저장할 작업 디렉토리로 이동해서 puppeth를 해줘야한다
5. 아래처럼 환경 설정을 진행해준다. 네트워크 네임을 적고 시작. hoochu로 함
나머지 설정은 아래 스크린샷 참고
chain/network ID 도 여기서 설정해준다. 7722로 함
제네시스 스펙이 저장될 폴더명도 적어준다. hoochu_ 로 함
6. 확인해보니 아래와 같이 작업디렉토리 (~/DeskTop/workspace/blockchain/ethereum/prv-net) 상에 hoochu_ 디렉토리가 생성되었다. hoochu_ 디렉토리 안에는 자동으로 hoochu.json이라는 제네시스 블럭 설정파일이 생성되어있다.
7. 이 제네시스 설정 파일을 읽어서 node라는 폴더를 블록 데이터를 저장하는 datadir로 만드는 명령어를 쳐준다.
$ geth --datadir node init "./hoochu_/hoochu.json"
geth 폴더가 생성되었다!
IPC 말고 http-rpc 통신으로 메타마스크에 네크워크 추가하고 계정 넣어주기
메타마스크와 같은 외부 프로그램은 해당 geth.ipc 에 접근이 불가능하다.
geth - http/rpc 통신을 해서 외부에서 geth.ipc에 접근가능하게끔 해줘야한다.
아래는 geth 외부통신을 위해 http-rpc 옵션으로 설정하여 실행시키는 명령어이다.
$ geth --datadir node --http
--http.addr "0.0.0.0"
--http.port 9000
--http.corsdomain "*"
--http.api "eth,admin,miner,txpool,web3,personal,net"
--syncmode full
--networkid 7722
--port 30300
--allow-insecure-unlock
# 실제 터미널 상엔 한줄로 넣어줌 geth --datadir node --http --http.addr "0.0.0.0" --http.port 9000 --http.corsdomain "*" --http.api "eth,admin,miner,txpool,web3,personal,net" --syncmode full --networkid 7722 --port 30300 --allow-insecure-unlock
위의 geth 실행 옵션에 대해서 간단히 정리해보았다.
--http : http-rpc 통신 가능하게끔 설정
--http.addr "ip주소" : 특정 ip가 접속할수있게끔 허용 / 모든 아이피를 허용할거임 "0.0.0.0"
--http.port 포트넘버 : 어떤 포트를 통해서 외부프로그램과 http-rpc 통신을 할 것인지 정해준다. / 9000포트로 할 거임
--http.corsdomain "출처" : cors 설정 해주는 부분 / 나는 로컬에서 돌리는 거니 우선 모든 출처 허용해줌 (*)
--http.api "접근할 수 있는 api들" : 사용할 수 있는 모듈, api를 따로 세부적으로 설정해줌
--syncmode full : full sync로 블럭체인 동기화를 하겠다.
--networkid 네트워크 아이디 : 제네시스 chain id 와 동일하게 설정 / 7722로 함
--port 30300 : 네트워크 기본 포트 설정 (다른 노드와의 연결 포트)
--allow-insecure-unlock : 계정 잠금 해지 허용 / http로 모든 사용자가 계정에 접근할 수 있게되어 보안상 문제가 될 순 있지만 테스트할 땐 사용할 수 있으니 이번엔 써준다.
1/ ipc 로 geth 와 통신할 때
$ geth attach ./node/geth.ipc
2/ http-rpc 로 geth 와 통신할 때
이번엔 저번 포스팅과 달리 ipc가 아닌 http/rpc로 통신한다. 위에서 --http.api로 설정한 모듈만 쓸 수 있음을 확인할 수 있다.
$ geth attach http://127.0.0.1:9000
자스 콘솔창에서 admin 명령어로 나온 객체를 확인해보면 위에서 설정한 네트워크 아이디를 확인 가능하다. (--networkid)
또한 게스 자체의 네트워크 기본 포트인 30300도 확인 가능하다. 해당 포트로 다른 노드들과 연결한다고 보면 된다.
트랜잭션을 하려면 코인이 있어야하므로 마이닝을 먼저 해서 코인을 생성한 후에 시작한다.
트랜잭션하려면 계정이 두개 있어야하므로 계정을 추가로 하나 더 생성해준다.
person.newAccount('비번설정')
$ person.newAccount('1234')
트랜잭션을 발생시켜준다. wei 단위로 보내줘야하며, 위에서 설정한 계정 비번도 넣어줘야한다.
personal.sendTransaction({트랜잭션 내용(from,to,value},'계정비번')
personal.sendTransaction({
from:eth.coinbase,
to:"0xaaeabb3410ce8aee0f8712e48e3815f0451d15d2",
value: web3.toWei(5, "ether")
}, "1234")
코인베이스(마이너 계정)에서 0xaaea 로 시작하는 계정으로 보내줬으나, 해당 잔고 조회 시 0으로 뜬다!
그 이유는 트랜잭션이 바로 실행되지않고 txpool로 들어갔기 때문이다.
txpool 명령어로 txpool 디테일을 확인할 수 있다. 아래 status-pending 이 2 인데, tx이 2개 쌓였기 때문이다.
이때 채굴을 다시해주면, txpool이 비워진걸 확인할수있고, 보낸 계정의 밸런스를 조회해보면 위에서 5ETH를 2번 보냈으니 해당 계정으로 아래처럼 10ETH가 찍힌다!
nodejs 상에서 web3 라이브러리를 가져와서 트랜잭션 객체를 확인해보았다.
geth 노드의 http-rcp용 외부 연결 포트인 9000번대 포트를 포함한 HttpProvider를 넣어줌으로써 geth와 연결된 web3 라이브러리를 가져왔다.
const Web3 = require("web3");
describe("블록 테스트", () => {
let web3;
it("web3 연결 테스트", async () => {
web3 = new Web3(new Web3.providers.HttpProvider("http://127.0.0.1:9000"));
const blockQty = await web3.eth.getBlockNumber();
console.log(blockQty); // 현재까지의 블럭개수를 가져옴
// for (let i = 1; i <= blockQty; i++) {
// const blockInfo = await web3.eth.getBlock(i, true); // 특정 블럭에 대한 정보를 가져옴
// console.log(blockInfo);
// for (let j = 0; j < blockInfo.transactions.length; j++) {
// console.log(block.transactions[j]);
// }
// }
console.log(blockQty[127]);
});
it("블록 정보 가져오기", async () => {
const blockInfo127 = await web3.eth.getBlock(127, true);
console.log(blockInfo127);
});
it("getTransaction", async () => {
const tx = await web3.eth.getTransaction(
"0x96f6e1c45521842d5c368f8770132c7bbb21ecad592c3edb7a26f12e9af345f2"
);
console.log("tx값", tx);
});
it("getTransactionReceipt", async () => {
const txReceipt = await web3.eth.getTransactionReceipt(
"0x96f6e1c45521842d5c368f8770132c7bbb21ecad592c3edb7a26f12e9af345f2"
);
console.log("tx Receipt 데이터 :", txReceipt);
});
});
마지막 블럭의 특정 tx 상세 내역을 확인하고자 할 때
web3.eth.getTransaction('트랜잭션 해쉬값')
: 메타마스크에서 geth로 보낸 서명까지만 완료된 트랜잭션 데이터
txpool 까지의 거래이며 아직 evm에서 트랜잭션을 실행시킨 상태는 아니다.
(실질적으론 가스량 측정을 위해 pool에 들어가기 전에도 evm거치고 들어가긴 하는데 어쨌든 evm에서 트랜잭션을 실행하진 않은 상태) 사용자가 날린 트랜잭션 내용만을 확인하고싶을때 쓰는 메소드라고 기억해두면 될듯
web3.eth.getTransactionReceipt('트랜잭션 해쉬값')
: geth가 트랜잭션 내용을 실행한 결과물이다. 즉, evm을 거쳤다 나온 트랜잭션 내용이고, 실제로 트랜잭션 실행에 사용한 가스량도 볼 수 있다.
메타마스크에 private 네트워크 추가해보기!
1. 네트워크 추가
- 네트워크 이름 : 내맘대로 설정
- 새 RPC URL : http-rpc용 포트를 포함한 url 넣어주기
- 체인 ID : 옵션으로 설정한 networkid 넣어주기
- 통화 기호 : 내맘대로 설정
2. 해당 네트워크(노드)의 계정 가져오기
- 파일 : keystore 내에 저장된 계정파일 넣어주기
- 비번 : 계정 생성 시 넣은 비번 넣어주기
헷갈려서 정리해본 구조도? 맞나?
'BlockChain' 카테고리의 다른 글
JS로 스마트 컨트랙트 컴파일, 배포 및 실행 (0) | 2022.07.12 |
---|---|
solidity 시작 - 스마트 컨트랙트 배포와 실행 (1) | 2022.07.11 |
geth로 네트워크 돌려보기 / private 네트워크 구축해보기 (0) | 2022.07.01 |
React프론트-메타마스크 연동 (ft.WEB3) (0) | 2022.06.30 |
json-rpc 프로토콜 / web3 라이브러리 / GAS 란?! (0) | 2022.06.28 |