October 16

Canton Network Quest 6

sudo apt update && sudo apt upgrade -y
sudo apt install -y curl unzip jq openjdk-17-jdk screen
curl -sSL https://get.daml.com/ | sh -s 3.3.0-snapshot.20250930.0
echo 'export PATH=$HOME/.daml/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
daml version
daml new capstone --template quickstart-java
cd capstone
daml build
screen -S daml-sandbox
daml sandbox --json-api-port 7575
curl localhost:7575/docs/openapi | head -n 5

Должен показать openapi: 3.0.3.

6. Загрузка пакета (.dar)

curl -v -X POST 'http://localhost:7575/v2/packages' \
  -H "Content-Type: application/octet-stream" \
  --data-binary @.daml/dist/quickstart-0.0.1.dar

Ожидаем HTTP/1.1 200 OK.

Создание Parties (Alice, Bob, EUR_Bank, USD_Bank)

Каждую команду выполняем и записываем Party ID:

# Alice
curl -d '{"partyIdHint":"Alice", "identityProviderId": ""}' \
-H "Content-Type: application/json" -X POST localhost:7575/v2/parties | jq .
# Bob
curl -d '{"partyIdHint":"Bob", "identityProviderId": ""}' \
-H "Content-Type: application/json" -X POST localhost:7575/v2/parties | jq .
# EUR_Bank
curl -d '{"partyIdHint":"EUR_Bank", "identityProviderId": ""}' \
-H "Content-Type: application/json" -X POST localhost:7575/v2/parties | jq .
# USD_Bank
curl -d '{"partyIdHint":"USD_Bank", "identityProviderId": ""}' \
-H "Content-Type: application/json" -X POST localhost:7575/v2/parties | jq .
daml ledger list-parties

(получаем все строки сразу)

Получение Package ID

curl -X GET 'http://localhost:7575/v2/interactive-submission/preferred-package-version?package-name=quickstart&parties=<ALICE_ID>' | jq .

создаем файлы через нано

!!!!!НЕ ЗАБЫВАЙТЕ УКАЗЫВАТЬ ВАШИ ID

nano issue_eur.json

{
"commands": {
"commands": [
{
"CreateAndExerciseCommand": {
"templateId": "2fa7fec894ed2f78a52c03d35cd2bbd283dd2f415fd6bf40510c50a6445bbd2b:Iou:Iou",
"createArguments": {
"issuer": "EUR_Bank::12205a298e9f8f1edbd2dc60a452d30c768e70210bd46e0b8b8e1ee0437db01c7109",
"owner": "EUR_Bank::12205a298e9f8f1edbd2dc60a452d30c768e70210bd46e0b8b8e1ee0437db01c7109",
"currency": "EUR",
"amount": "100.0",
"observers": []
},
"choice": "Iou_Transfer",
"choiceArgument": {
"newOwner": "Alice::12205a298e9f8f1edbd2dc60a452d30c768e70210bd46e0b8b8e1ee0437db01c7109"
}
}
}
],
"userId": "eur-bank-user",
"commandId": "issue-eur-to-alice-1",
"actAs": [
"EUR_Bank::12205a298e9f8f1edbd2dc60a452d30c768e70210bd46e0b8b8e1ee0437db01c7109"
]
}
}

curl -X POST 'http://localhost:7575/v2/commands/submit-and-wait-for-transaction' \
  -H "Content-Type: application/json" \
  -d @issue_eur.json | jq .

берем из вывода "contractId" и вставляем его в конфиг alice

nano alice_trf.json

{
"commands": {
"commands": [
{
"ExerciseCommand": {
"templateId": "2fa7fec894ed2f78a52c03d35cd2bbd283dd2f415fd6bf40510c50a6445bbd2b:Iou:IouTransfer",
"contractId": "СЮДА",
"choice": "IouTransfer_Accept",
"choiceArgument": {}
}
}
],
"userId": "alice-user",
"commandId": "alice-accept-eur-transfer",
"actAs": [
"Alice::12205a298e9f8f1edbd2dc60a452d30c768e70210bd46e0b8b8e1ee0437db01c7109"
]
}
}

