[DAML documentation 따라가기] Create Daml Apps - Test Templates With Daml Script

2023. 7. 6. 17:58DAML

이번 파트에서 우리가 해볼 것은 아래와 같다.

 

- party 할당하기

- transaction 제출하기

- contract 생성하기

- failure 테스트하기

- contract archiving하기

- ledger와 가장 최근 ledger 상태 확인하기

 

 

DAML documentation에서는 Token이라는 이름의 template을 만들어놓고, 해당 template의 여러 contract를 생성하며 실습을 진행한다.


1. Party 할당, Transaction 제출, Contract 생성하기

 

원장 (ledger)에 정보를 올리기 위해서 해야할 일은 총 3가지이다.

- transaction을 누가 진행함?    --> Party를 할당하는 이유

- 어떤 contract를 원장에 올리지?  --> createCmd를 통해 어떤 것을 올릴 지 명시해주기

- contract의 어떤 transaction(생성, 조회)을 원장에 올리지? --> submit 키워드로 transaction을 제출하기!

 

 

이 과정은 대체로 한번에 진행되며, 각각 진행되는 것도 가능하다.

 

DAML documentation에서는 아래처럼 한번에 진행된다!

 

 

-- Token이라는 이름의 template을 만드는 DAML code
template Token
  with
    owner : Party
  where
    signatory : owner


-- token_test라는 이름으로 계약 생성해보기
token_test = do

  -- 계약 생성 전 누가 transaction 발생시킬 지 있어야 하므로 Party를 가장 먼저 할당해줌
  alice <- allocateParty "Alice"
  
  -- alice라는 Party가 만들어진 transaction을 제출함
  submit alice do
  
    -- owner field의 값이 alice인 Token contract를 생성함
    createCmd Token with owner alice

 

<짚고 가야할 point>

1. <- 기호는 결과값을 해당 변수에 바인딩 하라는 문법이다.

2. DAML 에서 함수는 fn ar1 ar2와 같이 사용한다.

   즉, allocateParty "Alice"는 allocateParty라는 함수의 argument로 Alice가 들어간 형태라고 생각하면 된다.

 

 

 

2. Failure 테스트하기

 

 

-- token_test라는 이름으로 계약 생성해보기
token_test = do

  -- 계약 생성 전 누가 transaction 발생시킬 지 있어야 하므로 Party를 가장 먼저 할당해줌
  alice <- allocateParty "Alice"
  jason <- allocateParty "Jason"
  
  
  ------------ Failure 지점 ------------
  submit alice do
    createCmd Token with owner jason
  -------------------------------------

 

 

 

 

3. Contract archiving하기

 

Contract creating과 대응되는 개념이 archiving이다. (왜 대응된다고 이야기하는 지는 모르겠지만 크게 두 가지라 그런듯)

 

contract는 immutable하기 때문에 update를 위해서는 ledger에 있는 contract들을 archive한 후 새로운 것을 생성한다.

 

Archiving은 controller로부터의 권한이 필요하다.

 

 

token_test = do
  alice <- allocateParty "Alice"
  bob <- allocateParty "Bob"

  -- alice_token는 alice가 가지고 있는 token contract를 담는 원장이라고 생각
  alice_token <- submit alice do
    createCmd Token with owner = alice

  -- bob은 alice_token을 archive할 권한이 없으므로 당연히 fail함
  submitMustFail bob do
    archiveCmd alice_token

  -- alice는 alice_token을 archive할 권한이 있으므로 archive 성공!
  submit alice do
    archiveCmd alice_token

 

4. ledger와 가장 최근 ledger 상태 확인하기

 

블록체인의 특징은 모든 transaction이 원장에 영구적으로 보관이 된다는 점이다.

 

이런 특성이 DAML의 원장에도 반영이 되어 있으며, 이는 "Show transaction view"를 클릭하여 확인할 수 있다.

 

--> 내부적인 동작과정에 대한 조사 및 공부가 필요함.. 나중에 업로드 하기..

 

 

TX # : transaction 번호를 가장 앞에 띄워준다.

 

consumed by #2:0   : commit 2의 0번 transaction에서 archiving이 되었다는 것을 알려주는 라인

 

referenced by #2:0   : 해당 contract가 이용된 transaction의 번호들을 나열해준다. 현재는 2번 commit의 0번 transaction에서 사용되었다는 것을 알려줌

 

disclosed to (since) : 'Alice' (0) : 해당 contract를 누가 아는(archive가 가능한 당사자?) 지 얘기해줌. 현재는 Alice가 해당 contract의 내용을 알고 있고, 0번 commit에서 해당 contract의 내용을 알 수 있었다는 것 또한 알 수 있음.