스마트 컨트랙(Smart Contract)이란?
1990년대에 Nick Szabo가 소개한 개념으로 기존의 문서 계약을 디지털 형식으로 바꾼 것입니다.
디지털 형식으로 명시된 서약(commitment)들의 집합이라고 할 수 있음!
전혀 스마트하지 않아서 다소 잘못된 용어지만 자리잡음
블록체인에서의 정의
불변의 컴퓨터 프로그램
- 컴퓨터 프로그램
- 불변(immutable)한 번 배포되면 변경 불가
- 결정적(deterministic) 실행한 결과가 모두 같음.
- EVM(Ethereum virtual machine) 위에서 동작
- 탈중앙화된 World Computer 동일한 상태를 유지
Smart Contract를 작성하는 언어
- Solidity(가장 대중화되어 있고 상대적으로 사용하기 쉬움)
- LLL
- Viper
- Assembly
Smart Contract의 배포와 호출
Smart Contract Code → 컴파일 → EVM Bytecode, ABI(Application Binary Interface) in JSON → 트랜잭션 생성
→
1
2
3
4
5
6
7
{
...
from: deployer's address,
to: 0x,
data: bytecode,
...
}
→ 서명 → Sending transaction
스마트 컨트랙에는 바이트코드가 담기게 됩니다..
스마트컨트랙 또한 주소가 생성되는데 이를 컨트랙트 주소(CA: Contract Address)라고 합니다.
실제로 스마트 컨트랙을 Solidity로 작성해 보기 위해 우리는 Remix IDE를 사용합니다.
Remix IDE로 실제 배포 및 호출 해보기
- 이더리움 재단이 제공하는 스마트컨트랙을 쉽게 사용할 수 있게 웹페이지에서 제공하는 통합 개발 환경
스마트 컨트랙 배포
우리는 여기서 기본적으로 제공되는 예제 contract인
2번 영역에서 contract 폴더 내의 1_Storage.sol 을 활용해보겠습니다!
컴파일은 1번 영역의 2번째 버튼을 사용합니다.
이더리움은 2015년에서부터 엄청 많은 업데이트가 있었는데 그러는 중 컴파일러 문법이 달라지기도 하고 내부적인 구현이 달라지기도 했습니다.
따라서 컴파일러의 버전을 pragma solidity 라는 지시자로 언제부터 어디까지의 버전을 따른다는 것을 명시합니다.
1번 영역에서 다시 파일 익스플로러로 넘어오면 컴파일한 sol파일이 있는 폴더에 artifacts 라는 폴더가 생성되고 컴파일 결과를 확인할 수 있습니다!
여기까지 스마트 컨트랙의 배포 과정 중 컴파일로 ABI 생성까지 이루어진 것!
그럼 이걸 실제로 배포를 해야합니다
(ENVIRONMENT 부분)
JavaScript VM 선택시 총 10개의 테스트해볼 수 있는 이더리움 계정을 준다.
[1번] 디플로이(Deploy) 선택시 해당 스마트 컨트랙이 [2번] 배포(가상환경에/_)되는 것을 볼 수 있습니다.
또한 3번을 보면 배포가 완료되어 가스비가 나간것을 확인할 수 있습니다.
그리고 터미널에서 배포 부분을 크게 보면 어떤 지갑에서 나갔고 가스를 얼마 썼고 등의 확인을 할 수 있습니다.
그럼 여기까지 스마트컨트랙의 배포 과정이 완료된 것이고 우리는 테스트만을 목적으로 한 것이기 때문에 아직 이더리움 메인넷을 활용하진 않은 것입니다.
→ 브라우저 기반 가상환경에서 즉각적으로 처리되는 테스트를 한 것
배포된 컨트랙트의 주소값은 왼쪽 아래에서 확인 가능
그렇다면 이젠 배포가 끝났으니 배포된 스마트 컨트랙을 호출할 차례입니다.
스마트 컨트랙 호출
- Deployed Contracts 열기
각각의 store 버튼과 retrieve 버튼이 각 우리가 컴파일한 1_Storage.sol의 function을 가리킨다는 것을 알 수 있습니다
여기에서 retrieve 버튼을 눌러보시면 number의 숫자를 get할 수 있습니다.
자바에서 get, set 메서드를 작성하는 것처럼 그러한 동작을 하는 함수라는 것을 알 수 있습니다.
아래쪽의 decoded output을 보시면 0이라는 숫자가 받아진 것을 보실 수 있습니다.
우리의 코드에선 number를 단순 선언만 해줬었는데 0이라는 값이 초기화 되어 있다는 것도 알 수 있죠.
또한 이런 retrieve 함수는 호출했을 때 가스가 들지 않지만
이렇게 값을 바꾸는 함수를 호출할 경우 가스가 사용되게 됩니다. (맨 아래 함수의 호출 결과 상세)
→ 전세계의 컴퓨터에서 해당 값을 바꾸라는 얘기가 되므로 일을 시키는데에는 가스가 필요함!
이것이 단순한 컴퓨터랑은 무엇이 다른가?
→ 한 번 값을 1000으로 바꾸고 나면 다시 스마트 컨트랙으로 값을 바꾸기 전까진 전세계의 컴퓨터들이 이 값을 1000 증명하기 때문에 불변의 속성을 가집니다.
모든 것을 프로토콜대로만 제어할 수 있다! 라는 것입니다.
우리는 스마트컨트랙 배포를 끝마쳤으니 이제 배포한 사람뿐만 아니라 이 스마트 컨트랙을 아예 다른 제 3자가 활용할 수 있는데
배포한 스토리지에서 컨트랙트 주소를 복사하고 이를 삭제한 후 다른 계정으로도 똑같이 테스트 할 수 있습니다.
이와 같이 이더리움 주소를 바꿨고 100 ether가 그대로 있지만
At Address버튼을 통해 컨트랙트 주소를 추가하고 아래에서 배포된 컨트랙트를 다시 불러올 수 있습니다.
그리고 여기서 retrieve를 하면 예전에 저장했던 값인 1000이 보이는 것을 확인하실 수 있습니다.
여기까지 블록체인 [이더리움을 통해 맛보기] (2) 였습니다.
감사합니다.
해보면 좋은 것들
Remix에서 3_Ballot.sol 배포해보기
상태 변수의 의미 알기
- chairman, proposals 변수를 호출해보고 어떤 값이 할당되어 있는지 알기
함수 및 변수 호출하기
- 아직 사용하지 않은 계정을 선택해 3_Ballot.sol 배포한 컨트랙트의 delegate() 함수 호출해보기
- 호출자(계정)를 변경하고 proposals의 index중 하나를 입력하고 vote()를 호출해보기
- 2에서 호출한 계정의 voters 정보 확인해보기
3_Ballot을 Ropsten 테스트넷에 배포하기
- Remix환경과 MetaMask를 이용하여 Ropsten 네트워크에 3_Ballot.sol 컨트랙트를 배포해보기