Створення і використання
Перш, ніж продовжити, переконайтеся в тому, що Ви виконали всі кроки з налаштування.
Щоб побачити список підтримуваних контрактів і дій, введіть наступну команду:lorentz-contract-multisig --help

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

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

Приклад початкового сховища:
1
$ lorentz-contract-transferlist Transferlist init --issuer "\"$FRED_ADDRESS\"" \
2
--transferlists "[]" \
3
--users "[]" \
4
--admin "\"$FRED_ADDRESS\"" \
5
--initialStorageType 'address'
6
7
Pair (Pair "tz1RwoEdg4efDQHarsw6aKtMUYvg278Gv1ir" { }) (Pair { } "tz1RwoEdg4efDQHarsw6aKtMUYvg278Gv1ir")
Copied!
Щоб створити контракт:
1
$ tezos-client --wait none originate contract Transferlist \
2
transferring 0 from $FRED_ADDRESS running \
3
"$(cat contracts/address_transferlist.tz)" \
4
--init "$(lorentz-contract-transferlist Transferlist init --issuer "\"$FRED_ADDRESS\"" \
5
--transferlists "[]" \
6
--users "[]" \
7
--admin "\"$FRED_ADDRESS\"" \
8
--initialStorageType 'address')" --burn-cap 2.937
9
10
Waiting for the node to be bootstrapped before injection...
11
Current head: BLhwwjTTonUC (timestamp: 2020-07-09T19:24:06-00:00, validation: 2020-07-09T19:24:38-00:00)
12
Node is bootstrapped, ready for injecting operations.
13
Estimated gas: 77713 units (will add 100 for safety)
14
Estimated storage: 2937 bytes added (will add 20 for safety)
15
Operation successfully injected in the node.
16
Operation hash is 'ooMkQ2WYZhM9FRTSmg1ijJ5PT4DChzZA8rjPsroM1MR4YjsXxdG'
17
NOT waiting for the operation to be included.
18
Use command
19
tezos-client wait for ooMkQ2WYZhM9FRTSmg1ijJ5PT4DChzZA8rjPsroM1MR4YjsXxdG to be included --confirmations 30 --branch BKk5pbbgmu4ZnA7NjcSwsZF66h66dc287WQFtRz8fM2NZLfLY75
20
and/or an external block explorer to make sure that it has been included.
21
This sequence of operations was run:
22
Manager signed operations:
23
From: tz1RwoEdg4efDQHarsw6aKtMUYvg278Gv1ir
24
Fee to the baker: ꜩ0.010656
25
Expected counter: 623955
26
Gas limit: 77813
27
Storage limit: 2957 bytes
28
Balance updates:
29
tz1RwoEdg4efDQHarsw6aKtMUYvg278Gv1ir ............. -ꜩ0.010656
30
fees(tz1Ke2h7sDdakHJQh8WX4Z372du1KChsksyU,270) ... +ꜩ0.010656
31
Origination:
32
From: tz1RwoEdg4efDQHarsw6aKtMUYvg278Gv1ir
33
Credit: ꜩ0
34
Script:
35
{ ... }
36
Initial storage:
37
(Pair (Pair "tz1RwoEdg4efDQHarsw6aKtMUYvg278Gv1ir" {})
38
(Pair {} "tz1RwoEdg4efDQHarsw6aKtMUYvg278Gv1ir"))
39
No delegate for this contract
40
This origination was successfully applied
41
Originated contracts:
42
KT1FHaNcQwQt6Ug92iKuFjFs31bQTSDU92Fi
43
Storage size: 2680 bytes
44
Updated big_maps:
45
New map(9382) of type (big_map nat (pair bool (set nat)))
46
New map(9381) of type (big_map address nat)
47
Paid storage size diff: 2680 bytes
48
Consumed gas: 77713
49
Balance updates:
50
tz1RwoEdg4efDQHarsw6aKtMUYvg278Gv1ir ... -ꜩ2.68
51
tz1RwoEdg4efDQHarsw6aKtMUYvg278Gv1ir ... -ꜩ0.257
52
53
New contract KT1FHaNcQwQt6Ug92iKuFjFs31bQTSDU92Fi originated.
54
Contract memorized as Transferlist.
Copied!
1
$ TRANSFERLIST_ADDRESS="KT1FHaNcQwQt6Ug92iKuFjFs31bQTSDU92Fi"
Copied!

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

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

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

