해보자고

[이더리움 입문 바이블] 본문

블록체인

[이더리움 입문 바이블]

초코맛동산 2023. 5. 5. 02:13

https://www.inflearn.com/course/ethereum-bible/dashboard

 

[무료] 이더리움 입문 바이블: 모든 이더리움 입문자를 위하여 - 인프런 | 강의

본 텍스트 강의는 하나의 '바이블' 을 자처하고, 그러한 기초 내용을 올바르게 담고자 노력한 자료입니다., - 강의 소개 | 인프런

www.inflearn.com

인프런 강의를 토대로 입맛대로 정리 + 복붙한 글입니다. 

 

 

#섹션0

 

- 비트코인 블록체인은 은행과 같은 중앙 기관의 중재 없이 블록체인의 다양한 당사자 간에 돈을 송금하는 데 사용

- 비탈릭 부테린(Vitalik Buterin)은 탈중앙화의 개념을 다양한 분야에서 적용하고 싶어했고, 탈중앙화적으로 전세계적으로 운영 가능한 응용 프로그램을 만들고 싶어함. 

 

-----

 

- 이더리움은 *퍼블릭 블록체인 기반의 *분산 컴퓨팅 플랫폼

- 응용 프로그램 작성 및 글로벌 컴퓨터에서 실행 가능하며, 이 플랫폼은 중단 시간, 검열, 사기 또는 제 3 자의 간섭없이 항상 실행되도록 보장함.

- 모든 컴퓨터(노드라고도 함)는 서로 연결되어 있으며, 코드와 데이터의 전체 복사본을 가지고 있음.

     -> 이더리움 블록체인에 코드를 배포하면 코드가 네트워크의 모든 노드로 복제. 

     -> 응용 프로그램에 데이터가 저장되면 모든 노드에 해당 데이터 복제

          => 네트워크에는 수 많은 노드가 존재하고, 모든 노드를 중지시키는 것은 불가능하기에 응용프로그램에 항상 액세스 가능. 

 

*퍼블릭 블록체인: 누구나 참여할 수 있으며, 모든 참여자들의 상호 검증을 거치는 블록체인 (ex. 비트코인, 이더리움, 라이트 코인 등)

*분산 컴퓨팅:  다수의 컴퓨터가 공통 문제를 해결하기 위해 협업하도록 만드는 방법

 

+) 세계의 컴퓨터 예시 이미지가 이해가 안 감. 

 

-----

(해당 차시 이미지 참고)

- 모든 클라이언트(브라우저)가 연결할 중앙 서버가 없음 

- Dapp(탈중앙화 애플리케이션)과 상호 작용하려는 모든 사람은 컴퓨터/스마트콘 등의 기기에 실행중인 블록체인의 전체 복사본이 필요.

     -> 즉, 애플리케이션 이용을 위해선 블록체인을 다운로드한 후 실행해야 함. 

- 이더리움에는 웹 기반 Dapp을 만들기 위해 web3.js라는 편리한 자바스크립트 라이브러리가 존재.  

- 해당 라이브러리는 블록체인 노드에 연결되며 따라서 유명한 js 프레임워크에(ex. react.js, angular.js) 라이브러리를 포함시킬 수 있음.

- 이더리움 블록체인의 두 가지 요소

데이터베이스 - 네트워크의 모든 트랜색션이 블록체인에 저장 (응용 프로그램 배포도 트랜잭션으로 간주)
- 네트워크의 모든 노드에 데이터 복사본이 동일한지 확인
- 데이터베이스에 유효하지 않은 데이터가 저장되지 않게끔 이더리움은 작업증명(Proof of Work) 알고리즘 사용하여 네트워크 보호

=> 모든 트랜잭션은 공개되며, 누구나 확인 가능하며, 조작이 불가능.
코드  1. (이더리움 세계에서는) 솔리디티(Solidity) 언어로 논리/응용 프로그램 코드(스마트 계약)를 작성
2. 솔리디티 컴파일러를 통해 이더리움 바이트 코드(Ethereum Byte Code)로 컴파일
3. 블록체인에 해당 바이트 코드 배포

