Створення і використання

Перш, ніж продовжити, переконайтеся в тому, що Ви виконали всі кроки з налаштування.

Щоб побачити список підтримуваних контрактів і дій, введіть наступну команду:lorentz-contract-multisig --help

Створення коду контракту Transferlist

Автономний Transferlist контракт

Приклад початкового сховища:

$ lorentz-contract-transferlist Transferlist init --issuer "\"$FRED_ADDRESS\"" \
--transferlists "[]" \
--users "[]" \
--admin "\"$FRED_ADDRESS\"" \
--initialStorageType 'address'
Pair (Pair "tz1RwoEdg4efDQHarsw6aKtMUYvg278Gv1ir" { }) (Pair { } "tz1RwoEdg4efDQHarsw6aKtMUYvg278Gv1ir")

Щоб створити контракт:

$ tezos-client --wait none originate contract Transferlist \
transferring 0 from $FRED_ADDRESS running \
"$(cat contracts/address_transferlist.tz)" \
--init "$(lorentz-contract-transferlist Transferlist init --issuer "\"$FRED_ADDRESS\"" \
--transferlists "[]" \
--users "[]" \
--admin "\"$FRED_ADDRESS\"" \
--initialStorageType 'address')" --burn-cap 2.937
Waiting for the node to be bootstrapped before injection...
Current head: BLhwwjTTonUC (timestamp: 2020-07-09T19:24:06-00:00, validation: 2020-07-09T19:24:38-00:00)
Node is bootstrapped, ready for injecting operations.
Estimated gas: 77713 units (will add 100 for safety)
Estimated storage: 2937 bytes added (will add 20 for safety)
Operation successfully injected in the node.
Operation hash is 'ooMkQ2WYZhM9FRTSmg1ijJ5PT4DChzZA8rjPsroM1MR4YjsXxdG'
NOT waiting for the operation to be included.
Use command
tezos-client wait for ooMkQ2WYZhM9FRTSmg1ijJ5PT4DChzZA8rjPsroM1MR4YjsXxdG to be included --confirmations 30 --branch BKk5pbbgmu4ZnA7NjcSwsZF66h66dc287WQFtRz8fM2NZLfLY75
and/or an external block explorer to make sure that it has been included.
This sequence of operations was run:
Manager signed operations:
From: tz1RwoEdg4efDQHarsw6aKtMUYvg278Gv1ir
Fee to the baker: ꜩ0.010656
Expected counter: 623955
Gas limit: 77813
Storage limit: 2957 bytes
Balance updates:
tz1RwoEdg4efDQHarsw6aKtMUYvg278Gv1ir ............. -ꜩ0.010656
fees(tz1Ke2h7sDdakHJQh8WX4Z372du1KChsksyU,270) ... +ꜩ0.010656
Origination:
From: tz1RwoEdg4efDQHarsw6aKtMUYvg278Gv1ir
Credit: ꜩ0
Script:
{ ... }
Initial storage:
(Pair (Pair "tz1RwoEdg4efDQHarsw6aKtMUYvg278Gv1ir" {})
(Pair {} "tz1RwoEdg4efDQHarsw6aKtMUYvg278Gv1ir"))
No delegate for this contract
This origination was successfully applied
Originated contracts:
KT1FHaNcQwQt6Ug92iKuFjFs31bQTSDU92Fi
Storage size: 2680 bytes
Updated big_maps:
New map(9382) of type (big_map nat (pair bool (set nat)))
New map(9381) of type (big_map address nat)
Paid storage size diff: 2680 bytes
Consumed gas: 77713
Balance updates:
tz1RwoEdg4efDQHarsw6aKtMUYvg278Gv1ir ... -ꜩ2.68
tz1RwoEdg4efDQHarsw6aKtMUYvg278Gv1ir ... -ꜩ0.257
New contract KT1FHaNcQwQt6Ug92iKuFjFs31bQTSDU92Fi originated.
Contract memorized as Transferlist.
$ TRANSFERLIST_ADDRESS="KT1FHaNcQwQt6Ug92iKuFjFs31bQTSDU92Fi"

Наповнення контракту

Давайте заповнимо договір користувачами і трансфер-листами.

