스마트 계약(smart contract)또는 스마트 컨트랙트란 블록체인 기반으로 금융거래, 부동산 계약, 공증 등 다양한 형태의 계약을 체결하고 이행하는 것을 말한다.
1994년, 닉 자보가 처음 제안했고, 2013년 비탈릭 부테린에 의해 이더리움이라는 가상화폐속에서 스마트 계약 기능을 구현했다.
출처: 위키백과
Solidity를 구동할 수 있는 이더리움 가상 머신이다. 이더리움 가상 머신과 관련된 내용이다 보니 이더리움 구조에서 설명한 부분이 중복될 수 있다.
모든 계정은 256비트의 문자열들이 서로 키-값으로 영구히 매핑된 스토리지 가지고 있음.
대상 계정이 코드를 포함하고 있으면 코드는 실행되고 페이로드(Binary Data)는 입력 데이터로 제공
대상 계정이 설정되지 않은 경우 트랜잭션은 새 컨트랙트 생성, 논스의 의해 주소 결정.
각 트랜잭션 생성 데이터 페이로드는 EVM 바이트 코드로 실행되기 위해 사용.
컨트랙트를 만들기 위해 실제 코드를 보내는 대신, 실행될 때의 코드를 리턴하는 코드를 보내야 함.
가스 = 가스 가격 * 가스 양 지불
컨트랙트가 다른 컨트랙트 호출하거나 컨트랙트 아닌 계정으로 Ether를 송금할 수 있음.
송신자, 수신자, 데이터 페이로드, Ether, 가스와 리턴 값을 가지고 있어 트랜잭션과 유사하다.
델리게이트 콜 / 콜코드와 라이브러리
델리게이트 콜: 대상 주소의 코드가 호출하는 컨트랙트의 컨텍스트 내에서 실행되고, msg.sender / msg.value 값이 변하지 않는다는 것 외에는 메시지 콜과 동일하다.
컨트랙트가 실행 중 다양한 주소의 코드를 동적으로 불러온다.
로그
블록 레벨까지의 모든 절차를 매핑, 특별히 인덱싱된 데이터 구조 데이터를 저장하는 것도 가능하다.
이벤트를 구현하기 위해 사용하며, 일부 로그 데이터는 bloom filters 안에 저장해 효율적이고 암호화되어있으며 안전하다.
생성
페이로드 데이터가 실행되고, 결과가 코드로 저장된다, 호출자와 생성자가 스택의 새 컨트랙트 주소를 받는 다는 점이 일반 메시지 콜과 다르다.
비활성화와 자기소멸
selfdestruct 연산이며 주소에 저장된 남은 ether는 지정된 타켓으로 옮겨지고 스토리와 코드는 해당 상태에서 지워진다.
비활성화: 내부상태 disable
OpenZeppelin 을 통해 토큰을 생성하는 것을 추천한다. (규격이 정해져있기 때문)
ERC20 토큰을 생성하기 위해 필요한 Solidity 파일 목록들
Abstract Contract: 구현되지 않은 함수 하나라도 있으면 된다. 이것만 쓰면 컴파일 되지 않는다.
ERC20Basic 컨트랙트는 totalSupply, balanceOf, transfer 함수를 가지고 내부에서 Transfer 이벤트를 발생시킬 수 있다.
transferFrom(제 3자가 대신 송금해주는 기능) 제외
ERC20 에 따르면 토큰이 이동할 때에는 반드시 Transfer 이벤트 발생 해야 한다.
안전한 사칙연산 라이브러리 by OpenZeppelin
1 ether = 10 ** 18 wei 이기 때문에 보통 18승으로 함.
allowed[누가][누구에게] = 얼마;
approve: 이더리움의 경우에는 채굴이 되기 전까지는 실행이 되자않기 때문에, 늦게 실행한 코드가 먼저 동작하는 경우 생긴다.
따라서 인출한 권리를 바꿔줄때 0으로 바꾸고 다른 값으로 변경하기를 추천한다.
ERC20 규약에는 X, increaseApproval, decreaseApproval: 0으로 변경하고 다시 변경하는 거 안하고 쉽게 해주기 위해서이다.