+) 스마트 계약 작성시 다양한 언어가 존재함. 솔리디티만 존재하는 것X  

=> 따라서, 이더리움 블록체인은 트랜잭션을 저장할 뿐 아니라 스마트 계약 코드를 저장하고 실행합니다.

=> 기본적으로 블록체인은 데이터를 저장하고 코드를 저장하며 코드를 EVM (Ethereum Virtual Machine)에서 실행

 

 

 

#섹션1

 

- 스마트 계약(Smart Contracts): 스마트 계약은 이더리움 애플리케이션의 기초적인 빌딩 블록으로, 이는 블록체인에 저장된 컴퓨터 프로그램이며, 기존의 계약을 디지털 병렬로 변환할 수 있다. (출처: https://ethereum.org/ko/smart-contracts/)

- 왜 스마트 계약이라고 부를까??

       => 계약서를 작성 -> 코드로 변환 및 블록체인에 배포 -> 디지털 계약 체결

                => 블록체인에 있는 이 코드는 당사자 간 합의를 강화할 수 있다. 

                   - 어떻게 계약이 실행되나???

                          => 일단 계약이 블록체인에 배포되면 이를 중지하거나 수정할 수 없다.

- 작성: 솔리디티(Solidity) 등의 고급 프로그래밍 언어

- 컴파일: EVM 바이트코드 

       - 이더리움의 런타임 환경은 바이트코드만 이해, 실행 가능 

 

- 각 블록체인에는 자체 통화가 존재.

ex) 이더리움 블록체인의 경우 기본 통화는 이더(Ether)

+) 이더를 다른 화폐로 교환할 수 있는 거래소도 존재.

+) 이더에도 다양한 단위 존재. 

출처: 이더리움 입문 바이블

 

- 주소(address) : 공개키 해시(Keccak-256)의 마지막 20바이트로 구성되며, 이더리움 블록체인에서 사용자의 신분증에 해당 (출처: https://steemit.com/kr/@anpigon/ethereum-1)

- 각 주소에는 해당 *개인키가 존재.

 ex) 001d3f1ef827552ae1114027bd3ecf1f086ba0f9

- 블록 체인과 상호 작용하기 위해선 주소 + 개인키 쌍이 필요

 

*개인키: 사용자가 알고 있는 일종의 암호와 같은 것으로 이해. 

 

+) 블록체인과 이더리움을 이해하기 위한 몇 가지 핵심 사항

  1. 이더리움 주소는 공개되어 있으며 전 세계 누구와도 공유 할 수 있다.
  2. 개인키는 절대 다른 사람과 공유해서는 안된다.
  3. 주소 + 개인키는 그 어떤 데이터베이스에도 저장되지 않는다. 사용자만이 이 정보를 통제 할 수 있다.

- 이더리움 주소는 어떻게 생성되나??

     => 1. 개인키 생성 k(private key) = f8f8a2f43c8376ccb0871305060d7b27b0554d2cc72bccf41b2705608452f315 

           2. 개인키로부터 공개키 생성 K(public key) = 6e145ccef1033dea239875dd00dfb4fee6e3348b84985c92f103444683bae07b83b5c38e5e2b0c8529d7fa3f64d46daa1ece2d9ac14cab9477d042c84c32ccd0 

          1. keccak256 알고리즘으로 공개키의 해시값 계산 Keccak256(K) = 2a5bc342ed616b5ba5732269001d3f1ef827552ae1114027bd3ecf1f086ba0f9001d3f1ef827552ae1114027bd3ecf1f086ba0f9 

          2. 생성된 해시값의 뒤쪽 20바이트를 취하여 이더리움 주소 생성 0x001d3f1ef827552ae1114027bd3ecf1f086ba0f9

 

