인프런 -블록체인 이더리움 부동산 댑(Dapp) 만들기
1. Geth로 프라이빗 노드 구축(제네시스 블록, 계정 생성)
- genesis 블록 생성(노드 초기화에 필요)
puppeth
라는 geth 인스톨 될 때, 같이 설치되는 툴을 가지고 제네시스 블록을 생성.- chain/network ID 설정시, public ID는 피해야함 (1: Main net, 2: modern test net(이제안씀) , 3. Ropsten test net, 5. Rinkeby test network, 42: kovan test net)
- code mynetwork.json 하면 제네시스 블록, 즉 첫번째 블록이 담고 있는 정보를 보여줌
- 이더리움 노드에서 제네시스 블록의 내용을 읽고 체인의 시작을 어떻게 해야 하는지 초기화하는 것.
- config : chain의 parameter
- timestamp : 이더리움 가상머신에서 블록 생성의 난이도를 조절함. 연속되는 두 개의 블록의 타임스템프 차가 작으면 난이도가 올라간다. 타임스탬프는 또한 블록들이 올바른 순서대로 진행되는지 확인
- gas limit : 블록 내의 트랜잭션이 소비할 수 있는 최대 가스값. 각 블록마다 트랜잭션을 몇개나 할 것인지 제한해서 블록 사이즈 조절
- difficulty : 채굴자가 블록을 풀기 위해 연산을 몇번이나 해야하는지. 직접적인 연관. 높으면 채굴시간이 길어짐
- alloc : 지갑주소에 자금을 미리 할당하는 내
- number: 제네시스 블록
- gasUsed : 블록 내에서 여러 트랜잭션을 처리하면서 상용된 모든 가스의 합계
- parentHash: 부모블록의 해쉬 정보
private node 초기화
geth --datadir . init mynetwork.json
- 현재 디렉토리에 private node data를 저장한다.
- 관련 정보 생성이 되었다.
- geth 폴더 안에는 모든 체인에 관한 데이터가 저장되어 있다.
- keystore는 우리가 만들 계정들을 저장하는 공간
geth --datadir . account new
: keystore 폴더 안에 무작위로 새로운 이더리움 계정 생성- 총 3개 생성.
- 계정을 리스트로 보여주는 커맨드 :
geth --datadir . account list
- 생성한 순서대로 번호를 매겨서, 계정 주소와 파일이 어디에 위치해있는지 알려줌. 첫 번째 계정은 모든 채굴 보상금이 이 계정으로 들어간다.
2. Geth로 프라이빗 노드 구축 2(노드 첫 실행, DAG 파일 생성)
- 노드 실행. 스크립트를 만들어서 파라미터를 지정해줘야함.
code nodestart.cmd
(cmd : command script) get --networkid 4386 --mine --minerthreads 2 --datadir "./" --nodiscover --rpc --rpcprot "8545" --rpccorsdomain "*" --nat "any" --rpcapi eth,web3,personal,net --unlock 0 -- password ./password.sec
- 무조건 첫 번째 라인에 있어야 유지가 된다.
code password.sec
- generating DAG in progress
- DAG : 에타시?채굴 알고리즘에서 필요로 하는 데이터 구조. 노드 처음 실행시 DAG 파일 생성. 노드가 채굴을 하기 위해서 이 DAG파일이 생성이 되어야 한다. 3만 블록. 명칭 -> 에폭?1이 100이 되면 끝이 남.
- 트랜잭션이 없어도 블록채굴을 하는 이유 : 트랜잭션 처리 + 새로운 에더 생성에도 목적이 있기 때문
3. Geth로 프라이빗 노드 구축 3(Geth 콘솔)
geth attach ipc://./pipe/geth.ipc
->이게 실행이 안되서 그냥 geth attach ipc로 함.- 해당 명령어는 백그라운드로 돌고 있는 노드에 연결시켜서 자바스크립트 console을 연다. 몇 가지 정보 확인 가능
- coinbase (3개의 계정 중 첫 계정 의미)
- module : 이 창에서 쓸 수 있는 api 나열.
- nodestart.cmd에 파라미터로
-rpcapi
주고 값으로eth,web3,personal,net
을 줬었다. eth.coinbase
: coinbase 계정 등장eth.accounts
: 현재 노드에 등록된 모든 계정eth.getBalance(eth.accounts[1])
2번째 계정의 잔액을 본다.eth.getBalance(eth.coinbase)
: 이 금액 wei 변환되서 나옴.(terminal에서는 그냥 0붙여서 나옴) wei는 adder를 나타내는 데 가장 낮은 단위web3.fromWei(eth.getBalance(eth.coinbase),"ether")
이렇게 치니 308 나오네miner.stop()
: 채굴 멈추기miner.start(2)
: 2는 몇개의 채굴기 사용.personal.unlockAccount(eth.accounts[1],"비밀번호",200)
: 계정 언락. 계정의 프라이빗키. 즉 개인키를 열어서 트랜잭션에 서명할 수 있게. 디폴트로 프라이빗키는 잠궈져 있고 계정의 비밀번호를 알고 있어야 언락 가능. 일정시간동안 언락도 가능. 200초 unlock 걸어놓음eth.sendTransaction({from:eth.coinbase, to:eth.accounts[1], value:web3.toWei(20,"ether")})
리턴된 것 : 새로운 트랜잭션이 만들어진 것.eth.getBalance(eth.accounts[1])
: 보낸 것 확인하기exit
console 나가기
참조
https://www.inflearn.com/course/blockchain-%EC%9D%B4%EB%8D%94%EB%A6%AC%EC%9B%80-dapp#