2018년은 가상 화폐의 해라고 봐도 될 정도로 많은 이슈들이 있었고 그에 따른 가격 변동도 있었다. 많은 가상 화폐들이 생겨났고 그에 따른 기술들도 많이 생겨났다. 이번 포스트에는 그 중에서 2세대 블록체인이라고 불리는 Ethereum에 대해서 알아보려한다. ( 내부적으로 들어가게 된다면 여러 복잡한 요소들이 나오는데 그 부분들은 다루지 않겠다. 그래서 포스팅에는 여태까지 프로그래밍을 하면서 머리속에 정리된 것에 대해서 꺼내보려한다.)

Ethereum은 기존 비트코인에서 존재하지 않았던 Smart Contract가 가장 큰 차이점이라고 볼 수 있다. Smart Contract는 말 그대로 똑똑한 계약이란 뜻을 가지고있다. 기존에는 돈 거래 밖에 불가능했지만 Smart Contract가 생기고 나서 블록체인 내에 logic을 가지고 있고 그에 따라 여러 동작이 가능하게 되었다. Blockchain 내부에서 동작하는 어플리케이션이라고 생각하면 쉬울 것 같다. 또한 이러한 어플리케이션을 DApp(Decentralized Application)이라고 불린다.

Ethereum은 Solidity, Serpent, Viper등 여러가지 언어를 가지고 있지만 그 중에서 대중적으로 사용되는 언어는 Solidity이다. Solidity로 프로그래밍을 한 후 Solc로 컴파일을 진행하면 bytecode가 생성되고 여기서 생성된 bytecode는 EVM이 동작시킨다. (Ethereum Virtual Mechine) EVM은 OPCODE를 실행할 때 마다 일정한 수수료를 사용하게 되는데 이것을 Gas 값이라고 부른다. 이 Gas값은 내부에서 실수든 고의든 무한 루프를 돌려 네트워크에 성능을 저하시키는 것을 막아준다. 만일 Transaction을 보냇을때 Gas값이 부족하다면 중간에 Abort된다. 즉, Gas 값이 부족한 채로 Transaction을 보낸다면 수수료만 사용하게 되고 내가 원하는 동작은 다 되지 않는다는 뜻이다. 따라서 넉넉한 Gas값을 넣고 완료 된 후 Gas값 반환을 기다리는게 바람직한 동작이다.
이러한 Gas값이 부담이 안될 수 없는데 이를 줄이기 위한 방법 중 IPFS라는 시스템을 이용하여 큰 데이터를 저장하고 여기서 반환된 Hash값을 블록체인에 담기도 한다.
IPFS 참조

Blockchain은 크게 두가지로 나뉘는데 Public Blockchain과 Private Blockchain이다.(번외로 Consortium Blockchain과 같은 Blockchain도 존재한다.)

두가지의 Blockchain의 가장 큰 차이점은 참여자인데 Public Blockchain은 말과 같이 공개되어있는 블록체인으로 모든 사용자가 접근할 수 있고 모든 블럭에 대해 모두가 검증한다. 따라서 신뢰도는 높지만 속도가 느리다(block 갯수가 많기에 block difficulty가 많이 올라갔고 전파에도 시간이 소요된다.) 반면에 Private Blockchain은 제한적인 참여가 가능하다. Public blockchain에 비하여 적은 사용자가 Block에 대해서 검증을 진행하며 이 때문에 비교적 신뢰도가 낮지만 속도가 빠르다는 장점이 존재한다. 따라서 개발을 할때 자신이 개발하고자하는 어플리케이션의 목적에 따라서 선택을 해야한다.

위에서 언급한 것과 같이 블록체인엔 딜레마가 존재한다. 결국에 위의 두가지의 블록체인을 놓고 보면 속도를 선택할 것인가, 신뢰도를 선택할 것인가라는 선택지를 가지게 되는데, 이를 해결하기 위하여 Private Blockchain에 정보를 담고 이에 대한 간략한 정보를 Public Blockchain을 통하여 신뢰성을 높히는 방법도 존재한다.

