‘마스터링 이더리움’ 세미나 2 – 2장. 이더리움 기초
이번 세미나에서는 ‘2장. 이더리움 기초’를 다룹니다. 2장은 Getting Start에 해당하는 장으로 직접 해 보는 것이 중요합니다. 어떤 내용이 있는지 가볍게 한 번 훑어본 후 반드시 직접 하나 하나 해 봐야 합니다. 처음에는 책 내용에 따라 한 번 해 보고, 두 번째는 책 내용을 보지 않고 해 보도록 합니다. 하나씩 따라 하다 보면 재미를 느낄 수 있을 것입니다.
이더 화폐 단위
아래 정리한 내용 정도는 기억하고 넘어가도록 합니다.
- 이더리움은 시스템이다.
- 화폐 단위는 이더(ether)이고, ETH는 이더의 심볼이고, 최소 단위는 웨이(wei)이고, 1 이더는 1018 웨이이다.
- 이더리움 내부에서는 항상 웨이를 부호 없는 정수를 사용합니다.
이더리움 지갑 선택하기
아래 인용한 내용 정도는 주의하고 넘어갑니다.
우리는 이더리움 계정을 관리하는 데 도움이 되는 소프트웨어 애플리케이션이라는 의미로 ‘지갑(wallet)’이라는 용어를 사용할 것이다. 지갑은 사용자의 키를 보유하고, 사용자를 대신하여 트랜잭션을 생성하고 브로드캐스트할 수 있다.
저는 세미나 참석자들에게 ‘트러스트 월렛’과 ‘아임토큰’ 지갑을 추천합니다.
통제와 책임
통제를 탈중앙화 한다는 것은 통제의 수단을 개인에게 돌려주겠다는 것입니다. 블록체인에서 통제의 수단은 개인키입니다.
자신이 직접 통제할 수 있다고 하면 처음에는 무조건적으로 좋아보입니다. 하지만 개인키를 직접 관리하다보면 ‘난 그건 모르겠고, 편하게 사용할 수만 있다면 키 관리는 직접 하지 않아도 좋아’라고 돌변하기도 합니다. 책임이 따르지 않는 권한은 없습니다. 블록체인에서 탈중앙화를 얻기 위한 수단으로 어떤 것을 선택한 것인지 깊이 새겨둘 필요가 있습니다.
블록체인이 안고 있는 어려운 과제 중 하나가 바로 ‘통제의 수단을 개인에게 돌려주면서도 너무 번거로워지지 않고 추가적인 위험이 너무 커지지 않도록 하는 것’입니다. 문제를 해결하는 것이 사업이라고 한다면, 이 부분은 해 볼 만한 사업 중 하나입니다.
아래 요약 내용을 주의 깊게 다시 한 번 읽고, 키 관리할 때 실천해 보시길 바랍니다.
- 보안을 즉흥적으로 처리하지 마라. 검증된 표준 접근 방식을 사용하라. 계정이 더 중요할수록 더 높은 보안 조치를 취하라. 에어 갭이 있는 장치를 사용하면 수준의 보안을 유지할 수 있다.
- 개인키, 키스토어, 니모닉 시퀀스 어떤 것도 디지털 형식으로 저장하지 마라. 펜과 종이로 작성된 물리적인 사본을 잠긴 서랍이나 금고에 안전하게 보관하라.
- 많은 금액을(특히 신규 주소로) 이전하기 전에, 먼저 작은 테스트 트랜잭션(예: $1 미만)을 수행하고 수령 확인을 기다려라.
키, 키스토어, 니모닉 단어 시퀀스에 대해서 설명해 봅니다.
메타마스크 설치하기
메타마스크를 설치합니다. 지갑을 만듭니다.
네트워크 바꾸기
이더리움 네트워크 유형으로 어떤 것들이 있고, 어떤 차이가 있는지 설명해 봅니다.
테스트 네트워크에서 테스트 이더를 얻고 전송해 봅니다. 테스트 이더를 얻고 돌려주기 하는 부분에서 책 내용과 좀 다른 부분이 있긴 하지만 잘 살펴보고 진행하면 됩니다.
이더를 전송하는 것은 기본 트랜잭션으로 필요한 가스가 정해져 있습니다. 얼마로?
이더를 전송하기 위해 지불해야하는 수수료를 어떻게 계산하는지 설명해 봅니다.
월드 컴퓨터 소개
이더의 용도에 대해서 설명해 봅니다.
월드 컴퓨터로서의 이더리움에 대해서 설명해 봅니다.
아래 인용한 내용을 다시 한 번 읽어 봅니다.
EVM은 글로벌 싱글톤으로, 마치 전 세계에 걸친 단일 인스턴스 컴퓨터인 것처럼 작동하며 세상 어디에서든 실행된다. 이더리움 네트워크의 각 노드는 컨트랙트 실행을 확인하기 위해 EVM의 로컬 사본을 실행하고, 이더리움 블록체인은 트랜잭션과 스마트 컨트랙트를 처리할 때 월드 컴퓨터의 변화하는 상태를 기록한다.
외부 소유 계정(EOA) 및 컨트랙트
외부 소유 계정과 컨트랙트 계정을 비교 설명해 봅니다.
아래 요약한 내용을 주의 깊게 다시 한 번 읽어 봅니다.
- 외부 소유 계정(Externally Owned Account, EOA)은 개인키가 있는 계정이다. 개인키를 갖고 자금(이더) 또는 컨트랙트에 대한 접근을 제어할 수 있다.
- 컨트랙트도 주소를 갖고 이더를 주고 받을 수 있다. 트랙잭션 목적지가 컨트랙트 주소이면 EVM은 트랜잭션 데이터를 가지고 컨트랙트를 실행한다.
- 트랜잭션을 시작하려면 개인키가 있어야 한다. EOA만 트랜잭션을 시작할 수 있다.
간단한 컨트랙트: 테스트 이더 Faucet
우리는 앞에서 메타마스크를 사용해서 테스트 이더를 받았습니다. 이것이 가능한 것은 테스트 이더를 요청하면 이더를 제공하는 스마트 컨트랙트가 테스트넷에 배포되어 있기 때문입니다. 이번 절에서는 이와 비슷한 스마트 컨트랙트를 만들어 보고 배포해 봅니다. 너무 깊게 들어가지는 않지만 꼭 직접 해 봐야 합니다. 한 번은 책 내용에 따라, 한 번은 책 내용을 조금씩 보면서, 한 번은 책 내용을 보지 않고.
다음과 같은 키워드들을 기억해 둡니다.
contract, function, payable, public, uint
내장 함수로 require가 있다는 것, 이 함수를 사용해 어떻게 자금 흐름 제어를 하는지를 살펴봅니다.
msg라는 전역 객체가 있다는 것. 이 객체가 컨트랙트 실행을 시작한 트랜잭션을 나타낸다는 것. 이 객체는 해당 트랜잭션의 발신자 주소에 해당하는 sender를 갖는다는 것. sender를 사용해서 transfer할 수 있다는 것을 기억해 둡니다.
컨트랙트를 실행한 트랜잭션에 함수를 지정하지 않았거나 데이터를 포함하지 않은 경우 fallback 또는 기본(default)함수를 호출하는데, 기본 함수는 이름이 없고 public이고 payable로 정의된다는 것. payable은 이더를 컨트랙트가 받아들일 수 있다는 것을 의미한다는 것을 기억해 둡니다.
Faucet 컨트랙트 컴파일
리믹스를 사용해서 Faucet 코드를 작성하고, 컴파일 합니다. 리믹스가 업그레이드 되면서 UI가 변경되었습니다. 책 내용과 다른 부분이 있습니다.
다음과 같이 Faucet 컨트랙트를 작성합니다.
- Home 탭의 Environments에서 Solidity를 선택합니다.
- 왼쪽 툴바에 컨트랙트를 빌드하고 배포하고 실행하고 테스트할 수 있는 버튼들이 추가됩니다.
- Faucet.sol 파일을 추가합니다.
- 이전 절에서 설명한 것을 참조해서 Faucet 컨트랙트 코드를 작성합니다.
- 책의 내용처럼 컨트랙트 코드의 첫 부분에 컴파일러 버전을 명시합니다.
- pragma solidity ^0.4.19;
- 왼쪽 툴바에서 Solidity compiler 버튼을 클릭하고, SOLIDITY COMPILER에서 해당 버전의 Compiler를 선택합니다.
- Compile Faucet.sol 버튼을 클릭해서 컴파일합니다.
- Compilation Details 버튼을 클릭해서 바이트 코드와 같은 자세한 컴파일 결과를 볼 수 있습니다.
블록체인에 컨트랙트 생성하기
블록체인에 컨트랙트를 배포합니다.
블록체인에 컨트랙트를 등록하는 것은 목적지 주소가 ‘0x0000000000000000000000000000000000000000’인 특수 트랜잭션을 만드는 것입니다. 리믹스가 이 모든 것을 처리하고 메타마스크에 트랜잭션을 보냅니다. 메타메스크가 트랜잭션에 서명하고 트랜잭션을 네트워크에 전송합니다.
리믹스에서 컨트랙트를 배포하기 위해서 다음과 같이 합니다.
- 왼쪽 툴바에서 ‘Deploy & run transactions’ 버튼을 클릭합니다.
- Environment에서 Injected Web3를 선택하고, 메타마스크 지갑에 연결합니다.
- 메타마스크가 연결된 네트워크와 계정이 보입니다.
- Deploy 버튼을 클릭해서 배포합니다.
- 리믹스가 컨트랙트 배포를 위한 트랜잭션을 생성하고, 메타마스크에 전달하여 트랜잭션 전송에 대한 승인을 요청합니다.
- 메타마스크에서 승인하면 트랜잭션에 서명한 후 네트워크에 전송합니다.
- 잠시 기다리면(롭스텐에서는 블록 생성에 약 15초에서 30초가 걸립니다), 하단의 Deployed Contracts에 배포된 컨트랙트가 보입니다.
- Deployed Contracts의 왼쪽 확장 아이콘을 클릭하면 실행할 수 있는 함수들이 나타나고, 여기에 값을 작성해서 쉽게 컨트랙트 함수를 실행할 수 있습니다.
컨트랙트 사용하기
컨트랙트가 생성되었지만 아직 컨트랙트에는 자금(이더)이 하나도 없습니다. faucet을 해 주려면 먼저 컨트랙트에 이더를 전송해 두어야 합니다. 메타마스크에서 Account 1에서 컨트랙트 계정으로 1이더를 보냅니다. 이전에 이더를 반환한 경우 1이더보다 적게 갖고 있을것이니 다시 1이더를 faucet 받습니다.
리믹스에서 withdraw 함수의 withdraw_amount로 0.1 이더를 작성하고, withdraw 함수의 확장 아이콘을 클릭하고 transact 버튼을 클릭합니다. 메타마스크에서 승인하고 트랜잭션을 전송합니다.
참고 자료
- 리믹스 대신 사용할 수 있는 IDE – BUIDL
- 댑 개발을 위한 IDE
- 스마트 컨트랙트, 웹 UI를 함께 다룰 수 있음
- BUILD에서는 Second State DevChain을 기본으로 사용합니다.
- Second State DevChain은 개발자 경험을 향상시키기 위한 이더리움과 호환되는 공개 블록체인으로, 1초마다 블록이 생성되고, 가스 가격이 없습니다.
- 댑 개발을 위한 IDE