Ethereum 개념 & 구조
Ethereum
Ethereum 이란 무엇인가
- 스마트 컨트랙트를 구현한 블록체인 플랫폼이다.
- 스마트 컨트랙트 만을 위한 언어 ( Solidity, LLL 등 ) 을 개발하고 이를 실행시키기 위한 가상 머신 ( EVM, Ethereum Virtual Machine ) 도 제작하였다.
- 비트코인에서는 반복문이 동작할 수 없는 튜링 불완전한 스택 기반의 스크립트 언어라면 이더리움의 스마트 컨트랙트는 반복문을 포함하여 좀 더 복잡한 로직을 구성할 수 있는 튜링 완전 언어를 사용한다.
- 비트코인의 블록체인을 확장하여 탈중앙화된 응용 프로그램 ( dApps ) 이 블록체인상에서 구동 될 수 있는 구조를 가지고 있다.
- 하나의 암호화폐가 하나의 블록체인에서만 거래되던 기존의 패러다임을 여러개의 암호화폐가 하나의 블록체인에 거래될 수 있도록 한 블록체인이다.
- 단순 분산 원장 ( 광범위하게 널리 분포되어 있고 거래 내역을 적은 장부가 있는 ) 수준에 머물러 있던 블록체인을 수많은 서비스에 적용할 수 있게끔 탈바꿈시킨 혁신적인 시스템이다.
- 그래서 이더리움 부터 2세대 블록체인, 2세대 암호화폐 라 불린다. ( 비트코인은 1세대 )
- 단순한 가치 저장의 수단이 아닌 안에서 애플리케이션을 구동하고, 증권 등 자산을 만들고, 계약도 할 수 있는 비즈니스 플랫폼으로 가치를 가진다.
이더리움과 비트코인 ( 1세대 블록체인 ) 차이점
- 암호 해시함수
- 1세대는 SHA 계열의 해시함수를 사용
- 이더리움은 ASIC 저항성을 향상하고 채굴의 중앙화 해소를 위해 Ethash 라는 KECCACK 기반의 해시 알고리즘을 개발하여 사용
- MPT ( Modified Merkle Patricia Trie )
- MPT는 트랜잭션 데이터의 위변조 감지 및 스마트 컨트랙트 관련 상태 정보를 저장, 관리하기 위한 기술
- 1세대는 Merkle Tree를 이용해서 감지
- 이더리움은 Merkle Tree를 Patricia Trie와 접목시킨 MPT를 사용하여 상태 정보를 Key-Value 형식으로 저장하고 관리
- 암호화폐의 관리 기술에 관한 차이
이더리움 클라이언트 종류
- geth ( 81.1% )
- openethereum
- parity-ethereum
- nethermind
- coregeth
- besu
- parity
이더리움 블록체인 네트워크 분류
Public Network 퍼블릭 네트워크
- 메인넷
- 거래소에 있는 이더리움
- 실제 스마트 컨트랙트를 접할 수 있는
- 테스트넷
- 메인넷에 하기 전에 이더리움을 경험해볼 수 있는 네트워크
- 롭슨 (Ropsten), 코반 (Kovan), 링키비 (Rinkeby), 고얼리 (Roerli)
Private Network 프라이빗 네트워크
- Test용, 실습용
- 실제로 이더가 왔다갔다 하지만 메인넷처럼 Valuable 한 이더를 교환하는 것이 아닌 개인적으로 마음껏 이더를 채굴하고 스마트 컨트랙트를 배포할 수있고 이더를 거래할 수 있는 환경이다.
- 진정한 의미의 블록체인 X
이더리움 네트워크 개념도
- 이더리움 네트워크는 많은 노드로 구성되어져있다. ( 로컬PC는 노드1개 )
- 노드들은 수많은 이더리움에 들어있는 데이터들을 다 동기화해서 똑같이 가지고 있다.
- 블록의 형태로 가지고 있다.
- 이 노드들을 활용해서 이더리움 네트워크를 활용할 수 있다.
- 네트워크에 참여하기 위해서는 이더리움 클라이언트가 필요하다.
- geth라는 클라이언트를 사용한다.
환경 설정
-
Chocolatey 설치
- 윈도우 소프트웨어를 위한 머신 수준의 명령 줄 패키지 관리자 이자 인스톨러이다.
- 참고 링크 : https://chocolatey.org/install
- Powershell에 설치 명령 ( 관리자로 실행 )
- 사전 필요 요소 설치
# git > choco install git -y # go language -> geth가 go language로 되어있다 -> git에서 go 다운 받아 이용하기 때문 > choco install golang -y > choco install mingw -y
-
Geth 설치 ( Go Ethereum)
- cmd 창에서 설치
# 디렉토리 생성 > mkdir src\github.com\ethereum # git clone ( go ethereum source code ) > git clone https://github.com/ethereum/go-ethereum --branch v1.9.24 src\github.com\ethereum\go-ethereum # 디렉토리로 이동 > cd src\github.com\ethereum\go-ethereum # compile 작업 > go get -u -v golang.org/x/net/context # install 작업 > go install -v ./cmd/... # 설치 확인 ( cmd 창을 닫았다가 다시 실행 ) > geth version # 1.9.24-stable 버전 확인
-
ganache 설치
- ganache ( 가나슈 )
- 이더리움 개발 툴
- 로컬PC내에 이더리움 블록체인 가상 네트워크를 생성
- 스마트 계약 트랜젝션 송신 가능
- MetaMask 지갑으로 송금가능
- Ganache와 MetaMask 연동으로 이더리움 블록체인 개발 가능
-
node.js 설치
- powershell 에서 설치
> choco install nodejs-lts
-
ganache-cli 설치
- cmd 에서 설치
> npm install -g ganache-cli
- cmd 에서 설치 확인
> ganache-cli --version
- ganache ( 가나슈 )
-
MetaMask 설치 지갑 프로그램
- 설치 링크 : MetaMask
- 크롬 확장 프로그램으로 설치
- 지갑 생성하기
- 동의
- 비밀번호 등록
- 이더리움 지갑 생성 완료
이더리움 계정
- 개인키 생성: 256bit의 무작위 숫자 -> 64자리 Hex 값으로 인코딩
- 타원곡선전자서명 알고리즘(ECDSA, secp256k1)을 사용하여 공개키 생성
- Keccak-256 hashing
- 마지막 20Byte가 계정 주소
이더리움 지갑 생성 과정
-
- 복호화키와 암호화키가 서로 다른 것이다. 공개키 ( 사람들에게 공개된 키 ) 개인키 ( 본인만 알고있는 키 )로 구분
- 공개키 개인키가 하나의 쌍을 이루고 있다.
- 디지털 서명을 할 때는 개인키로 암호화
- 복호화할 때는 공개키를 사용해서 복호화
- 비대칭 키에서 개인키로 암호화 할 시 안전한 전자서명을 통한 인증 과정에 중점을 둔 것
- 비대칭 키에서 공개키로 암호화 할 시 데이터 보안에 중점을 둔 것
- 개인키로 암호화한 공개키로 복호화한 해시값이 같으면 본인이 서명한 것으로 판단
- 대표적인 것으로는 ECDSA ( 타원곡선암호 ), RSA, 디피-헬만
로컬 네트워크 활용 및 실습
-
가나슈 구동
- 직접 이더리움 네트워크에 연결하면 복잡하다.
- 이더리움 네트워크에 연결한 것 처럼 로컬 PC에서 경험할 수 있음.
- cmd창에 geth가 다운받아진 디렉토리에 가서
> ganache-cli -d -m -p 7545 -a 5 # -d -m ( --deterministic --mnemonic ) HD Wallet 생성 시 니모닉 구문 사용 # -p ( --port ) 포트 지정 ( default : 8545 ) # -a ( --account ) 구동 시 생성할 계정 수 ( default 10 ) # 명령어 옵션 확인 > ganache-cli --help
-
가나슈 구동 화면
-
Geth로 네트워크 접속
-
구조
-
Geth 명령어로 가나슈 테스트넷에 접속 ( 새 cmd )
> geth attach http://localhost:7545
-
-
네트워크 기본 사항 확인
-
cmd 창
-
연결성 확인 Connectivity Check
# listening 상태인지 > net.listening # peer가 얼마나 있는지 -> local은 없다 > net.peerCount
- 계정 목록 확인
# 계정 정보 리스트로 > eth.accounts
- 계정 보유 잔액 확인
> web3.fromWei(eth.getBalance(eth.accounts[0]))
-
-
MetaMask로 네트워크 접속
- 사용자 정의 RPC > 네트워크 추가
- 네트워크 이름 : Localhost 7545
- 새로운 RPC URL : http://localhost:7545
- chainId : geth console에서 chainId 확인
> eth.chainId() "0x539"
-
MetaMask 계정으로 이더 전송
- geth console로 이동 ( cmd )
# 1 Ether = 10^18 Wei > tx = { from : "가나슈_제공_계정_중_하나" , to : "메타마스크_계정", value : 1e18} # 전송 > eth.sendTransaction(tx)
- MetaMask를 확인하면 1 이더가 전송된 것을 볼 수 있다.
-
Transaction 정보 확인
> eth.getTransaction("hash")
-
from 주소 잔액 확인
> eth.getBalance(eth.accounts[0]) 98999580000000000000 # gas 값 때문에 딱 안 떨어진다
- 잔액 : 98.99958 Ether
- total gas : 420000GWei ( 21000 * 20GWei ) = 0.00042 Ether
- ( value + 소요 가스 ) 만큼 차감
-
단위 환산
> web3.fromWei(eth.getBalance(eth.accounts[0]), "ether") 98.99958
-
Text ( Data ) 같이 첨부하기
# 1 이더를 "hello" 라는 메세지와 함께 보내기 > eth.sendTransaction({from:"가나슈_제공_계정_중_하나", to:"메타마스크_계정", value:web3.toWei(1,"ether"),data:web3.toHex("hello")})