Blockchain의 고질적인 문제인 속도에 대한 기술도 활발히 연구가 진행되고 있다.

1.Sharding

  • 블록을 노드마다 파트별로 나눠서 가짐
    2.Plasma
  • Off-chain을 통하여 검증에 필요한 최소한의 정보만 Public에 업로드
    3.Raiden
  • 거래가 일어날때마다 기록이 아닌 채널을 열고 그 안에서 거래가 이뤄지며 거래가 열리고 닫힐때만 기록

간단한 프로그래밍에 대해서 보여주려고 한다.

Dapp을 개발하고 배포하는 과정은 다음과 같다.

  1. 코드 작성

  2. TestNet 배포

  3. 테스트

  4. 에러 수정 및 완료

  5. Public 배포

  6. 코드 작성
    코드 작성 단계에서는 자신만의 에디터를 사용해도 되지만 온라인 상에서 프로그래밍을 할 수 있는 플랫폼이 이미 갖춰져있다. Remix
    (Solidity로 작성된 코드는 sol이라는 확장자를 가져야한다.)

Remix에서 코드를 작성하고 컴파일을 할 수 있고 디버깅까지 가능하다.

이제 간단한 코드를 작성해보자.

pragma solidity ^0.4.23;

contract Value {
string value;

function setValue(string _value) external {
value = _value;
}

function getValue() view returns (string) {
return value;
}
}

위의 코드는 value라는 string형 변수를 저장하고 value 변수를 set, get 할 수 있는 코드이다.

그 후 컴파일을 해주면 된다.
compile

  1. TestNet배포
    개발 중간에 Public에 올리는 것을 원하지 않는 사람도 존재할 수 있지만 Gas값에 대해서도 생각을 안할 수 없다. 따라서 그 전 과정으로 Ether를 무료로 받을 수 있는 Testnet을 사용하면 된다. 그 전 Chrome의 확장 앱인 Metamask를 깔아보자.
    metamask

그 후 Metamask를 실행하고 여러 동의 과정을 거친 후 아래와 같이 네트워크를 테스트 넷을 설정해주고 Buy를 클릭 후 웹에 들어가진다면 Request 1 ether 버튼을 클릭하면 지갑으로 Ether가 들어온다.
Metamask2

  1. 테스트, 4. 에러 수정 및 완료
    Ether가 들어오면 그 후 Remix로 다시 돌아가서 Run에 Deploy를 클릭한다.
    그러면 Smart Contract 배포에 완료했다. 이제 아무도 이 컨드렉트를 삭제하지 못한다.
    이 또한 Blockchain의 특징이라고 볼 수 있다.

meta3

그 후 Mining이 완료되면 아래와 같은 칸이 나올것이다.
우리는 이 함수들을 통해 값을 설정하고 가져올 수 있다.
remix

setValue와 getValue이 정상적으로 동작하였다면 매우 간단한 첫 Dapp을 테스트넷 네트워크에 올리게 된 것이다.

  1. Public 배포
    위의 과정에서 문제가 없이 잘 동작한다고 생각이 된다면 네트워크만 바꿔 진행하면 완료이다.

Solidity를 익히는 것에 대해선 아래 사이트가 대표적이다.
CryptoZombies

결론
Blockchain을 접하고 Ethereum 기반에서 프로그래밍을 한지는 얼마안되었지만 여러가지 느낀점들이 있다. 먼저 오직 Blockchain만으로는 아직 상용화할만한 어플리케이션을 만들기 힘들다는 점과 이 점을 극복하기 위하여 너무나도 빠르게 바뀌고 있다는 것이다. 자고 일어나면 새로운 기술과 이슈들이 떠있다. 그렇기에 참조 할만한 사이트들을 아래에 첨부하도록 하겠다.

Ethereum Reddit
Ethereum HackerNoon
Ethereum Study