Щоб згенерувати параметр для додавання $ALICE_ADDRESS в список передачі 0:
1
$ lorentz-contract-transferlist Transferlist UpdateUser \
2
--newUser "\"$ALICE_ADDRESS\"" --newUserType 'address' \
3
--newUserTransferlistId 0
4
5
Right (Right (Left (Left (Right (Pair "tz1R3vJ5TV8Y5pVj8dicBR23Zv8JArusDkYr" (Some 0))))))
Copied!
Ми можемо відправити параметр наступним кодом:
1
$ tezos-client --wait none transfer 0 from $FRED_ADDRESS to $TRANSFERLIST_ADDRESS \
2
--arg "$(lorentz-contract-transferlist Transferlist UpdateUser \
3
--newUser "\"$ALICE_ADDRESS\"" --newUserType 'address' \
4
--newUserTransferlistId 0)"
Copied!
Оскільки ми будемо додавати чотирьох користувачів, ось зручний спосіб додати користувача:
1
$ transferlist_add_user(){ tezos-client --wait none transfer 0 from $FRED_ADDRESS to $TRANSFERLIST_ADDRESS \
2
--arg "$(lorentz-contract-transferlist Transferlist UpdateUser \
3
--newUser "\"$1\"" --newUserType 'address' \
4
--newUserTransferlistId "$2")" --burn-cap 1.0 }
Copied!

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

Щоб згенерувати параметр для додавання трансфер-листа:
  • transferlistId: 0
  • Це може перенести в трансфер-листи 0, 2
  • unrestricted
1
$ lorentz-contract-transferlist Transferlist \
2
SetTransferlistOutbound --transferlistId 0 --outboundTransferlist "[0,2]"
3
4
Right (Right (Left (Right (Left (Pair 0 (Some (Pair True { 0; 2 })))))))
Copied!
Як і у випадку з користувачами, ось зручний спосіб додати трансфер-лист:
1
$ add_transferlist(){ tezos-client --wait none transfer 0 from $FRED_ADDRESS to $TRANSFERLIST_ADDRESS \
2
--arg "$(lorentz-contract-transferlist Transferlist \
3
SetTransferlistOutbound --transferlistId "$1" --outboundTransferlist "$2" $3)" --burn-cap 1.0 }
Copied!

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

Користувачі і трансфер-листи можуть бути додані в будь-якому порядку.
Щоб заповнити контракт використовуйте наступне:
Користувачі:
  • $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})
Тепер можна виконати:
1
transferlist_add_user $ALICE_ADDRESS 0
2
transferlist_add_user $BOB_ADDRESS 0
3
transferlist_add_user $CHARLIE_ADDRESS 1
4
transferlist_add_user $DAN_ADDRESS 2
5
add_transferlist 0 '[0,2]'
6
add_transferlist 1 '[1]'
7
add_transferlist 2 '[1,2]' --restricted
Copied!
Ось посилання на операції:

assertTransfers

Операція успішна тоді і тільки тоді, коли для кожного from з і пов'язаних з ним to в списку виконується одна з цих умов:
  • Обидві:
    • assertReceivers будуть успішні для обох from і to userId
    • transferlistId для to входить в set з набору трансфер-листів from дозволених вихідних трансфер-листів
  • Обидві:
    • assertReceivers буде успішно для to userId
    • from userId і є issuer userId
Це еквівалентно наступному псевдокоду:
1
def assertTransfers(input_list):
2
for from, tos in input_list:
3
for to in tos:
4
if from == issuer:
5
assertReceivers [to]
6
else:
7
assertReceivers [from, to]
8
users.get(to) in transferlists.get(users.get(from)).allowedTransferlists
Copied!
1
(list %assertTransfers (pair (userId %from)
2
(list %tos userId)))
Copied!
Див. transfer FA2 для прикладу подібної пакетної точки входу.

