일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 매개변수
- 아이디 중복체크기능
- JWT 로그인 기능 구현
- useEffect clean up
- cookie-parser 만들어보기
- FormData()
- 라우터미들웨어 분리
- express session
- 라우터 분리
- JWT 하드코딩
- 블록 만들기
- 라우트 매개변수
- 시퀄라이즈 기본설정
- ws 라이브러리
- nodejs파일업로드
- useContext
- javascript기초
- 비동기파일업로드
- 라우터와 미들웨어
- node.js path
- buffer.from
- Uncaught Error: could not find react-redux context value; please ensure the component is wrapped in a <Provider>
- OAuth 카카오
- 세션으로 로그인 구현
- JWT 만들어보기
- express router
- css기초
- express실행
- express.static
- mysql wsl
- Today
- Total
즐코
이더리움 / 스마트 컨트랙트 (EVM?!) / MAC Geth 설치 본문
이더리움 개요
현재까지 배운 블록체인 네트워크, http 서버, p2p서버, 지갑, 지갑서버 등은 비트코인의 형태를 따 온 것이다.
이젠 이더리움을 공부할건데 이 이더리움은 프로그래밍이 가능한 블록체인으로 비트코인과 다른 기술을 도입한다.
비트코인과 달리 smart contract가 이더리움의 핵심이라고 볼 수 있다.
- 비트코인 : transaction의 기능만 구현
- 이더리움 : 기존의 거래뿐만 아니라 조건에 따라 특정 코드가 실행되게끔 구현한 블록체인 플랫폼 => 스마트 컨트랙트
이 스마트 컨트랙트를 위해 이더리움은 EVM 이라는 게 있고, EVM 외에 transaction과 account 내용이 기존의 비트코인과 좀 다르다. 따라서 이 EVM가 뭐고 transaction, account가 비트코인과 어떻게 다른지 가볍게 정리해본다.
1. EVM
Ethereum Virtual Machine 이더리움 가상 머신
이더리움 블록체인 네트워크 상의 노드들이 공유하는 하나의 가상 머신
이더리움은 트랜잭션 내의 스마트 컨트랙트 실행을 위해 어떤 언어로 코드를 만들던, 어떤 os에서 코드가 돌아가던 간에 무조건 똑같이 실행되어야한다. 따라서, 사람이 이해하는 언어에서 기계어, 즉 바이너리 코드로 바꿔 모든 언어/환경에서 돌아가게끔 해주는 것이 필수적이다.
이는 컴파일러에 의해서 기계어로 변환이 되는데, 이를 이더리움 바이트코드라고 한다. 이 바이트코드가 EVM에서 실행되는 것이다.
solidity ===> ethereum byte code ===> EVM
이더리움 실행 환경 설치
- 이더리움에서 제공해주는 소스코드를 다운받고 설치하면 끝!
- 즉, 여태 비트코인 네트워크의 형태를 구현하면서 배웠던 blockchain, blockchain http server, socket기반의 p2p server, wallet server를 합친 이 모든 코드를 이더리움에서 제공해주는데, 이를 다운받고 설치하면 끝난다.
- P2P는 따지면 한 노드가 서버도 되고 클라이언트도 되지만, 이더리움 네트워크 상에선 서버역할을 할지라도 보통 이더리움 클라이언트(노드)라고 부른다. 아래처럼 노드간 코드 전송 시 바이트코드를 전달하여 EVM 으로 실행시킨다.
- EVM 은 블록을 채굴하는 노드만 가지고 있으며 tx pool에 tx가 들어갈 때 tx 유효성 검사를 위해서 채굴자 컴퓨터 내에 evm이 필요함
- 어떠한 OS 기반의 컴퓨터건 작동되야하기때문에 컴파일을 거쳐서 기계어로 실행이 된다. 따라서, 어떤 언어로 구현했던 간에 실행되는데, 보통 Go/Rust/JS/Java 언어로 구현한 코드를 많이 쓴다. 특히, 이더리움 재단에서 만든 Go 언어로 만든 코드가 안정성도 높고 가장 점유율이 높다고한다.
2. Transaction 내용
https://etherscan.io/ 에 가면 각 tx 디테일을 확인할 수 있다. (block explorer)
이 tx 내용 중 가스비(GAS) 와 input Data가 비트코인과 크게 다른 점이다.
이 input data에 스마트 컨트랙트를 위한 binary code가 들어가는 것이다.
트랜잭션 내용이 비트코인보다 간단하고 직관적이다. 아래와 같이 data쪽에 특정 조건 시 실행될 코드가 들어간다고 보면 된다.
자세한 내용은 이제 차차 알아갈 것이다.
3. Account
이더리움에선 크게 두가지 종류의 account 가 있다.
- EOA (Externally Owned Account) : 코인의 입출금 시 쓰는 계정
- CA (Contract Address) : 계약 전용 계정
트랜잭션을 실행시키려면 누가 컨트랙트 내용을 tx의 data 상에 넣었는지 (보낸 이)가 명시되어야하는데 여기서 이 보낸이에 대한 계정이 EOA 이고 to(받는이), value(코인양) 값이 비어있다. 그렇게 해서 트랜잭션이 발동이 되면 그때 리턴값이 있는데, 그게 바로 CA 라고한다.
어떤 특정 블럭에 어떠한 트랜잭션 내용인지를 나타내기 위한 고유키값으로 만들어준 게 CA 라고 한다.. 배포 후에 리턴값으로 CA를 받기 때문에 배포한 사람만 이 CA를 알 수 있다고 한다. * 여기서의 배포는 tx의 data에 스마트 컨트랙트 내용을 넣고 이 트랜잭션을 던지는 것을 말한다. 뭔소린지 아직 감이 안잡힘. 나중에 구현할때 이해하는 걸로 넘어간다ㅋ
또한, 이더리움에선 이 account에 상태값이 있는데, 대표적으로 밸런스/논스/코드/스토리지가 있다.
코드/스토리지는 스마트 컨트랙트에서 나오는 개념이고, 밸런스/논스값이 코인의 입출금과 연관되어있다.
해시값을 찾는 논스와는 다른 개념이다. 여기서의 논스는 단순한 거래, 트랜잭션 횟수를 표현한다고 한다. 밸런스는 말그대로 잔고를 뜻함
2. Geth (게스)
Go + Ethereum = Geth
Go 언어로 개발된 이더리움 클라이언트 소프트웨어를 게스(GETH)라고 한다!
Geth를 설치하면 다른 이더리움 클라이언트(노드)들에 연결되는 작업부터 시작하고 블록체인의 전체 사본을 내려받게 되는 것이다.
블록체인은 거래, 채굴로 인해 계속해서 업데이트 되기 때문에 이를 최신 상태로 유지하기 위해서 Geth로 다른 노드들과 계속해서 통신할 뿐만 아니라, 내 노드 또한 블록체인에 트랜잭션을 추가하고, 이를 검증하며 트랜잭션을 실행시킬수도 있다.
geth 설치 (MAC 기준)
1. Go lang 설치
$ go version
# zsh : command not found: go
brew update
brew install golang
go version
# go version go1.18.3 darwin/arm64
2. 이더리움 소스코드 다운받기
$ cd ~/workspace/blockchain/ethereum
$ git clone https://github.com/ethereum/go-ethereum
$ cd go-ethereum
$ make geth
* 맥에서 make 명령어가 안된다면 xcode 가 설치 되어야하는데, xcode-select --install 명령어를 실행하면 된다.
* make : 터미널 컴파일 명령어 / 파일 간의 종속관계를 파악하여 Makefile(기술파일)에 적힌 대로 컴파일러에 명령하여 SHELL 명령이 순차적으로 실행될 수 있게 한다. 출처: https://bowbowbow.tistory.com/12#make-makefile-이란 [멍멍멍:티스토리]
3. 설치 확인
- geth가 잘 깔렸는지 확인하려면 version을 확인해준다.
$ geth version
# zsh: command not found: geth 와 같이 뜬다면,
$ cd ./build/bin
$ ./geth version
Geth
Version: 1.10.20-unstable
Git Commit: c7f485d9e5b9ffe125d59495da3a13e1f66a24c9
Git Commit Date: 20220626
Architecture: arm64
Go Version: go1.18.3
Operating System: darwin
GOPATH=
GOROOT=go
환경변수가 설정되지않아 geth를 찾지 못한 것이다.
geth 명령어를 치면 "~/workspace/blockchain/ethereum/go-ethereum/build/bin/geth를 실행할수있도록 설정해줘야한다.
4. 환경변수 설정하기
$ pwd
/Users/yjlee/DeskTop/workspace/blockchain/ethereum/go-ethereum/build/bin
$ vi ~/.bash_profile
# home directory의 bash_profile 파일로 들어가서 편집 모드로 변경
# 아래 코드를 써준다.
export PATH=$PATH:/Users/yjlee/DeskTop/workspace/blockchain/ethereum/go-ethereum/build/bin
# esc -> : (콜론) -> wq! 로 저장 후 종료
$ source ~/.bash_profile
5. geth 실행하기
geth 명령어 하나로 이더리움 메인넷에 접속이 되었다.
이더리움 네트워크를 그대로 가져오기 때문에 계속해서 터미널에 콘솔이 찍히니 ctrl+c 로 나가준다!
$ geth
# 실행결과
INFO [06-27|10:53:02.865] Starting Geth on Ethereum mainnet...
INFO [06-27|10:53:02.865] Bumping default cache on mainnet provided=1024 updated=4096
INFO [06-27|10:53:02.867] Maximum peer count ETH=50 LES=0 total=50
INFO [06-27|10:53:02.868] Set global gas cap cap=50,000,000
INFO [06-27|10:53:02.868] Allocated trie memory caches clean=614.00MiB dirty=1024.00MiB
INFO [06-27|10:53:02.869] Allocated cache and file handles database=/Users/yjlee/Library/Ethereum/geth/chaindata cache=2.00GiB handles=5120
INFO [06-27|10:53:03.130] Opened ancient database database=/Users/yjlee/Library/Ethereum/geth/chaindata/ancient readonly=false
INFO [06-27|10:53:03.130] Writing default main-net genesis block
...
** web3 : 기존엔 axios 등을 통해서 블록체인 네트워크의 http서버로 요청을 날리고 응답을 받는 흐름으로 진행했었는데, 이더리움에선 이를 수월하게 사용하게끔 도와주는 라이브러리가 존재하는데 그게 web3이다. 추후 사용할 예정이니 그때 자세히 정리해야겠다.
ganache 가나쉬 라이브러리!
로컬에서만 실행되는 이더리움 네트워크이다. 테스트용도로 쓴다.
다만, 채굴 기능도 없고, p2p 통신 기능도 없다. 또한, 1tx 당 1block을 생성한다.
해당 라이브러리를 실행시키면 아래 스크린샷처럼 계정 및 개인키가 10개 자동생성됨과 동시에 서버가 돌아간다.
이렇게 만들어진 계정/개인키를 이용해서 메타마스크와 연동하여 이더리움의 트랜잭션과 web3에 대해 이해하고, 나중엔 ganache는 버리고 geth 로 넘어갈 것이다.
$ npm i -g ganache-cli
# 실행
$ ganache-cli
# 또는
$ npx ganache-cli
앞으로의 공부 방향
1- 이더리움 생태계 이해하기!
- 이더리움 네트워크 설치까지 끝냈으니 이 이더리움 네트워크를 사용해서 제네시스 블럭만 수정해서 우리만의 로컬 네트워크를 만들어볼것이다.
- 원래는 월렛을 간단하게 구현했으나 이젠 실제로 존재하는 지갑 프로그램인 메타마스크를 활용해서 우리가 만든 네트워크와 통신을 해볼 것, 이렇게 통신할 때 쓰는 라이브러리가 web3이고 사용법에 대해 익힐 것이다.
- 메타마스크와 연결된 프론트서버를 하나 만들어서 메타마스크 쪽으로 요청을 넣어서 메타마스크가 geth (이더리움 네트워크) 쪽과 통신을 하는 흐름을 배울 것이다.
2- 스마트 컨트랙트!
위에서 말한 이더리움 생태계, 네트워크에 어느정도 익숙해지면 그 때서야 smart contract 작성을 위한 solidity를 배울 예정이다.
'BlockChain' 카테고리의 다른 글
React프론트-메타마스크 연동 (ft.WEB3) (0) | 2022.06.30 |
---|---|
json-rpc 프로토콜 / web3 라이브러리 / GAS 란?! (0) | 2022.06.28 |
지갑, 트랜잭션 구현 (6) - 트랜잭션 풀 업데이트와 브로드캐스트 (0) | 2022.06.25 |
지갑, 트랜잭션 구현 (5) - 트랜잭션, utxo 업데이트! (0) | 2022.06.23 |
지갑, 트랜잭션 구현 (4) - txIn, txOut, UTXO (0) | 2022.06.22 |