Додавання користувачів

Щоб згенерувати параметр для додавання $ALICE_ADDRESS в список передачі 0:

$ lorentz-contract-transferlist Transferlist UpdateUser \
--newUser "\"$ALICE_ADDRESS\"" --newUserType 'address' \
--newUserTransferlistId 0
Right (Right (Left (Left (Right (Pair "tz1R3vJ5TV8Y5pVj8dicBR23Zv8JArusDkYr" (Some 0))))))

Ми можемо відправити параметр наступним кодом:

$ tezos-client --wait none transfer 0 from $FRED_ADDRESS to $TRANSFERLIST_ADDRESS \
--arg "$(lorentz-contract-transferlist Transferlist UpdateUser \
--newUser "\"$ALICE_ADDRESS\"" --newUserType 'address' \
--newUserTransferlistId 0)"

Оскільки ми будемо додавати чотирьох користувачів, ось зручний спосіб додати користувача:

$ transferlist_add_user(){ tezos-client --wait none transfer 0 from $FRED_ADDRESS to $TRANSFERLIST_ADDRESS \
--arg "$(lorentz-contract-transferlist Transferlist UpdateUser \
--newUser "\"$1\"" --newUserType 'address' \
--newUserTransferlistId "$2")" --burn-cap 1.0 }

Додавання трансфер-листів

Щоб згенерувати параметр для додавання трансфер-листа:

  • transferlistId: 0

  • Це може перенести в трансфер-листи 0, 2

  • unrestricted

$ lorentz-contract-transferlist Transferlist \
SetTransferlistOutbound --transferlistId 0 --outboundTransferlist "[0,2]"
Right (Right (Left (Right (Left (Pair 0 (Some (Pair True { 0; 2 })))))))

Як і у випадку з користувачами, ось зручний спосіб додати трансфер-лист:

$ add_transferlist(){ tezos-client --wait none transfer 0 from $FRED_ADDRESS to $TRANSFERLIST_ADDRESS \
--arg "$(lorentz-contract-transferlist Transferlist \
SetTransferlistOutbound --transferlistId "$1" --outboundTransferlist "$2" $3)" --burn-cap 1.0 }

Пакетна установка

Користувачі і трансфер-листи можуть бути додані в будь-якому порядку.

Щоб заповнити контракт використовуйте наступне:

Користувачі:

  • $ALICE_ADDRESS: 0

  • $BOB_ADDRESS: 0

  • $CHARLIE_ADDRESS: 1

  • $DAN_ADDRESS: 2

Трансфер-листи:

  • 0: (unrestricted: True, allowedTransferlists: {0, 2})

  • 1: (unrestricted: True, allowedTransferlists: {1})

  • 2: (unrestricted: False, allowedTransferlists: {1, 2})

Тепер можна виконати:

transferlist_add_user $ALICE_ADDRESS 0
transferlist_add_user $BOB_ADDRESS 0
transferlist_add_user $CHARLIE_ADDRESS 1
transferlist_add_user $DAN_ADDRESS 2
add_transferlist 0 '[0,2]'
add_transferlist 1 '[1]'
add_transferlist 2 '[1,2]' --restricted

Ось посилання на операції:

assertTransfers

Операція успішна тоді і тільки тоді, коли для кожного from з і пов'язаних з ним to в списку виконується одна з цих умов:

  • Обидві:

    • assertReceivers будуть успішні для обох from і to userId

    • transferlistId для to входить в set з набору трансфер-листів from дозволених вихідних трансфер-листів

  • Обидві:

    • assertReceivers буде успішно для to userId

    • from userId і є issuer userId

Це еквівалентно наступному псевдокоду:

def assertTransfers(input_list):
for from, tos in input_list:
for to in tos:
if from == issuer:
assertReceivers [to]
else:
assertReceivers [from, to]
users.get(to) in transferlists.get(users.get(from)).allowedTransferlists
(list %assertTransfers (pair (userId %from)
(list %tos userId)))

Див. transfer FA2 для прикладу подібної пакетної точки входу.

Приклади

Використовуючи попередню настройку, припустимо, що був зроблений наступний виклик assertTransfers:

