블로그

다중 참여 원장에서 DAML 앱 실행 (Canton)

socl 2020. 9. 23. 11:00

"다중 참여자 (multi-participant) "원장이란 무엇입니까?

DAML 원장은 다양한 토폴로지를 가질 수 있습니다. 이 블로그 포스트의 경우 다중 참여 토폴로지가 있는 원장에 관심이 있습니다. 참여자는 시스템 파티들에게 Ledger API를 제공하는 노드로서, 다중 참여형 토폴로지는 복수의 참가자 노드를 가진 토폴로지입니다. 다른 참가자는 일반적으로 시스템 파티의 다른 세트에 서비스를 제공합니다. DAML 문서에서 원장 토폴로지 및 참여자에 대한 자세한 내용을 읽을 수 있습니다.

왜 다중 참여 원장입니까?

다중 참여 원장은 매우 일반적입니다. 예를 들어 Hyperledger Sawtooth의 DAML 및 Canton 원장 상호운용성 프로토콜(Canton ledger interoperability protocol)은 모두 다중 참여 토폴로지(multi-participant topologies)를 사용합니다. 아래 다이어그램은 Canton의 다중 참여자 토폴로지 예를 보여줍니다.

이 다이어그램에서 시스템 파티는 원장 API를 제공하는 참여자 노드에 연결됩니다. 참여자 노드는 도메인에 연결됩니다. 각 Canton 도메인은 참가자 간의 Canton 동기화 프로토콜을 용이하게 하는 DAML Ledger 인스턴스입니다.

여러 참가자(multiple participant)를 사용하는 이유는 구현에 따라 다르지만 일반적으로 이러한 토폴로지에는 몇 가지 잠재적인 이점이 있습니다. 장점 중 일부는 다음과 같습니다.

개인 정보 보호(Privacy) : 일반적으로 참가자는 당사자와 관련된 원장 부분에 대해서만 알고 있습니다. 당사자는 자신의 참가자 노드를 실행하거나 신뢰할 수 있는 참가자 노드를 선택하여 신뢰할 수 없는 엔터티가 이 데이터를 저장하지 않도록 할 수 있습니다.
확장성(Scalability) : 여러 참가자를 확보하면 참가자들 간에 작업을 공유할 수 있기 때문에 특정 작업 부하에서 원장의 처리량을 향상시킬 수 있습니다.
신뢰 가정 감소(Reducing trust assumption) : 당사자(파티)를 호스팅하는 참가자는 당사자를 대신하고, 다른 참가자는 그렇지 않습니다. 일부 구현에서는 참가자가 서로를 신뢰하지 않으므로 당사자는 호스팅 참가자만 신뢰하면됩니다.

Canton에서 "create daml app"실행 예

여러 참가자를 사용하여 응용프로그램을 실행하면, 특히 같은 컴퓨터에서 여러 참가자를 호스팅하려는 개발 구현중에 복잡성을 가중시킬 수 있습니다. 이 게시물의 나머지 부분에서는 Canton을 다중 참가자 원장의 예제로 사용하여 두 참가자에 대해 create-daml-app 예제 애플리케이션을 동시에 실행하는 방법을 설명합니다. 이것을 시도하기 전에 DAML 시작 안내서를 따르는 것이 좋습니다.

이 자습서에서는 아래 SW를 사용합니다.

  • Canton 0.18.1
  • DAML 1.5.0

다음 다이어그램은이 게시물의 나머지 부분에서 설정할 전체 토폴로지를 보여줍니다.

Canton을 다운로드후 압축을 해제하세요.

~/canton-cda
$ unzip canton-0.18.1.zip
...
$ cd canton-0.18.1
~/canton-cda/canton-0.18.1
$ ls
bin   demo        lib          start-demo.command         VERSION
daml  deployment  LICENSE.txt  start-demo-win.cmd
dars  examples    README.md    third-party-licenses.html

다음으로 아래의 명령어를 통해 create-daml-app예제를 생성합니다.

~/canton-cda/canton-0.18.1
DAML_SDK_VERSION=1.5.0 daml new create-daml-app --template create-daml-app && cd create-daml-app
Created a new project in "create-daml-app" based on the template "create-daml-app".

다음 명령을 사용하여 DAR을 빌드하고 UI에 대한 종속성을 설치하십시오.

~/canton-cda/canton-0.18.1/create-daml-app
$ daml build
Compiling create-daml-app to a DAR.
Created .daml/dist/create-daml-app-0.1.0.dar
~/canton-cda/canton-0.18.1/create-daml-app
$ daml codegen js .daml/dist/create-daml-app-0.1.0.dar -o daml.js
Generating 057eed1fd48c238491b8ea06b9b5bf85a5d4c9275dd3f6183e0e6b01730cc2ba
Generating create-daml-app-0.1.0 (hash: 37197ee5461df46eaf2b1dffa5da310c405fdb6100cf93bdec01c86ce2b54eae)
...
~/canton-cda/canton-0.18.1/create-daml-app
$ cd ui
~/canton-cda/canton-0.18.1/create-daml-app/ui
$ yarn install --force --frozen-lockfile
...

Canton압축 해제가 된 디렉터리로 돌아와서 Canton을 실행합니다.

