이것저것 프로그래밍 정리(Macbook)

Ethereum으로 프로그래밍 - HelloWorld (web3@0.2.0) 본문

ethereum(blockchain)

Ethereum으로 프로그래밍 - HelloWorld (web3@0.2.0)

parkaparka 2020. 3. 16. 00:26
반응형

간단한 HelloWorld 프로젝트를 실행해보도록 하자.

이더리움을 이용한 블록체인 코딩을 할때 크게 4단계로 나뉜다. 1번째 스마트 컨트랙 개발, 2단계 컴파일해서 abi,byte code 가져오기, 3단계 스마트 컨트랙 배포, 4단계 사용이다.

web3@0.2.0, solidity@0.5.0 또는 0.6.3, node@13.8.0 의 개발 환경이다.


1. 스마트 컨트랙 개발


스마트 컨트랙 소스 코드를 개발하는 단계이다. 

HelloWorld 소스 코드를 봐보도록 하자.

%%writefile src/Hello.sol
pragma solidity ^0.6.3;  #컴파일 할 solidity version
contract Hello {  #컨트랙 이름을 Hello로 하겠음
     function sayHello() pure public returns(string memory) {  #sayHello() 함수, 단순히 지역변수 값을 반환
          return "Hello World";  #Hello World 반환
     }
}

Hello.sol
0.00MB


2. 컴파일


1단계에서 만든 smart contract 소스코드를 컴파일 하기 위해서는 두가지 방법이 있다.

1번째 solc compiler를 사용하거나

2번째 REMIX를 사용할 수 있다.

 

먼저 solc compiler를 사용해 보도록 하자.

jupyter notebook에서 abi와 byte code를 먼저 얻어보자.

다음과 같이 자신의 컴퓨터에 깔려있는 solidity 컴파일러 버전과 1단계에서 개발한 smart contract의 버젼이 같아야 한다. 위를 보면 0.6.3으로 동일한 것을 확인 할 수 있다.

다음은 같은 것을 터미널에서 확인해 보도록 하자.

터미널에서도 동일한 값을 확인 할 수 있다.

 

 

이제 2번째 방법인 REMIX를 통해 abi와 byte code를 얻어보도록 하자.

구글 검색창에 REMIX를 검색한 후 REMIX - Ethereum IDE에 들어가면 된다.

여기에 1단계에서 만든 Hello.sol 파일 과 같은 내용을 코드 창에 써주고 컴파일 하면 abi와 byte code를 얻을 수 있다.

여기서 Complie Hello.sol을 누르면 좌측에서 abi 와 byte code를 얻을수 있다.

각각 따로 얻기보다는 Compilation Details 를 눌러서 전체 정보를 가져오는 것을 추천한다.

 

Compilation Details를 눌러서 WEB3DEPLOY라는 항목을 활용하도록 하자.

1번째 직접 컴파일 하는 방법보다 2번째 REMIX를 이용하는 방법을 추천한다. 첫번째 직접 컴파일 하는 경우 에러가 많이 발생했었다.

또한 위처럼 0.6.3 버젼으로 했을 경우 나중에 BigNumber 에러가 뜨는 것을 확인할 수 있다. 이는 ethereum을 프로그래밍 하기 위해서는 많은 언어들이 사용되는데 이들끼리 버젼이 충돌나서 일어나는 에러라고 한다. 

따라서 REMIX에서 smart contract를 컴파일 할때는 0.5.0 버젼을 이용하도록 하자.


3. smart contract 배포


컴파일 해서 얻은 abi를 통해 contract 객체를 생성해서, 배포를 요청하고 마이닝을 통해 트랜잭션을 발생시켜 blockchain에서의 주소를 받기까지가 3단계의 과정이다.

 

3.1 contract 객체 생성

new() 명령어로 객체를 생성한다. 이때 2단계에서 얻어온 abi 와 byte code를 사용한다. 

helloWorldContract = web3.eth.contract(abi);
var contractInstance = helloWorldContract.new({from: , data: , gas: });

3.2 contract 배포 요청

