블록체인이란?
블록체인은 전 세계적으로 공유되는 "데이터 보관함"(트랜잭션 데이터베이스)입니다.
네트워크에 참여하는 것만으로, 보관함(데이터베이스)의 내용을 읽을 수 있습니다.
보관함에서 무언가를 변경하려면, 다른 모든 사람들이 수락해야 하는 "데이터"(트랜잭션)를 생성해야 합니다.
하나의 데이터를 보관함에 넣는 동안, 다른 데이터가 이를 방해할 수 없습니다.
예를 들어, 모든 계좌의 전자 화폐 잔액을 저장하는 보관함을 상상해 보세요.
한 계좌에서 다른 계좌로 이체가 요청되는 경우, 한 계정에서 금액을 빼면 항상 다른 계정에 추가되어야겠죠?
어떤 이유로든 다른 계좌에 금액을 추가할 수 없는 경우, 원본 계좌도 수정되지 않습니다.
( 모든 사람이 수락하지 않으면 적용되지 않아요. )
또, 데이터 생성자(발신자)가 데이터를 암호화 서명합니다. ( 암호화 키 생성 )
이렇게 하면 보관함의 수정 사항에 대한 접근을 쉽게 보호할 수 있습니다.
전자 화폐의 예에서, 간단한 수표는 "키를 보유한 사람"만이 계좌에서 돈을 이체할 수 있도록 합니다.
블록이란?
넘어야 할 한 가지 주요 장애물은 "이중 지출 공격" (비트코인 용어) 이라고 하는 것입니다.
네트워크에 계정을 비우려는 두 개의 데이터가 있으면 어떻게 될까요?
데이터 중 하나만 유효할 수 있으며, 일반적으로 먼저 승인되는 데이터만 유효합니다.
문제는 P2P 네트워크에서 "첫 번째"가 객관적인 용어가 아니라는 것입니다.
이는 전 세계적으로 승인된 거래 순서가 자동으로 선택함으로 해결할 수 있습니다.
데이터는 "블록"으로 묶인 다음 실행되고 참여하는 모든 컴퓨터(노드)에 배포됩니다.
두 데이터가 서로 모순되는 경우, 두 번째 데이터가 거부되고 블록에 포함되지 않습니다.
이러한 블록은 시간에 따라 체인형태로 이어지며, 이 때문에 "블록체인"이라고 부릅니다.
블록은 다소 일정한 간격으로 체인에 추가됩니다. 이더리움의 경우 대략 17초마다 추가됩니다.
"주문 선택 메커니즘"("채굴"이라고 함)의 일부로, 때때로 체인의 "끝"에서 블록을 취소할 수 있습니다.
특정 블록 위에 더 많은 블록이 추가될수록, 이 블록이 취소될 가능성은 줄어듭니다.
따라서 거래가 되돌려지고 블록체인에서 제거될 수도 있지만, 오래 기다릴수록 그럴 가능성은 줄어듭니다.
데이터 생성자가 데이터를 포함할 블록을 결정하는 것이 아니라, 채굴자가 결정하기 때문에
생성자 마음대로, 다음 블록이나 특정 미래 블록에 데이터를 추가할 수는 없습니다.
( 계약의 향후 호출을 예약하려면 스마트 계약 자동화 도구 또는 Oracle 서비스를 사용할 수 있습니다. )
이더리움 가상 머신이란? ( EVM )
이더리움의 스마트 계약을 위한 런타임 환경입니다.
샌드박스 방식일 뿐만 아니라 실제로 완전히 격리되어 있습니다.
즉, EVM 내부에서 실행되는 코드는 네트워크, 파일 시스템 또는 기타 프로세스에 접근할 수 없습니다.
스마트 계약은 다른 스마트 계약에 대한 접근도 제한됩니다.
이더리움 계정이란?
이더리움에는 동일한 보관함 공간을 공유하는 두 가지 종류의 계정이 있습니다.
공개-개인 키 쌍(즉, 사람)에 의해 제어되는 "외부 계정"과,
프로그래밍 코드에 의해 제어되는 "계약 계정" 입니다.
외부 계정의 보관함 주소는 공개 키로 결정되는 반면, 계약 계정의 보관함 주소는 데이터가 생성될 때 결정됩니다.
( 생성자 보관함과, 해당 보관함에서 보낸 계약서 개수, 이른바 "nonce" )
계정이 코드를 저장하는지 여부에 관계없이, 두 유형은 EVM에서 동등하게 처리됩니다.
모든 계정에는 256비트 단어를 256비트 단어에 매핑하는, 영구 키-값 저장소( storage )가 있습니다.
또, 모든 계정에는 Ether의 잔액이 있습니다.
(정확하게는 "웨이", 1 ether = 10**18 wei , 계약서를 송신함으로써 변경 될 수 있음).
트랜잭션이란? ( 데이터 )
트랜잭션은 한 계정에서 다른 계정으로 전송되는 데이터( 메시지 )입니다
( 동일하거나 비어 있을 수 있음, 아래 참조 )
여기에는 바이너리 데이터("페이로드"라고 함)와 ether가 포함될 수 있습니다.
계정에 코드가 포함되어 있으면 해당 코드가 실행되고, 페이로드가 입력 데이터로 제공됩니다.
계정이 설정되지 않은 경우( 데이터 수신자가 없거나, null로 설정됨) 트랜잭션은 새 계약을 생성합니다 .
이미 언급했듯이 해당 계약의 주소는 0 주소가 아니라,
보낸 사람과 보낸 데이터 수("nonce")에서 파생된 주소입니다.
이러한 계약에서 생성된 페이로드는 EVM 바이트 코드로 간주되어 실행됩니다.
이 실행의 출력 데이터는 계약 코드로 영구적으로 저장됩니다.
즉, 계약을 생성하기 위해 계약의 실제 코드를 보내는 것이 아니라
실제로 실행될 때 해당 코드를 반환하는 코드를 보내는 것입니다.
계약이 생성되는 동안 해당 코드는 여전히 비어 있습니다.
따라서 생성자가 실행을 완료할 때까지 생성 중인 계약을 다시 호출해서는 안 됩니다.
( 실행 결과가 나올때까지 시간이 필요함 )
가스란?
트랜잭션 생성 시 마다 일정량의 가스 가 부과되며,
트랜잭션을 실행에 대한 비용을 지불함으로써, 실행하는 데 필요한 작업량을 제한합니다.
EVM이 트랜잭션을 실행하는 동안 가스는 특정 규칙에 따라 점점 고갈됩니다.
가스 가격은 트랜잭션 생성자가 설정하고, "가스 가격 * 가스"를 송금 계정에서 선불로 지불해야 합니다.
실행 후 일부 가스가 남아 있으면 동일한 방식으로 작성자에게 환불됩니다. ( 가스 가격 * 가스 )
가스가 어느 시점에서든 소진되면(즉, 음수) 가스 부족 예외가 트리거되어
현재 트랜잭션에 대한 모든 수정 사항을 되돌립니다.
스토리지, 메모리 및 스택
이더리움 가상 머신은 데이터를 저장할 수 있는 세 가지 영역(스토리지, 메모리 및 스택)이 있습니다.
각 계정에는 함수 호출과 트랜잭션 사이에 지속되는 storage 이라는 데이터 영역 이 있습니다.
저장소는 256비트 단어를 256비트 단어로 매핑하는 키-값 저장소입니다.
계약 내에서 스토리지를 열거하는 것은 불가능하며,
읽는 데 비교적 비용이 많이 들며 스토리지를 초기화하고 수정하는 데는 훨씬 더 많은 비용이 듭니다.
이 비용 때문에 영구 저장소에 저장하는 것을 계약을 실행하는 데 필요한 것으로 최소화해야 합니다. 파생된 계산, 캐싱 및 집계와 같은 데이터를 계약 외부에 저장합니다. 계약은 자체 스토리지 이외의 스토리지를 읽거나 쓸 수 없습니다.
두 번째 데이터 영역은 메모리 라고 하며 , 이 영역 에서 계약은 각 메시지 호출에 대해 새로 지워진 인스턴스를 얻습니다. 메모리는 선형이며 바이트 수준에서 주소를 지정할 수 있지만 읽기는 256비트 너비로 제한되는 반면 쓰기는 8비트 또는 256비트 너비가 될 수 있습니다. 메모리는 이전에 변경되지 않은 메모리 워드(즉, 워드 내의 오프셋)에 액세스(읽기 또는 쓰기)할 때 워드(256비트)만큼 확장됩니다. 증설시 가스비를 부담하셔야 합니다. 메모리는 커질수록 비용이 더 많이 듭니다(2차로 확장됨).
EVM은 레지스터 머신이 아니라 스택 머신이므로 모든 계산은 스택 이라는 데이터 영역에서 수행됩니다 . 요소의 최대 크기는 1024개이며 256비트의 워드를 포함합니다. 스택에 대한 액세스는 다음과 같은 방식으로 상단으로 제한됩니다. 최상위 16개 요소 중 하나를 스택 상단으로 복사하거나 최상위 요소를 그 아래에 있는 16개 요소 중 하나로 교체할 수 있습니다. 다른 모든 작업은 스택에서 맨 위에 있는 두 개(또는 작업에 따라 하나 또는 그 이상) 요소를 가져와 결과를 스택에 푸시합니다. 물론 스택에 대한 더 깊은 액세스를 위해 스택 요소를 스토리지나 메모리로 이동하는 것은 가능하지만 스택의 맨 위를 먼저 제거하지 않고 스택의 더 깊은 임의의 요소에 액세스하는 것은 불가능합니다.
https://docs.soliditylang.org/en/latest/
https://docs.soliditylang.org/en/latest/introduction-to-smart-contracts.html#blockchain-basics
반응형