본문 바로가기
블록체인/WEB3 개발

이더리움 개발 환경 구성하기 - Remix, 스마트 컨트랙트 코드 작성해서 컴파일해보고 배포까지 해보자!

by 제이제이_은재 2022. 7. 12.
반응형

 

💡 Remix - 이더리움 개발 환경 구성하기

 

이더리움 스마트 컨트랙트 코드를 작성하는 데는 다양한 IDE가 있습니다. 우리가 지금까지 사용한 VSCode는 데스크톱 IDE로, solidity 언어 익스텐션을 설치하여 컴파일을 할 수 있습니다.

 

 

하지만, VSCode를 비롯한 Atom, IntelliJ 등은 자체적으로 솔리디티 코드를 디버깅하거나 컴파일하는 기능이 없기 때문에 솔리디티 코드를 컴파일, 배포, 테스트, 디버깅 해주는 Truffle과 로컬 환경에 블록체인 테스트넷을 사용할 수 있게 해주는 Ganache를 함께 사용해야 합니다. 

 

Remix를 이용하면 이러한 불편함을 해소시킬 수 있습니다. 웹 기반 IDE인 Remix는 솔리디티 개발을 위한 IDE입니다. 자체적으로 솔리디티 개발을 위한 컴파일, 배포, 테스트, 디버깅 기능을 내장하고 있기 때문에 별도의 프레임워크나 라이브러리를 설치하지 않아도 쉽게 솔리디티 코드 작성부터 테스트넷 배포까지 할 수 있습니다. Remix의 사용법을 익히기 위해 컨트랙트 코드를 작성해보고, 컴파일 및 배포를 진행해보도록 하겠습니다.

 

일단 remix.ethereum.org 에 접속해봅시다!

 

가장 왼쪽에는 파일 익스플로러, 솔리디티 컴파일러, 배포 및 트랜잭션 실행, 플러그인 매니저 탭이 있는 것을 확인할 수 있습니다.

이들에 대해 간단히 알아보자면 아래와 같습니다.

 

➤ 파일 익스플로러(File Explorers): 새로운 파일, 폴더를 만들거나 깃허브를 연동하고 로컬 컴퓨터에서 파일을 업로드 할 수 있습니다.

➤ 솔리디티 컴파일러(Solidity Compiler): 작성한 컨트랙트 코드를 컴파일할 때 사용합니다.

➤ 배포 및 트랜잭션 실행(Deploy & Run Transactions): 컴파일한 코드를 배포하고, 배포한 컨트랙트를 실행합니다.

➤ 플러그인매니저(Plugin Manager): 컨트랙트 개발에 필요한 모듈을 설치하고 관리합니다.

 

 

Remix에 파일을 생성하고 코드를 작성해보록 하겠습니다. contracts 폴더 아래 simpleStorage.sol을 생성하고 다음의 코드를 작성해보도록 하겠습니다. 

// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.4.16 <0.9.0;

contract SimpleStorage {
    uint storedData;

    function set(uint x) public{
        storedData = x;
    }

    function get() public view returns (uint){
        return storedData;
    }
}

 

simpleStorage.sol 파일을 열어둔 상태에서 SOLIDIY COMPILER 탭에 들어가, 아래의 그림에 알맞게 옵션이 선택되었는지 확인합니다.

 

각 옵션에 대해 알아보자면 아래와 같습니다.

 

➤ COMPILER : 솔리디티  코드를 어떤 버전으로 컴파일 할 것인지 지정할 수 있습니다.

➤ LANGUAGE : 어떤 언어를 컴파일 하는지 지정합니다.

➤ EVM VERSION : EVM은 버전에 따라 각기 다른 특징을 가지고 있는데, byzantium이 디폴트 값입니다. 다양한 EVM 버전에 대해서는 공식 문서로 자세히 알아볼 수 있다.

 

 

Comple simpleStroage.sol 버튼을 누르면 솔리디티 파일에 대한 컴파일이 시작되고, 컴파일이 완료되면 CONTRACT 옵션에 우리가 만든 컨트랙트가 컨트랙트명(파일명) 형식으로 출력됩니다.

 

 

Compilation Details 버튼을 누르면 컨트랙트에 대한 메타데이터 및 ABI데이터, 바이트 코드를 확인할 수 있습니다.

 

contract 밑에 있는 버튼을 클릭하여 ABI, Bytecode 등을 쉽게 복사할 수도 있습니다.

 

 

💻 ABI

[
	{
		"inputs": [],
		"name": "get",
		"outputs": [
			{
				"internalType": "uint256",
				"name": "",
				"type": "uint256"
			}
		],
		"stateMutability": "view",
		"type": "function"
	},
	{
		"inputs": [
			{
				"internalType": "uint256",
				"name": "x",
				"type": "uint256"
			}
		],
		"name": "set",
		"outputs": [],
		"stateMutability": "nonpayable",
		"type": "function"
	}
]

 

💻 Bytecode

 

