Создание и использование
Прежде чем продолжить, убедитесь, что вы уже выполнили все шаги по настройке.
Чтобы увидеть список поддерживаемых контрактов и действий, выполните команду: 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
Last modified 1yr ago