Приклади

Використовуючи попередню настройку, припустимо, що був зроблений наступний виклик assertTransfers:
1
assertTransfers
2
{ Pair "$ALICE_ADDRESS" { "$BOB_ADDRESS", "$DAN_ADDRESS" }
3
, Pair "$BOB_ADDRESS" { "$ALICE_ADDRESS" }
4
, Pair "$CHARLIE_ADDRESS" { "$CHARLIE_ADDRESS", "$DAN_ADDRESS" }
5
}
Copied!
  • 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 завершиться помилкою.
Ось як його згенерувати:
1
$ lorentz-contract-transferlist Transferlist AssertTransfers \
2
--userType 'address' --list \
3
"{ Pair \"$ALICE_ADDRESS\" { \"$BOB_ADDRESS\"; \"$DAN_ADDRESS\" }; \
4
Pair \"$BOB_ADDRESS\" { \"$ALICE_ADDRESS\" }; \
5
Pair \"$CHARLIE_ADDRESS\" { \"$CHARLIE_ADDRESS\"; \"$DAN_ADDRESS\" } }"
6
7
Left { Pair "tz1R3vJ5TV8Y5pVj8dicBR23Zv8JArusDkYr" { "tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm"; "tz1aHNfXQkBTKUDtkYrZ1iHhAoV3uZYgmkz1" }; Pair "tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm" { "tz1R3vJ5TV8Y5pVj8dicBR23Zv8JArusDkYr" }; Pair "tz1e95DfgHze6hszPbrkdWeVb4vPiDdJWBhF" { "tz1e95DfgHze6hszPbrkdWeVb4vPiDdJWBhF"; "tz1aHNfXQkBTKUDtkYrZ1iHhAoV3uZYgmkz1" } }
Copied!
Щоб відправити перевірку assertTransfers:
1
$ tezos-client --wait none transfer 0 from $FRED_ADDRESS to $TRANSFERLIST_ADDRESS \
2
--arg "$(lorentz-contract-transferlist Transferlist \
3
AssertTransfers --userType 'address' --list \
4
"{ Pair \"$ALICE_ADDRESS\" { \"$BOB_ADDRESS\"; \"$DAN_ADDRESS\" }; \
5
Pair \"$BOB_ADDRESS\" { \"$ALICE_ADDRESS\" }; \
6
Pair \"$CHARLIE_ADDRESS\" { \"$CHARLIE_ADDRESS\"; \"$DAN_ADDRESS\" } }")"
7
8
Waiting for the node to be bootstrapped before injection...
9
Current head: BLzZBqGJMh4E (timestamp: 2020-07-09T20:40:36-00:00, validation: 2020-07-09T20:41:01-00:00)
10
Node is bootstrapped, ready for injecting operations.
11
This simulation failed:
12
Manager signed operations:
13
From: tz1RwoEdg4efDQHarsw6aKtMUYvg278Gv1ir
14
Fee to the baker: ꜩ0
15
Expected counter: 623963
16
Gas limit: 1040000
17
Storage limit: 60000 bytes
18
Transaction:
19
Amount: ꜩ0
20
From: tz1RwoEdg4efDQHarsw6aKtMUYvg278Gv1ir
21
To: KT1FHaNcQwQt6Ug92iKuFjFs31bQTSDU92Fi
22
Parameter: (Left { Pair "tz1R3vJ5TV8Y5pVj8dicBR23Zv8JArusDkYr"
23
{ "tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm" ;
24
"tz1aHNfXQkBTKUDtkYrZ1iHhAoV3uZYgmkz1" } ;
25
Pair "tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm"
26
{ "tz1R3vJ5TV8Y5pVj8dicBR23Zv8JArusDkYr" } ;
27
Pair "tz1e95DfgHze6hszPbrkdWeVb4vPiDdJWBhF"
28
{ "tz1e95DfgHze6hszPbrkdWeVb4vPiDdJWBhF" ;
29
"tz1aHNfXQkBTKUDtkYrZ1iHhAoV3uZYgmkz1" } })
30
This operation FAILED.
31
32
Runtime error in contract KT1FHaNcQwQt6Ug92iKuFjFs31bQTSDU92Fi:
33
001: { parameter
34
002: (or (list %assertTransfers (pair address (list address)))
35
...
36
070: IF {} { PUSH string "outbound not transferlisted" ; FAILWITH } } } ;
37
...
38
271: PAIR } }
39
At line 70 characters 102 to 110,
40
script reached FAILWITH instruction
41
with "outbound not transferlisted"
42
Fatal error:
43
transfer simulation failed
Copied!
Якщо ми видалимо передачі, які не можуть бути завершені (докладніше див. TZIP-15), твердження буде успішним:
1
$ tezos-client --wait none transfer 0 from $FRED_ADDRESS to $TRANSFERLIST_ADDRESS \
2
--arg "$(lorentz-contract-transferlist Transferlist \
3
AssertTransfers --userType 'address' --list \
4
"{ Pair \"$ALICE_ADDRESS\" { \"$BOB_ADDRESS\" }; \
5
Pair \"$BOB_ADDRESS\" { \"$ALICE_ADDRESS\" }; \
6
Pair \"$CHARLIE_ADDRESS\" { \"$CHARLIE_ADDRESS\" } }")" --burn-cap 0.000001
7
8
Waiting for the node to be bootstrapped before injection...
9
Current head: BLjCwGGsznH8 (timestamp: 2020-07-09T20:43:06-00:00, validation: 2020-07-09T20:43:40-00:00)
10
Node is bootstrapped, ready for injecting operations.
11
Estimated gas: 72505 units (will add 100 for safety)
12
Estimated storage: no bytes added
13
Operation successfully injected in the node.
14
Operation hash is 'op5a4BjNXh39vqkFgeyRj1m87W9vVmTX5kYFNKwjPv34fL4eo2m'
15
NOT waiting for the operation to be included.
16
Use command
17
tezos-client wait for op5a4BjNXh39vqkFgeyRj1m87W9vVmTX5kYFNKwjPv34fL4eo2m to be included --confirmations 30 --branch BLJoirBhCYFmQWfmedAdLk6UgBFQAKUY2GuQyDA2Gbb7hinTfqL
18
and/or an external block explorer to make sure that it has been included.
19
This sequence of operations was run:
20
Manager signed operations:
21
From: tz1RwoEdg4efDQHarsw6aKtMUYvg278Gv1ir
22
Fee to the baker: ꜩ0.007791
23
Expected counter: 623964
24
Gas limit: 72605
25
Storage limit: 0 bytes
26
Balance updates:
27
tz1RwoEdg4efDQHarsw6aKtMUYvg278Gv1ir ............. -ꜩ0.007791
28
fees(tz1Ke2h7sDdakHJQh8WX4Z372du1KChsksyU,270) ... +ꜩ0.007791
29
Transaction:
30
Amount: ꜩ0
31
From: tz1RwoEdg4efDQHarsw6aKtMUYvg278Gv1ir
32
To: KT1FHaNcQwQt6Ug92iKuFjFs31bQTSDU92Fi
33
Parameter: (Left { Pair "tz1R3vJ5TV8Y5pVj8dicBR23Zv8JArusDkYr"
34
{ "tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm" } ;
35
Pair "tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm"
36
{ "tz1R3vJ5TV8Y5pVj8dicBR23Zv8JArusDkYr" } ;
37
Pair "tz1e95DfgHze6hszPbrkdWeVb4vPiDdJWBhF"
38
{ "tz1e95DfgHze6hszPbrkdWeVb4vPiDdJWBhF" } })
39
This transaction was successfully applied
40
Updated storage:
41
(Pair (Pair 0x0000452d024b72d5897f14a02dc1a3b8e012c802cc3d 9381)
42
(Pair 9382 0x0000452d024b72d5897f14a02dc1a3b8e012c802cc3d))
43
Storage size: 3180 bytes
44
Consumed gas: 72505
Copied!
Матеріали розроблені TQ Tezos перекладені українською мовою Tezos Ukraine