- 계정(account): 이더리움 주소와 개인키의 조합

- 이더리움 계정은 이더 잔고를 보유하고 트랜잭션을 전송할 수 있으며 2가지 유형이 존재한다. 

    - 1) 외부 소유 계정(EOA)

    - 2) 컨트랙트 계정

 

1) 외부 소유 계정(EOA)

- 공개 주소와 개인키 조합

- 다른 계정과 이더 송수신 가능

- 스마트 컨트랙트에 트랜잭션 보내기 가능

 

2) 컨트랙트 계정

- 상응하는 개인키가 존재X

- 스마트 계약을 블록체인에 배포할 때 생성

- 컨트랙트(contract)로만 표기하기도 함.

- 다른 계정과 이더 송수신 가능(EOA와 동일)

- 관련된 코드를 담음 (EOA와 다름)

- EOA나 다른 컨트랙트의 호출을 받아 트랜잭션을 발생시킴

 

- 지갑: 이더리움 계정을 저장, 관리하는 데 사용되는 *소프트웨어 플러그인 또는 라이브러리 

- 지갑으로 여러 계정 관리, 트랜잭션 서명, 잔고 추적 등의 기능 사용 가능 

- 지갑의 유형

     - 1) 비결정적 지갑

           - 임의의 개인키/공개키 쌍을 사용하는 유형의 지갑

           - 개인키/공개키 쌍을 많이 생성할 수 있다.

           - 그러나 각 키 쌍 간에는 상관 관계가 없다.

                  -> 어떤 의미의 상관 관계?? 

                              => 무작위로 서로 간의 관계성이 없는 키를 생성하는 방법 (원래는 개인키로부터 공개키를 생성) 

     - 2) 결정론적 지갑

           - 모든 키가 시드(seed)라는 단일 시작 지점에서 파생

           - 시드는 사용자가 다른 어떤 정보를 요구하지 않고 지갑을 쉽게 백업 및 복원 가능하게 해주며, 개인키를 모른 채                 공개키 생성이 가능하도록 해준다. 

           - 시드는 일반적으로 사람이 읽을 수 있는 *니모닉 문구 단어로 배열됨.

 

*소프트웨어 플러그인: 어떤 프로그램에 없던 새 기능을 추가하기 위해 끼워넣는 부가 프로 그램. 쉽게 부가 소프트웨어 (출처: https://m.cafe.daum.net/myveritas/O8dl/9

*니모닉: 메타마스크, 카이카스 등의 암호화폐 지갑 복구를 위한 12개의 단어로, 단어 12개를 순서대로 맞춰 지갑을 복구, 열 수 있게 해준다. 랜덤한 영어 단어로 이루어져 있다. (출처: https://m.post.naver.com/viewer/postView.naver?volumeNo=34746474&memberNo=40921089)

 

- 가스(Gas) : 아래와 같은 이유에서의 연산의 단위 (일종의 수수료 책정을 위한 것)

      - 블록체인에서 트랜잭션을 실행하려면 네트워크의 *채굴자에게 이더를 지불해야 함. 

            +) 채굴: 거래내역을 기록해주는 사람에게 일을 수행한 대가로 디지털자산을 지급하는 것

      - 이더리움 황서에 기재된 바에 따르면 트랜잭션의단위 연산이 얼마나 많이 포함되는지에 따라 이더의 양이 달라짐

           ex) 단순히 두 개의 숫자를 더하는 작업 -> 3개의 단위 연산 / 곱셈 -> 5개의 단위 연산 

- 가스 가격(Gas Price): 채굴자에게 지불해야하는 이더의 양을 결정하는 요소

      - 트랜잭션 생성자가 원하는 가스 가격 설정 가능 

           ex) 가스당 3Gwei(기위)를 지불할 용의가 있다라고 설정 (트랜잭션이 100000가스 소비, 가스 가격은 3Gwei => 수수료 3000000Gwei 지불) // 이해 안됨.

           +) 0.000000001 ETH = 1 Gwei (10억 Gwei = 1 ETH) 

      - 설정한 가스 가격이 높을 수록 트랜잭션이 더 빨리 처리

            => 채굴자들이 가스 가격이 높은 순서대로 채굴하기에 

