Back

Nov 10, 2020

이더리움 대신 아르고로 DApp 쉽게 만들기1

owen

1. DApp 기본 환경 세팅

기본 프로젝트를 다음 주소를 통해 내려 받습니다.
https://github.com/late-autumn/blockoBoard


프로젝트 오픈을 위해 다음 링크에서 Lombok.jar 파일을 받아줍니다.
https://projectlombok.org/download


Specify location을 클릭하여 eclipse 혹은 sts의 경로를 추가해줍니다.


eclipse.ini 폴더를 지정 후, 확인 버튼을 누릅니다.


Install/Update 버튼을 누른 후 Quite Installer를 눌러 종료합니다.



프로젝트를 실행하기 위해 h2 를 세팅합니다.
http://h2database.com/html/download.html 링크를 통해 각자 os에 맞는 h2를 다운받습니다.


윈도우 기준

다운받은 버전을 설치해줍니다.


시스템 변수에 H2_HOME 변수를 등록해줍니다.

H2_HOME 시스템 변수를 환경 변수에 등록해줍니다.

실행 방법은 바로가기, 설치된 경로에서 실행하는 방법 2가지가 있습니다.

  

실행하면 다음과 같은 웹 브라우저를 통해 접속이 이루어집니다.



* 확인
– 위와 같이 JDBC URL을 입력했음에도 db를 생성할 수 없다는 메시지가 발생한다면 홈디렉토리 위치에서 testdb.mv.db 파일을 수동으로 생성하면 됩니다.

 

Mac 기준

다운받은 h2를 위와 같이 실행시켜줍니다.

프로젝트가 성공적으로 run 하면 다음과 같이 테이블 생성 및 데이터 삽입이 된 것을 확인할 수 있습니다.

http://localhost:8080/blocko/board로 접속하면 기본 게시판화면이 나오는 것을 볼 수 있습니다.


h2 역시 새로고침하면 위와 같은 화면을 볼 수 있습니다.

 

2. AERGO Smart Contract 작성

Git 에서 내려 받은 프로젝트에서 resources/lua/sql_smartcontract.lua 파일을 열어줍니다.


게시판에 필요한 테이블을 위와 같이 생성해줍니다.


작성한 테이블에 초기 데이터를 위와 같이 만들어 넣어줍니다.

* 주의
→ sql구문을 insert into ~ 로 작성하지 않고 or replace into ~ 를 사용한 이유는 실습을 진행하면서 re-deploy를 수행할 때 키 제약조건 에러를 방지하기 위해 작성하였으니 참고하시면 됩니다.

  • Board 테이블에 초기에 넣어준 값이 제대로 들어갔는지 확인할 수 있도록 위와 같이 함수를 생성합니다.

  • 제일 아래 생성한 함수가 abi에 등록될 수 있도록 입력합니다.


  • Compile과 Deploy를 순차적으로 눌러줍니다.

  • Deploy를 누를 시 위와 같이 에러가 발생할 경우 잠시 기다렸다가 다시 Deploy를 눌러줍니다.

  • Contract가 정상적으로 배포되었으면 우측 상단에 위와 같은 화면이 출력됩니다.

  • Athena IDE 하단 console창에는 Txhash, Contract Address가 출력됩니다.

  • 우측 하단에 생성된 contract의 함수인 selectBoardDetail이 생성된 것을 확인할 수 있습니다.

  • boardIdx에 1을 입력 후 selectBoardDetail 버튼을 클릭해줍니다.

  • 우측 하단에 초기에 만들어준 Board 테이블의 데이터 값이 정상적으로 조회되는 것을 확인할 수 있습니다.

  • aergoscan.io 를 통해 작성 및 배포된 smart contract를 보다 쉽게 확인할 수 있습니다.

  • 우측 상단에 우리가 생성한 contract 주소를 입력 후 enter를 치면 해당 contract에 대해서 볼 수 있습니다.

  • 가운데 하단에는 해당 contract의 transaction 내역을 볼 수 있습니다.

  • 왼편 hash를 클릭하면 우리가 사용한 함수 내역 또한 볼 수 있습니다.

 

3. 게시판과 Contract 연결

/board/src/main/resources/application.yaml 파일을 생성합니다.

 

/board/src/main/java/board/common/Common.java

  • board 패키지 안에 common/Common.java 파일을 만들어줍니다.

  • 아르고 테스트넷 접속을 위한 접속주소를 위와 같이 정의해주고, 클라이언트를 생성해줍니다.

  • 초기에 설정한 아르고 키와 비밀번호를 꺼내쓸 수 있도록 keystore를 생성해줍니다.

  • 이는 aergo 지갑을 통해 contract와 통신할 수 있기 위함입니다.

 

/board/src/main/java/board/smartcontract



  • board 패키지 안에 위와 같이 패키지와 클래스를 생성해줍니다.

 

/board/src/main/java/board/smartcontract/AbstractSmartContract.java

  • AbstractSmartContract.java 같은 경우 logger를 사용하고자 생성한 클래스입니다.

 

/board/src/main/java/board/smartcontract/SmartContract.java


  • SmartContract class 에서 contract를 쿼리로 Execute 하거나 Query로 읽는 2가지 함수가 위와 같이 있습니다.


  • SmartContract class 에서 contract를 쿼리로 Execute 하거나 Query로 읽는 2가지 함수가 위와 같이 있습니다.


4. 게시판 리스트 만들기

/board/src/main/java/board/board/service/BoardServiceImpl.java

  • Contract와 연결하기 위해 위와 같이 작성합니다. (application.yaml과 smartcontract.java 파일 호출 필요)


  • Contract와 연결하기 위해 위와 같이 작성합니다.

  • 쿼리로 조회를 하기 때문에 SmartContract.contractQuery() 함수를 호출합니다.

  • contractQuery() 함수 안에 인자에는 contract에서 생성한 ’selectBoardList’ 함수명을 입력해줍니다.

 

/board/src/main/java/board/controller/BoardController.java


  • 기존의 controller에는 service에서 만들어준 list() 함수를 contractResult에 담아줍니다.

  • contractResult로 받아온 결과값은 Gson을 통해 변환, BoardEntity에 맞춰 list 형식으로 담아줍니다.

 

  • eclipse 실행 결과를 다음과 같이 볼 수 있습니다.

  • 스마트 컨트랙트를 호출하고 return 받은 결과를 콘솔로그 확인

  • eclipse 실행 결과를 다음과 같이 볼 수 있습니다.

  • http://localhost:8080/blocko/board

해당 게시판 리스트가 Contract에서 읽어온 결과가 맞는지는 H2 DataBase를 조회해보면 알 수 있습니다.

 

 

이어서 이더리움 대신 아르고로 DApp 쉽게 만들기 2편에서는 게시글 생성 및 조회수 올리기, 게시글 수정과 삭제를 해보겠습니다.