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 파일을 생성합니다.
좀전에 배포한 contract 주소를 id에 입력해줍니다.
Encryptionkey와 password는 만든 개인키와 비밀번호를 입력하면 됩니다.
/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편에서는 게시글 생성 및 조회수 올리기, 게시글 수정과 삭제를 해보겠습니다.