본문 바로가기

IT/블록체인 Blockchain

[Corda] CorDapp Template 간단한 테스트

반응형


R3cev의 Corda 플랫폼과 관련한 세 번째 포스팅입니다.

이번에는 CorDapp Template 프로젝트 파일을 따라가면서 살펴볼까 하는데요,

Corda Documentation https://docs.corda.net/tutorial-cordapp.html 에 해당하는 내용입니다.


github 상의 Corda repository는 corda와 cordapp-template 2개가 있습니다. corda는 코어 플랫폼 + 샘플이 포함되어 있고, cordapp-template은 cordapp 개발을 쉽게 시작하기 위한 템플릿 소스코드가 포함되어 있다는 차이점이 있습니다.


먼저 CorDapp 의 정의를 간단히 설명하면, 코다 플랫폼에서 실행되는 프로그램이라고 할 수 있습니다. 코다 플랫폼이 노드(node, 코다 네트워크를 구성하는 Peer ) 를 구성한다면, CorDapp는 그 위에서 실행되는 스마트계약의 바이트코드라고 해도 될 것 같네요.


corda 프로젝트와 같은 방법으로 cordapp-template 프로젝트를 github에서 local로 Clonning 하면 진행할 준비가 됩니다.

Clonning 및 building은 모두 corda 프로젝트와 동일하므로 이전 포스팅을 참조하세요. (IntelliJ IDEA 혹은 command line git 어떤 쪽을 이용해도 상관 없습니다)

Background - example scenario

CorDapp Template에 포함되어 있는 예제는 다음과 같습니다.


  • Controller : 네트워크 맵 서비스 + 공증(노터리) 서비스
  • NodeA : 구매자. PO (구매요청서) 를 판매자에게 보낸다.
  • NodeB : 판매자.
  • NodeC : 본 구매 과정과 관계 없는 제 3자


NodeA 는 구매할 물품의 항목과 수량, 그리고 주소와 같은 관련 정보 (메타데이터)를 생성할 수 있습니다. NodeB는 수신한 PO가 미리 정의된 계약 항목에 어긋나지 않으면 해당 요청에 동의하게 되는데, 이는 PurchaseOrderContract.kt 소스코드에 정의되어 있습니다.

NodeC는 해당 거래에 참여하지 않으므로 아무런 데이터를 받지 못하게 되는데 이는 Corda의 특성 - Need to know 기반 - 에 따른 것입니다.


디렉토리 구조 / 노드 실행


빌드를 마치면 ./build/nodes 디렉토리에 아래와 같은 디렉토리 구조 / 파일이 생성됩니다.


. nodes
├── controller
│   ├── corda.jar
│   ├── dependencies
│   ├── node.conf
│   └── plugins
├── nodea
│   ├── corda.jar
│   ├── dependencies
│   ├── node.conf
│   └── plugins
├── nodeb
│   ├── corda.jar
│   ├── dependencies
│   ├── node.conf
│   └── plugins
├── nodec
│   ├── corda.jar
│   ├── dependencies
│   ├── node.conf
│   └── plugins
├── runnodes
└── runnodes.bat


각 노드별 디렉토리가 생성되고 그 밑에 코다 코어 바이트코드 (corda.jar) 및 CorDapp이 설치되는 plugins 디렉토리가 있습니다.

runnodes.bat는 jar 파일들을 JVM 에 실행시켜 주는 윈도우 배치 파일입니다.


이제 runnodes.bat를 실행해 보겠습니다. 그냥 탐색기에서 더블클릭 하면 됩니다.

Java 윈도우 4개가 실행되는 것이 보이죠? 로그 위치를 보면 어떤 창이 어떤 노드인지 알 수 있습니다.



콘솔 화면에 로그 저장 디렉토리, DB 접속 주소 (H2 웹 콘솔을 이용해 직접 DB 접속이 가능합니다), 로드된 플러그인 (CorDapp, 즉 스마트계약) 등의 정보가 보입니다.


노드가 실행되면 아래와 같은 디렉토리가 추가로 생성되는데 코다에서 사용하는 파일들이 생성되는 디렉토리입니다.