curl -X POST 'http://localhost:7575/v2/commands/submit-and-wait-for-transaction' \
  -H "Content-Type: application/json" \
  -d @alice_trf.json | jq .

2. USD_Bank выпускает IOU

nano issue_usd.json

{
"commands": {
"commands": [
{
"CreateAndExerciseCommand": {
"templateId": "2fa7fec894ed2f78a52c03d35cd2bbd283dd2f415fd6bf40510c50a6445bbd2b:Iou:Iou",
"createArguments": {
"issuer": "USD_Bank::12205a298e9f8f1edbd2dc60a452d30c768e70210bd46e0b8b8e1ee0437db01c7109",
"owner": "USD_Bank::12205a298e9f8f1edbd2dc60a452d30c768e70210bd46e0b8b8e1ee0437db01c7109",
"currency": "USD",
"amount": "110.0",
"observers": []
},
"choice": "Iou_Transfer",
"choiceArgument": {
"newOwner": "Bob::12205a298e9f8f1edbd2dc60a452d30c768e70210bd46e0b8b8e1ee0437db01c7109"
}
}
}
],
"userId": "usd-bank-user",
"commandId": "issue-usd-to-bob-1",
"actAs": [
"USD_Bank::12205a298e9f8f1edbd2dc60a452d30c768e70210bd46e0b8b8e1ee0437db01c7109"
]
}
}

curl -X POST 'http://localhost:7575/v2/commands/submit-and-wait-for-transaction' \
  -H "Content-Type: application/json" \
  -d @issue_usd.json | jq .

берем из вывода "contractId" и вставляем его в конфиг bob

nano bob_trf.json

{
"commands": {
"commands": [
{
"ExerciseCommand": {
"templateId": "2fa7fec894ed2f78a52c03d35cd2bbd283dd2f415fd6bf40510c50a6445bbd2b:Iou:IouTransfer",
"contractId": "<BOB_TRANSFER_CID>",
"choice": "IouTransfer_Accept",
"choiceArgument": {}
}
}
],
"userId": "bob-user",
"commandId": "bob-accept-usd-transfer",
"actAs": [
"Bob::12205a298e9f8f1edbd2dc60a452d30c768e70210bd46e0b8b8e1ee0437db01c7109"
]
}
}

curl -X POST 'http://localhost:7575/v2/commands/submit-and-wait-for-transaction' \
  -H "Content-Type: application/json" \
  -d @bob_trf.json | jq .

Следующий шаг ( Add Observer)

Теперь у тебя есть оба:

  • <ALICE_ACCEPT_EUR> = 00d28761210e104e2041648dbccbb4b1df5c60ad35e62d1577b6107018760e3862ca1112200cb42cb2df0a62a5f744b9dda228060f4e730b16f65e07072b0a5f98eb35ee94
  • <BOB_ID> = Bob::12205a298e9f8f1edbd2dc60a452d30c768e70210bd46e0b8b8e1ee0437db01c7109
nano add_observer.json

{
"commands": {
"commands": [
{
"ExerciseCommand": {
"templateId": "2fa7fec894ed2f78a52c03d35cd2bbd283dd2f415fd6bf40510c50a6445bbd2b:Iou:Iou",
"contractId": "00d28761210e104e2041648dbccbb4b1df5c60ad35e62d1577b6107018760e3862ca1112200cb42cb2df0a62a5f744b9dda228060f4e730b16f65e07072b0a5f98eb35ee94",
"choice": "Iou_AddObserver",
"choiceArgument": {
"newObserver": "Bob::12205a298e9f8f1edbd2dc60a452d30c768e70210bd46e0b8b8e1ee0437db01c7109"
}
}
}
],
"userId": "alice-user",
"commandId": "iou-disclosure-split-1",
"actAs": [
"Alice::12205a298e9f8f1edbd2dc60a452d30c768e70210bd46e0b8b8e1ee0437db01c7109"
]
}
}