{
	"functionDebugData": {},
	"generatedSources": [],
	"linkReferences": {},
	"object": "608060405234801561001057600080fd5b50610150806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c806360fe47b11461003b5780636d4ce63c14610057575b600080fd5b6100556004803603810190610050919061009d565b610075565b005b61005f61007f565b60405161006c91906100d9565b60405180910390f35b8060008190555050565b60008054905090565b60008135905061009781610103565b92915050565b6000602082840312156100b3576100b26100fe565b5b60006100c184828501610088565b91505092915050565b6100d3816100f4565b82525050565b60006020820190506100ee60008301846100ca565b92915050565b6000819050919050565b600080fd5b61010c816100f4565b811461011757600080fd5b5056fea2646970667358221220514775e17906094599596bd4169d48d7375d0e13f02638fe1e358a1eae7be32e64736f6c63430008070033",
	"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x150 DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x36 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x60FE47B1 EQ PUSH2 0x3B JUMPI DUP1 PUSH4 0x6D4CE63C EQ PUSH2 0x57 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x55 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x50 SWAP2 SWAP1 PUSH2 0x9D JUMP JUMPDEST PUSH2 0x75 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x5F PUSH2 0x7F JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x6C SWAP2 SWAP1 PUSH2 0xD9 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST DUP1 PUSH1 0x0 DUP2 SWAP1 SSTORE POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 CALLDATALOAD SWAP1 POP PUSH2 0x97 DUP2 PUSH2 0x103 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xB3 JUMPI PUSH2 0xB2 PUSH2 0xFE JUMP JUMPDEST JUMPDEST PUSH1 0x0 PUSH2 0xC1 DUP5 DUP3 DUP6 ADD PUSH2 0x88 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0xD3 DUP2 PUSH2 0xF4 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0xEE PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0xCA JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x10C DUP2 PUSH2 0xF4 JUMP JUMPDEST DUP2 EQ PUSH2 0x117 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 MLOAD SELFBALANCE PUSH22 0xE17906094599596BD4169D48D7375D0E13F02638FE1E CALLDATALOAD DUP11 0x1E 0xAE PUSH28 0xE32E64736F6C63430008070033000000000000000000000000000000 ",
	"sourceMap": "71:192:0:-:0;;;;;;;;;;;;;;;;;;;"
}

 

 

이제 컨트랙트 코드를 배포해보도록 하겠습니다. simpleStorage.sol 파일을 열어둔 상태에서 DEPLOY & RUN TRANSACTIONS 탭을 들어가 옵션이 아래와 같이 선택되었는지 확입합니다.

각 옵션에 대해 간단히 알아보면 아래와 같습니다.

 

➤ ENVIRONMENT : 컨트랙트 코드를 배포할 네트워크를 의미합니다. Injected Web3를 선택하여 지갑과 연동하거나, Web3 Provider를 선택하여 Geth를 통해 접속한 네트워크에 연결할 수 있습니다. 실제 네트워크가 아닌 Remix가 제공하는 가상 네트워크를 사용하려면 Javascript VM(London) 을 선택하면 됩니다.

➤ ACCOUNT : 컨트랙트 코드를 배포할 계정입니다. Javascript VM에서 사용할 수 있는 가상 계정이 선택되어 있습니다. 계정 정보는 조금씩 다를 수 있습니다.

➤ GAS LIMIT : 컨트랙트 실행 시 사용할 가스의 한도입니다.

➤ VALUE : 전송할 이더의 양입니다.

➤ CONTRACT : 트랜잭션으로 올릴 컨트랙트를 선택합니다.

 

 

주황색 Deploy 버튼을 누르면 배포가 시작되고, 배포가 성공적으로 완료되면 터미널 창에 트랜잭션에 대한 정보가 출력됩니다.

 

DEPLOYED CONTRACTS 에서는 우리가 배포한 함수의 컨트랙트의 함수가 버튼으로 표시됩니다. set 함수는 인자를 받아 컨트랙트 내 state 를 변경하는 함수입니다. 이렇게 상태를 변경하는 함수를 주황색으로 표기됩니다. get 함수는 컨트랙트 내의 state를 반환하는 함수입니다.

 

 

 

 

 

🔔 Remix Plugin 사용하기

 

VS Code에서 다양한 익스텐션을 사용할 수 있는 것처럼, Remix 에서도 다양한 플러그인을 사용할 수 있습니다. PLUGIN MANAGER 탭을 클릭하시거나 more를 클릭하시면 다양한 플러그인을 확인할 수 있습니다.

 

원하는 플러그인이 있을 경우, search 에서 검색해서 확인할 수 있고, Activate/Deactivate 버튼을 눌러 플러그인을 활성화/비활성화 시킬 수도 있습니다.

 

 

플러그인 사용법이 궁금하신다면 공식 문서에서 더 자세히 알아보시길 바래요~

 

Plugin Manager — Remix - Ethereum IDE 1 documentation

In Remix IDE you only load the functionality you need. Controlling which plugins are active or inactive happens in the Plugin Manager. This plugin architecture has made it possible to integrate tools made by the Remix team with tools made by external teams

remix-ide.readthedocs.io

 

반응형

댓글