본문 바로가기

IT/블록체인 Blockchain

[Corda] 환경세팅에서 데모구동까지

반응형

Corda를 이해하기 위해서는 기술백서와 Documentation을 읽어보는 것이 제일 좋은 방법이겠지만, 저 처럼 뭔가 컴퓨터에 직접 해 봐야 느낌이 오는 분들을 위해서 step-by-step 으로 간단한 데모 구동 환경을 구성해 보겠습니다.

코다의 기본 개념은 이전 포스팅 [2016/12/07 - [IT/블록체인 Blockchain] - [Corda] R3cev - 분산원장 플랫폼 Corda 공개] 을 참조해 주시고요, 아래 내용은 코다 Documentation [ https://docs.corda.net/getting-set-up.html ]에 있는 내용을 제가 직접 실행하면서 작성한 것입니다.

 

환경설정 (Environment Setup)

 

코다는 JVM기반으로 작동하기 때문에 이더리움처럼 OS에 대한 dependency가 없습니다.

여기서는 윈도우7 환경에서 테스트 해 보도록 하겠습니다.

 

 

1. JAVA (JDK) 설치

JVM에서 돌아가니 Java는 당연히 필요하겠죠?

오라클에서 최신의 JDK를 받아서 설치합니다. 저는 64비트 버전으로 아래 위치에서 받아 설치 했습니다.

http://www.oracle.com/technetwork/java/javase/downloads/index.html

 

2. IntelliJ IDEA 설치

https://www.jetbrains.com/idea/download/ 에서 IDEA 를 받아 설치합니다.

유료/무료 버전이 있는데 굳이 유료버젼은 필요하지 않으므로 무료버전을 선택해서 받으면 되고요.

IDEA는 IDE (통합 개발 툴) 의 하나인데, Corda 에서 주 언어로 사용하는 Kotlin을 개발한 IntelliJ社에서 제공하는 툴이라서 Kotlin을 잘 지원하고 기능도 뛰어난 편 입니다.

최신버전의 IDEA에는 Kotlin 플러그인이 이미 포함되어 있기 때문에 따로 다운받을 필요가 없습니다.

 

3. GIT, Gradle

코다의 소스코드는 GIT을 통한 버전관리를 채용하고 있습니다. IntelliJ내에서도 GIT을 사용할 수 있는데, 꼭 따로 GIT을 설치해야 하는지는 잘 모르겠네요. 어쨌던 저는 아래 페이지에서 받아서 설치 했습니다.

https://git-scm.com/download/win

Gradle은 빌드 및 dependency 관리 툴입니다. (https://gradle.org/)

Corda는 Gradle wrapper를 사용하기 때문에, 따로 Gradle을 다운받을 필요는 없고 빌드 과정에서 알아서 다운 및 설치됩니다.

 

 

데모 구동 준비

 

IntelliJ IDEA 를 실행시키고 Create New Project를 선택 합니다.

프로젝트 종류는 Kotlin (JVM) 을 선택하고요,

 

 

다음을 선택한 뒤 프로젝트 이름, 위치를 지정해 주면 Main windwo가 뜹니다.

그리고 VCS메뉴에서 Git을 선택합니다.

 

 

 

Git 다이얼로그가 뜨면, 아래처럼 Corda 소스코드 위치를 입력하고 Clone을 누릅니다.

 

 

그러면 github 에서 corda 프로젝트 파일을 로컬시스템으로 클로닝하게 됩니다.

여기까지 했으면 Corda 프로젝트를 테스트 해 볼 준비는 모두 끝났습니다.

 

데모 구동은 IntelliJ 환경에서 할 수도 있고, Windwos 커맨드창에서 할 수도 있습니다. Windows 커맨드창에서 실행하면 Java 콘솔화면이 각각의 노드별로 뜨기 때문에 조금 더 편하게 볼 수 있는 장점이 있습니다.

이번 포스팅에서는 가장 간단한 데모인 Trader demo를 실행해 보겠습니다.

 

트레이더 데모 (Trader demo)

 

원문은 이곳에 있습니다.

https://docs.corda.net/running-the-demos.html#trader-demo

 

이 데모는 3개의 Corda 노드를 구동합니다. 은행 A, 은행 B 그리고 공증 및 네트워크 맵 서비스를 제공하는 Notary 노드입니다.

은행 A는 현금을 발행하고, 은행 B에게서 CP (commercial paper, 기업 어음) 을 매수하는 시나리오 입니다.

 

Corda source code가 clone되어 있는 디렉토리에서 cmd 창으로 아래의 명령어를 입력 합니다.

 

gradlew.bat samples:trader-demo:deployNodes

 

gadelew.bat는 윈도우 환경에서 사용하는 gradle wrapper입니다. 처음 실행한 경우 wrapper가 알아서 gradle binary를 다운받고 압축을 푸는 작업을 하는 데 시간이 좀 걸립니다.

wrapper가 gradle 설치를 마치면 Kotlin 소스파일로부터 바이트코드 컴파일까지 모두 자동으로 수행합니다.

 

각 노드별로 빌드된 jar파일을 실행시키면 노드가 기동되는데, 아래 배치파일을 실행하면 자동으로 3개의 노드가 실행됩니다.

 

samples\trader-demo\build\nodes\runnodes.bat

 

노드가 모두 기동되면, 먼저 A은행에서 스스로에게 현금을 issue하는 작업을 수행합니다.

 

gradlew.bat samples:trader-demo:runBuyer

 

그 다음 단계는 실제로 CP가 거래되는 트랜잭션을 수행합니다. A은행의 현금은 B은행으로 넘어가고, CP의 소유권은 A은행으로 넘어갑니다. Notary노드는 이 과정에서 트랜잭션의 정합성을 확인합니다.

 

 

트레이더 데모 디렉토리의 gradle 설정 파일 (build.gradle) 을 살펴 보면 위에서 demo를 run 할때 사용된 3개의 task가 정의되어 있습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['build']) {
    directory "./build/nodes"
    // This name "Notary" is hard-coded into TraderDemoClientApi so if you change it here, change it there too.
    // In this demo the node that runs a standalone notary also acts as the network map server.
    networkMap "Notary"
    node {
        name "Notary"
        dirName "notary"
        nearestCity "London"
        advertisedServices = ["corda.notary.validating"]
        artemisPort 10002
        webPort 10003
        cordapps = []
    }
    node {
        name "Bank A"
        dirName "nodea"
        nearestCity "London"
        advertisedServices = []
        artemisPort 10004
        webPort 10005
        cordapps = []
    }
    node {
        name "Bank B"
        dirName "nodeb"
        nearestCity "New York"
        advertisedServices = []
        artemisPort 10006
        webPort 10007
        cordapps = []
    }
}
....
 
task runBuyer(type: JavaExec) {
    classpath = sourceSets.main.runtimeClasspath
    main = 'net.corda.traderdemo.TraderDemoKt'
    args '--role'
    args 'BUYER'
}
 
task runSeller(type: JavaExec) {
    classpath = sourceSets.main.runtimeClasspath
    main = 'net.corda.traderdemo.TraderDemoKt'
    args '--role'
    args 'SELLER'
}
cs

 

실제 노드에서 수행되는 내용은 api 및 flow source code에 정의되어 있습니다.

(TraderDemoApi.kt, BuyerFlow.kt, SellerFlow.kt 소스코드 파일들)

소스코드를 IDEA 창에서 열어 살펴보시기 바랍니다.

 

Corda에서는 많이 사용되는 금융계약을 클래스로 정의해 두고 있습니다.

CP는 CommercialPaper라는 class로 정의되어 있습니다. (https://docs.corda.net/api/net.corda.contracts/-commercial-paper/index.html)

SellerFlow.kt 소스코드에서 해당 클래스를 사용하는 예제를 찾을 수 있습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
        val issuance: SignedTransaction = run {
            val tx = CommercialPaper().generateIssue(party.ref(123), 1100.DOLLARS `issued by` DUMMY_CASH_ISSUER,
                    Instant.now() + 10.days, notaryNode.notaryIdentity)
 
            // TODO: Consider moving these two steps below into generateIssue.
 
            // Attach the prospectus.
            tx.addAttachment(serviceHub.storageService.attachments.openAttachment(PROSPECTUS_HASH)!!.id)
 
            // Requesting timestamping, all CP must be timestamped.
            tx.setTime(Instant.now(), 30.seconds)
 
            // Sign it as ourselves.
            tx.signWith(keyPair)
 
            // Get the notary to sign the timestamp
            val notarySig = subFlow(NotaryFlow.Client(tx.toSignedTransaction(false)))
            tx.addSignatureUnchecked(notarySig)
 
            // Commit it to local storage.
            val stx = tx.toSignedTransaction(true)
            serviceHub.recordTransactions(listOf(stx))
 
            stx
        }
cs

 

스마트 계약 작성하기 (Writing a contract)

 

Corda documentation page의 "Writing a contract" 항목에서 CP 예제를 가지고 Corda에서 smart contract를 작성하는 방법을 설명하고 있습니다.

https://docs.corda.net/tutorial-contract.html

 

상세한 내용은 다음 포스팅에서 작성해 볼 생각이지만, 여기서는 간단히 중요한 개념만 정리해 보겠습니다.

코다에서 스마트 계약이 가지는 중요 요소는 아래의 3가지 입니다.

  • Executable code (validation logic)
  • State objects
  • Commands

스마트 계약의 핵심은 트랜잭션에서 상태 오브젝트 (State object) 의 변화를 검증하는 실행 코드입니다.

상태 오브젝트는 원장에 저장되는 데이터인데, 트랜잭션의 입력과 출력으로 사용되고 계약의 현재 상태를 나타냅니다.

마지막으로 커맨드는 트랜잭션에 포함되어 있는 추가적인 데이터인데 실행 코드에게 트랜잭션의 검증 방법을 알려주는 기능을 수행합니다.

 

다음 포스팅에서는 스마트 계약의 주요 구성요소들이 데모 소스 코드에서 어떻게 정의되고 사용되었는지 하나씩 찾아보도록 하겠습니다.

반응형