블록체인에서 호스팅되고 실행되는 프로그램으로, 미리 설정된 조건이 충족될 시 계약을 이행하는 방식으로 수행된다. 탈중앙화된 블록체인에서 실행되어 데이터 무결성이 보장되고, 계약의 이행에 믿을만한 제3자의 존재가 불필요하다.
신뢰할수 있는 제3자가 필요없으므로 그에게 지불하는 거래 수수료가 없다.
스마트 컨트랙트의 내용은 블록체인에 올라가므로 누구나 확인할 수 있다.
스마트 컨트랙트는 특정 조건이 만족하기만 하면 계약의 내용이 수행되는 결정론적인 상태인 다자간 계약이다.
SPOF가 없으므로 내용과 결과의 무결성이 보장된다. 계약을 변경할 수 없는 주체가 없으므로 공평함이 보장되며, 체인위에서 프로그램적으로 수행되므로 효율적이다.
배포 이후 수정이 불가능하여 배포한 컨트랙트의 보안 취약점이 발견될 경우 해킹에 취약하다. 블록체인 외부 정보에 의존적인 스마트계약을 작성할 경우 외부에서 정보를 가지고 오기 위한 과정에서 탈중앙성에 문제가 생길 수 있다.
비트코인은 계정이 없으므로 해당 지갑이 얼마만큼의 코인을 보유하고 있는지는 UTXO를 검사함으로써 알 수 있다. UTXO는 사용되지 않은 수표와 같다. 만약 앨리스의 UTXO에 10BTC가 들어 있고, 앨리스가 밥에게 3BTC를 송금하려고 하면 앨리스가 사용할 수 있는 10BTC가 담긴 UTXO는 unlock되어 locked된 3BTC, 7BTC의 UTXO로 분리된다. UTXO모델은 심플하여 병렬적으로 트랜잭션을 검증할 수 있다.
UTXO를 활용해 트랜잭션을 생성하기 위한 명령어.
비트코인 스크립트는 Op코드로 이루어져 있다. 스크립트는 콜스택을 이용해 OP코드와 연산자를 규칙에 따라 처리한다.
P2PK와 P2PKH가 있다.
P2PKH는 공개키의 해시값을 활용하므로 공개키의 주소를 그대로 노출하는 P2PK보다 안전하다.
해당 스크립트들에 포함된 OP코드의 자세한 작동과정은 지금단계에서는 이해하지 않고 넘어간다.
비트코인은 보안성과 탈중앙성은 우수하지만 블록생성시간 약 10분으로 길고, 거래가 완료되기까지 약 1시간이 소요되므로 확장성에 한계가 있다. 이를 해결하기 위한 솔루션으로 오프체인에서 거래한 결과만 메인체인에 반영하는 라이트닝 네트워크, 비트코인에서 튜링 완전한 스마트 컨트랙트를 수행하게 하는 루트스탁가 있다.
2021년 11월에 이루어진 비트코인 업그레이드로 슈노르 서명과 MAST등 중요한 사항이 포함되어 있다.
MAST와 슈노르 서명을 통해 스크립트 실행에 대한 효용성이 극대화 되어, 비트코인 스마트 컨트랙트의 활용성이 확장될 것으로 기대된다. MAST와 슈노르 서명이 결합되면 서명을 한번만 해도 트랜잭션이 이루어지므로 속도가 개선되고 효율성이 증대된다.
이터리움은 비탈릭부테린이 2015년에 최초로 출시한 블록체인 네트워크다. 튜링 완전한 언어인 솔리디티로 작성한 스마트 컨트랙트를 이더리움 네트워크에 배포할 수 있고, 배포된 컨트랙트는 EVM위에서 구동 플랫폼에 종속받지 않고 실행 가능하다. 이더리움은 허가 트랜잭션😢과 무허가 트랜잭션😢을 모두 허용한다.
고급언어인 솔리디티로 작성된 스마트컨트랙트를 컴파일하면 EVM이 해석가능한 바이트코드가 된다. 바이트코드는 이더리움 클라이언트를 통해 네트워크게 올라가게 된다. 이후 EVM은 바이트코드를 하드웨어에서 구동시킬 수 있는 OP코드 단위로 해석하여 실행한다.
객체지향, 정적 타입, 고급 스크립트 언어다. 솔리디티로 작성된 코드를 컴파일하면 EVM에서 구동가능한 bytecode가 된다
비트코인의 스크립트와 달리 솔리디티는 튜링완전성을 제공한다. 이 말은 범용 컴퓨터언어와 같이 기본연산과 조건문, 반복문을 모두 수행할 수 있다는 의미다.(비트코인 스크립트는 보안성을 위해 의도적으로 반복문을 제외했다.)
Remix IDE, solc(컴파일러), Ganache(테스트 환경 구축), TestNet(Goerli, Sepolia)과
솔리디티 코드를 체인에 올리기 위한 프레임워크들이 있다. (테스트, 디버깅, 컴파일, 배포 제공)
프레임워크들의 종류는 다음과 같다.
상태머신이란 입력을 받고, 해당 입력을 기반으로 새로운 상태로 전환하는 컴퓨터를 의미한다. 이더리움은 Genesis에서 출발해 트랜잭션이라는 입력을 받고 새로운 상태로 전환되어 나간다. 아무 입력도 받지 않은 마지막 상태가 이더리움의 현재 상태다.
이더리움에는 EOA(External Owned Account), CA(Contract Account) 두 종류의 계정이 존재한다.
EOA는 일반적인 계정을 의미한다. 트랜잭션을 만들 수 있고, 비밀키를 가지고 있으므로 트랜잭션에 대한 서명도 가능하다. EOA에는 코드를 저장 할 수 없어 EOA의 Contract Code 값은 비어 있다.
반면 CA는 외부에서 들어온 트랜잭션에 대한 응답에 대해서만 트랜잭션을 만들 수 있다. 하지만 코드를 저장 할 수 있어 Contract Code값에 코드의 해싱값을 포함하고 있다.
당연하게도 이더리움 네트워크에서 일어나는 모든 액션은 항상 EOA에서 만든 트랜잭션부터 출발한다.
이더리움의 블록헤더에는 3가지 머클트리 루트의 해시값이 저장되어 있다.
1. 상태트리 : 트랜잭션과 연관동 계정의 상태 정보
2. 트랜잭션 트리 : 현재 블록의 트랜잭션 정보 저장
3. 영수증 트리 : 현재 블록의 거래 영수증 정보 저장
때문에 데이터무결성이 보장되고, 블록헤더는 3가지 머클루트 값을 가지므로 모든 상태를 가지고 있지 않아도 이더리움의 상태 일부분을 검증할 수 있다.