A의 계좌에서는 $X가 감소하고 B의 계좌에서는 $X가 증가하는 거래가 일어났을 때, 상태변환함수에 의해 발생하고, 만약 처음에 A의 계좌에 있는 금액이 $X 이하인 경우에는 상태변환함수가 에러를 리턴한다.
상태변환함수 'APPLY(S,TX) -> S'
1. TX의 각 입력각에 대해
- 만약 참조된 UTXO가 'S'에 없다면 에러를 리턴
-> 존재하지 않는 코인이 트랜잭션에 사용되는 것을 방지- 만약 서명이 UTXO의 소유자와 매치되지 않으면, 에러를 리턴
-> 다른 사람의 코인이 트랜잭션에 사용되는 것을 방지
- 만약 입력에 사용된 UTXO들 금액의 합이 출력 UTXO들 금액의 합보다 작으면, 에러를 리턴
- 입력에 사용된 UTXO가 삭제되고 출력 UTXO가 추가된 'S'를 리턴
비트코인에서는 탈중앙화된 통화시스템을 구축하고자, 모든 사람이 수긍할 수 있는 트랜잭션 순서 합의 시스템을 상태변화시스템과 결합해야만한다. 그러므로 네트워크에 블록이라 불리는 트랜잭션 패키지를 지속적으로 생성하고자 시도하는 노드들이 필요하다. 각 블록은 타임스탬프, 논스(nonce), 이전 블록의 해시, 그리고 이전 블록 이후에 발생한 모든 트랜잭션 목록을 포함한다.
아래의 알고리즘을 통해 하나의 블록의 유효성을 확인한다.
- 이 블록에 의해 참조되는 이전 블록이 존재하는지, 유효한지 확인한다.
- 타임스탬프 값이 이전 블록의 타임스탬프 값보다 크면서 2 시간 이내인지 확인한다.
- 작업증명(proof of work)이 유효한지 확인한다.
S[0]
를 이전 블록의 마지막 상태(state)가 되도록 설정한다.TX
를n
개의 트랜잭션을 가지는, 블록의 트랜잭션 목록으로 가정한다. 폐구간0...n-1
의 모든 i 에 대해,
S[i+1] = APPLY(S[i], TX[i])
집합 중 어느 하나라도 에러를 리턴하면 거짓(false)을 리턴하며 종료한다.- 참(true)을 리턴하고,
S[n]
를 이 블록의 마지막 상태로 등록한다.
비트코인에 구현된 스크립트 언어에는 한계가 있음.
튜링불완전성 : 모든 경우의 프로그래밍을 다 지원하지는 않는다. 특히 거래 증명을 할 때 무한 순환에 빠지는 것을 방지하기 위해 while이나 for같은 loop명령 카테고리가 빠져있다.
가치 무지 : UTXO 스크립트만으로는 인출 액수를 세밀하게 통제할 방법이 없다. UTXO는 인출액 전부가 송금되거나 말거나밖에 선택할 수 없기 때문에 세밀한 작은 다위로 나눠질 수 없다.
ex) A와 B가 공동계좌에 $1000어치의 BTC를 입금했다고 가정했을 때, 시간에 따라 BTC의 가격에 변동이 생긴다. 두 사람은 30일 후 자동으로 A까 $1000어치 BTC를 받고 B는 나머지 잔액을 받는 계약을 맺고 싶지만 1BTC가 얼마인지 정해지지 않기 때문에 불가능하다.
상태표현제한 : UTXO가 표현할 수 있는 상태는 사용되었거나 안 되거나 둘 뿐이다. 그러므로 이 두가지 상태 이외에 다른 다중 단계 계약이나 스크립트를 만들 수 없다.
이더리움의 목적은 분산 어플리케이션 제작을 위한 대체 프로토콜을 만드는 것이다. 튜링 완전 언어를 내장하고 있는 블록체인이라는 필수적이고 근본적인 기반을 제공함으로써 이 목적을 이루고자 한다. 그리고 이 언어를 사용하여 스마트 컨트랙트, 분산 어플리케이션을 작성하여 소유권에 대한 임의의 규칙, 트랜잭션 형식, 상태변환 함수 등을 생성할 수 있다.
-> 튜링-완전, 가치 인지능력, 블록체인 인지능력, 상태 개념등이 포함되므로 비트코인의 한계를 극복 가능
이더리움에서 상태는 어카운트의 모음으로 구성되어 있다. 어카운트는 아래 4개의 필드를 가지고 있다.
이더는 이더리움을 작동시키는 연료이며 트랜잭션 수수료를 지불하는데 사용된다.
어카운트는 외부 소유 어카운트(EOA)와 컨트랙트 어카운트(CA)로 나뉜다.
외부 소유 어카운트(EOA)
-> 개인키에 의해 통제됨
-> 코드를 가지고 있지 않음
-> 메시지를 보내기 위해서 새로운 트랜잭션을 하나 생성하고, 서명을 해야함
컨트랙트 어카운트
-> 컨트랙트 코드에 의해 통제됨
-> 메시지를 받을 때마다 자신의 코드를 활성화 시킴
-> 메시지를 읽거나 내부 저장공간에 기록하거나 다른 메시지를 보내거나, 컨트랙트를 차례대로 생성함.
트랜잭션은 외부 소유 어카운트(EOA)가 보낼 메시지를 가지고 있는 서명된 데이터 패키지를 말한다. 즉 CA에게 보내고자하는 메시지를 담고 있는 서명된 데이터이다. 트랜잭션은 다음으로 구성되어 있다.
STARTGAS와 GASPRICE를 이용하여 gas를 통한 수수료로 코드내의 우연적이거나 악의적인 무한루프 또는 계산 낭비를 방지한다.
트랜잭션과 유사하지만 컨트랙트에 의해서 생성된다는 점이 차이점이다.
메시지는 다음으로 구성되어 있다.
이더리움 상태 전이 함수 APPLY(S, TX) -> S’ 은 다음처럼 정의 될 수 있다.
- 트랜잭션이 형식에 제대로 맞는지(즉, 올바른 개수의 값을 가지고 있는지) 체크하고, 서명이 유효한지, 논스가 발신처 어카운트의 논스와 일치하는지를 체크한다. 그렇지 않다면 오류를 반환한다.
- STARTGAS * GASPRICE 로 트랜잭션 수수료를 계산하고, 서명으로부터 발신처주소를 결정한다. 발신처 어카운트 잔고에서 이 수수료를 빼고 발신자 논스를 증가시킨다. 발신처 잔고가 충분하지 않으면 오류를 반환한다.
-> 가스비에 대한 수수료 계산- GAS = STARTGAS 로 초기화 한후, 트랜잭션에서 사용된 바이트에 대한 값을 지불하기 위해 바이트당 gas 의 특정양을 차감한다.
-> 실제 가스비용 처리- 발신처 어카운트에서 수신처 어카운트로 트랜잭션 값을 보낸다. 수신처 어카운트가 존재하지 않으면 새로 생성한다. 수신처 어카운트가 컨트랙트이면, 컨트랙트의 코드를 끝까지 또는 gas 가 모두 소모될 때 까지 수행한다.
-> 수신처로 트랜잭션의 값을 보내고 처리- 발신처가 충분한 ‘돈'을 가지고 있지 못해서 값 전송이 실패하거나, 코드 수행시 gas 가 부족하면, 모든 상태 변경을 원상태로 돌려놓는다. 단, 수수료 지불은 제외되고, 이 수수료는 채굴자 어카운트에 더해지게 된다.
- 그 외에는, 모든 남아있는 모든 gas 에 대한 수수료를 발신처에게 돌려주고, 소모된 gas 에 지불된 수수료를 채굴자에게 보낸다.
-> 총 사용된 가스비에서 남은 가스비를 발신처에 돌려주고 트랜잭션 처리에 소모된 가스비를 채굴처에게 전송
컨트랙트의 스토리지는 비어있다고 가정하고, 트랜잭션이 10 ether, 2000 gas, 0.001ether gasprice, 64 바이트의 데이터를 보낸다고 가정하자. 이 경우 상태 변환 함수의 프로세스는 다음과 같다.
- 트랜잭션이 유효하고 형식에 제대로 맞는지 확인한다.
- 트랜잭션 발송처가 최소 2000 * 0.001=2 ether 를 가지고 있는지 확인하고, 그럴 경우, 발송처의 어카운트에서 2 ether 를 뺀다.
- gas=2000 으로 초기화 한 후, 트랜잭션은 170 바이트 길이를 가지고, 바이트당 수수료는 5 라고 가정하면, 850 을 빼야 하고 결국 1150 gas 가 남게 된다.
- 송신처 어카운트에서 추가 10 ether 를 빼고 이것을 컨트랙트 어카운트에 더한다.
- 코드를 실행시킨다. 이 경우는 간단한데, 컨트랙트의 index 2 에 해당하는 스토리지가 사용되었는지 확인하고 (이 경우, 사용되지 않았다.) index 2 에 해당하는 스토리지 값을 ‘CHARLIE’로 설정한다. 이 작업에 187 gas가 소비됐다고 가정하면, 남아있는 gas 의 양은 1150 - 187 = 963 이 된다.
- 963*0.001 = 0.963 ether 를 송신처의 어카운트로 되돌려주고, 결과 상태를 반환한다.
메시지는 트랜잭션와 마찬가지로 상태를 원래 상태로 되돌린다. 메시지 실행시 gas가 부족하면 메시지 실행과 이후의 과정은 되돌려지지만 이전의 실행은 되돌려지지 않는다.
특정한 집합의 구성원 중 필요한 수만큼의 구성원의 동의하에 조직자금운용 권한 및 코드 변경 권한을 갖음 (주주총회와 비슷?) 구성원들은 운영자금의 분배를 어떻게 할 지를 결정한다. DAO의 자금 배분의 강제 집행을 위해 암호화 블록체인 기술을 사용한다.
링크텍스트
위 링크를 통해 코드 작성 없이 DAO를 만들어 볼 수 있다. (감사하게도 SKKRYPTO 정규 세션 중에 공유해주셨다.)
GHOST의 문제의식은, 거래가 처리되는데 걸리는 시간이 빨라 블록체인들이 높은 스테일 비율로 인해 보안성 저하를 겪고 있는데, 이는 블록들이 네트워크를 통해 전파되는데 일정한 시간이 걸리기 때문이다. 그리고 중앙집중화 이슈도 겪고 있다. 이를 해결하기 위해 이더리움은 수정된 GHOST 프로토콜을 도입했다. 수정된 GHOST 프로토콜은 고스트 프로토콜의 7단계 레벨만 포함한 수정된 버전의 고스트 프로토콜이다. 수정 고스트 프로토콜은 스테일블록들 중 일부를 엉클블록으로 채택하고, 이 블록의 생성자에게도 보상을 지급하여 해당 블록들의 작업도 메인체인에 포함시킨다.
-> 즉, 가장 무거운 체인을 채택하는 것이다. (무겁다 : 서브트리가 가장 많다.)