assertTransfers
{ Pair "$ALICE_ADDRESS" { "$BOB_ADDRESS", "$DAN_ADDRESS" }
, Pair "$BOB_ADDRESS" { "$ALICE_ADDRESS" }
, Pair "$CHARLIE_ADDRESS" { "$CHARLIE_ADDRESS", "$DAN_ADDRESS" }
}
  • alice -> bob: alice і bob знаходяться в одному трансфер-листі (0),

    який містить себе і свої allowedTransferlists а також має статус unrestricted,

    таким чином операція може успішно завершитися

  • alice -> dan: alice в трансфер-листі (0) який містить dan transferlistId (2) в своєму allowedTransferlists і має статус unrestricted, операція не відбудеться, тому що трансфер-лист для dan єrestricted

  • bob -> alice: Операція успішно пройде за тією ж логікою, що і alice -> bob: вони знаходяться в одномуunrestricted трансфер-листі, який містить свою власнуtransferlistId в своєму allowedTransferlists

  • charlie -> charlie: Операція буде успішна, оскільки трансфер-лист charlie unrestricted і містить свою власну transferlistId в своєму allowedTransferlists

  • charlie -> dan: Операція не пройде, тому що трансфер-лист для dan (2) є restricted

Таким чином, наведений вище виклик assertTransfers завершиться помилкою.

Ось як його згенерувати:

$ lorentz-contract-transferlist Transferlist AssertTransfers \
--userType 'address' --list \
"{ Pair \"$ALICE_ADDRESS\" { \"$BOB_ADDRESS\"; \"$DAN_ADDRESS\" }; \
Pair \"$BOB_ADDRESS\" { \"$ALICE_ADDRESS\" }; \
Pair \"$CHARLIE_ADDRESS\" { \"$CHARLIE_ADDRESS\"; \"$DAN_ADDRESS\" } }"
Left { Pair "tz1R3vJ5TV8Y5pVj8dicBR23Zv8JArusDkYr" { "tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm"; "tz1aHNfXQkBTKUDtkYrZ1iHhAoV3uZYgmkz1" }; Pair "tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm" { "tz1R3vJ5TV8Y5pVj8dicBR23Zv8JArusDkYr" }; Pair "tz1e95DfgHze6hszPbrkdWeVb4vPiDdJWBhF" { "tz1e95DfgHze6hszPbrkdWeVb4vPiDdJWBhF"; "tz1aHNfXQkBTKUDtkYrZ1iHhAoV3uZYgmkz1" } }

Щоб відправити перевірку assertTransfers:

$ tezos-client --wait none transfer 0 from $FRED_ADDRESS to $TRANSFERLIST_ADDRESS \
--arg "$(lorentz-contract-transferlist Transferlist \
AssertTransfers --userType 'address' --list \
"{ Pair \"$ALICE_ADDRESS\" { \"$BOB_ADDRESS\"; \"$DAN_ADDRESS\" }; \
Pair \"$BOB_ADDRESS\" { \"$ALICE_ADDRESS\" }; \
Pair \"$CHARLIE_ADDRESS\" { \"$CHARLIE_ADDRESS\"; \"$DAN_ADDRESS\" } }")"
Waiting for the node to be bootstrapped before injection...
Current head: BLzZBqGJMh4E (timestamp: 2020-07-09T20:40:36-00:00, validation: 2020-07-09T20:41:01-00:00)
Node is bootstrapped, ready for injecting operations.
This simulation failed:
Manager signed operations:
From: tz1RwoEdg4efDQHarsw6aKtMUYvg278Gv1ir
Fee to the baker: ꜩ0
Expected counter: 623963
Gas limit: 1040000
Storage limit: 60000 bytes
Transaction:
Amount: ꜩ0
From: tz1RwoEdg4efDQHarsw6aKtMUYvg278Gv1ir
To: KT1FHaNcQwQt6Ug92iKuFjFs31bQTSDU92Fi
Parameter: (Left { Pair "tz1R3vJ5TV8Y5pVj8dicBR23Zv8JArusDkYr"
{ "tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm" ;
"tz1aHNfXQkBTKUDtkYrZ1iHhAoV3uZYgmkz1" } ;
Pair "tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm"
{ "tz1R3vJ5TV8Y5pVj8dicBR23Zv8JArusDkYr" } ;
Pair "tz1e95DfgHze6hszPbrkdWeVb4vPiDdJWBhF"
{ "tz1e95DfgHze6hszPbrkdWeVb4vPiDdJWBhF" ;
"tz1aHNfXQkBTKUDtkYrZ1iHhAoV3uZYgmkz1" } })
This operation FAILED.
Runtime error in contract KT1FHaNcQwQt6Ug92iKuFjFs31bQTSDU92Fi:
001: { parameter
002: (or (list %assertTransfers (pair address (list address)))
...
070: IF {} { PUSH string "outbound not transferlisted" ; FAILWITH } } } ;
...
271: PAIR } }
At line 70 characters 102 to 110,
script reached FAILWITH instruction
with "outbound not transferlisted"
Fatal error:
transfer simulation failed