.
├── artemis
├── attachments
├── cache
├── certificates
├── corda.jar
├── dependencies
├── identity-private-key
├── identity-public
├── logs
├── node.conf
├── persistence.mv.db
└── plugins


아르테미스는 노드간의 통신을 주관하는 미들웨어입니다. (아파치 오픈소스 프로젝트) 그 외에도 첨부파일, 인증서, 개인/공개키쌍 등이 있고요.


노드 Interaction


실행된 노드는 HTTP API 혹은 웹을 통해서 인터랙션 할 수 있습니다. (PO 전송 등)


윈도우에서 HTTP API로 메시지를 보내는 테스트는 Cygwin 상에서 curl을 이용해야 합니다. (윈도우용 curl로 테스트 하면 잘 안되더군요)

Cygwin을 설치한 후 Cygwin bash 에서 아래 명령어를 실행합니다.


echo '{"orderNumber": "1","deliveryDate": "2018-09-15","deliveryAddress": {"city": "London","country": "UK"},"items" : [{"name": "widget","amount": "3"},{"name": "thing","amount": "4"}]}' | cURL -T - -H 'Content-Type: application/json' http://localhost:10005/api/example/NodeB/create-purchase-order


살펴보면 json형식의 메시지를 nodeB 로 보내는 걸 알 수 있죠.

메시지의 내용은 PO의 내용입니다. 주문 수량, 배송 일자 등의 정보가 있습니다.


Web상의 버튼을 클릭해서 PO를 생성하는 것도 가능합니다.http://localhost:10005/web/example/ 로 접속하면 아래와 같은 화면이 보입니다.



HTTP API를 이용하던, Web 인터페이스를 이용하던 PO를 생성하면 Node A, Node B의 터미널 화면에 다음처럼 메시지가 발생하고, Web 인터페이스 혹은 h2 DB접속을 통해 트랜잭션이 발생한 것과 State의 변화가 일어난 것을 확인할 수 있습니다.


NodeA:

✅  Constructing proposed purchase order.
✅  Sending purchase order to seller for review.
✅  Received partially signed transaction from seller.
✅  Verifying signatures and contract constraints.
✅  Signing transaction with our private key.
✅  Obtaining notary signature.
    ✅  Requesting signature by Notary service
    ✅  Validating response from Notary service
✅  Recording transaction in vault.
✅  Sending fully signed transaction to seller.
✅  Done

NodeB:

✅  Receiving proposed purchase order from buyer.
✅  Generating transaction based on proposed purchase order.
✅  Signing proposed transaction with our private key.
✅  Sending partially signed transaction to buyer and wait for a response.
✅  Verifying signatures and contract constraints.
✅  Recording transaction in vault.
✅  Done

NodeC:

메시지가 없습니다.


HTTP 외에 RPC로 노드와 인터랙션 하는 방법은 Corda Documentation을 확인해 보시기 바랍니다.


H2 Database SQL connection

코다는 내부적으로 H2 DB를 통해 SQL Query를 허용합니다.

제가 이해하기로는 실제 데이터구조를 H2 DB형식으로 변환하여 사용자 (혹은 다른 어플리케이션) 이 SQL를 통해 쉽게 Query할 수 있도록 제공하는 기능이라고 합니다.

비트코인의 블록체인 처럼 코다의 State들도 Immutable (변경 불가) 성을 띄기 때문에 SQL 도 당연히 읽기전용으로만 사용할 수 있습니다.


H2 Connectino을 테스트 하려면 먼저 http://www.h2database.com/html/download.html 에서 H2 DB Engine을 다운받아 설치합니다. (오라클이나 마이SQL등에 비하면 굉장히 작은 프로그램입니다. 5MB정도)

설치가 완료되면 웹콘솔을 실행하고,



JDBC URL에 노드 콘솔에 보이는 데이터베이스 접속 URL을 입력 한 후 Connect를 누릅니다. (ID/PW는 그대로 둡니다)



접속한 뒤 SQL문을 이용한 Query를 테스트할 수 있습니다.



오늘은 여기까지 하고, CorDapp Template 예제와 관련된 소스코드나 Flow 등의 조금 더 상세한 내용은 다음 번 포스팅에서 살펴보도록 하겠습니다.

반응형