curl -X POST 'http://localhost:7575/v2/commands/submit-and-wait-for-transaction' \
  -H "Content-Type: application/json" \
  -d @add_observer.json | jq .

В ответе должен появиться CreatedEvent → это новый IOU с Bob в наблюдателях.
Этот contractId мы будем называть <NEW_IOU> и использовать на Step 7.3 (Trade Proposal).
Выглядит так
00c150e5e67fd561f512bac1c9b7ca4704400036a9e48abb2e5ae981253242d4d8ca111220df8ee3713c0312e5a0eca6fef60df7a50e99f75b28a4439c379d44796d9542e2

Создай файл propose_trade.json

{
"commands": {
"commands": [
{
"CreateCommand": {
"templateId": "2fa7fec894ed2f78a52c03d35cd2bbd283dd2f415fd6bf40510c50a6445bbd2b:IouTrade:IouTrade",
"createArguments": {
"buyer": "Alice::12205a298e9f8f1edbd2dc60a452d30c768e70210bd46e0b8b8e1ee0437db01c7109",
"seller": "Bob::12205a298e9f8f1edbd2dc60a452d30c768e70210bd46e0b8b8e1ee0437db01c7109",
"baseIouCid": "00c150e5e67fd561f512bac1c9b7ca4704400036a9e48abb2e5ae981253242d4d8ca111220df8ee3713c0312e5a0eca6fef60df7a50e99f75b28a4439c379d44796d9542e2",
"baseIssuer": "EUR_Bank::12205a298e9f8f1edbd2dc60a452d30c768e70210bd46e0b8b8e1ee0437db01c7109",
"baseCurrency": "EUR",
"baseAmount": "100.0",
"quoteIssuer": "USD_Bank::12205a298e9f8f1edbd2dc60a452d30c768e70210bd46e0b8b8e1ee0437db01c7109",
"quoteCurrency": "USD",
"quoteAmount": "110.0"
}
}
}
],
"userId": "alice-user",
"commandId": "trade-proposal-1",
"actAs": [
"Alice::12205a298e9f8f1edbd2dc60a452d30c768e70210bd46e0b8b8e1ee0437db01c7109"
]
}
}

curl -X POST 'http://localhost:7575/v2/commands/submit-and-wait-for-transaction' \
  -H "Content-Type: application/json" \
  -d @propose_trade.json | jq .

Вот этот контракт — твой <TRADE_PROPOSAL_CID>:

002d95e05d90a25d478d0b2ab01b33a2c81ad4abe178fb42089f20c30bc6218380ca11122061b5232006c3860e61a7876f743701de50bca6f0e1fcae889b9e1bb1bce4e494

Создай файл accept_trade.json

{
"commands": {
"commands": [
{
"ExerciseCommand": {
"templateId": "2fa7fec894ed2f78a52c03d35cd2bbd283dd2f415fd6bf40510c50a6445bbd2b:IouTrade:IouTrade",
"contractId": "002d95e05d90a25d478d0b2ab01b33a2c81ad4abe178fb42089f20c30bc6218380ca11122061b5232006c3860e61a7876f743701de50bca6f0e1fcae889b9e1bb1bce4e494",
"choice": "IouTrade_Accept",
"choiceArgument": {
"quoteIouCid": "00d4ebe87ee5d3d18e95fcec9661ddaaa916a2e39f57da36214062716a431a215eca111220d4357a4b8fdacac7a40d877d4a757105651c0a8f924a00e63fda603c5ec44634"
}
}
}
],
"userId": "bob-user",
"commandId": "trade-acceptance-1",
"actAs": [
"Bob::12205a298e9f8f1edbd2dc60a452d30c768e70210bd46e0b8b8e1ee0437db01c7109"
]
}
}

curl -X POST 'http://localhost:7575/v2/commands/submit-and-wait-for-transaction' \
  -H "Content-Type: application/json" \
  -d @accept_trade.json | jq .