블록체인 정보 맛보기 블록체인 [이더리움을 통해 맛보기] (2)
포스트
취소

블록체인 [이더리움을 통해 맛보기] (2)

스마트 컨트랙(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

UntitledUntitled

스마트 컨트랙에는 바이트코드가 담기게 됩니다..

스마트컨트랙 또한 주소가 생성되는데 이를 컨트랙트 주소(CA: Contract Address)라고 합니다.

실제로 스마트 컨트랙을 Solidity로 작성해 보기 위해 우리는 Remix IDE를 사용합니다.

Remix IDE로 실제 배포 및 호출 해보기

  • 이더리움 재단이 제공하는 스마트컨트랙을 쉽게 사용할 수 있게 웹페이지에서 제공하는 통합 개발 환경

Untitled

Untitled

스마트 컨트랙 배포

우리는 여기서 기본적으로 제공되는 예제 contract인

2번 영역에서 contract 폴더 내의 1_Storage.sol 을 활용해보겠습니다!

Untitled

컴파일은 1번 영역의 2번째 버튼을 사용합니다.

Untitled

이더리움은 2015년에서부터 엄청 많은 업데이트가 있었는데 그러는 중 컴파일러 문법이 달라지기도 하고 내부적인 구현이 달라지기도 했습니다.

따라서 컴파일러의 버전을 pragma solidity 라는 지시자로 언제부터 어디까지의 버전을 따른다는 것을 명시합니다.

Untitled컴파일을 문제없이 완료하면 왼쪽과 같이 컨트랙트가 나타나게 됩니다.
만약 문법상의 에러가 난다면 터미널 영역에서 에러가 표시됨!
컴파일 완료시 → ABI와 Bytecode가 생성됨.

1번 영역에서 다시 파일 익스플로러로 넘어오면 컴파일한 sol파일이 있는 폴더에 artifacts 라는 폴더가 생성되고 컴파일 결과를 확인할 수 있습니다!

Untitled

여기까지 스마트 컨트랙의 배포 과정 중 컴파일로 ABI 생성까지 이루어진 것!

그럼 이걸 실제로 배포를 해야합니다

Untitled이렇게 컴파일러에서 초록색으로 체크가 되어 있으면
실제로 배포를 할 수 있다는 것인데 실제 배포하기 전에 간단하게
클라이언트의 가상 환경에서 테스트를 해볼 수 있게 제공합니다.

(ENVIRONMENT 부분)

JavaScript VM 선택시 총 10개의 테스트해볼 수 있는 이더리움 계정을 준다.

Untitled

[1번] 디플로이(Deploy) 선택시 해당 스마트 컨트랙이 [2번] 배포(가상환경에/_)되는 것을 볼 수 있습니다.

또한 3번을 보면 배포가 완료되어 가스비가 나간것을 확인할 수 있습니다.

Untitled

그리고 터미널에서 배포 부분을 크게 보면 어떤 지갑에서 나갔고 가스를 얼마 썼고 등의 확인을 할 수 있습니다.

그럼 여기까지 스마트컨트랙의 배포 과정이 완료된 것이고 우리는 테스트만을 목적으로 한 것이기 때문에 아직 이더리움 메인넷을 활용하진 않은 것입니다.

→ 브라우저 기반 가상환경에서 즉각적으로 처리되는 테스트를 한 것

Untitled

배포된 컨트랙트의 주소값은 왼쪽 아래에서 확인 가능

그렇다면 이젠 배포가 끝났으니 배포된 스마트 컨트랙을 호출할 차례입니다.

스마트 컨트랙 호출

  1. Deployed Contracts 열기

Untitled

Untitled

각각의 store 버튼과 retrieve 버튼이 각 우리가 컴파일한 1_Storage.sol의 function을 가리킨다는 것을 알 수 있습니다

여기에서 retrieve 버튼을 눌러보시면 number의 숫자를 get할 수 있습니다.

자바에서 get, set 메서드를 작성하는 것처럼 그러한 동작을 하는 함수라는 것을 알 수 있습니다.

Untitled

아래쪽의 decoded output을 보시면 0이라는 숫자가 받아진 것을 보실 수 있습니다.

우리의 코드에선 number를 단순 선언만 해줬었는데 0이라는 값이 초기화 되어 있다는 것도 알 수 있죠.

또한 이런 retrieve 함수는 호출했을 때 가스가 들지 않지만

Untitled

Untitled

이렇게 값을 바꾸는 함수를 호출할 경우 가스가 사용되게 됩니다. (맨 아래 함수의 호출 결과 상세)

→ 전세계의 컴퓨터에서 해당 값을 바꾸라는 얘기가 되므로 일을 시키는데에는 가스가 필요함!

이것이 단순한 컴퓨터랑은 무엇이 다른가?

→ 한 번 값을 1000으로 바꾸고 나면 다시 스마트 컨트랙으로 값을 바꾸기 전까진 전세계의 컴퓨터들이 이 값을 1000 증명하기 때문에 불변의 속성을 가집니다.

모든 것을 프로토콜대로만 제어할 수 있다! 라는 것입니다.

우리는 스마트컨트랙 배포를 끝마쳤으니 이제 배포한 사람뿐만 아니라 이 스마트 컨트랙을 아예 다른 제 3자가 활용할 수 있는데

Untitled

배포한 스토리지에서 컨트랙트 주소를 복사하고 이를 삭제한 후 다른 계정으로도 똑같이 테스트 할 수 있습니다.

Untitled

이와 같이 이더리움 주소를 바꿨고 100 ether가 그대로 있지만

At Address버튼을 통해 컨트랙트 주소를 추가하고 아래에서 배포된 컨트랙트를 다시 불러올 수 있습니다.

그리고 여기서 retrieve를 하면 예전에 저장했던 값인 1000이 보이는 것을 확인하실 수 있습니다.


여기까지 블록체인 [이더리움을 통해 맛보기] (2) 였습니다.

감사합니다.



해보면 좋은 것들

Remix에서 3_Ballot.sol 배포해보기

상태 변수의 의미 알기

  • chairman, proposals 변수를 호출해보고 어떤 값이 할당되어 있는지 알기

함수 및 변수 호출하기

  1. 아직 사용하지 않은 계정을 선택해 3_Ballot.sol 배포한 컨트랙트의 delegate() 함수 호출해보기
  2. 호출자(계정)를 변경하고 proposals의 index중 하나를 입력하고 vote()를 호출해보기
  3. 2에서 호출한 계정의 voters 정보 확인해보기

3_Ballot을 Ropsten 테스트넷에 배포하기

  • Remix환경과 MetaMask를 이용하여 Ropsten 네트워크에 3_Ballot.sol 컨트랙트를 배포해보기
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.

블록체인 [이더리움을 통해 맛보기] (1)

프로그래머스 Level2 카카오프렌즈 컬러링북 풀이