위에서 new()를 통해 객체를 생성하면 자동으로 contract를 블록체인 상에 배포한다. 이를 위해서 개인 계정은 잠금 해제 되어 있어야 한다.

personal.unlockAccount(eth.coinbase)

3.3 마이닝(트랜잭션 발생)

miner.start()
miner.stop()

마이닝을 시작한 후 트랜잭션 발생 완료 시 다시 마이닝을 멈춰준다. 

miner.start(1);admin.sleepBlocks(1);miner.stop()

위의 명령어는 1 블럭만 마이닝 해주는 명령어이다. 실제 이더리움 메인 네트워크에서는 계속해서 마이닝 중이기때문에 따로 마이닝 할 필요 없지만 사설망에서 직접 마이닝을 해줘야 한다. 위의 방법보다는 1블럭만 마이닝 하는 2번째 방법을 추천한다. 

하지만 두번째 방법으로 할때 안될 경우도 있으니 2번째 방법으로 1 블럭만 마이닝 시도해 보고 안되면 1번째 방법으로 하면 좋을 것 같다.

REMIX에서 얻은 WEB3DEPLOY를 기반으로 위와 같은 자바스크립트 파일을 하나 생성한다. 변수 abi로 abi가 사용되었고 변수 hello 안에 data로 byte code가 사용된 것을 확인 할 수 있다. 

 

이렇게 만든 자바 스크립트 파일을 실행 시켜 준다.

현재 위 사진은 마이닝까지 완료한 사진이고, 마이닝을 하지 않았을시에는 맨 밑에 있는 contract의 주소와 transactionHash 값이 뜨지 않을 것이다.

node src/HelloDeploy.js 를 실행해서 contract를 배포를 했으면 마이닝을 통해 마무리 해줘야 한다.

마이닝 하는 과정을 보자.

geth창으로 다음과 같이 들어와서 이제 마이닝을 해보자.

현재 contract가 배포 요청이 되어 있기 때문에 eth.pendingTracsactions 명령어를 통해 확인해보면 현재 pending 되어 있는 것이 있는 것을 확인 할 수 있다.

이후 이제 miner.start(1);admin.sleepBlocks(1);miner.stop() 명령어를 통해서 하나의 블럭을 마이닝 해준다.

위 명령어로 마이닝이 되지 않는다면 miner.start(1); 로 마이닝을 시작하고 eth.pendingTransactions를 확인했을 때 아무것도 없는 비어 있는 상태이면 miner.stop(); 을 통해 마이닝을 멈춰준다.

이후 이제 eth.pendingTransactions 를 통해 pending 되어 있는 트랜잭션이 있나 확인해 보면 없는 것을 확인 할 수 있다.

이렇게 마이닝이 완료 되면 다시 jupyter notebook으로 돌아오면 contract의 주소값과 transaction hash 값이 떠있는 것을 확인 할수 있다. 이렇게 contract 배포를 완료하였다. 이제 배포한 contract를 이용해 보도록 하자.


4. 사용하기


배포한 contract를 사용하려면 객체를 먼저 생성해야 한다. 

배포할 때 사용한 abi와 배포 단계의 결과물은 contract address를 이용해서 블록체인에 생성된 객체를 얻어오도록 하자.

var helloContract = web3.eth.contract(abi);
var hello = helloContract.at("contract address");

다음과 같이 HelloUse1.js의 자바 스크립트 파일을 만들고 이제 실행해 주면 맨처음 contract 개발할때의 리턴 값인 Hello World를 확인 할수 있을 것이다.

이렇게 결과를 확인 할 수 있다. 처음에 진행할때는 위처럼 HelloUse1.js 파일을 만들어 놓고 node 창을 새로 열어서 한줄 한줄 입력해보는 것을 추천한다.

위 방법으로 한 결과물을 확인해보자.

각각 한줄씩 입력하여 Hello World 값을 확인 할 수 있다. 

다른 코딩 언어들의 Hello World에 비해 매우 복잡한 것을 알 수 있다.

다음에는 보다 더 복잡한 프로젝트를 진행해 보도록 하자.

반응형
Comments