Qtum의 디자인에 대한 시리즈의 2부에 다시 오신 것을 환영합니다. 이전 부분에서, 우리는 비트 코인에 의해 옹호 UTXO 모델에 대해 이야기했다. 오늘, 우리는 방정식의 이더리움의 측면을 보고있을 것입니다 - 이더리움 가상 머신.
이더리움 가상 머신이란?
Java에서 개발자가 코드를 작성하고 바이트코드로 컴파일하는 예제로 Java를 살펴보겠습니다. 그런 다음 이러한 바이트 코드는 Java 가상 머신(JVM)에 로드되고 JVM에서 실행됩니다. JVM 사양은 다양한 구현에서 프로그램의 상호 운용성을 보장합니다. 이더리움은 개발자가 솔리티에서 스마트 계약을 코딩하는 유사한 접근 방식을 취합니다. 이러한 계약은 바이트코드로 변환되고 다양한 하드웨어 플랫폼에서 실행되는 EVM(이더리움 가상 머신)에서 실행하기 위해 블록 체인에 업로드됩니다.
이더리움 가상 머신은 "준 튜링" 완전 기계입니다. 튜링 완전 기계는 수학적으로 주어진 문제를 해결할 수 있습니다. 그렇다면 왜 이더리움 가상 머신은 준 튜링이 완성된 것으로 만 볼 수 있을까요? 그 이유는 기계가 수행하는 계산이 가스에 의해 제한되기 때문에 기계가 수행할 수 있는 계산 수에 관해서는 안전 한계역할을 합니다.
우리는 이더리움 가상 머신이 이더리움 생태계의 중심에 있다고 이전에 언급했습니다. 그것은 배포 및 스마트 계약의 실행을 처리합니다. 간단한 트랜잭션EVM의 참여가 필요하지 않습니다. 그러나 다른 작업에는 EVM의 상태 업데이트가 필요합니다. 이더리움 가상 머신에는 수백만 개의 실행 가능한 개체가 포함되어 있으며 각 개체는 데이터 저장소를 가지고 있습니다.
이더리움 가상 머신은 스택 기반 아키텍처를 사용하여 메모리 내 값을 스택에 저장합니다. 모든 작업은 EVM 코드 또는 바이트코드에 정의된 대로 수행됩니다. 또한 다음과 같은 여러 데이터 구성 요소가 있습니다.
● 불변프로그램 코드 ROM, ROM은 실행해야 하는 계약의 바이트 코드가 로드됩니다.
● 0으로 초기화된 휘발성 메모리
● 영구 저장, 이더리움 상태의 일부.
EVM과 기존 기술 비교
이더리움 가상 머신은 상대적으로 제한된 운영 범위를 가지고 있습니다. 계산 및 스토리지의 추상화를 제공하는 계산 엔진으로만 작용하는 Java 가상 머신과 유사합니다. Java 가상 머신은 기본 운영 체제의 불가지론적 환경을 제공하기 때문에 여러 시스템에서 호환성을 지원합니다.
EVM도 마찬가지로 기능을 통해 더 높은 수준의 스마트 계약 프로그래밍 언어가 컴파일되는 바이트코드 명령 세트를 실행합니다. 실행 순서는 외부에서 구성되므로 EVM에는 일정 기능이 없습니다. 이더리움 클라이언트는 스마트 계약의 실행 순서를 결정합니다. 이더리움 가상 머신에는 시스템 인터페이스나 물리적 기계가 전혀 없습니다.
이더리움 가상 머신의 작동 방식 이해
이더리움 가상 머신은 이더리움 노드 내에 내장된 샌드박스 가상 스택으로 정의할 수 있습니다. 이더리움 가상 머신의 주요 기능은 개발자가 dApps를 만들고 스마트 계약을 실행할 수 있도록 하는 것입니다. 이제 개발자로서의 사전 경험이 필요 하거나 EVM을 사용 하려면 광범위 한 코딩 배경. 강력하고 값비싼 하드웨어의 필요성을 없애어 초보자에게 완벽합니다.
이더리움 가상 머신의 계약은 솔리티, 비퍼 와 같은 언어로 작성된 다음 EVM 바이트코드로 컴파일됩니다. 이렇게 하면 코드가 네트워크에서 완전히 격리될 수 있습니다. 네트워크의 각 노드는 EVM 인스턴스를 실행하여 명령 실행에 동의할 수 있습니다.
이더리움 가상 머신을 사용하면 개발자가 신뢰할 수 없는 환경에서 코드를 만들고 실행할 수 있습니다. EVM에서 구현되는 각 명령은 시스템에 의해 추적됩니다. 시스템은 명령의 실행 비용을 추적합니다. 그런 다음 관련 가스 비용을 지시에 할당합니다. 계약 또는 거래를 시작하려면 사용자가 가스 비용을 지불하기에 충분한 이더를 제공해야 합니다.
Gas는 EVM에 대한 두 가지 문제를 해결하고, 유효성 검사기는 실행에 실패하더라도 선불 금액을 받고, 실행은 선불 금액이 허용하는 것보다 더 오래 실행되지 않습니다. 네트워크에 전송된 각 트랜잭션에 대해 유효성 검사기는 다음을 확인해야 합니다.
● 트랜잭션에 관한 모든 정보는 유효해야 합니다.
● EVM은 예외로 실행되지 않습니다.
● 보낸 사람은 실행을 위해 지불 할 충분한 자금이 필요합니다.
이더리움의 상태 전환 기능
이더리움은 입력을 제공하는 수학적 함수역할을 하며 출력을 생성합니다. 아래 기능을 살펴보십시오.
Y(S, T)= S'
이전 상태 S와 명령 세트 T는 이더리움 상태 함수 Y(S, T)가 새 출력 S'를 생성한다는 것을 의미합니다.
주
이더리움의 맥락에서, 상태는 "수정 된 머클 패트리샤 트리"로 알려진 데이터 구조입니다. 머클 패트리샤 트리의 역할은 무엇입니까? 임의 길이 바이너리 데이터를 매핑하는 암호화인증된 영구 데이터 구조를 제공합니다. 256비트 이진 조각과 임의 길이 바이너리 데이터 간에 매핑할 수 있는 변경 가능한 데이터 구조입니다. 이더리움의 유일한 요구 사항은 머클 트리의 유일한 요구 사항은 주어진 키 값 쌍 집합을 식별하는 데 사용할 수 있는 32바이트 값을 제공하는 것입니다.
이더리움 세계 국가는 최상위 수준에 자리잡고 있으며, 이더리움 주소를 계정에 매핑합니다. 각 주소는 에테르 잔액, nonce, 계정 저장소 및 계정 프로그램 코드로 구성된 계정을 나타냅니다. 스마트 계약 코드가 실행되면 EVM에 현재 블록 및 트랜잭션 정보가 표시됩니다. 계약 계정의 코드가 프로그램 코드 ROM에 로드되고 프로그램 카운터가 0으로 설정됩니다. 저장소도 계약 계정 저장소에서 로드되며 메모리도 0으로 설정됩니다.
거래란?
이더리움은 일반 계정(또는 외부 소유 계정)과 계약 계정의 두 가지 유형을 사용합니다. 일반 계정은 개인 키를 사용하여 ETH 를 결제할 수 있습니다. 계약 계좌는 계약 생성을 초래하는 메시지 통화 및 트랜잭션에 대한 책임이 있습니다.
EVM 지침이란 무엇입니까?
이더리움 가상 머신의 깊이는 1,025개, 각 항목은 256비트 단어입니다. EVM이 트랜잭션을 실행하면 일시적인 메모리(단어 주소가 있는 바이트 배열)를 유지 관리합니다. 이 메모리는 트랜잭션 간에 지속되지 않습니다. 컴파일된 스마트 계약은 EVM opcodes로 실행됩니다. 이러한 작업은 AND, XOR, ADD, SUB 등과 같은 스택 작업을 수행할 수 있습니다. 또한 EVM은 BALANCE, 주소, BLOCKHASH 등과 같은 특정 스택 작업을 구현할 수 있습니다.
가스 및 EVM
한 계정에서 다른 계정으로의 트랜잭션에는 페이로드라고도 하는 이더 또는 이진 데이터가 포함됩니다. 중앙 기관은 없으며 계약은 이더리움 노드에서 실행됩니다. 이것은 여러 복잡한 계약을 만들어 네트워크를 느리게 악의적 인 행위자의 위험을 제공합니다. 이러한 공격으로부터 네트워크를 보호하기 위해 opcodes에는 트랜잭션 실행 비용을 지불하는 데 사용되는 기본 가스 비용이 있습니다. Gas는 운영에 필요한 작업을 제한합니다. 트랜잭션이 실행되면 가스가 사용됩니다.
OPCODE KECCAK256의예를 들면, 단어당 6가스의 동적 가스 비용으로 30의 기본 가스 비용이 있음을 알 수 있습니다. 계산 비용이 많이 드는 지침은 간단한 지침보다 더 높은 수수료를 부과합니다. 그러나 상태 크기를 줄이는 지침이 실행되는 경우에도 가스를 환불받을 수 있습니다. 저장 값이 0으로 설정된 경우 15,000개의 가스가 환불되고 자폭 성 opcode를 사용하는 경우 24,000개의 가스가 환불됩니다.
Opcodes란 무엇입니까?
이제 우리가 예를 보았으니 우리는 opcodes를 이해할 수 있습니다. Opcodes는 이더리움 가상 머신이 매우 구체적인 작업을 수행하는 데 도움이 됩니다. opcodes는 이더리움 가상 머신이 튜링이 완료될 수 있도록 하는 것입니다. 쓰기 시 EVM은 150개 가 넘는 opcodes를 실행할 수 있으며, 이 코드는 다음과 같이 나눌 수 있습니다. opcodes에 대한 포괄적인 설명은 이더리움 옐로우 페이퍼에서 확인할 수 있습니다.
● 비교 및 비트 로직 작업
● 정지 및 산술 작업
● SHA3
● 차단 정보
● 환경 정보
● 스택, 메모리, 저장 및 흐름 작업
● 중복 작업
● 푸시 작업
● 로깅 작업
● 교환 운영
● 시스템 운영
바이트 코드
바이트코드는 Opcodes를 효율적으로 저장할 때 EVM에 매우 중요합니다. 각 opcode에는 바이트가 할당됩니다. 바이트코드를 더 잘 이해하는 예를 살펴보겠습니다.