Remix — Solidity IDE

Teckle
7 min readJun 18, 2018

--

About Teckle (Technology + Tackle = Teckle)

Teckle은 “어려운 기술을 확고히, 효율적으로 분석하여, 많은 이들이 알 수 있도록 널리 알리자” 라는 목적을 가지고 만들어진 블록체인 스터디 및 DApp 개발 모임입니다. 현재 6인의 멤버가 함께하고 있습니다.

Remix는 무엇인가요?

보고서를 작성할 때 가장 먼저 워드를, Java를 시작할 때 Eclipse를 실행하듯 Solidity 개발을 위해 가장 먼저 시작해야 할 일은 해당 IDE를 실행하는 것입니다. 다행히도 Remix는 복잡한 설치과정 필요 없이 다음 주소를 통해 바로 웹에서 사용 가능합니다.

http://remix.ethereum.org/

http://remix.ethereum.org 의 초기화면

Remix는 Solidity 개발을 위한 브라우저 기반의 IDE입니다. 즉, 브라우저상에서 테스트 환경을 제공하고 작성된 Smart Contract를 실행, 디버깅 할 수 있게 도와줍니다. Smart Contract의 실행은 블록체인 위에서 이루어집니다. 실제 이더리움 체인이나 테스트넷에서 실행할 수도 있고 로컬 가상머신 위에서 할 수도 있습니다.

Remix는 어떻게 사용하나요?

Remix에서 빌드 환경 선택하기

Remix에서는 실행을 위한 다음과 같은 세 가지 환경을 제공합니다 :

  • Web3 Provider :
    외부 도구가 필요합니다. geth가 로컬에서 작동되고 있어야 하며 이더를 할당하거나 직접 마이닝 해야 합니다.
  • Injected Provider :
    역시 외부 도구가 필요합니다. Mist 브라우저나 MetaMask를 통해 테스트넷에 연결하여 사용합니다.
  • JavaScript VM :
    셋 중 가장 간단하고 편하며, 이번에 알아볼 방법입니다. 외부 도구가 필요 없으며 Remix의 메모리상에서 모든 작업이 이루어집니다.

JavaScript VM을 선택하고 Account를 보면 5개의 계정이 자동으로 생성되어있는 것을 볼 수 있고 각 계정에는 100ETH의 가상의 가상화폐(..) 가 지급되어있습니다. 옆의 + 버튼을 누르면 100ETH가 들어있는 주소를 한 개씩 더 생성합니다.

와 부자다 ( 100 * 700,000 = …!)

그리고 그 하단의 Gas limit는 지금 하려는 작업이 발생시킬 가스의 양을 지정하는 것입니다. 이 값은 추정치이므로 더 많이 발생할 수도, 더 적게 발생할 수도 있습니다. 실제 발생하는 가스보다 Gas limit를 작게 설정하면 실행 시 Out of gas 오류를 만날 수 있습니다 :(

마지막으로 Value를 설정할 수 있는데 이 부분은 Solidity의 payable modifier와 관련이 있으므로 여기선 다루지 않고 넘어가도록 하겠습니다.

Hello World!

자 이제 실행에 관련된 기본적인 사항들을 알아보았으니 코드를 실행해봐야겠죠? 기본적으로 제공해주는 예제인 ballot.sol은 다소 어려운 감이 있으니 Remix docs에 있는 예제를 통해 알아보도록 하겠습니다.

우측 상단의 +버튼을 누르고 testContract.sol 파일을 생성한 뒤 아래 코드를 작성합니다.

pragma solidity ^0.4.16;contract testContract {    uint value;
function testContract(uint _p) {
value = _p;
}
function setP(uint _n) payable {
value = _n;
}
function setNP(uint _n) {
value = _n;
}
function get () constant returns (uint) {
return value;
}
}

코드를 작성하고 나면 Warning 제법 많이 보이는데 Remix에 Lint가 적용되기 전의 예제라서 그런 것 같습니다. 보기싫으니 약간 수정을 해보도록 하겠습니다.

function testContract(uint _p) {

우선 처음으로 function testContract(uint _p) 부분을 보도록 하겠습니다. Warning 내용을 살펴보면 생성자를 Contract의 이름과 동일한 함수로 정의하는 것이 Deprecated 되었고 constructor 키워드를 사용하라고 되어있습니다. 따라서 해당 부분을 constructor(uint _p) 의 형태로 변경합니다.

다음은 각 함수의 Visibility가 없어서 생기는 Warning을 제거하도록 하겠습니다. Solidity에서는 기본적으로 public이니 우선 각 함수에 public을 추가합니다.

이렇게 최종적으로 수정된 코드는 다음과 같습니다.

pragma solidity ^0.4.16;contract testContract {    uint value;
constructor(uint _p) public {
value = _p;
}
function setP(uint _n) payable public {
value = _n;
}
function setNP(uint _n) public {
value = _n;
}
function get () public constant returns (uint) {
return value;
}
}

자, 이제 보기 싫은 Warning이 모두 지워졌네요. 그럼 실행을 해보도록 하겠습니다. 우측 상단의 Compile 탭에서 Start to compile를 누르고 Run 탭에서 값을 넣지 않고 Deploy 합니다.

Deploy 후 Run 탭

성공적으로 실행이 되면 Run 탭의 내용이 조금 바뀌게 됩니다.

내용을 살펴보면 Contract를 생성하면서 생긴 트랜잭션과 실행 비용이 소모되어 현재 선택된 계정의 이더가 100 ETH에서 조금 줄어들었습니다.

또한 Contract가 성공적으로 Deploy 되어 하단에 작성한 함수를 실행시킬 수 있는 섹션이 생겼습니다.

Deploy후 Log

로그창을 보면 testContract가 잠시 pending 되었다가 실행에 성공한 것을 볼 수 있습니다. 실제 이더리움 체인 위에서라면 시간이 다소 걸리겠지만 여기에서는 JavaScript VM 위에서 동작하므로 거의 딜레이 없이 실행됩니다.

setP와 get을 실행한 후의 모습

위에서는 값을 넣지 않고 실행했는데, testContract의 value 값이 0인 것을 확인할 수 있습니다. setNP와 setP 에 값을 넣고 빨간색 영역을 누르면 이더를 소비하면서 해당 함수를 실행합니다.

get 버튼을 누르면 value 값을 가져와 사용자에게 보여줍니다. 하지만 이 동작은 이더를 소비하지 않는데요, 이 부분은 Solidity와 관련된 부분이므로 다음 글에서 다루도록 하겠습니다.

혹시 다른 코드도 실행해 보고 싶으신 분들은 저희가 작성한 다음 링크의 VisitCounter.sol을 실행해 보시기 바랍니다.

마치며

지금까지 Solidity IDE인 Remix의 기본적인 사용법과 예제 코드를 실행해 보았습니다. 다른 개발 환경에 대해서는 초보자들을 위한 이더리움 DApp 만들기 글을 참고해주세요! 감사합니다.

Written by 인영

--

--

Teckle

Teckle (Technology + Tackle = Teckle)은 “어려운 기술을 확고히, 효율적으로 분석하여, 많은 이들이 알 수 있도록 널리 알리자” 라는 목적을 가지고 만들어진 블록체인 스터디 및 DApp 개발 모임입니다.