보안: 계약에 대한 중앙화된 공격 지점이 없고, 누군가에게 뇌물을 주고 계약 내용이나 결과를 변조할 위험이 없습니다.
신뢰성: 스마트 컨트랙트 로직이 조건에 부합해 계약이 이행되면 블록체인 네트워크에 있는 노드들에 의해 여러 번 수행되고 검증되기 때문에, 위변조가 매우 어렵고 정확성이 높습니다.
공평함: 계약 조건을 공유하고 강제하기 위해 분산화된 블록체인 네트워크를 사용하기 때문에, 수수료를 가져가는 등 영리적 목적의 중개자가 필요하지 않습니다.
효율성: 계약 이행을 자동화하기 때문에 계약 당사자들은 수동으로 데이터를 입력하거나, 상대방의 계약 의무 이행 여부 검증하거나, 중개자가 계약을 집행하는지 확인할 필요가 없습니다.
출력에는 자산이 잠겨있고, 입력으로 출력을 해제하여 출력에 있는 값을 꺼내, 새로운 출력에 자산을 담습니다. 트랜잭션에는 다른 곳에 잠겨있는 출력을 해제하는 입력과, 입력의 결과로 생긴 새로운 출력이 담기게 됩니다. 따라서 트랜잭션은 이전 출력을 해제하고, 새로운 출력을 만드는 추상적인 "액션"이라고 볼 수 있습니다. 이렇게 입력에 의해 생성된 후, 다른 입력에 의해 해제되지 않은 트랜잭션 출력을 UTXO라고 합니다.
비트코인에서는 스크립트(Script)라는 스크립터 언어를 사용해 스마트 컨트랙트를 구현합니다. 이 스크립트 실행을 통해 비트코인의 송금이 이루어집니다. 비트코인 스크립트는 일반적인 프로그래밍 언어와는 다르게 어떤 공식적인 문법이나 구문이 있는 것은 아닙니다. 대신 간단한 연산 목록으로 구성되어 있습니다.
이 스크립트 실행을 통해 비트코인의 송금이 이루어집니다. 이러한 특징으로 인해 비트코인은 프로그래밍할 수 있는 화폐(Programmable Money)에 대한 대중성을 부여했다고 볼 수 있습니다.
스크립트 동작원리
스크립트 프로그램은 두 종류의 객체를 가지고 있습니다.
1. Opcode: 덧셈, 뺄셈, 곱셈과 같은 연산 작업을 나타냅니다.
2. 데이터: OP_CODE가 아닌 모든 데이터는 원시 데이터로 해석되며, 스택에 들어가게 됩니다.
노드가 네트워크로부터 새로운 트랜잭션을 받으면, ScriptSig와 ScriptPubkey 필드를 추출하여 연결하여 최종적으로 <ScriptSig><ScriptPubkey>
형태의 스크립트를 얻게 됩니다.
스크립트는 이 Opcode와 DATA를 일렬로 늘어놓은 것입니다. 여기서 포인터(Pointer)는 일렬로 늘어진 Opcode와 데이터를 순서대로 하나씩 가리킵니다. 만약 포인터가 데이터를 가리키면 데이터를 스택에 넣고, Opcode를 가리키면 스택에서 데이터를 꺼내옵니다. Opcode는 스택에서 데이터를 하나 이상 가져올 수 있지만, 중요한 것은 스택 구조이기 때문에 가장 나중에 들어온 데이터부터 가져온다는 것입니다.
[스마트 컨트랙트&핵심 요약-그림.2] 스크립트
두 개의 데이터와 하나의 opcode만 사용하는 가장 간단한 종류의 비트코인 스크립트입니다. P2PK는 퍼블릭 키에 직접 코인을 송금하는 데 사용합니다. 수신자의 공개 키를 직접 노출하기 때문에 보안에 취약하며, 오늘날에는 사용되지 않습니다.
[스마트 컨트랙트&핵심 요약-그림.3] P2PK
P2PKH는 P2PK 메커니즘과 거의 동일하며, 한 가지 차이점은 P2PKH에서는 ScriptPubkey가 공개 키의 해시값을 가지고 있다는 점입니다.
P2PK와는 다르게, 서명과 공개키가 ScriptSig에 들어있습니다. ScriptPubkey는 P2PK에서와 다르게 여러 개의 Opcode를 가지고 있으며, 수신자의 공개키를 해싱한 값인 Hash 1 객체가 들어있습니다. 비트코인을 보내는 동안 송신자는 공개키의 해시값을 보내기 때문에 스크립트 이름의 PayToPubkeyHash인 것입니다.
UTXO는 일종의 계약으로 정의될 수 있으며, 이 계약은 유효한 해제 조건을 주면 잠긴 비트코인을 이동시킵니다. 오직 유효한 해제 조건을 줘야만 코인을 송금할 수 있는 계약인 것입니다. 이 계약의 실행은 비트코인 네트워크가 보장하기 때문에 계약 이행을 강제하기 위한 중개자가 필요하지 않습니다.
이더리움은 블록체인 기술을 활용해 스마트 컨트랙트와 암호화폐 거래를 제삼자 없이 안전하게 이뤄질 수 있도록 하는 오픈소스 퍼블릭 서비스입니다. 누구든지 분산형 어플리케이션(dApp)을 이더리움 네트워크에 배포할 수 있습니다. 이더리움은 개발자들이 dApp을 만들 수 있도록 튜링 완전한 언어인 솔리디티(Solidity)를 제공하였으며, 이더리움 네트워크에 올라간 솔리디티 코드는 EVM(Ethereum Virtual Machine)을 통해 실행됩니다.
비트코인은 암호화폐를 거래하는 반면, 이더리움은 스마트 컨트랙트를 활용한 분산 어플리케이션(dApp)을 만들 수 있도록 솔리디티 언어와 EVM(Ethereum Virtual Machine)을 지원합니다.
비트코인은 무허가 퍼블릭 트랜잭션만을 허용하지만, 이더리움은 허가 트랜잭션과 무허가 트랜잭션을 모두 허용합니다.
비트코인에서는 플랫폼을 실행하고 트랜잭션을 검증하는 채굴 노드가 보상받습니다. 기본적으로 새로운 블록을 만드는 첫 번째 컴퓨터가 비트코인을 보상으로 받습니다. 반면, 이더리움은 블록 생성에 대한 보상을 제공하지 않으며, 대신 채굴 노드가 트랜잭션 수수료를 받을 수 있도록 합니다.
[스마트 컨트랙트&핵심 요약-그림.5] EVM 계층
EVM(Ethereum Virtual Machine)은 우리가 짠 코드와 이더리움 블록체인 사이에 있는 가상 머신으로, 블록체인에서 코드가 실행될 수 있도록 합니다.
EVM은 솔리디티를 읽을 수 없기 때문에, 먼저 우리가 작성한 솔리디티 코드를 solc를 이용해 컴파일하여 EVM이 읽을 수 있는 바이트코드 형태로 만듭니다. 그리고 이 바이트코드를 Geth를 이용해 이더리움 네트워크에 올립니다. EVM에서는 바이트코드를 Opcode로 변환하여 실행합니다.
솔리디티는 스마트 컨트랙트를 실행하는 객체 지향(Object-Oriented), 정적 타입(Static Typed), 고급(High-Level) 스크립트 언어로, EVM에서 실행됩니다.
튜링 머신은 실제로 구현된 기계가 아니라, 이론상으로 존재하는 기계로, 오늘날 우리가 구축할 수 있는 가장 강력한 기계 컴퓨터를 설명할 때 사용하는 수학적 연산 모델입니다.
어떤 프로그래밍 언어나 추상 기계가 튜링 머신과 동일한 연산 능력을 갖출 때, 우리는 그것이 튜링 완전(Turing-Complete)하다고 말합니다. 반대로 튜링 머신보다 연산 능력이 떨어질 경우 튜링 불완전(Turing-Incomplete)하다고 합니다.
사토시 나카모토는 무한 반복 공격과 같은 보안상의 이슈를 고려해 의도적으로 반복문 Opcode를 제외했습니다. 따라서 비트코인 스크립트를 두고 튜링 불완전하다고 말합니다.
비트코인으로 스마트 컨트랙트를 구현할 때는 반복문을 사용할 수 없다 보니, 단순한 스마트 컨트랙트를 만드는 데에 그칠 수밖에 없었습니다. 이더리움의 핵심은 이러한 비트코인의 튜링불완전성이라는 한계를 넘어, 개발자가 원하는 스마트 컨트랙트를 유연하게 구현할 수 있도록 튜링 완전을 제공하는 것입니다. EVM은 반복문 Opcode들을 지원하는 대표적인 튜링 완전 머신이며, 솔리디티는 튜링 완전 머신을 동작하게 하는 튜링 완전 언어입니다.
Remix IDE
solc
Ganache
TestNet
Truffle, Embark, Dapple
이더리움은 거래에 기반을 둔 상태 머신(Transaction-based state machine)입니다. 상태 머신이란 일련의 입력을 읽고, 그 입력을 기반으로 새로운 상태로 전환하는 것을 의미합니다. 이더리움의 상태에는 수천 개의 트랜잭션이 있습니다. 이 트랜잭션은 블록이라는 그룹에 묶여 있으며, 블록은 직전에 만들어진 블록과 이어져 있습니다.
[스마트 컨트랙트&핵심 요약-그림.7] 이더리움의 트랜잭션 블록
이더리움에는 EOS(External Owned Account)와 CA(Contract Account)라는 두 종류의 계정이 있습니다. 모든 계정은 주소로 식별되며, 동일한 주소 공간을 가집니다.
EOS와 CA 모두 잔액(Balance), 논스(Nonce), 스토리지(Stroage), 컨트랙트 코드(Contract Code)로 구성되어 있습니다.
Balance: 계정의 현재 이더 잔고
Nonce: EOA의 경우, 해당 EOA로부터 보내진 트랜잭션의 숫자. CA의 경우,
해당 CA로부터 생성된 컨트랙트의 숫자를 의미합니다.
StorageRoot: 머클 패트리샤 트리의 루트 노드를 해싱한 값.
Contract Code: EVM이 실행할 코드의 해싱된 값. EOA에는 코드를 저장할 수 없기 때문에 비어있습니다.
CA는 스스로 새로운 트랜잭션을 만들 수 없습니다. CA는 EOS나 다른 CA에서 받은 트랜잭션에 대한 응답에 대해서만 트랜잭션을 만들 수 있습니다.
이더리움의 전역 상태는 계정 주소와 계정 상태를 매핑한 것으로 구성되어 있습니다. 이 매핑은 머클 패트리샤 트리(Merkle Patricia Tree) 형태로 저장되어 있습니다.
머클 패트리샤 트리에서 변조가 시도되면 그 즉시 발견되기 때문에, 루트 노드는 데이터에 대한 ID처럼 사용될 수 있습니다. 또한 블록 헤더는 상태, 트랜잭션, 영수증 트리의 루트 노드 값을 가지고 있기 때문에, 네트워크의 노드들은 모든 상태를 저장하고 있지 않더라도 이더리움의 상태 일부분을 검증할 수 있습니다.
트랜잭션은 메시지 호출(Message Call)과 컨트랙트 생성(Contract Creations) 두 종류로 나뉩니다.
이더리움의 모든 트랜잭션은 항상 EOA에서 만들어지고 블록체인에 올라갑니다. 즉, 트랜잭션은 외부 세계를 이더리움 내부의 상태로 연결해주는 다리와 같습니다. 연결의 창구가 CA입니다.
논스를 0으로 설정한다.
송신자가 CA 생성 트랜잭션에 이더를 함께 보낸 경우, 이를 CA의 잔금(Balance)으로 설정한다.
잔금에서 value 만큼을 제외한다.
CA의 스토리지를 빈 값으로 초기화한다.
CA의 코드를 빈 문자열의 해시값으로 초기화한다.
계약을 초기화하는 이 init 코드를 실행할 때는 가스를 사용합니다. 트랜잭션은 남아있는 가스보다 더 많은 가스를 소비할 수 없기 때문에, 만약 남아있는 가스를 다 사용한 경우 OOG(Out-of-Gas) 예외 처리와 함께 코드 실행이 종료됩니다. OOG로 인한 트랜잭션 종료가 발생하면 상태는 트랜잭션 실행 이전 상태로 돌아갑니다.
[스마트 컨트랙트&핵심 요약-그림8, 9] EVM의 구성 요소, EVM 실행 모델
이더리움에서 가장 중요한 개념 중 하나는 트랜잭션 실행 수수료입니다. 이더리움에서 트랜잭션의 결과로 발생하는 모든 연산은 수수료를 요구합니다. 이 수수료를 가스(Gas)라고 합니다.
가스는 트랜잭션 코드에 있는 모든 Opcode를 실행하는데 필요한 수수료를 측정하는 데 사용하는 단위입니다. Gas Price는 가스당 지불하려고 하는 이더의 양을 의미하며, Gwei라는 단위를 사용합니다.
트랜잭션 송신자는 Gas Limit과 Gas Price를 트랜잭션에 지정합니다. 이 Gas Price와 Gas Limit은 송신자가 트랜잭션을 실행하는데 지불하고자 하는 Wei의 최대 양을 의미합니다.
채굴자는 연산을 수행하고 트랜잭션을 검증하는 데에 자원을 소모하기 때문에 이에 대한 보상으로 가스 수수료를 받습니다.
이더리움은 튜링 완전 언어이기 때문에, 튜링 불완전한 비트코인 스크립트와는 달리 반복문을 지원합니다. 그러나 반복문의 가장 큰 단점은 무한 루프 문제가 일어날 수 있다는 것입니다. 만약 악의적인 사용자가 큰 자원을 소모하는 무한 루프 코드가 들어있는 트랜잭션을 실행시킨다면, 트랜잭션은 이더리움 네트워크의 엄청난 양의 자원을 소모하게 될 것이고, 심각하게는 이더리움 네트워크 전체가 멈출 수도 있습니다.
수수료는 이러한 악의적인 공격으로부터 네트워크를 보호합니다. 연산마다 수수료를 부과하면 악의적인 사용자라도 수수료를 지불해야 하므로 쉽게 무한 루프 코드를 실행시킬 수 없습니다. 또한 의도치 않게 무한 루프를 만든 코드를 실행시키더라도 Gas Limit을 설정해두면 지정해둔 가스를 다 소모하기 전에 실행을 멈출 수 있습니다.
프라이빗 블록체인은 네트워크 내에서 초대된 사용자만이 네트워크에 참여하고, 원장에 접근할 수 있는 허가형(Permissioned) 블록체인을 의미합니다. 프라이빗 블록체인은 채굴 과정과 합의 알고리즘에 대한 권한을 중앙 기관이 개발하고 유지합니다. 중앙 기관은 네트워크에 참여할 수 있는 사용자를 결정합니다.
높은 효율성
완전한 개인 정보 보안
불법적 활동 제한
하이퍼레저
R3
넥스레저
하이퍼레저 패브릭의 블록체인적 특징
프라이버시와 기밀성: 패브릭의 채널(Channel)은 네트워크의 특정 하위 노드 집합에게 트랜잭션 프라이버시와 기밀성을 보장해줍니다.
효율적인 처리: 네트워크의 동시성과 병렬성을 제공하여, 트랜잭션 실행을 트랜잭션 정렬 및 커밋과 분리합니다.
체인코드 기능: 이더리움의 스마트 컨트랙트에 해당하는 체인코드를 제공합니다.
모듈식 설계: 아키텍쳐들을 모듈식으로 구현하여 필요한 모듈들을 가져다 쓸 수 있도록 선택권을 제공합니다.
피어(Peer) 피어는 블록체인 네트워크의 기본 요소이며, 원장과 스마트 컨트랙트를 호스팅하는 노드입니다. 네트워크와의 상호작용의 시작점이며, 어플리케이션이 체인코드(스마트 컨트랙트)를 실행하여 쿼리를 하거나 원장을 업데이트하도록 합니다.
커밋 피어와 보증 피어로 나뉩니다.
채널(Channel) 하이퍼레저 패브릭 채널은 둘 이상의 특정 네트워크 노드 간의 통신을 위한 프라이빗 서브넷으로, 프라이빗 트랜잭션을 수행하기 위한 목적으로 사용됩니다.
스마트 컨트랙트는 트랜잭션을 관리하며, 체인 코드는 스마트 컨트랙트를 배포하기 위해 패키징하여 관리합니다.
플랫폼의 목적: 이더리움은 EVM 위에서 스마트 컨트랙트를 실행하는 하나의 목적을 위해 만들어졌습니다. 하이퍼레저는 고성능과 신뢰성이 높은 블록체인 개발을 위한 산업 전반의 협업을 가속화하기 위해 도입되었습니다.
작동 방식: 이더리움은 퍼블릭 블록체인으로, 누구나 블록체인 네트워크에 접근할 수 있고, 네트워크에 접근할 때 허가받을 필요가 없습니다. 반면, 하이퍼레저 패브릭은 프라이빗 블록체인으로, 허가된 사용자만이 네트워크에 참여할 수 있습니다.
피어 역할: 이더리움은 트랜잭션이 완료되면 이를 위해 여러 노드가 참여해야 하므로 확장성, 프라이버시, 효율성 등의 문제가 발생할 수 있습니다. 하이퍼레저는 네트워크 내의 각 피어에게 트랜잭션을 수행하기 위해 정보를 제공할 필요가 없는 DLT(Distributed Ledger Technology)를 제공합니다.
기밀성: 이더리움은 퍼블릭 네트워크이기 때문에, 블록체인 네트워크에 기록된 모든 트랜잭션에 누구든지 접근할 수 있습니다. 하이퍼레저는 허가형 프라이빗 네트워크이기 때문에 허가된 멤버만 트랜잭션에 접근할 수 있습니다.
합의 메커니즘: 이더리움은 모든 노드가 합의에 도달해야 하는 PoW 합의 알고리즘을 사용합니다. 반면, 하이퍼레저 패브릭은 다른 종류의 합의 알고리즘을 사용합니다. 하이퍼레저 패브릭에서는 아예 합의하지 않거나, 다양한 합의 프로토콜 중 하나를 선택할 수 있습니다.
프로그래밍 언어: 이더리움은 이더리움의 자체 언어인 솔리디티를 사용하지만, 하이퍼레저에서는 Go 언어를 사용합니다.
금융 상품(DeFi)
게임 및 NFT
DAO
ICO
브릿지
일정한 형식의 반복적인 계약이 많은 경우
사례: 보험
원격자 간 계약 체결이 필요한 경우
사례: 자동차 렌탈 서비스
제품의 유통 추적이 필요한 경우
사례: 물류 유통
오라클은 web API나 마켓 데이터 피드와 같은 방식을 통해 블록체인과 스마트 컨트랙트용 외부 데이터를 검색하고 검증하는 것을 의미합니다.
오라클 문제는 서드 파티 오라클과 스마트 컨트랙트의 무신뢰성 실행 간 보안, 인증, 신뢰 충돌 문제에 관한 것입니다. 스마트 컨트랙트는 주어진 데이터에 따라 계약 이행 여부를 결정할 뿐이지, 데이터에 대한 자체적인 판단 능력은 갖추고 있지 않습니다.
컴퓨터는 입력받은 값에 대해 정해진 행동을 하므로, 조종할 수 없는 새로운 데이터를 생성하는 것을 잘하지 못합니다. 따라서 컴퓨터 과학에서 난수는 유사 난수(Pseudo Random)와 진짜 난수(True Random)로 나뉩니다. 유사 난수는 컴퓨터에 있는 데이터와 알고리즘을 통해 얻게 되는 난수입니다. 이 난수는 컴퓨터 내부에 있는 알고리즘과 데이터를 가지고 생성되었기 때문에 특정한 패턴을 가지게 되고, 이에 따라 예측할 수 있습니다.
블록체인에서는 모든 노드가 트랜잭션을 검증함으로써 데이터의 무결성을 보장하기 때문에, 블록체인에서 일어나는 모든 동작은 결정적인 방식으로 일어납니다.
예를 들어, 이더리움 스마트 컨트랙트에는 랜덤 함수가 구현되어 있지 않습니다. 노드들이 블록을 검증하기 위해서는 블록에 있는 트랜잭션을 실행한 결과 상태 값과 현재 자신이 가지고 있는 상태 값을 비교해야 합니다. 그런데 트랜잭션에서 무작위 값이 나오면 트랜잭션을 실행한 결과 상태 값이 매번 변할 것이기 때문에 데이터의 무결성을 증명하기가 매우 어려워집니다.
그러나 우리가 원하는 난수 생성은 결정적이면 안 됩니다. 매번 예측할 수 없는 값이 나와야 예측하거나 조작할 수 없기 때문입니다.
Commit Reveal Scheme
BLS Scheme
비트코인 스크립트는 보안상의 이유로 Opcode를 사용할 수 없게 설계되어있다.
때문에 비트코인에서는 반복문을 사용할 수 없다보니 단순한 스마트 컨트랙트를 만드는데 그쳤다.
반대로 이더리움은 dApp을 만들 수 있도록 튜링 완전한 언어인 솔리디티를 제공하면서 개발자가 원하는 스마트
컨트렉트를 유연하게 구현할 수 있게 되었다.
플랫폼 목적 : 이더리움은 evm위에서 스마트 컨트랙트를 실행하기위해
만들어졌고 하이퍼레저는 고성능과 신뢰성을 바탕으로 산업 전반의
협업을 가속하기위해 도입되었다.
작동 방식 : 이더리움은 허가없이 누구나 블록체인 네트워크에 접근할 수
있는 반면 하이퍼레저 패브릭은 허가된 사용자만 네트워크에
참여할 수 있다.
피어 역할 : 이더리움은 피어마다 역할이 있는 반면, 하이퍼레저는 각 피어에게 정보를
제공할 필요가 없는 DLT를 제공한다.
합의 메커니즘 : 이더리움은 모든 노드가 합의에 도달해야하는 POS합의 알고리즘을 사용하고
하이퍼레저 패브릭에서는 아예 합의하지 않거나 다양한 합의 프로토콜 중
하나를 선택할 수 있다.
프로그래밍 언어 : 이더리움은 이더리움의 자체 언어인 솔리디티를 사용하지만,
하이퍼레저에서는 GO언어를 사용합니다.
VM: Virtual Machine 가상머신
EVM: 이더리움, EOS VM: 이오스에서 사용하는 VM
개발자가 작성한 코드를 이더리움 블록체인에서 실행될 수 있도록 하는 가상 머신
개발자가 솔리디티로 작성 => 바이트코드로 변환(solc로 컴파일) => EVM이 Opcode단위로 읽음
뱅코르 알고리즘은 스마트 컨드랙트 위에서 코인을 거래하는 것이다.
유니스왑을 사용하는 이유는
1. 단순하고 2. 더 빠르고 3. 비용이 적기 때문이다.
=> 이로 인해 더 많은 유동성 발생
유니스왑의 경우 스마트 컨트랙트로 작동을 하지만
1. 뱅커와 다르게 자체 토큰이 존재하지 않고
2. 단순한 알고리즘을 사용하게 된다.
=> 때문에 비용이 저렴
동일한 입력값을 넣는다 하더라도, 매번 다른 과정을 거쳐 다른 결과를 도출하는 것을
비결정적 문제라 합니다. 이에 반해, 솔리디티의 경우 튜링 완전성을 가지고 있고,
모든 노드에서 나온 결과값이 동일하기에 결정적 특성을 가지고 있습니다.
트랜잭션이 발생하는 모든 연산에 있어 수수료를 지불하는 방식으로 과금을 구합니다.
이에 따라 연산이 복잡할 경우 채굴자는 더 높은 수수료를 요구합니다. 또한 송신자가
자신의 트랜잭션을 먼저 실행시킬 수 있도록 채굴자에게 수수료를 제공합니다.
1) 채굴자에게 주는 수수료
2) 트랜잭션에 드는 연산에 대한 수수료
가상 메모리 상태와 레지던트 세트 크기로 CPU, Memory, Storage 사용량을 구할 수 있다.
런타임에 가상메모리 사용량, 레지던트 세트 크기 등과 같은 메모리 사용량을 얻을 수 있다.
(일부 시스템 라이브러리를 사용할 수 있음)
C++의 경우 "/proc/self/stat" 폴더에서 모든 세부 정보를 얻을 수 있다.
다른 프로그래밍 언어로 작성된 프로그램과 달리 스마트 계약 코드는 타이머나 이벤트(event)
등을 통해서 실행되지 못한다. 예를 들어, 특정 시간에 특정 주소로 자동으로 송금하는 프로세스
등은 구현할 수 없다. 왜냐하면 스마트 컨트랙트는 자기 자신의 개인키(private key)가 없기
때문에 스스로 어떤 트랜잭션도 발생시킬 수 없기 때문이다.
단일 마이그레이션 파일에서 둘 이상의 스마트 계약을 배포할 수 있다. Truffle 마이그레이션은
계약, 라이브러리, 인수 전달을 연결하기 위해 정확히 이루어진다.계약이 상호 작용할 필요가 없는
경우 각각에 대해 서로 다른 마이그레이션 파일을 갖는 것이 유용하다. 그중 하나만 변경한 경우
변경되지 않은 코드를 재배포하지 않고 특정 마이그레이션을 개별적으로 실행할 수 있다.
if or when (이벤트 x가 실행되면) { // 조건
액션 y를 실행하라 // 계약 이행
}
코드가 블록체인 네트워크에 올라가면, 네트워크는 미리 결정된 조건이 충족되고,
검증된 경우 조건에 따른 액션을 실행
코드에 따라 계약이 실행 됨을 보장하는 결정론적인 상태(Deterministic State)인
다자간 디지털 계약이 바로 스마트 컨트랙트이다.
일반적인 어플리케이션: 중앙서버
디앱: 탈중앙화됨. 블록체인 생태계에 직접적으로 블록으로 저장됨
장점: 보안성 및 투명성, 인센티브, 거버넌스 참여
단점: 느린 속도, 높은 비용
1) 스택: EVM은 들어오는 바이트코드를 스택구조로 처리함
2) 메모리: 휘발성. 들어오는 데이터를 배열로 저장하고
프로그램이 종료되면 메모리에 있는 데이터도 사라짐
3) 스토리지: 비휘발성, 시스템 상태에 따라서 유지.
가상 ROM이라는 공간에 코드와 별개로 분리해서 저장
사용자의 경우
트랜잭션을 실행하기 전 가스한도를 설정해둔다(지정된 가스).
지정된 가스보다 스마트 컨트랙트 실행비용이 높은 경우,
즉 한도를 낮게 설정한 경우 트랜잭션 연산을
완벽히 마치지 못하게 되고 트랜잭션을 실패한다.
또한 그 시점까지 사용된 수수료는 환불받지 못한다.
이에 따라 스마트 컨트랙트 실행비용에 대한 추측이 필요하며,
추측값보다 한도를 높이 설정해둔다면 트랜잭션을 마치더라도
남는 이더는 환불 받을 수 있을 것이다.
가스 사용량은 트랜잭션을 처리할 때 드는 비용이다.
이더리움은 공격자들의 공격을 방지하기 위해 트랜잭션 처리하는 데에 수수료를 부과한다.
수수료 계산 원리 : 트랜잭션 크기에 따라 결정
(클수록 많은 수수료 소요, 작을수록 적은 수수료 소요)
0.000000001ETH = 1 Gwei(10억 Gwei = 1 ETH)
가스비는 이더리움 채굴자들이 채굴에 대한 보상으로 가져감
4명의 페어분과 함께 학습하며 이론을 적립했다.
게더에서 진행 한 첫 페어였는데, 게임 하듯 학습을 한 것 같다.
기다리던 스마트 컨트랙트를 드디어 다루게 된 것 같아서 기쁨이 과했지.
관련 책 몇 권 봤다고 익숙할 줄 알았는데, 내가 쓸 수 있도록 익힌다는 것은 전혀 다른 문제인듯.
8번과 10번의 경우 한글 써치에 한계를 느꼈는데, 역시 구글링은 영어로.
Crypto Zombies로 게임을 빙자한 솔리디티 코플릿을 풀어야한다.