Якщо ми видалимо передачі, які не можуть бути завершені (докладніше див. TZIP-15), твердження буде успішним:

$ tezos-client --wait none transfer 0 from $FRED_ADDRESS to $TRANSFERLIST_ADDRESS \
--arg "$(lorentz-contract-transferlist Transferlist \
AssertTransfers --userType 'address' --list \
"{ Pair \"$ALICE_ADDRESS\" { \"$BOB_ADDRESS\" }; \
Pair \"$BOB_ADDRESS\" { \"$ALICE_ADDRESS\" }; \
Pair \"$CHARLIE_ADDRESS\" { \"$CHARLIE_ADDRESS\" } }")" --burn-cap 0.000001
Waiting for the node to be bootstrapped before injection...
Current head: BLjCwGGsznH8 (timestamp: 2020-07-09T20:43:06-00:00, validation: 2020-07-09T20:43:40-00:00)
Node is bootstrapped, ready for injecting operations.
Estimated gas: 72505 units (will add 100 for safety)
Estimated storage: no bytes added
Operation successfully injected in the node.
Operation hash is 'op5a4BjNXh39vqkFgeyRj1m87W9vVmTX5kYFNKwjPv34fL4eo2m'
NOT waiting for the operation to be included.
Use command
tezos-client wait for op5a4BjNXh39vqkFgeyRj1m87W9vVmTX5kYFNKwjPv34fL4eo2m to be included --confirmations 30 --branch BLJoirBhCYFmQWfmedAdLk6UgBFQAKUY2GuQyDA2Gbb7hinTfqL
and/or an external block explorer to make sure that it has been included.
This sequence of operations was run:
Manager signed operations:
From: tz1RwoEdg4efDQHarsw6aKtMUYvg278Gv1ir
Fee to the baker: ꜩ0.007791
Expected counter: 623964
Gas limit: 72605
Storage limit: 0 bytes
Balance updates:
tz1RwoEdg4efDQHarsw6aKtMUYvg278Gv1ir ............. -ꜩ0.007791
fees(tz1Ke2h7sDdakHJQh8WX4Z372du1KChsksyU,270) ... +ꜩ0.007791
Transaction:
Amount: ꜩ0
From: tz1RwoEdg4efDQHarsw6aKtMUYvg278Gv1ir
To: KT1FHaNcQwQt6Ug92iKuFjFs31bQTSDU92Fi
Parameter: (Left { Pair "tz1R3vJ5TV8Y5pVj8dicBR23Zv8JArusDkYr"
{ "tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm" } ;
Pair "tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm"
{ "tz1R3vJ5TV8Y5pVj8dicBR23Zv8JArusDkYr" } ;
Pair "tz1e95DfgHze6hszPbrkdWeVb4vPiDdJWBhF"
{ "tz1e95DfgHze6hszPbrkdWeVb4vPiDdJWBhF" } })
This transaction was successfully applied
Updated storage:
(Pair (Pair 0x0000452d024b72d5897f14a02dc1a3b8e012c802cc3d 9381)
(Pair 9382 0x0000452d024b72d5897f14a02dc1a3b8e012c802cc3d))
Storage size: 3180 bytes
Consumed gas: 72505

Матеріали розроблені TQ Tezos перекладені українською мовою Tezos Ukraine