October 13

Гайд по виконанню п'ятого завдання в проекті Canton

Крипто-подорожі з Дмитром - канал про ретродропи, тестнети, блокчейни, скрипти, NFT, криптобіржі, коротше, про все цікаве зі світу криптовалюти. Впевнений, тобі буде цікаво та корисно.
Чат каналу - ласкаво прошу, спілкуємось, ділимося новими активностями, допомагаємо один одному.

Привіт всім.

Отже, сьогодні виконуємо п'яте завдання для проекту Canton, в якого 400 лямів інвесту. Перше, друге, третє і четверте я розписав в своєму ТГ каналі, можете ознайомитись:
Перше
Друге

Третє

Четверте

Посилання на сторінку з завданням:
https://earn.stackup.dev/campaigns/unlocking-canton-with-daml-unifying-traditional-and-crypto-markets-on-chain/quests/quest-5-enhancing-smart-contracts-with-interactivity-and-logic

Результатом виконання завдання має бути скрін, який ви бачите зверху. Погнали?

Це завдання можна виконати на Віндовсі, як і четверте (напевно, навіть простіше це зробити саме на Віндовсі, без сервера). Хоча кому як.

Для початку в вас мають бути встановлені:

Java - https://adoptium.net/temurin/releases/?version=11

Daml - https://docs.daml.com/getting-started/installation.html#windows

VS Code - https://code.visualstudio.com/

Завдання насправді дуже просто зробити за цим гайдом, вважайте, що я вам зекономив мінімум годину життя і трохи нервових клітин, тому що гайд короткий і ви не бачите 20 видалених гілок в Перплексіті і Геміні ).

В терміналі в будь якій папці створюєте проект:

daml new persondata --template skeleton

Потім фізично зайдіть в папку з проектом і переіменуйте файл (не знаю для чого, так в інструкції написано):
файл daml/Main.daml треба переіменувати в PersonData.daml

Потім в VS Code відкриваєте цей проект і в файл PersonData вставляєте код:

module PersonData where
import Daml.Script
import DA.Optional (Optional(..))
import DA.List (delete)
data PersonKey = PersonKey with
keyIssuer : Party
keyDataId : Text
deriving (Eq, Show)
template PersonData
with
issuer : Party
owner : Party
dataId : Text
personalInfo : (Text, Text, Int)
addresses : [Text]
contact : Optional Text
where
signatory issuer, owner
ensure dataId /= ""
choice UpdatePersonalInfo : ContractId PersonData
with
newInfo : (Text, Text, Int)
controller owner
do
archive self
create this with personalInfo = newInfo
choice AddAddress : ContractId PersonData
with
newAddress : Text
controller owner
do
archive self
create this with addresses = newAddress :: addresses
choice SetContact : ContractId PersonData
with
newContact : Text
controller owner
do
create this with contact = Some newContact
choice ClearContact : ContractId PersonData
controller owner
do
archive self
create this with contact = None
template PersonDataProposal
with
proposal : PersonData
where
signatory proposal.issuer
observer proposal.owner

choice Accept : ContractId PersonData
controller proposal.owner
do
create proposal
test_person_data = script do
issuer <- allocateParty "IssuerParty"
owner <- allocateParty "OwnerParty"

let initialPersonData = PersonData with
issuer = issuer
owner = owner
dataId = "KYC-001"
personalInfo = ("Jane", "Doe", 35)
addresses = ["10 Downing Street"]
contact = Some "old.contact@example.com"

proposalCid <- submit issuer do
createCmd PersonDataProposal with
proposal = initialPersonData
personCid <- submit owner do
exerciseCmd proposalCid Accept
Some contract <- queryContractId issuer personCid
assert (contract.contact == Some "old.contact@example.com")
let personKey = PersonKey with keyIssuer = issuer, keyDataId = "KYC-001"
newCid <- submit owner do
exerciseCmd personCid SetContact with
newContact = "new.contact@example.com"

Some newContract <- queryContractId owner newCid
assert (newContract.contact == Some "new.contact@example.com")
return ()

Тепер як і в попередньому завданні треба запустити "Script Result", дивіться скрін:

Тепер в результатах ставите пташечку "Show archived" і розтягуєте його, щоб було повністю видно.

Робите скрін