~/canton-cda/canton-0.18.1/create-daml-app/ui
$ cd ../..
~/canton-cda/canton-0.18.1
$ chmod +x bin/canton
~/canton-cda/canton-0.18.1
$ bin/canton -c examples/04-create-daml-app/canton.conf --bootstrap examples/04-create-daml-app/init.canton

Compiling (synthetic)/ammonite/predef/DefaultPredef.sc
Compiling (synthetic)/ammonite/predef/ArgsPredef.sc
Compiling /home/pho/canton-cda/canton-0.18.1/(console)
Compiling /home/pho/canton-cda/canton-0.18.1/Main.sc
   _____            _
  / ____|          | |
 | |     __ _ _ __ | |_ ___  _ __
 | |    / _` | '_ \| __/ _ \| '_ \
 | |___| (_| | | | | || (_) | | | |
  \_____\__,_|_| |_|\__\___/|_| |_|

  Welcome to Canton!
  Type `help` to get started. `exit` to leave.


@

그러면 두 개의 참가자 노드가 시작됩니다: 다중 참가자 토폴로지를 사용합니다. 또한 두 당사자를 할당할 예정입니다. Participant1은 파티Alice를,Participant2는 Bob을 호스팅합니다. Canton 콘솔은 실행 상태로 두세요, 나중에 필요합니다.

이제 동시에 실행되는 두 가지 UI 인스턴스를 시작하겠습니다. 하나는 'Alice'용이고 다른 하나는 'Bob'용입니다. 참가자의 Ledger API에 UI를 연결하려면 HTTP JSON API를 사용해야하므로 각 참가자에 대한 인스턴스가 필요합니다.

새 터미널 창에서 Participant1에 대한 HTTP JSON API를 시작합니다.

~/canton-cda
$ DAML_SDK_VERSION=1.5.0  daml json-api \
    --ledger-host localhost \
    --ledger-port 12011 \
    --http-port 7575 \
    --allow-insecure-tokens

다른 터미널 창에서Participant2에 대한 HTTP JSON API를 시작합니다.

14:45:52 ~/canton-cda
$ DAML_SDK_VERSION=1.5.0 daml json-api \
    --ledger-host localhost \
    --ledger-port 12021 \
    --http-port 7576 \
    --allow-insecure-tokens

이제 두 개의 새 창에서 두 개의 UI 인스턴스를 시작할 수 있습니다.

Participant1을 위한 명령어

14:50:15 ~/canton-cda/canton-0.18.1/create-daml-app/ui 
$ REACT_APP_LEDGER_ID=participant1 yarn start

Participant2을 위한 명령어

14:50:15 ~/canton-cda/canton-0.18.1/create-daml-app/ui 
$ PORT=3001 REACT_APP_HTTP_JSON_PORT=7576 REACT_APP_LEDGER_ID=participant2 yarn start

그러면 http://localhost:3000/에서Participant1(Alice의 참가자)을 위한 UI가 열리고 http://localhost:3001/에서Participant2를 위한 UI가 열립니다. 하지만 안타깝게도 Canton은 파티 ID의 더 복잡한 표현을 사용하기 때문에“Alice”또는“Bob”문자열을 사용하여 로그인할 수 없습니다. Canton 콘솔로 돌아가서 Alice와 Bob의 파티 ID를 조회할 수 있습니다.

   _____            _
  / ____|          | |
 | |     __ _ _ __ | |_ ___  _ __
 | |    / _` | '_ \| __/ _ \| '_ \
 | |___| (_| | | | | || (_) | | | |
  \_____\__,_|_| |_|\__\___/|_| |_|

  Welcome to Canton!
  Type `help` to get started. `exit` to leave.

@
val aliceId = participant1.parties.list(filterParty="Alice").head.party.filterString
aliceId: String = "Alice::01691ae95af923195517af5de7cd551d8a52015943d2640b98290af5cb8c5d33fb"

@ val bobId = participant2.parties.list(filterParty="Bob").head.party.filterString
bobId: String = "Bob::01dede5ea97789e9965eb94532b12fe4b83cf06c5571c20787d794e936c0b2df0a"

예제 결과화면에 출력된 ID를 사용하여 Alice는 Alice :: 01691ae95af923195517af5de7cd551d8a52015943d2640b98290af5cb8c5d33fb를 사용하여 로그인하고 Bob은 Bob :: 01dede5ea97789e9965eb94532b12fe4b83cf06c5571c20787d794e936c0b2df0a_ 를 사용하여 로그인 할수 있습니다. (사용자 ID와는 다릅니다)

이를 사용하여 두 UI 인스턴스에 로그인을 하면 다음과 같이 보일 것입니다.

분명히 ID는 약간 길지만 제대로 작동합니다. Alice와 Bob은 Canton 상호 운용성 프로토콜을 사용하여 서로 상호 작용할 수 있어야 합니다. Canton 문서에서 이 튜토리얼의 더 자세한 버전을 찾을 수 있습니다.

또한 상호 운용성에 관심이 있는 경우 Anthony Lusardi는 Phoenix의 Hyperledger Global Forum 2020에서 발표한 교차 플랫폼 상호 운용성 데모를 확인해보세요

https://youtu.be/z5NIT8514\_I

원문 : Running DAML App on Multi-Participant Ledgers
https://daml.com/daml-driven/running-daml-app-on-multi-participant-ledgers/