이더리움은 어떻게 작동합니까? (1)
Last updated
Last updated
그것이 무엇인지 이해하든 그렇지 않든 아마도 이더리움 에 대해 들어본 적이 있을 것입니다. 뉴스에 많이 나왔으니까. 이더리움에 대한 기본적인 이해가 없다면 이 기사를 읽는 것이 다소 혼란스러울 수 있습니다. 그렇다면 이더리움은 정확히 무엇입니까? 이는 본질적으로 디지털 거래에 대한 영구적인 기록을 유지하는 공개 데이터베이스입니다. 중요한 것은 이 데이터베이스를 유지 관리하고 보호하기 위해 중앙 기관이 필요하지 않다는 것입니다. 대신 개인이 제3자나 서로에 대한 신뢰 없이 P2P 거래를 할 수 있는 프레임워크인 "신뢰 없는" 거래 시스템으로 작동합니다.
여전히 혼란스럽습니까? 여기에서 이 기사를 사용할 수 있습니다. 제 목표는 복잡한 수학이나 무서운 공식 없이 이더리움이 기술 수준에서 어떻게 작동하는지 설명하는 것입니다. 비록 당신이 프로그래머가 아니더라도 적어도 그것에서 무언가를 얻기를 바랍니다. 일부 부품이 너무 기술적이고 너무 모호하더라도 문제가 되지 않습니다. 모든 세부 사항을 알 필요는 없습니다. 큰 수준에서 이해하는 것이 좋습니다.
이 기사에서 언급한 주제는 Ethereum Yellow Paper의 개념적 해부입니다. 이해하기 쉽도록 제 설명과 도표를 추가했습니다. 기술적인 도전에 관심이 있다면 옐로우 페이퍼를 직접 읽을 수도 있습니다.
블록체인은 "공유 상태를 가진 트랜잭션의 암호학적으로 안전한 싱글톤"입니다.
"암호화 보안"은 생성된 디지털 통화가 해독하기 어려운 복잡한 에 의해 보호됨을 의미합니다. 다양한 방화벽을 생각해 보십시오. 가짜 거래 생성, 거래 기록 삭제 등 시스템을 속이는 것은 거의 불가능합니다.
"싱글톤 트랜잭션 머신"은 시스템에서 생성된 모든 트랜잭션을 담당하는 단일 정식 인스턴스 머신이 있음을 의미합니다. 즉, 모든 사람이 믿는 하나의 세계적인 진리가 있습니다.
"공유 상태를 갖는다"는 것은 이 기계에 저장된 상태가 모든 사람에게 공유되고 노출된다는 것을 의미합니다.
이더리움이 구현하는 것은 이러한 블록체인 패러다임입니다.
이더리움 블록체인은 본질적으로 트랜잭션 기반 상태 머신입니다. 컴퓨터 과학에서 상태 머신은 일련의 입력을 읽고 해당 입력을 기반으로 새로운 상태로 전환하는 것을 말합니다.
Ethereum의 상태 기계를 사용하여 "제네시스 상태"로 시작합니다. 백지 상태와 같으며 네트워크에서 트랜잭션이 발생하지 않았습니다. 트랜잭션이 실행되면 제네시스 상태가 최종 상태로 전환됩니다. 어느 시점에서 최종 상태는 이더리움의 현재 상태를 나타냅니다.
이더리움 상태에는 수백만 건의 트랜잭션이 있습니다. 이러한 거래는 블록을 구성합니다. 블록에는 일련의 트랜잭션이 포함되며 각 블록은 이전 블록에 연결됩니다.
네트워크의 모든 노드는 채굴자 노드라고 주장할 수 있으며 블록 생성 및 유효성 검사를 시도할 수 있습니다. 전 세계적으로 많은 채굴자들이 동시에 블록을 생성하고 검증하려고 합니다. 블록체인에 블록을 제출할 때 각 광부는 보증 역할을 하는 수학적 "증명"을 제공합니다. 증거가 존재하는 경우 블록이 유효해야 합니다.
블록이 메인 체인에 추가되기 위해서는 채굴자가 다른 경쟁자보다 더 빨리 증명해야 합니다. 채굴자가 수학적 증명을 제공하도록 하여 각 블록을 검증하는 프로세스를 "작업 증명"이라고 합니다.
새 블록을 검증하는 광부는 이 작업을 수행하도록 장려하기 위해 일정 금액의 가치를 받습니다. 어떤 종류의 가치? 이더리움 블록체인은 기본 디지털 토큰 "Ether"를 사용합니다. 광부가 블록을 증명할 때마다 새로운 Ether 토큰이 생성되어 광부에게 보상됩니다.
모든 사람이 같은 사슬에 묶이도록 하는 것은 무엇입니까? 자신의 체인을 만들기로 결정한 광부 하위 집합이 없을 것이라고 어떻게 확신할 수 있습니까?
또한 위에서 언급했듯이 블록체인을 공유 상태의 트랜잭션 싱글톤 머신으로 정의합니다. 이 정의를 사용하여 올바른 현재 상태는 모든 사람이 받아들여야 하는 단일한 글로벌 사실임을 이해할 수 있습니다. 여러 상태(또는 여러 체인)를 갖는 것은 어떤 상태가 올바른 상태인지에 동의하는 것이 불가능하기 때문에 전체 시스템을 망칩니다. 여러 체인이 있는 경우 한 체인에 10개의 토큰, 다른 체인에 20개의 토큰, 다른 체인에 40개의 토큰이 있을 수 있습니다. 이 경우 가장 "효율적인" 체인을 결정할 방법이 없습니다.
여러 경로가 있을 때마다 "포크"가 발생합니다. 우리는 일반적으로 포크가 시스템을 깨뜨리고 사람들이 신뢰할 체인을 선택하도록 하기 때문에 포크를 피하고 싶습니다.
어떤 경로가 가장 효율적인지 결정하고 여러 체인이 생성되는 것을 방지하기 위해 Ethereum은 "GHOST 프로토콜"이라는 메커니즘을 사용합니다. "GHOST" = "탐욕적으로 관찰된 가장 무거운 하위 트리"
간단히 말해서, GHOST 프로토콜은 가장 많은 컴퓨팅 성능을 소비하는 경로를 선택해야 한다고 말합니다. 해당 경로를 결정하는 한 가지 방법은 최신 블록("리프 블록")의 블록 번호를 사용하는 것입니다. 이 블록 번호는 현재 해당 경로에 있는 총 블록 수를 나타냅니다(최초 블록 제외). 블록 번호가 높을수록 "잎 블록"에 도달하는 데 필요한 경로와 더 많은 채굴 노력이 필요합니다. 이 추론 방법을 사용하여 현재 상태의 정식 버전에 동의할 수 있습니다.
이제 블록체인에 대해 조금 알게 되었으므로 이더리움 시스템의 주요 구성 요소를 자세히 살펴보겠습니다.
계정
상태
가스 및 요금
거래
차단하다
트랜잭션 실행
채광
PoW
시작하기 전에 한 가지 주의할 점: 이 기사에서 X의 "해시"라고 할 때 일반적으로 이더리움에서 사용하는 KECCAK-256 해시를 의미합니다.
이더리움의 글로벌 "공유 상태"는 메시징 프레임워크를 통해 서로 상호 작용하는 많은 작은 개체(계정)로 구성됩니다. 각 계정에는 연결된 상태 및 20바이트 주소가 있습니다. 이더리움의 주소는 모든 계정을 식별하는 160비트 식별자입니다.
두 가지 유형의 계정이 있습니다.
연결된 코드가 없는 개인 키로 제어되는 외부 계정.
계약 코드로 제어되는 계약 계정에는 연결된 코드가 있습니다.
외부 계정과 계약 계정의 근본적인 차이점을 이해하는 것은 매우 중요합니다. 개인 키로 트랜잭션을 생성하고 서명함으로써 외부 계정은 다른 외부 계정이나 다른 계약 계정에 메시지를 보낼 수 있습니다. 두 외부 계정 간의 메시지는 단순히 가치 이전입니다. 그러나 외부 계정에서 계약 계정으로 보낸 메시지는 계약 계정의 코드를 활성화하여 다양한 작업(예: 토큰 전송, 내부 저장소에 쓰기, 새 코인 발행, 계산 수행, 새 계약 생성 등)을 수행할 수 있도록 합니다.
외부 계정과 달리 계약 계정은 자체적으로 새로운 거래를 시작할 수 없습니다. 대신, 계약 계정은 수신한 다른 거래에 응답함으로써만 자신의 거래를 트리거할 수 있습니다. 예를 들어 외부 계정 또는 다른 계약 계정의 트랜잭션에 의해 트리거됩니다. "트랜잭션 및 메시지" 장에서 계약 간 요청에 대해 자세히 알아볼 것입니다.
따라서 이더리움 블록체인에서 발생하는 모든 작업은 항상 외부 계정에 의해 트리거되는 트랜잭션에 의해 시작됩니다.
계정 상태는 계정 유형에 관계없이 존재하는 네 부분으로 구성됩니다.
Nonce: 계정이 외부 계정인 경우 이 숫자는 이 계정 주소에서 보낸 트랜잭션 수를 나타냅니다. 계정이 계약 계정인 경우 nonce는 계정에서 생성한 계약 수입니다.
잔액: 주소가 소유한 Wei의 수입니다. 각 Ether에는 1e+18Wei가 있습니다.
StorageRoot: Merkle Patricia 트리의 루트 노드의 해시 값(머클 트리는 나중에 설명함). Merkle 트리는 기본적으로 비어 있는 계정에 저장된 콘텐츠의 해시를 인코딩합니다.
CodeHash: odeHash: 이 계정에 대한 EVM 코드의 해시입니다. 계약 계정의 경우 해시되어 CodeHash로 저장되는 코드입니다. 외부 계정의 경우 codehash 필드는 빈 문자열의 해시입니다.
이더리움의 글로벌 상태에는 계정 주소와 계정 상태 간의 매핑이 포함됩니다. 매핑은 Merkle Patricia 트리의 데이터 구조에 저장됩니다.
Merkle 트리는 다음과 같은 노드 집합으로 구성된 이진 트리입니다.
트리 맨 아래에 있는 많은 수의 리프 노드에는 기본 데이터가 포함되어 있습니다.
각 노드가 두 자식 노드의 해시인 중간 노드 집합
두 자식 노드의 해시로 구성된 루트 노드는 트리의 맨 위를 나타냅니다.
트리 하단의 데이터는 저장하고자 하는 데이터를 블록으로 분할한 후, 블록을 버킷으로 분할하고, 각 버킷의 해시를 취하여 남은 해시의 총 개수가 1이 될 때까지 동일한 과정을 반복하여 생성됩니다. 단 하나: 루트 해시.
머클 트리는 저장된 각 값에 키가 있어야 합니다. 트리의 루트 노드에서 시작하여 키는 리프 노드에 저장된 해당 값을 얻기 위해 따라야 할 자식 노드를 알려야 합니다. 이더리움의 경우 상태 트리의 키/값 매핑은 각 계정의 잔액, nonce, codeHash 및 StorageRoot(StorageRoot 자체가 트리임)를 포함하여 주소와 연결된 계정 사이에 있습니다.
(출처: 이더리움 백서)
동일한 트라이 구조는 거래 및 영수증을 저장하는 데에도 사용됩니다. 보다 구체적으로, 각 블록에는 다음을 포함하여 세 가지 다른 Merkle 시도 구조의 루트 노드 해시를 저장하는 "블록 헤더"가 있습니다.
상태 트라이
트레이드 트라이
영수증 트라이
이 모든 정보를 Merkle 시도에 효율적으로 저장하는 기능은 "가벼운 클라이언트"와 "가벼운 노드"가 있기 때문에 이더리움에서 매우 유용합니다. 블록체인은 많은 노드에 의해 유지된다는 것을 기억하십시오. 일반적으로 노드에는 전체 노드와 라이트 노드의 두 가지 유형이 있습니다.
풀 노드는 제네시스 블록에서 현재 블록까지 전체 체인 데이터를 다운로드하여 블록체인에 포함된 모든 트랜잭션을 실행하여 블록체인을 동기화합니다. 일반적으로 채굴자는 채굴을 위해 이 작업을 수행해야 하기 때문에 아카이브 노드에 전체를 저장합니다. 조치를 취하지 않고 전체 노드를 다운로드할 수도 있습니다. 어떤 경우에도 모든 전체 노드에는 모든 체인이 포함됩니다.
그러나 노드가 각 트랜잭션을 실행하거나 편의상 이력 데이터를 쿼리해야 하는 경우가 아니면 전체 체인의 데이터를 저장할 필요가 없습니다. 이것은 또한 라이트 노드 개념의 기원이기도 합니다. 전체 체인의 데이터를 다운로드 및 저장하고 모든 트랜잭션을 실행하는 대신 라이트 노드는 트랜잭션을 실행하거나 관련 상태를 검색하지 않고 제네시스 블록에서 현재 블록의 블록 헤더까지 체인 헤더만 다운로드합니다. 라이트 노드는 세 번의 시도에 대한 해시가 포함된 블록 헤더에 액세스할 수 있으므로 트랜잭션, 이벤트, 잔액 등에 대한 검증 가능한 답변을 쉽게 생성하고 받을 수 있습니다.
이것이 작동하는 이유는 Merkle 트리의 해시가 위쪽으로 전파되기 때문입니다. 악의적인 사용자가 Merkle 트리의 맨 아래에 가짜 트랜잭션을 넣으려고 하면 이러한 변경으로 인해 위 노드의 해시가 변경되어 그런 다음 계속 위 노드의 해시를 변경하는 식으로 진행하고 마지막으로 트리 루트의 해시를 변경합니다.
데이터를 확인하려는 모든 노드는 "머클 증명"을 사용하여 이를 수행할 수 있습니다. 머클 증명에는 다음이 포함됩니다.
증명할 데이터와 해시
트리의 루트 해시
"분기"(모든 버디 해시는 블록에서 루트까지의 경로를 따릅니다)
증명을 읽는 사람은 누구나 분기의 해시가 트리에서 일관성을 유지하여 주어진 블록이 실제로 트리의 어딘가에 있음을 확인할 수 있습니다.
요약하면, Merkle Patricia 트리를 사용할 때의 이점은 구조의 루트 노드가 트리에 저장된 데이터에 암호화 방식으로 의존하므로 루트 노드 해시를 사용하여 해당 데이터를 안전하게 식별할 수 있다는 것입니다. 블록 헤더에는 상태, 트랜잭션 및 수신 트리의 루트 해시가 포함되어 있으므로 모든 노드는 이더리움 상태를 모두 저장하지 않고도 작은 부분을 확인할 수 있으며 전체 노드는 매우 클 수 있습니다.
한 상태가 다음 상태로 전환하려면 트랜잭션이 유효해야 합니다. 트랜잭션이 유효한 것으로 인식되기 위해서는 이라는 프로세스를 거쳐야 합니다. 노드 그룹(컴퓨터)은 컴퓨팅 리소스를 사용하여 유효한 트랜잭션이 포함된 블록을 생성하며 이를 마이닝이라고 합니다.