이더리움은 디지털 화폐 지급 네트워크가 목적이 아닌, 가상 머신을 운영하는 범용 프로그래밍이 가능한 블록체인으로 설계되었다.
이더리움은 하나의 분산 컴퓨터로서 작동하는 것이 목적이므로 일반 컴퓨터가 할 수 있는 다양한 프로그래밍을 하고싶어함.
- 튜링 완전(Turing complete)이란?
(정리하기!)
- 튜링 완전(Turing complete) 언어란?
우리가 알고있는 대부분의 프로그래밍 언어라고 생각하면 된다. (루프 형태 코드를 만들 수 있음)
비트코인의 스크립트 언어는 조건부 흐름 제어 기능 이외에 루프나 복잡한 흐름 제어 능력이 없음 (튜링 불완전성)
크롬 웹스토어 ➜ MetaMask 검색 ➜ 설치
설치한 후 확장프로그램을 실행하면
시작하기를 눌러서 새로 지갑을 생성할 수 있다.
지갑을 생성하고나면 계정의 정보를 볼 수 있다.
이더리움 네트워크도 설정할 수 있다.
Ropsten 테스트넷 ➜ Buy ➜ 파우셋 테스트 이더 얻기 ➜ request 1 ether from faucet
아래 transaction ID로 트랜잭션을 탐색할 수 있다. 롭스텐 이더스캔
난 왜 안들어오지..ㅠㅠ
외부소유계정은 트랜잭션을 시작할 수 있고, 컨트랙트는 트랜잭션을 시작할 수 없다.
컨트랙트는 다른 컨트랙트를 호출해서 컨트랙트에 반응할 수 있다.
contract Faucet {
// 컨트랙트의 다른 함수에 의해 호출될 수 있는 public 함수
function withdraw(uint withdraw_amount) public {
require(withdraw_amount <= 1000000000000000000); // 0.1ETH
//require문은 조건을 만족하면 함수를 계속 실행하고 조건을 만족하지 못하면 예외처리로 함수 실행을 중지시킨다.
msg.sender.transfer(withdraw_amount);
// msg.sender는 해당 컨트랙트 실행한 발신자의 주소를 의미
// msg.sender.transfer는 인자로 받은 만큼의 값을 해당 컨트랙트를 실행한 발신자(sender)에게 보낸다(transfer).
}
function () public payable {}
// payable은 이더를 받을 수 있는 특별한 함수 유형
// 이더를 컨트랙트 주소로 보내는 트랜잭션을 처리한다.
// 함수가 payable이 아닌데 이더를 보내려고 한다면 트랜잭션을 거부한다.(크립토좀비 내용)
}
위의 코드는 솔리디티언어를 이용한 하나의 컨트랙트 코드이다. 해당 컨트랙트를 실행하는 사람에게 이더를 보내는 코드이다.
이 솔리디티 코드를 솔리디티 컴파일러를 사용하여 블록체인 자체에서 실행할 수 있는 EVM 바이트코드로 변환해보자.
Remix IDE 🖜 솔리디티 컴파일러
이렇게 코드를 작성하고 컴파일하자.
DEPLOY & RUN TRANSACTIONS 탭에서 ENVIRONMENT를 Web3로 설정하면 메타마스크 확장프로그램이 실행되고 이전에 만든 계정과 연결을 하면 이렇게 ACCOUNT가 설정된다. 그리고 DEPLOY를 누르면 작성한 Faucet 컨트랙트를 배포하게된다.
(테스트 이더 잔액이 없어서 deploy가 안된다ㅠㅠ)
이렇게 컨트랙트를 배포하는데 필요한 가스가 나오고 승인을 하면 컨트랙트를 블록체인 상에 자체 주소를 갖는 컨트랙트로 배포할 수 있다. 컨트랙트 배포는 블록체인에 해당 컨트랙트의 바이트코드를 등록하는 트랜잭션에 의해 수행되는 것이라고 보면 된다. 이 컨트랙트의 주소에 누군가 트랜잭션을 보내면 컨트랙트가 EVM(이더리움 가상 머신)에서 실행되어 코드를 수행한다.