본문으로 건너뛰기

Glossary

Account

  • 이더리움에서 state는 account라고 불리는 객체로 구성된다
  • account는 20바이트 주소를 가진다
    • 비밀키 -> 공개키
      • 비밀키를 ECDSA으로 패어링
    • 공개키 -> 주소
      • Keccak-256을 사용하여 공개키의 해시를 계산하고 마지막 20바이트가 주소가된다.
  • 이더리움의 State는 각 Account들의 상호 메시지 전달 프레임워크를 통해 변환됨

Account Fields

  • account의 state는 4가지의 필드로 구성된다.
  • nonce
    • 각 트랜잭션이 한 번만 처리될 수 있도록 하기 위해 사용되는 카운터
    • 외부 소유 계정 계정인 경우이 주소에서 보낸 트랜잭션의 수
    • [컨트랙트 계정](#contract account)인 경우 이 계정으로 만든 컨트랙트 생성 수
    • 최초에 0으로 초기화되어 있다.
  • balance
    • 이 주소에 의해 소유된 이더(Wei)의 양
  • codeHash
    • 외부 소유 계정의 경우: 빈 문자열의 Hash
    • 컨트랙트 계정의 경우 : 계정의 EVM 코드 해시
    • 주소가 메시지 수신할 경우 실행되는 코드입니다.
    • 코드는 불변하므로 다른 필드와 달리 생성 후에 바뀌지 않는다.
    • 이러한 모든 코드 조각은 나중에 검색할 수 있도록 해당 해시의 상태 데이터베이스에 포함되어 있습니다.
  • storageRoot
    • 생성 초기 비어있다.
    • 계정의 storage 내용을 인코딩하는 Merkle Patricia 트리의 루트 노드에 대한 256비트 해시

EOA

  • 외부 소유 계정(Externally Owned Accounts)

    • Ethereum 네트워크의 사용자(사람)에 의해 생성된 계정입니다.
  • 외부 소유 계정은 개인키가 있는 계정이다

    • 개인키를 갖는다는 건, 자금 또는 컨트랙트에 대한 접근을 제어한다는 뜻이다.
  • code를 가지고 있지 않다

  • 트랜잭션을 만들고 서명함으로써 메시지를 전송할 수 있다.

Contract Account

  • 스마트 컨트랙트 코드를 가지는 계정

  • 컨트랙트 계정은 개인키가 없다.

    • 대신 스마트 컨트랙트 코드의 로직으로 통제된다
    • 트랜잭션을 시작할 수 없다(컨트랙트의 발신자가 될 수 없다)
    • EOA만 트랜잭션을 시작할 수 있다.
  • 스마트 컨트랙트 코드는 컨트랙트 계정 생성 시 이더리움 블록체인에 기록되고 EVM에 의해 실행되는 소프트웨어 프로그램이다.

  • 메시지를 받을 때 마다 코드가 작동한다

    • 트랜잭션 목적지가 컨트랙트 주소일 때 트랜잭션과 트랜잭션 데이터를 입력으로 사용하여 컨트랙트가 EVM에서 실행된다.
    • 트랜잭션에는 실행한 컨트랙트의 측정 함수와 해당하는 함수에 전달할 파라미터를 나타내는 데이터를 포함할 수 있다.
  • storage를 읽고 쓸 수 있다

  • 메시지를 보내거나 컨트랙트를 만들 수 있다.

Address

  • 주소는 일반적으로 트랜잭션을 수신하거나 전송할 수 있는 EOA 또는 계약을 나타낸다.
  • 주소 = ECDSA 공개 키의 Keccak hash의 가장 오른쪽 160비트

Block

  • 비트코인의 블록과 유사하지만 차이점이 있다.
    • 주요 차이점으로는 비트코인과는 달리 이더리움 블록은 트랜잭션 리스트와 가장 최근의 상태(state) 복사본을 가지고 있다는 것이다.
  • 블록 구성요소
    • transaction 리스트
    • 최신 state
    • 블록 넘버
    • difficulty

Bolck Headers

  • number
    • 부모 블록의 수
    • 제네시스 블록은 number가 0
  • parentHash
    • 부모 블록 헤더의 해시(The Keccak 256-bit hash)
  • timestamp
    • 블록 생성시 시간
  • beneficiary
    • 160비트 주소
    • 채굴 승자에게 주어지는 수수료의 합을 이 주소로 전송한다.
  • difficulty
    • 블록의 난이도
    • 블록의 난이도는 이전 블록의 난이도와 타임스탬프로 계산된다.
  • gaslimit
    • 블록당 소비할 수 있는 최대 가스 양
    • 현재 gaslimit은 6,712,096gas로 한 블록에 Standard Transaction (21,000Gas)을 약 319개 넣을 수 있는 양임.
  • gasUsed
    • 블록의 트랜잭션들에서 사용된 가스의 총 양
  • stateRoot
    • 모든 트랜잭션이 실행되고 종료된 후 상태 트리의 루트 노드의 해시(The Keccak 256-bit hash)
    • 세계 상태(World State: 모든 계정들의 상태의 전체 집합)는 Merkle-Particia 트리의 형태로 각 노드에 저장되고 각 블록에는 세계 상태 트리의 최상위 노드만 저장한다.
  • transactionsRoot
    • 트랜잭션으로 채워진 트리 구조의 루트 노드의 Keccak 256비트 해시
    • 블록에 포함된 모든 거래는 트리 형태로 저장되고 각 노드에 저장되고 블록에는 거래 트리의 최상위 노드만 저장한다.
  • receiptsRoot
    • 모든 거래는 영수증을 발생시키고 이렇게 각 거래에 대응되는 영수증 집합은 트리 형태로 저장된다.
    • 블록에는 영수증 트리의 최상위 노드만 저장한다.
  • logsBloom
    • Log 정보로 구성된 Bloom Filter
  • extraData
    • 이 블록과 관련된 추가 Data
  • mixHash
    • Ethash(작업증명)의 연산 결과로 생성되는 해시 (32바이트)
  • nonce
    • Ethash(작업증명)에서 사용된 논스
  • Uncles Hash(ommersHash)
    • 이 블록의 Uncle에 해당하는 Block List의 Hash 값

Block Validation Algorithm

  • 기본적인 이더리움 블록 검증 알고리즘은 다음과 같다.

ethereum-apply-block-diagram

  1. 이전 참조되는 블록이 존재하고 유효한지 검사
  2. 현재 블록의 타임스탬프가 참조하고 있는 이전 블록의 그것보다 크면서, 동시에 현 시점을 기준으로 15 분 후보다 작은 값인지 확인한다.
  3. 해당 블록의 블록 넘버, difficulty, 트랜잭션 루트, 언클 루트, gas limit이 유효한지 검사
  4. 해당 블록의 POW가 유효한지 검사
  5. S[0]를 이전 블록의 마지막 상태라고 하자
  6. TX를 블록에 포함될 transaction N개의 리스트라고 하자
    • 모든 i 에 대해서 S[i+1] = APPLY(S[i],TX[i]) 라고 설정
    • 블록에서 소비된 총 가스가 GASLIMIT를 초과할 경우 오류를 반환한다.
  7. 채굴자에게 지불된 보상 블록을 S[n] 덧붙인 후 이것을 S_FINAL 이라 하자.
  8. 상태 S_FINAL 의 머클 트리 루트가 블록 헤더가 가지고 있는 최종 상태 루트와 같은지를 검증한다.
    • 이 값이 같으면 그 블록은 유효한 블록이며, 다르면 유효하지 않은 것으로 판단한다.

Block과 State

  • 모든 상태를 각 블록에 저장하는 것은 매우 비효율적인 것처럼 보이지만, 실제로는 효율성의 측면에서는 비트코인과 비교할만 하다.
  • 그 이유로는 상태가 트리 구조로 저장되고, 모든 블록 후에 단지 트리의 작은 부분만이 변경되기 때문이다.
  • 보통, 인접한 두개의 블록간에는 트리의 대부분의 내용이 같고, 따라서 한번 데이터가 저장되면 포인터(서브트리의 해쉬)를 사용하여 참조될 수 있다.
  • 패트리시아 트리(Patricia tree)로 알려진 이러한 종류의 특별한 트리는 머클 트리 개념을 수정하여 노드를 단지 수정할 뿐만 아니라, 효율적으로 삽입되거나 삭제하여 이러한 작업을 수행할 수 있도록 해준다.
  • 모든 상태 정보가 마지막 블록에 포함되어 있기 때문에, 전체 블록체인 히스토리를 모두 저장할 필요가 없어지게 된다.
  • 이 방법을 비트코인에 적용한다면 5 - 20 배의 저장 공간 절약의 효과가 생길 것이다.

Stale Block

image-20211103171645657

  • 블록생성에 성공하였고, 검증 작업시, 오류가 없어서 네트워크를 통해 전파되었으나, 더 빨리 전파 된 다른 채굴자에 의한 블록에 순위가 밀리는 바람에 주체인에 산입되지 못한 블록이다.
  • 이더리움과 같은 짧은 블록 생성 주기(15초)를 가지는 블록체인에서는 스테일 블록이 생성될 확률이 높다.
  • 이더리움에서는 스테일 블록도 여전히 주체인블록 보상의 87.5%만큼의 보상을 받으며 보안성을 강화하는 역할을 수행하게 된다.
  • GHOST Protocol

Blockchain

  • 퍼블릭 블록체인의 구성 요소
    • 표준화된 가십 프로토콜을 기반으로 참여자를 연결하고 트랜잭션 및 검증된 트랜잭션 블록을 연결하는 P2P 네트워크
    • 상태 전이를 나타내는 트랜잭션 형식의 메시지
    • 트랜잭션의 구성 요건과 트랜잭션의 유효성을 판단하는 합의 규칙의 집합
    • 합의 규칙에 따라 트랜잭션을 처리하는 상태 머신
    • 검증되고 적용된 모든 상태 전이의 장부 역할을 해줄 수 있는, 암호학적으로 보호된 체인
    • 합의 규칙들을 적용하는데 모든 참여자가 협력할 수 있도록 강제함으로써 블록체인의 통제 권한을 탈중앙화하는 합의 알고리즘
    • 공개된 환경에서 상태 머신에 경제적인 보안성을 제공할 수 있는 게임 이론적으로 유효한 인센티브 메커니즘
    • 위에서 언급한 것들을 구현한 하나 이상의 오픈 소스 소프트웨어
  • 블록체인 핵심 특성
    • 개방성
    • 공공성
    • 국제화
    • 탈중앙화
    • 중립성
    • 검열 저항성

Consensus Algorithm

  • 합의 알고리즘이란 피투피 네트워크와 같이 정보 도달에 시간차가 있는 네트워크에서 여러 참가자들이 하나의 단일한 결과에 대한 합의를 얻기 위한 알고리즘이다.
  • 블록체인 시스템의 경우 네트워크에 참여하는 모든 참여자들이 동일한 데이터를 복사하여 분산 저장하기 때문에 원본과 사본의 구별이 없으며, 통일된 의사결정을 내릴 수 있는 권위 있는 중앙(center)이 존재하지 않는다.
    • 이런 상황에서 합리적이고 효율적인 의사결정을 내릴 수 있는 다양한 알고리즘이 개발되었다.

Contract

Code Execution

  • 이더리움 Contract의 코드는 "이더리움 가상 머신 코드" 또는 "EVM 코드"라고 하는 저수준의 스택 기반 바이트코드 언어로 작성된다.
  • 이 코드는 연속된 바이트로 구성되어 있고, 각각의 바이트는 연산(operation)을 나타낸다.
  • 일반적으로 코드 실행은 코드 끝에 도달하거나 오류 또는 STOP 또는 RETURN 명령이 감지될 때까지 현재 프로그램 카운터(0에서 시작)에서 작업을 반복적으로 수행한 다음 프로그램 카운터를 하나씩 증가시키는 무한 루프이다.
  • operation은 데이터를 저장할 수 있는 세 가지 유형의 공간에 액세스할 수 있습니다.
    • 스택: 값을 넣고 뺄 수 있는 선입선출 저장소
    • 메모리: 무한 확장 가능한 바이트 배열
    • 스토리지: 계약의 장기 보관, 키/밸류 스토어. 연산이 끝나면 리셋되는 스택이나 메모리와 달리 스토리지는 장기간 지속된다.
  • 코드는 또한 블록 헤더 데이터뿐만 아니라 특정 값이나, 발송자 및 수신되는 메시지의 데이터에 접근할 수 있고, 결과값으로 데이터의 바이트 배열을 반환할 수도 있다.
  • 물리적인 하드웨어 관점에서 볼 때, 컨트랙트 코드는 “어디에서" 실행되는가?
    • 트랜잭션이 블록 B 에 포함되면 그 트랜잭션에 의해 발생할 코드의 실행은 현재 또는 향후에 블록 B 를 다운로드 하고 검증하는 모든 노드들에 의해 실행될 것이다

Dapp

  • Dapp은 공개되고 탈중앙화된 피어투피어 기반 서비스 위에 제공되는 웹 애플리케이션

Dapp의 특징

  • 오픈 소스
    • 개발한 소스 코드가 모두 공개되어 있으므로 사용자를 속이고 무단으로 정보를 빼가는 것(위치 정보 수집 등)이 불가능.
  • 자율적 수행
    • 한번 배포된 Dapp은 코드에 따라 자율적으로 수행됨. 개발자를 포함한 외부의 개입이 원천적으로 차단됨.
  • 보안성
    • 블록체인의 보안성에 의존하고 있으므로 해커의 침입 및 데이터의 위조로부터 안전함.
  • 100% 가용성
    • 중앙화된 서버와는 다르게 점검 혹은 트래픽으로 인한 장애가 없이 항상 가동되고 있음을 보장함.

Dapp의 구성 요소

  • 최소 구성 요소
    • 블록체인 스마트 컨트랙트
    • 웹 프론트엔드 사용자 인터페이스
  • 추가 요소
    • 탈중앙화 스토리지 프로토콜과 플랫폼
    • 탈중앙화 메시지 프로토콜과 플랫폼

Dapp의 종류

  • 토큰 시스템
    • 새로운 암호화폐, 주식, 스마트 자산, 위조불가능한 쿠폰, 포인트 시스템 등
  • 탈중앙화된 자율조직(DAO)
    • 특정한 집합의 구성원 또는 주주를 갖고 있는 가상 독립체가 코드에 의해 운영됨
  • 다중서명 공탁 계좌
    • 5명 중 4명이 동의하면 전체 금액, 5명 중 3명이 동의하면 10%를 사용 등 설계
  • 클라우드 컴퓨팅
    • 빅데이터, 과학 연구, 유전자 분석 등 작업을 참여 노드가 분산적으로 수행
  • 탈중앙화된 장터
    • 신원 조회/ 평판 시스템 기반 P2P 장터를 구축
  • 파생 상품과 가치 안정 통화
    • 금융 시스템의 핵심인 파생 상품 구현 및 외부 시세 참조를 통한 가치 안정 통화
  • 신원 조회 / 평판 시스템
    • 인터넷의 도메인을 IP 주소와 연결하는 DNS 및 사용자 명의 등록 시스템
  • 분산형 파일 저장소
    • 유저 개개인이 남는 하드디스크 공간을 대여해주는 댓가로 소액의 보상을 지급

Digital Signature

Ethash

image-20211103162956109

  • 이더리움은 이더해시(Ethash)라는 작업증명 알고리즘을 사용하여 채굴할 수 있다.
  • 이더리움은 비트코인과 같은 작업증명(PoW) 방식의 합의 알고리즘을 사용하고 있고 있지만, 기존 비트코인의 SHA-256 방식을 사용하지 않고, Hashimoto/Dagger hybrid인 이더해시(Ethash) 방식을 사용한다.
    • Dagger 와 Hashimoto 알고리즘의 장점을 결합한 Dagger-Hashimoto 의 수정버전
  • 기존의 작업증명(PoW) 방식에서는 중국의 비트메인 등 소수의 채굴업체들이 에이식(ASIC) 방식의 고성능 채굴기를 제작하고 거대한 마이닝풀을 구성하여 막강한 영향력을 행사할 수 있다.
    • 심지어 전체 해시파워의 과반수에 이르는 연산력을 보유하고, 이른바 51% 공격도 가능한 상황이었다.
  • 이더리움이 채택한 이더해시 방식을 따를 경우, 에이식(ASIC) 채굴기를 사용한 채굴이 매우 어렵다.
    • 이더리움을 채굴하려면, 채굴하기 전에 컴퓨터에서 대그(DAG) 작성이라는 프로세스를 수행해야 한다.
    • 해시값을 구하기 위해서는 논스뿐만 아니라 DAG의 데이터를 랜덤하게 읽어와야 한다.
  • 컴퓨터 메모리상의 일정 양의 데이터를 읽은 후 이를 넌스와 함께 해시계산을 함으로써 메모리 IO 중심의 작업 증명
    • Memory Hard Computation
    • Memory Easy Validation
    • DAG에서 한번에 읽어오는 데이터는 128 바이트이므로 하나의 논스를 해시할 때에 (128 바이트 * 64) = 8KB의 메모리를 읽어오는 작업이 필수적이고, 따라서 연산력은 프로세서(CPU, GPU)의 속도보다 RAM의 속도에 큰 영향을 받는다.
  • 약 12초에 하나의 블록을 생성하는 것이 알고리즘의 궁극적인 목표

HASHIMOTO

  • CPU에 비해 상대적으로 느린 메모리(RAM)의 최대 읽기/쓰기 속도보다 빠르게 채굴을 수행할 수 없는 알고리즘

DAGGER

  • DAG(Directed Acyclic Graph)를 사용하여 메모리 상으로 계산하기 어렵지만 검증하기 쉬운 알고리즘

Ether

  • 이더리움(Ethereum) 네트워크는 그 안에서 자체적으로 통용되는, ‘이더(Ether)’라는 화폐를 가지고 있다.
  • 이더는 여러가지 가상자산들간의 효율적인 교환을 가능하게 하는 매개물의 역할을 하며, 또한 트랜잭션 수수료를 지불하기 위한 방법을 제공한다.

Ether와 Gas

  • 이더리움 월드 컴퓨터에서 계산 비용을 지급하기 위한 가스를 이더로만 살 수 있다.
  • 이더는 트랜잭션과함께 보내야하고 가스 구매를 위한 허용 가능한 가격을 명시적으로 지정한다.
  • 가스의 가격은 정해져있지 않다.
  • 트랜잭션을 위해 가스가 구매되고, 계산을 수행하고, 사용 후 남은 가스는 발신자에게 반환된다.

Ethereum

  • 종종 월드 컴퓨터라고 불린다.
  • 이더리움은 스마트 컨트랙트라는 프로그램을 실행하는 오픈 소스에 기반을 둔 전 세계에 걸쳐 탈중앙화된 컴퓨팅 인프라스트럭쳐이다
  • 블록체인을 사용하여 시스템의 상태 변화를 동기화하고 저장하며, 이더라고 하는 암호화폐를 이용하여 실행 자원 비용을 측정하고 제한한다.
  • 개발자는 이더리움 플랫폼을 사용해서 경제적 기능들을 내장한 강력하면서도 탈중앙화된 애플리케이션을 개발할 수 있다.
  • 이더리움 플랫폼은 고가용성, 감사 가능성, 투명성, 중립성을 제공하는 동시에 검열을 줄이거나 없애고, 거래상대방의 위험을 줄인다.
  • 이러리움의 주된 목적은 디지털 화폐 지급 네트워크가 아니다
    • 이더의 주 목적은 월드 컴퓨터로서 이더리움 플랫폼 사용로를 지불하기 위한 유틸리티 화폐이다.

EVM

Fallback Function

  • 트랜잭션에 데이터가 없거나 선언된 함수 이름이 없는 경우 호출되는 컨트랙트의 기본 함수입니다.

Gas

GHOST Protocol

  • Greedy Heaviest Observed Subtree
  • 다중 체인 방지 프로토콜
    • 스테일 블록 문제 해결
    • 빠른 블록 생성 시 스테일 블록이 많이 생성되고 그로 인해 보안성이 저하된다.
  • GHOST 는 어느 체인이 “가장 긴(longest)”것인지 계산할 때 스테일 블록도 포함으로써 네트워크 보안 손실이라는 문제를 해결한다.
    • 어느 블록이 가장 큰 전체 작업증명을 가지고 있는지 계산할 때 그 블록의 모블록과 그 조상뿐만 아니라, 그 블록의 삼촌까지도 더한다는 것이다
    • 스테일 블록도 기본 보상의 87.5%를 받게 되며, 그 스테일 블록을 포함하고 있는 사촌이 나머지 12.5%를 받는다.
    • 하지만 수수료는 삼촌들에게는 주어지지 않는다.
  • GHOST 프로토콜은 가장 최신의 블록넘버를 가진 경로(계산을 가장 많이 수행한 경로)를 선택하도록 함
  • 스테일 블록에 대한 보상을 지급함으로써 스테일 블록을 메인체인에 포함하여 Difficulty의 상승을 유도함

삼촌 블록 현재의 블록과 조부모 블록을 공유하는 블록으로써, 최대 6대 위의 블록까지만, 최대 2개의 블록만 삼촌 블록으로 기록될 수 있다. 삼촌 블록은 유효한 블록 헤더를 가지고 있어야 하며 유효한 블록일 필요는 없다. 삼촌 블록의 채굴자는 기본 블록 보상의 93.75%를 지급받고 삼촌 블록을 기록한 블록의 채굴자는 기본 보상에 3.125%를 추가로 지급받는다.

Merkle-Patricia Tree

image-20211103164512521

  • 머클 트리와의 차이점
    • 머클 트리를 수정한 트리로써, 각 노드가 하나의 해시값을 가지고 있는 것이 아니라 해시값 중 한 글자만 가지고 있는 트리. 트리를 탐색함으로써 전체 해시값을 얻게 된다.

머클 트리의 탐색 방법

  • HK에 해당하는 거래를 검색하기 위해서는 HL, HIJ, HMNOP, HABCDEFGH가 있으면 되고 이를 머클 경로라고 한다.

Message(INTERNAL TRANSACTION)

  • 컨트랙트는 다른 컨트랙트으로 메시지를 보낼 수 있다.
  • 메시지는 트랜잭션과 다르게 별도 저장할 필요가 없으며 이더리움 실행 환경에만 존재하는 가상 객체입니다.
  • 컨트랙트CALL opcode를 실행할 때 메시지가 생성된다.

Message 구성요소

  • 메시지 발신인

  • 메시지 수신인

    • CA 또는 EOA
  • ether 양

  • Data(데이터)

  • STARTGAS

Transaction과 비교

  • 본질적으로 메시지는 외부 행위자가 아닌 컨트랙트에 의해 생산된다는 점을 제외하면 트랜잭션과 유사하다.
  • 트랜잭션과 마찬가지로 메시지는 수신자 계정으로 코드를 실행되게한다.
  • 그러므로 계약들은 외부 행위자들이 할 수 있는 것과 정확히 같은 방식으로 다른 계약들과 관계를 맺을 수 있다.

Nonce

Orcle

PoW

  • 작업증명(PoW, Proof of Work)이란 목표값 이하의 해시를 찾는 과정을 무수히 반복함으로써 해당 작업에 참여했음을 증명하는 방식의 합의 알고리즘이다.
  • 작업증명에서는, 분산 합의의 결론을 도출하는 과정에서 더 많은 연산 작업을 수행한 주체일수록 결과를 결정할 수 있는 더 큰 영향력을 보유하게 된다.

PoS

  • 지분증명(Proof of Stake)
  • 지분증명이란 해당 암호화폐를 보유하고 있는 지분율에 비례하여 의사결정 권한을 주는 합의 알고리즘이다.
    • 해당 암호화폐를 보유한 지분에 따라 채굴에 성공할 확률이 결정된다.
  • 지분증명에서는, 분산 합의의 결론을 도출하는 과정에서 더 많은 지분을 보유한 주체일수록 결과를 결정할 수 있는 더 큰 영향력을 보유하게 된다.
  • 채굴 과정이 필요 없다
  • 지분증명은 작업증명(PoW)의 문제점으로 거론되는 막대한 에너지 및 리소스 소모를 해결한다.
  • 별도의 채굴기가 필요 없이 코인을 보유하고 있으면 기본적인 자격이 충족된다.

장점

  • 지분증명방식의 가장 많이 알려진 장점은 작업증명방식과 대조적으로 에너지 소모가 큰 프로세스가 없다는 점이다.
  • 작업증명방식의 문제점 중 하나가 마이너들과 암호화폐 보유자들의 이해관계가 일치하지 않을 수도 있다는 점이다. 또한 다른 문제점은 장기적 관점에서 해시레이트(hashrate)를 리스(lease) 할 수 있다는 점이다. 지분증명방식은 이와 다르게 합의 대리인을 직접적으로 암호화폐에 투자하게 만들고 그에 따라 투자자와 합의 대리인의 이해관계가 같아지게 된다.
  • 지분증명방식 기반 시스템의 또 다른 주요 장점은 작업증명방식의 마이닝이 가진 중앙집중식 특징으로 제거한다. 그로 인해 잠재적으로 더욱 탈중앙화 될 가능성이 있다는 것이다.

단점

  • 지분증명방식 시스템은 체인 선택에 대한 해결책만을 제시했다. 그 외 나머지 문제점들에 대한 해답은 제시하지 못하였다.
  • 이 시스템은 암호화폐 보유량에 비례하여 신규 자금을 배당한다. 그말은 소수의 사람들에게 자금이 집중될 수 있다는 것을 의미한다. 이러한 점을 보고 보상 시스템이 쓸모없고 인센티브를 전혀 제공하지 못하다고 비춰질 수 있다.
  • 지분증명방식은 지분을 받기 위해서는 인터넷에 연결된 시스템에 의해 검증된 메시지가 필요하다. 결국 지분 보유자들은 해커에 의한 자금 도난 위험이 높은 핫 월렛을 갖고 있어야 한다. 프라이빗 키를 부여하여 단점을 보완하려고 했지만 그것은 완전한 해결책이 되지 못한다.
  • 코인을 얻기위해 코인을 사용하지 않고 보유하려는 성향 때문에 코인의 유통성이 저하된다.

Private key

  • 계정 주소는 Private key에서 파생된다.
    • 공개키는 개인키에서 파생된다.
    • 외부 소유 계정의 이더리움 주소는 공개키-개인키 쌍의 공개키 부분에서 생성된다.
  • 공개키는 은행 계좌번호와 개인키는 PIN(개인 식별 번호)와 유사하다
  • 개인키는 대부분 암호화된 형태로 특수 파일에 저장하고 이더리움 지갑 소프트웨어로 관리한다
  • 외부 소유 계정의 이더리움 주소는 공개키-개인키 쌍의 공개키 부분에서 생성된다.

Public Key

  • 개인 키에서 단방향 함수를 통해 파생된 숫자이다
  • 공개키는 네트워크에 공개되어 대응되는 개인 키로 작성된 디지털 서명을 확인하는 데 누구나 사용할 수 있습니다.

Solidity

  • Solidity.md

  • 프로그래밍 언어를 저차원(Low-Level)과 고차원으로 구분했을 때 비트코인 스크립트 언어와 달리 고차원 언어.

  • C++, Python, 자바스크립트 등 기존에 널리 사용되고 있던 언어에 영향을 받았기에 어렵지 않게 학습이 가능.

  • 스마트 계약 작성을 위해 탄생한 언어로써 언어의 모든 요소가 스마트 계약을 쉽게 작성할 수 있도록 설계됨.

  • 튜링 완전성으로 인해 표현의 제약없이 자유롭게 어떠한 형태의 경제 활동이든 프로그래밍이 가능.

State

  • EVM 코드의 공식적인 실행 모델은 놀라울 정도로 간단하다.
  • 이더리움 가상 머신이 실행되는 동안 상태는 tuple(block_state, transaction, message, code, memory, stack, pc, gas)로 정의된다.
  • 각 명령어는 튜플에 어떻게 영향을 미치는지에 대한 자체 정의가 있다.
    • ADD는 스택에서 두 개의 항목을 pop하여 합계를 push하고 가스를 1만큼 줄이고 pc를 1 증가시킨다.
    • SSTORE 는 스택에서 두 개의 아이템을 꺼내 이 아이템의 첫 번째 값이 가리키는 컨트랙트 저장소 인덱스에 두 번째 아이템을 넣는다.
  • 세계 상태(World State: 모든 계정들의 상태의 전체 집합)는 Merkle-Particia 트리의 형태로 각 노드에 저장되고 각 블록에는 세계 상태 트리의 최상위 노드만 저장한다.

block_state

  • block_state는 글로벌 state이며 모든 계정과 잔액 및 스토리지를 포함한다.

PC

  • 현재 수행되는 instruction을 가리킴

State Tree

  • 계정 상태
    • Nonce, Balance, Codehash, StorageRoot로 이루어져 있으며 특정 시점에서 각 계정의 상태를 나타낸다.
  • 세계 상태
    • 모든 계정 상태의 집합으로써 계정의 주소-계정 상태의 쌍으로써 트리의 형태(Merkle-Patricia Tree) 로 표현된다.

State Transition Function

ether-state-transition

이더리움 상태 변환 함수 APPLY(S,TX) -> S'는 다음과 같이 정의할 수 있다.

  1. 트랜잭션이 제대로 구성되어 있는지 확인합니다.
    • 서명이 유효한지 확인
    • 발신자 계정의 nonce와 트랜잭션의 nonce가 같은지 확인
    • 같지 않으면 오류를 반환
  2. 거래 수수료를 STARTGAS * GASPRICE로 계산하고 서명에서 발송 주소를 결정합니다.
    • 발신자의 계정 잔액에서 수수료를 뺀다.
    • 발신자의 nonce를 증가시킨다.
    • 사용할 잔액이 부족하면 오류를 반환
  3. GAS = STARTGAS를 초기화하고 바이트당 일정량의 가스를 차감하여 트랜잭션의 바이트값을 지불합니다.
  4. value를 발신자의 계정에서 수신자의 계정으로 이동시킨다.
    • 만약 수신자의 계정이 존재하지 않는다면 생성한다.
    • 만약 수신자가 [컨트랙트 계정](#contract account)이라면 컨트랙트의 코드를 끝까지 또는 gas 가 모두 소모될 때 까지 수행한다.
    • 만약 수신자가 컨트랙트가 아니라면
      • 총 거래 수수료는 제공된 가스 가격에 거래 길이를 바이트로 곱한 것과 같다.
  5. 발신자의 잔액 부족으로 value전송이 실패하거나 가스 부족으로 code 실행이 실패하면
    • 수수료 지불을 제외한 모든 상태를 복구한다.
    • 그리고 마이너의 계정에 수수료를 준다.
  6. 실패하지 않으면 남은 가스 사용료는 모두 발신자에게 환불하고, 소비한 가스 사용료는 마이너에게 보낸다.

만약 거래의 수신자가 contract가 아니라면, 총 거래 수수료는 제공된 가스 가격에 거래 길이를 바이트로 곱한 것과 같을 것이고, 거래와 함께 보내진 데이터는 관련이 없을 것이다.

Transaction

Turing Complete

  • 튜링완전(Turing-Complete)는 어떤 프로그래밍 언어나 추상 머신이 튜링머신과 동일한 계산 능력으로 문제를 풀 수 있다는 의미이다.
  • 튜링머신(Turing Machine)
    • 추상적인 수학 개념상의 기계이다.
    • 알고리즘 구현 언이인 튜링완전언어로 구현되며 무한한 저장공간만 있다면 이 세상의 모든 문제를 풀 수 있는 기계를 만드는 것이 가능한데, 그것을 튜링머신이라고 한다.

Wallet

  • 이더리움 계정을 관리하는데 도움을 주는 소프트웨어 애플리케이션

  • 지갑은 사용자의 키를 보유하고 사용자를 대신하여 트랜잭션을 생성하고 브로드캐스팅한다.

  • 지갑은 단지 키만 보유한다.

    • 이더 혹은 다른 토큰은 이더리움 블록체인에 기록된다.
  • 지갑의 두가지 형태

    • 비결정적 지갑

      • 무작위 수로부터 각각의 키를 무작위적으로 추출하는 방법
    • 결정적 지갑

      • 모든 키가 시드(seed)라고 하는 단일 마스터 키로부터 파생된 방법
      • 모든 키는 서로 관련이 있고 원래의 시드를 갖고 있다면 다시 키를 파생할 수 있다.

Nondeterministic Wallet

  • 각 지갑 파일에 무작위로 추출된 단일 개인키를 저장한다
  • 이더리움을 사용하는 동안 프라이버시를 극대화 한다는 장점이 있다.
    • 즉 자금을 받을 때 마다 새로운 주소를 사용한다.
  • 각 트랜잭션에 대해 새로운 주솔ㄹ 사용할 수 있지만 이는 키 목록 증가를 의미하고 결국 정기적이 백업이 필요하다
    • 만약 지갑을 백업하기 전에 데이터를 잃어 버리면 자금과 스마트 컨트랙트에접근 할 수 없다.