- 가스 한도(Gas Limit): 트랜잭션을 실행하기 위해 사용할 가스의 최대 금액을 나타냄.

+) 가스 한도와 *블록 가스 한도(Block Gas Limit)는 다른 것.

 

*블록 가스 한도: 이더리움의 각 블록에 적용되는 최대 캡. 

 

- 이더리움 가상 머신(Ethereum Virtual Machine, EVM): 스마트 컨트랙트를 처리 (배포 및 실행) 하기 위한 256비트 이더리움 가상 머신

        - geth, parity 등의 이더리움 클라이언트를 설치 후 실행하면 EVM이 시작되고, EVM이 트랜잭션의 동기화, 유효성 검사 및 실행을 시작함. 

 

 

 

#섹션2

 

Geth

- 이더리움 재단이 제공하는 공식 클라이언트 소프트웨어

- 개발 언어: Go

- 처음 시작시 이더리움 클라이언트(노드node)에 연결 -> 블록체인 전체 사본 내려받음.

- 블록체인의 복사본을 최신 상태로 유지하기 위해 계속해서 다른 노드와 통신

- 블록 채굴, 블록체인에 트랜잭션 추가, 블록의 트랜잭션 검증, 트랜잭션 실행, 서버 역할, 블록체인에 연결 가능한 자바스크립트 클라이언트(geth sonsole) 존재. 

 

패리티(parity)

- 이더리움 프로토콜의 또 다른 구현체

- 개발 언어: Rust

 

Web3JS

- 이더리움 블록체인과 상호작용할 때 사용하는 유명한 자바스크립트 라이브러리

- 모든 프론트엔드 프레임워크에서 사용자가 탈중앙화 애플리케이션 이용이 가능해짐. 

+) 블록체인과 상호작용하는 또 다른 라이브러리로 Ethers.js 존재. 

 

트러플

- dapps 개발에 많이 사용되는 프레임워크로 블록체인에서 스마트 계약을 컴파일, 배포하는 복잡성을 추상화함. 

+) 트러플 대안으로 Embark 프레임워크 존재. 

 

가나슈

- 메모리 내 블록체인 

- geth, 패리티 등의 개발 속도가 느리다는 문제 해결을 위해 가나슈 사용.

- 100개의 이더가 탑재된 10개의 테스트 계정으로 테스트할 수 있다. 

 

메타마스크

- 이더리움 지갑중 가장 인기있는 지갑 

(강의에 영상이 포함되어 있으나 따로 정리X)

 

 

 

 

 

 

 

 

 

+) 개인적으로 공개키 암호화 공부할 때 좋았던 티스토리

https://koonsland.tistory.com/42

 

공개키 암호화! 원리와 사용방법을 알아보자!

암호화 종류의 마지막인 공개키 암호화입니다. 이전 포스팅에서는 단방향 암호화, 대칭키 암호화를 올려드렸었습니다. 마지막인 공개키 암호화는 국제 표준으로도 있을 만큼 굉장히 많이 사용

koonsland.tistory.com

+) 비트코인 간단한 용어 설명(해당 사이트의 다양한 글을 보면 자세하게 해줌)

https://upbitcare.com/academy/education/blockchain/60

 

비트코인 채굴 원리 - 업비트 투자자보호센터

채굴이란? 디지털자산은 발행되는 과정이 조금 독특합니다. 1개의 디지털자산을 생성하기 위한 과정은 마치 금을 캐내는 것처럼 많은 시간과 노력이 필요하다고 하여 '채굴(mining)'이라고 부릅니

upbitcare.com