DAML REPL을 사용하면 DAML 스크립트 API를 대화식으로 사용할 수 있습니다. 이는 디버깅 및 원장을 대화식으로 검사하고 조작하는 데 유용합니다.
사용법
먼저 script-example 템플릿을 기반으로 새 프로젝트를 만듭니다. 이 템플릿에 대한 자세한 내용은 DAML 스크립트 설명서를 참조하십시오.
# create a project called script-example based on the template
> daml new script-example --template script-example
# switch to the new project
> cd script-example
이제 프로젝트를 빌드하고 DAML SDK에 포함된 인 메모리(in memory) 원장 인 DAML Sandbox를 시작합니다. 우리는 wallclock 모드에서 Sandbox를 시작하고 있습니다. daml repl에서는 정적 시간(Static time)은 지원되지 않습니다.
> daml build
> daml sandbox --wall-clock-time --port=6865 .daml/dist/script-example-0.0.1.dar
원장 실행후, 다음 명령을 사용하여 별도의 터미널에서 REPL을 시작할 수 있습니다.
> daml repl --ledger-host=localhost --ledger-port=6865 .daml/dist/script-example-0.0.1.dar --import script-example
--ledger-host 및 --ledger-port 매개 변수는 원장이 실행 중인 호스트 및 포트를 지정합니다. 또한 REPL에서 액세스 할 수 있는 템플릿 및 기타 정의가 포함된 DAR의 이름도 인자로 전달해야 합니다. 또한 script-example 패키지에서 모든 모듈을 가져오도록 지정합니다. 모듈이 colliding definitions 를 제공하는 경우 REPL 내에서 모듈을 개별적으로 가져올 수도 있습니다. 여러 DAR을 지정할 수도 있으며 모두 사용할 수 있습니다.
이제 다음과 같은 프롬프트가 표시됩니다.
daml>
이 프롬프트는 스크립트 작업의 do-block 줄처럼 생각할 수 있습니다. 각 입력 라인은 다음 두 가지 형식 중 하나를 가져야 합니다.
- 일부 a 타입에 대한 script a 타입의 표현식 expr. 이것은 스크립트를 실행하고 a 가 Show 의 인스턴스이고 () 가 아닌 경우 결과를 출력 합니다.
- a 가 Show 의 인스턴스 인 a 타입에 대한 a 타입 의 순수 표현식(pure expression) expr 입니다. 이것은 expr 을 평가하고 결과를 출력 합니다. 순수 표현식에만 관심이 있는 경우 원장에 연결하지 않고 DAML REPL을 사용할 수도 있습니다.
- pat <- expr 형식의 바인딩. 여기서 pat 은 패턴입니다. 예를 들어 결과를 바인딩하는 변수 이름 x 와 expr 은 Script a 타입의 표현입니다. 이것은 스크립트를 실행하고 패턴의 변수에 일치를 바인딩하는 패턴 pat 에 대한 결과를 일치시킵니다. 그런 다음 해당 변수를 후속 줄에서 사용할 수 있습니다.
- let pat = y 형식의 let 바인딩. 여기서 pat 은 패턴이고 y 는 순수 표현식이거나 let f x = y 로 함수를 정의합니다. 바인딩된 변수는 다음 줄에서 사용할 수 있습니다.
- DAML 코드 옆에 REPL은 접두사가 붙은 REPL 명령도 인식합니다. 지원되는 REPL 명령 목록을 보려면 : help 를 입력하십시오.
먼저 표시 이름이 "Alice"이고 당사자 ID가 "alice"인 당사자와 표시 이름이 "Bob"이고 당사자 ID가 "bob"인 당사자를 만듭니다.
daml> alice <- allocatePartyWithHint "Alice" (PartyIdHint "alice")
daml> bob <- allocatePartyWithHint "Bob" (PartyIdHint "bob")
다음으로 Alice에서 Bob으로 CoinProposal 을 생성합니다.
daml> submit alice (createCmd (CoinProposal (Coin alice bob)))
Bob은 이제 Query 기능을 사용하여 활성 CoinProposal 계약 목록을 가져올 수 있습니다. debug : Show a => a-> Script () 함수를 사용하여 값을 출력 할 수 있습니다.
daml> proposals <- query @CoinProposal bob
daml> debug proposals
[Daml.Script:39]: [(<contract-id>,CoinProposal {coin = Coin {issuer = 'alice', owner = 'bob'}})]
마지막으로 forA 함수를 사용하여 모든 제안을 수락합니다.
daml> forA proposals $ \(contractId, _) -> submit bob (exerciseCmd contractId Accept)
query 기능을 사용하여 이제 하나의 Coin 이 존재하고, CoinProposal 이 없는지 확인할 수 있습니다.
daml> coins <- query @Coin bob
daml> debug coins
[Daml.Script:39]: [(<contract-id>,Coin {issuer = 'alice', owner = 'bob'})]
daml> proposals <- query @CoinProposal bob
[Daml.Script:39]: []
daml repl을 종료하려면 Ctrl-D 를 누릅니다.
프롬프트(prompt)의 범위는 무엇입니까?
프롬프트에서 --import 에 지정된 DALF의 모든 모듈을 자동으로 가져옵니다. 또한 DAML.Script 모듈도 가져 와서 DAML 스크립트 API에 대한 액세스를 제공합니다.
추가적인 모듈을 import 하려면 : module + ModA ModB… 명령을 사용하고, 이전에 추가 한 모듈을 제거하려면 : module-ModA ModB… 명령을 사용할 수 있습니다. module + 대신 import 구문을 사용하여 모듈을 가져올 수도 있습니다. : show imports 명령은 현재 import된 모듈을 나열합니다.
daml> import DA.Time
daml> debug (days 1)
원장 없이 DAML REPL 사용
예를 들어 일부 함수의 작동 방식을 테스트하기 위해 순수 표현식에만 관심이 있는 경우 --ledger-host 및 -ledger-port 매개 변수를 생략할 수 있습니다. DAML REPL은 평소처럼 작동하지만 원장과 상호 작용하는 DAML 스크립트 API를 호출하려고 하면 (예 : submit) 다음 오류가 발생합니다.
daml> java.lang.RuntimeException: No default participant
TLS를 통해 연결
--tls 를 사용하여 TLS가 필요한 원장에 연결할 수 있습니다. 서버 인증서를 확인하는 데 사용되는 사용자 지정 루트 인증서는 --cacrt 를 통해 설정할 수 있습니다. 마지막으로 --pem client.key --crt client.crt 를 인자로 하여 클라이언트 인증을 활성화 할 수도 있습니다. --cacrt 또는 --pem 및 --crt 가 전달되면 TLS가 자동으로 활성화되므로 --tls 가 중복됩니다(따로 설정할 필요 없음).
권한 인증이 필요한 원장에 연결
원장에 인증 토큰이 필요한 경우 --access-token-file 을 통해 전달할 수 있습니다.
DAML REPL을 사용하여 JSON으로 변환
: json 명령을 사용하여 직렬화 가능한 DAML 표현식을 JSON으로 인코딩 할 수 있습니다. 예를 들어 위에서 정의 및 가져 오기 사용 :
daml> :json days 1
{"microseconds":86400000000}
daml> :json map snd coins
[{"issuer":"alice","owner":"bob"}]
원문 : DAML REPL
https://docs.daml.com/1.5.0/daml-repl/index.html
'기술자료 > DAML' 카테고리의 다른 글
DAML 2.0의 Party와 User 관리 (0) | 2023.08.08 |
---|---|
DAML 애플리케이션 업그레이드 및 확장 (0) | 2020.10.12 |
DAML 스크립트 (0) | 2020.10.07 |