FA1.2 Lorentz
Создание контракта на базе стандарта токена FA1.2 Tezos блокчейна

Введение в lorentz-contract-param

lorentz-contract-metadata - является версией FA1.2 с метаданными FA2.
Больше информации по стандарту метаданных FA2 может быть найдено в TZIP-12.
Установите инструменты lorentz-contract-metadata следуя iинструкциям по установке lorentz-contract-metadata.

Создание смарт-контракта

Контракт стандарта FA1.2 должен быть инициализирован со следующими параметрами хранения:
1
Pair
2
{} -- Empty ledger big_map
3
(Pair
4
"$ALICE_ADDRESS" -- Administrator address
5
(Pair
6
False -- Is all activity currently paused? (no)
7
0 -- Total supply of tokens
8
)
9
)
Copied!
А также иметь встроенные мета-параметры:
    symbol: string
    name: string
    decimals: nat, количество цифр после десятичной точки при выводе.
    extras: map string string, все остальные мета-параметры
Важно отметить: метаданные FA2 также включают natзначение : token_id которое определено как 0 для контрактов с единственным токеном, таких как FA1.2
В этом примере мы будем использовать:
    symbol: TOK
    name: Token
    decimals: 0
    extras: {}
Вместо того, чтобы предоставлять параметры контракта в сыром виде на языке Michelson, мы можем использовать lorentz-contract-metadata, чтобы сгенерировать их.
Чтобы создать контракт, запустите следующий код:
1
$ tezos-client --wait none originate contract ManagedLedger \
2
transferring 0 from $ALICE_ADDRESS running \
3
"$(lorentz-contract-metadata Metadata print \
4
--token-symbol "TOK" \
5
--token-name "Token" \
6
--token-decimals 0 \
7
--oneline)" \
8
--init "$(lorentz-contract-metadata Metadata init \
9
--admin $ALICE_ADDRESS \
10
--initial-ledger '[]')" --burn-cap 5.033 --force
11
12
Waiting for the node to be bootstrapped before injection...
13
Current head: BLoWu4vMmzZb (timestamp: 2020-03-31T19:35:39-00:00, validation: 2020-03-31T19:36:23-00:00)
14
Node is bootstrapped, ready for injecting operations.
15
Estimated gas: 142649 units (will add 100 for safety)
16
Estimated storage: 5033 bytes added (will add 20 for safety)
17
Operation successfully injected in the node.
18
Operation hash is 'onnLanKjRG4E64eevGpPP2TFteheNoDEyy8uDMdZGHPgy18YWkC'
19
NOT waiting for the operation to be included.
20
Use command
21
tezos-client wait for onnLanKjRG4E64eevGpPP2TFteheNoDEyy8uDMdZGHPgy18YWkC to be included --confirmations 30 --branch BLoWu4vMmzZbwYkJG8VimgkLis2xS3YSFAMFi4jEuWJ9mHVmKP5
22
and/or an external block explorer to make sure that it has been included.
23
This sequence of operations was run:
24
Manager signed operations:
25
From: tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm
26
Fee to the baker: ꜩ0.001259
27
Expected counter: 623911
28
Gas limit: 10000
29
Storage limit: 0 bytes
30
Balance updates:
31
tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm ............. -ꜩ0.001259
32
fees(tz1Ke2h7sDdakHJQh8WX4Z372du1KChsksyU,150) ... +ꜩ0.001259
33
Revelation of manager public key:
34
Contract: tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm
35
Key: edpkuPTVBFtbYd6gZWryXypSYYq6g7FvyucwphoU78T1vmGkbhj6qb
36
This revelation was successfully applied
37
Consumed gas: 10000
38
Manager signed operations:
39
From: tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm
40
Fee to the baker: ꜩ0.019169
41
Expected counter: 623912
42
Gas limit: 142749
43
Storage limit: 5053 bytes
44
Balance updates:
45
tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm ............. -ꜩ0.019169
46
fees(tz1Ke2h7sDdakHJQh8WX4Z372du1KChsksyU,150) ... +ꜩ0.019169
47
Origination:
48
From: tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm
49
Credit: ꜩ0
50
Script:
51
{...}
52
Initial storage:
53
(Pair {} (Pair "tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm" (Pair False 0)))
54
No delegate for this contract
55
This origination was successfully applied
56
Originated contracts:
57
KT18apu7iDnqnUeXdMv3ZVjs81DTPWK6f1Me
58
Storage size: 4776 bytes
59
Updated big_maps:
60
New map(735) of type (big_map address (pair nat (map address nat)))
61
Paid storage size diff: 4776 bytes
62
Consumed gas: 142649
63
Balance updates:
64
tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm ... -ꜩ4.776
65
tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm ... -ꜩ0.257
66
67
New contract KT18apu7iDnqnUeXdMv3ZVjs81DTPWK6f1Me originated.
Copied!
Обратите внимание, что мы сокращаем большое содержимое скрипта с помощью {...}
Создайте переменную для нового адреса контракта:
1
FA12_ADDRESS=KT18apu7iDnqnUeXdMv3ZVjs81DTPWK6f1Me
Copied!
Обратите внимание, что на включение наших операций в сеть блокчейнов может потребоваться некоторое время (обычно не более нескольких минут). Чтобы проверить статус операции, используйте её хеш для получения квитанции:
1
$ tezos-client get receipt for onnLanKjRG4E64eevGpPP2TFteheNoDEyy8uDMdZGHPgy18YWkC
2
3
Operation found in block: BLBBGyNZKoi7hrZeszBUmjtfeg8JcjdZMxpUyVTPj24cyyRJQeF (pass: 3, offset: 1)
4
Manager signed operations:
5
From: tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm
6
Fee to the baker: ꜩ0.001259
7
Expected counter: 623911
8
Gas limit: 10000
9
Storage limit: 0 bytes
10
Balance updates:
11
tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm ............. -ꜩ0.001259
12
fees(tz1RomaiWJV3NFDZWTMVR2aEeHknsn3iF5Gi,150) ... +ꜩ0.001259
13
Revelation of manager public key:
14
Contract: tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm
15
Key: edpkuPTVBFtbYd6gZWryXypSYYq6g7FvyucwphoU78T1vmGkbhj6qb
16
This revelation was successfully applied
17
Consumed gas: 10000
18
Manager signed operations:
19
From: tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm
20
Fee to the baker: ꜩ0.019169
21
Expected counter: 623912
22
Gas limit: 142749
23
Storage limit: 5053 bytes
24
Balance updates:
25
tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm ............. -ꜩ0.019169
26
fees(tz1RomaiWJV3NFDZWTMVR2aEeHknsn3iF5Gi,150) ... +ꜩ0.019169
27
Origination:
28
From: tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm
29
Credit: ꜩ0
30
Script:
31
{...}
32
Initial storage:
33
(Pair {} (Pair "tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm" (Pair False 0)))
34
No delegate for this contract
35
This origination was successfully applied
36
Originated contracts:
37
KT18apu7iDnqnUeXdMv3ZVjs81DTPWK6f1Me
38
Storage size: 4776 bytes
39
Updated big_maps:
40
New map(735) of type (big_map address (pair nat (map address nat)))
41
Paid storage size diff: 4776 bytes
42
Consumed gas: 142649
43
Balance updates:
44
tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm ... -ꜩ4.776
45
tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm ... -ꜩ0.257
Copied!

Просмотры

Когда параметр контракта имеет не единичный тип возврата, например Get Total Supply, который возвращает общее количество токенов, сам контракт должен иметь возможность сохранять результат в каком-то месте. Например, другой контракт может принимать значение результата.
Для следующих примеров нам нужны контракты, принимающие значения address, natи token_metadata:

Для nat

1
$ tezos-client --wait none originate contract nat_storage transferring 0 \
2
from $ALICE_ADDRESS running "{ parameter nat ; storage nat ; code { CAR ; NIL operation ; PAIR } }" \
3
--init 0 --burn-cap 0.295
4
5
Waiting for the node to be bootstrapped before injection...
6
Current head: BKspjAccRQML (timestamp: 2020-03-31T19:40:49-00:00, validation: 2020-03-31T19:41:12-00:00)
7
Node is bootstrapped, ready for injecting operations.
8
Estimated gas: 10909 units (will add 100 for safety)
9
Estimated storage: 295 bytes added (will add 20 for safety)
10
Operation successfully injected in the node.
11
Operation hash is 'onfjhheM6UMKwGYbr93a1XiJMEFUa4GyCgxfWJUvZrdGQVrL5RC'
12
NOT waiting for the operation to be included.
13
Use command
14
tezos-client wait for onfjhheM6UMKwGYbr93a1XiJMEFUa4GyCgxfWJUvZrdGQVrL5RC to be included --confirmations 30 --branch BKspjAccRQMLX8JFRtGUzRzenRnBStZiyPWigNihmUmWq3nwyf1
15
and/or an external block explorer to make sure that it has been included.
16
This sequence of operations was run:
17
Manager signed operations:
18
From: tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm
19
Fee to the baker: ꜩ0.001368
20
Expected counter: 623913
21
Gas limit: 11009
22
Storage limit: 315 bytes
23
Balance updates:
24
tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm ............. -ꜩ0.001368
25
fees(tz1Ke2h7sDdakHJQh8WX4Z372du1KChsksyU,150) ... +ꜩ0.001368
26
Origination:
27
From: tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm
28
Credit: ꜩ0
29
Script:
30
{ parameter nat ; storage nat ; code { CAR ; NIL operation ; PAIR } }
31
Initial storage: 0
32
No delegate for this contract
33
This origination was successfully applied
34
Originated contracts:
35
KT1CTP1Bm1DvWCfeDibe8p5EDAAUa4XX4c34
36
Storage size: 38 bytes
37
Paid storage size diff: 38 bytes
38
Consumed gas: 10909
39
Balance updates:
40
tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm ... -ꜩ0.038
41
tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm ... -ꜩ0.257
42
43
New contract KT1CTP1Bm1DvWCfeDibe8p5EDAAUa4XX4c34 originated.
Copied!

Для address

1
$ tezos-client --wait none originate contract address_storage transferring 0 \
2
from $ALICE_ADDRESS running "{ parameter address ; storage address ; code { CAR ; NIL operation ; PAIR } }" \
3
--init "\"$ALICE_ADDRESS\"" --burn-cap 0.32
4
5
Waiting for the node to be bootstrapped before injection...
6
Current head: BKveReSTZqs9 (timestamp: 2020-03-31T19:46:17-00:00, validation: 2020-03-31T19:46:29-00:00)
7
Node is bootstrapped, ready for injecting operations.
8
Estimated gas: 11314 units (will add 100 for safety)
9
Estimated storage: 320 bytes added (will add 20 for safety)
10
Operation successfully injected in the node.
11
Operation hash is 'oo8CFWkqaRuV4UGm6Ng87WJNYnU3q4YjC1txQcngF4BiF2URQ1V'
12
NOT waiting for the operation to be included.
13
Use command
14
tezos-client wait for oo8CFWkqaRuV4UGm6Ng87WJNYnU3q4YjC1txQcngF4BiF2URQ1V to be included --confirmations 30 --branch BKveReSTZqs9u1hCQzubvS2zm5c3vpeRjxNHnphpsULhNgwjgAZ
15
and/or an external block explorer to make sure that it has been included.
16
This sequence of operations was run:
17
Manager signed operations:
18
From: tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm
19
Fee to the baker: ꜩ0.001448
20
Expected counter: 623914
21
Gas limit: 11414
22
Storage limit: 340 bytes
23
Balance updates:
24
tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm ............. -ꜩ0.001448
25
fees(tz1Ke2h7sDdakHJQh8WX4Z372du1KChsksyU,150) ... +ꜩ0.001448
26
Origination:
27
From: tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm
28
Credit: ꜩ0
29
Script:
30
{ parameter address ;
31
storage address ;
32
code { CAR ; NIL operation ; PAIR } }
33
Initial storage: "tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm"
34
No delegate for this contract
35
This origination was successfully applied
36
Originated contracts:
37
KT1LHvWNJhjGBehhNjd6BeNd1bzJkxhDd4fJ
38
Storage size: 63 bytes
39
Paid storage size diff: 63 bytes
40
Consumed gas: 11314
41
Balance updates:
42
tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm ... -ꜩ0.063
43
tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm ... -ꜩ0.257
44
45
New contract KT1LHvWNJhjGBehhNjd6BeNd1bzJkxhDd4fJ originated.
Copied!

Для token_metadata

Сначала определим:
1
TOKEN_METADATA_TYPE="(list (pair (nat %token_id) (pair (string %symbol) (pair (string %name) (pair (nat %decimals) (map %extras string string))))))"
Copied!
1
$ tezos-client --wait none originate contract metadata_storage transferring 0 \
2
from $ALICE_ADDRESS running "{ parameter $TOKEN_METADATA_TYPE ; storage $TOKEN_METADATA_TYPE ; code { CAR ; NIL operation ; PAIR } }" \
3
--init '{Pair 0 (Pair "SYMBOL" (Pair "NAME" (Pair 0 {})))}' --burn-cap 0.493 --force
4
5
Waiting for the node to be bootstrapped before injection...
6
Current head: BLFoMNaKmThy (timestamp: 2020-03-31T20:40:53-00:00, validation: 2020-03-31T20:41:04-00:00)
7
Node is bootstrapped, ready for injecting operations.
8
Estimated gas: 14859 units (will add 100 for safety)
9
Estimated storage: 493 bytes added (will add 20 for safety)
10
Operation successfully injected in the node.
11
Operation hash is 'opBNgPdvWG6siEEZTFdZXJgpm6gVF6SeZLjR7HJwab2BFjoPoWY'
12
NOT waiting for the operation to be included.
13
Use command
14
tezos-client wait for opBNgPdvWG6siEEZTFdZXJgpm6gVF6SeZLjR7HJwab2BFjoPoWY to be included --confirmations 30 --branch BLFoMNaKmThye5b5qa5yJA2hzNWNhtu6c1wvz84xCg3d3oaa3Pg
15
and/or an external block explorer to make sure that it has been included.
16
This sequence of operations was run:
17
Manager signed operations:
18
From: tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm
19
Fee to the baker: ꜩ0.001961
20
Expected counter: 623925
21
Gas limit: 14959
22
Storage limit: 513 bytes
23
Balance updates:
24
tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm ............. -ꜩ0.001961
25
fees(tz1Ke2h7sDdakHJQh8WX4Z372du1KChsksyU,150) ... +ꜩ0.001961
26
Origination:
27
From: tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm
28
Credit: ꜩ0
29
Script:
30
{ parameter
31
(list (pair (nat %token_id)
32
(pair (string %symbol)
33
(pair (string %name) (pair (nat %decimals) (map %extras string string)))))) ;
34
storage
35
(list (pair (nat %token_id)
36
(pair (string %symbol)
37
(pair (string %name) (pair (nat %decimals) (map %extras string string)))))) ;
38
code { CAR ; NIL operation ; PAIR } }
39
Initial storage: { Pair 0 (Pair "SYMBOL" (Pair "NAME" (Pair 0 {}))) }
40
No delegate for this contract
41
This origination was successfully applied
42
Originated contracts:
43
KT1MRPDw2zXGPdL8CrzSaFS9jiqUDM8tpPNn
44
Storage size: 236 bytes
45
Paid storage size diff: 236 bytes
46
Consumed gas: 14859
47
Balance updates:
48
tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm ... -ꜩ0.236
49
tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm ... -ꜩ0.257
50
51
New contract KT1MRPDw2zXGPdL8CrzSaFS9jiqUDM8tpPNn originated.
Copied!
Примечание: вам может потребоваться установить/увеличить предел записи, чтобы разрешить создание контракта(ов), например:
1
$ tezos-client --wait none originate contract address_storage transferring 0 \
2
from $ALICE_ADDRESS running "{ parameter address ; storage address ; code { CAR ; NIL operation ; PAIR } }" \
3
--init "\"$ALICE_ADDRESS\"" --burn-cap 0.0001 --dry-run
4
5
Waiting for the node to be bootstrapped before injection...
6
Current head: BLY4388F8VTU (timestamp: 2019-08-30T17:03:46-00:00, validation: 2019-08-30T17:04:08-00:00)
7
Node is bootstrapped, ready for injecting operations.
8
Fatal error:
9
The operation will burn ꜩ0.32 which is higher than the configured burn cap (ꜩ0.0001).
10
Use `--burn-cap 0.32` to emit this operation.
Copied!
Затем с помощью tezos-client get receipt for [Operation hash] для каждого хеша операции, сохранить адреса контрактов в переменных:
1
NAT_STORAGE_ADDRESS="KT1.."
2
ADDRESS_STORAGE_ADDRESS="KT1.."
3
METADATA_STORAGE_ADDRESS="KT1.."
Copied!
Затем вы можете получить доступ к сохраненным значениям с помощью следующих двух команд для natи addressсоответственно:
1
$ tezos-client get contract storage for $NAT_STORAGE_ADDRESS
2
3
0
4
5
$ tezos-client get contract storage for $ADDRESS_STORAGE_ADDRESS
6
7
"tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm"
Copied!

Взаимодействия с помощью тезос-клиента

Команды для взаимодействия с нашим экземпляром контракта ManagedLedger с использованием tezos-client и lorentz-contract-param следуют одному и тому же шаблону с изменением только нескольких параметров в зависимости от того, какую точку входа в контракт мы вызываем. На примере getTotalSupply вызов будет выглядеть так:
1
$ tezos-client --wait none transfer 0 from $ALICE_ADDRESS to $FA12_ADDRESS \
2
--arg "$(lorentz-contract-metadata \
3
Metadata getTotalSupply \
4
--callback-contract $NAT_STORAGE_ADDRESS)"
Copied!
Давайте запишем шаблон в функцию оболочки:
1
$ fa12(){tezos-client --wait none transfer 0 from $ALICE_ADDRESS to $FA12_ADDRESS --burn-cap 0.5 --arg "$(lorentz-contract-metadata Metadata [email protected];)"}
Copied!
Обратите внимание, что здесь мы также устанавливаем --burn-cap заглушку.

Получение общего предложения через getTotalSupply

Определив функцию fa12, мы можем теперь вызвать точку входа контракта getTotalSupply следующим образом:
1
$ fa12 getTotalSupply --callback-contract $NAT_STORAGE_ADDRESS
Copied!
Вывод этой команды выглядит так:
1
Waiting for the node to be bootstrapped before injection...
2
Current head: BLkmHajH44cY (timestamp: 2020-03-31T19:51:39-00:00, validation: 2020-03-31T19:52:00-00:00)
3
Node is bootstrapped, ready for injecting operations.
4
Estimated gas: 132442 units (will add 100 for safety)
5
Estimated storage: no bytes added
6
Operation successfully injected in the node.
7
Operation hash is 'oothedERdD6hkD45S9ncrnS3u6ienY3px92iSyfjAd4ijLtUjqs'
8
NOT waiting for the operation to be included.
9
Use command
10
tezos-client wait for oothedERdD6hkD45S9ncrnS3u6ienY3px92iSyfjAd4ijLtUjqs to be included --confirmations 30 --branch BLkmHajH44cYRFJzTqmdBnh3efUHGQnjZyKbjAmBB6bgeQbuXzV
11
and/or an external block explorer to make sure that it has been included.
12
This sequence of operations was run:
13
Manager signed operations:
14
From: tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm
15
Fee to the baker: ꜩ0.013564
16
Expected counter: 623915
17
Gas limit: 132542
18
Storage limit: 0 bytes
19
Balance updates:
20
tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm ............. -ꜩ0.013564
21
fees(tz1Ke2h7sDdakHJQh8WX4Z372du1KChsksyU,150) ... +ꜩ0.013564
22
Transaction:
23
Amount: ꜩ0
24
From: tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm
25
To: KT18apu7iDnqnUeXdMv3ZVjs81DTPWK6f1Me
26
Parameter: (Left (Right (Right (Right (Pair Unit "KT1CTP1Bm1DvWCfeDibe8p5EDAAUa4XX4c34")))))
27
This transaction was successfully applied
28
Updated storage:
29
(Pair 735 (Pair 0x0000aad02222472cdf9892a3011c01caf6407f027081 (Pair False 0)))
30
Storage size: 4776 bytes
31
Consumed gas: 121125
32
Internal operations:
33
Transaction:
34
Amount: ꜩ0
35
From: KT18apu7iDnqnUeXdMv3ZVjs81DTPWK6f1Me
36
To: KT1CTP1Bm1DvWCfeDibe8p5EDAAUa4XX4c34
37
Parameter: 0
38
This transaction was successfully applied
39
Updated storage: 0
40
Storage size: 38 bytes
41
Consumed gas: 11317
Copied!
Все команды в случае успеха дают одинаковый вывод, поэтому мы опускаем его в следующих примерах.
Значение общего количества токенов будет записано в простом хранилище контракта по адресу NAT_STORAGE_ADDRESS, который мы можем увидеть с помощью следующей команды (как только сеть tezos включит наши операции):
1
$ tezos-client get contract storage for $NAT_STORAGE_ADDRESS
2
3
0
Copied!

Получение данных администратора

Чтобы получить адрес текущего администратора, сначала поместите его в контракт ADDRESS_STORAGE_ADDRESS:
1
$ fa12 getAdministrator --callback-contract $ADDRESS_STORAGE_ADDRESS
Copied!
Как и в случае с NAT_STORAGE_ADDRESS, мы можем получить доступ к результату, используя get contract storage for и убедиться, что он соответствует адресу Алисы, используя echo $ ALICE_ADDRESS:
1
$ tezos-client get contract storage for $ADDRESS_STORAGE_ADDRESS
2
3
"tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm"
4
5
$ echo $ALICE_ADDRESS
6
7
tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm
Copied!

Получение баланса

Чтобы получить баланс токенов для определенного адреса (хранится в контракте NAT_STORAGE_ADDRESS) используйте:
1
$ fa12 getBalance --owner $ALICE_ADDRESS --callback-contract $NAT_STORAGE_ADDRESS
Copied!
Затем мы можем получить доступ к результату, используя:
1
$ tezos-client get contract storage for $NAT_STORAGE_ADDRESS
2
3
0
Copied!

Получение метаданных

Чтобы получить метаданные токена для конкретного контракта в стиле FA1.2 + FA2 (хранящегося в METADATA_STORAGE_ADDRESS) используйте:
1
$ fa12 getMetadata --callback-contract $METADATA_STORAGE_ADDRESS
Copied!
Затем мы можем получить доступ к результату, используя:
1
$ tezos-client get contract storage for $METADATA_STORAGE_ADDRESS
2
3
{ Pair 0 (Pair "TOK" (Pair "Token" (Pair 0 {}))) }
Copied!

Получение разрешений

Чтобы получить разрешение Боба на снятие средств со счета Алисы, где адрес Боба - BOB_ADDRESS используйте:
1
$ fa12 getAllowance --owner $ALICE_ADDRESS --spender $BOB_ADDRESS --callback-contract $NAT_STORAGE_ADDRESS
Copied!
Затем мы можем получить доступ к результату, используя:
1
$ tezos-client get contract storage for $NAT_STORAGE_ADDRESS
2
3
0
Copied!

Перевод

Из GetBalanceвыше мы знаем, что у Aliceнет токенов.
Чтобы передать токены от Алисы Бобу, нам сначала нужно дать Алисе несколько токенов. Мы можем сделать это, выпустив 5 токенов и назначив их Алисе (см. Подраздел «Выпуск токена» ниже):
1
$ fa12 mint --value 5 --to $ALICE_ADDRESS
Copied!
Чтобы передать 2 токена от Алисы Бобу:
1
$ fa12 transfer --value 2 --from $ALICE_ADDRESS --to $BOB_ADDRESS
Copied!
Проверьте баланс Боба:
1
$ fa12 getBalance --owner $BOB_ADDRESS --callback-contract $NAT_STORAGE_ADDRESS
2
$ tezos-client get contract storage for $NAT_STORAGE_ADDRESS
3
2
Copied!

Подтверждение операций

Чтобы Алиса разрешила Бобу снять до 2 токена с ее адреса:
1
$ fa12 approve --value 2 --spender $BOB_ADDRESS
Copied!
Затем мы можем проверить полученное разрешение, используя:
1
$ fa12 getAllowance --owner $ALICE_ADDRESS --spender $BOB_ADDRESS --callback-contract $NAT_STORAGE_ADDRESS
Copied!
1
$ tezos-client get contract storage for $NAT_STORAGE_ADDRESS
2
2
Copied!
Если мы попытаемся установить другое разрешение (4) для снятия Бобом токенов со счета Алисы, мы потерпим неудачу:
1
$ fa12 approve --value 4 --spender $BOB_ADDRESS
2
...
3
At line 294 characters 85 to 93,
4
script reached FAILWITH instruction
5
with (Pair "UnsafeAllowanceChange" 2)
Copied!
Контракт FA1.2 запрещает прямое изменение разрешения с ненулевого значения на другое ненулевое значение, чтобы предотвратить известную уязвимость к изменению разрешений.
Итак, чтобы сделать такое изменение разрешения возможным, нам нужно сначала установить его в 0:
1
$ fa12 approve --value 0 --spender $BOB_ADDRESS
Copied!
а затем установить новое значение 4:
1
$ fa12 approve --value 4 --spender $BOB_ADDRESS
Copied!
теперь операция не приведет к провалу.
Обратите внимание, что, в целом, это не совсем безопасно, потому что Боб мог потратить часть полученного от Алисы в промежутке времени между транзакцией, когда мы сначала установили разрешение на 2, и той, где оно было установлено в 0.
Чтобы правильно рассчитать новое значение, отличное от 0, нам нужно было бы просканировать все транзакции, произошедшие между этими двумя, но здесь мы, для простоты, предположим, что их не было.
Теперь мы можем снова проверить разрешение и увидеть, что оно изменилось:
1
$ fa12 getAllowance --owner $ALICE_ADDRESS --spender $BOB_ADDRESS --callback-contract $NAT_STORAGE_ADDRESS
2
$ tezos-client get contract storage for $NAT_STORAGE_ADDRESS
3
4
Copied!

Выпуск токена

Чтобы выпустить 5 токенов и назначить их Алисе:
1
$ fa12 mint --value 5 --to $ALICE_ADDRESS
2
$ fa12 getBalance --owner $ALICE_ADDRESS --callback-contract $NAT_STORAGE_ADDRESS
3
$ tezos-client get contract storage for $NAT_STORAGE_ADDRESS
4
5
Copied!

Сжигание токена

Если вы пошагово следовали этому руководству, на данный момент в учетной записи Боба должно быть 3 токена. Если этого не произошло, добавьте хотя бы 1 с помощью Transfer или Mint.
Перед сжиганием мы сначала добавляем 2 токена на аккаунт Боба:
1
$ fa12 mint --value 2 --to $BOB_ADDRESS
Copied!
Мы можем гарантировать, что у Боба есть как минимум 3 токена, используя:
1
$ fa12 getBalance --owner $BOB_ADDRESS --callback-contract $NAT_STORAGE_ADDRESS
2
$ tezos-client get contract storage for $NAT_STORAGE_ADDRESS
3
5
Copied!
Наконец, мы можем сжечь 2 токена Боба, используя:
1
$ fa12 burn --value 2 --from $BOB_ADDRESS
Copied!
И тогда мы можем подтвердить, что два токена были вычтены из аккаунта Боба:
1
$ fa12 getBalance --owner $BOB_ADDRESS --callback-contract $NAT_STORAGE_ADDRESS
2
$ tezos-client get contract storage for $NAT_STORAGE_ADDRESS
3
3
Copied!

Приостановка контракта

Чтобы приостановить контракт:
1
$ fa12 setPause --paused True
Copied!
Мы можем проверить, приостановлен ли контракт, используя:
1
$ tezos-client get contract storage for $FA12_ADDRESS
2
Pair 0 (Pair "tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm" (Pair True 7))
Copied!
Значение True указывает, что он приостановлен, значение False указывает, что он не приостановлен.
Передачи и подтверждения отключены, пока контракт приостановлен. Попробуйте:
1
$ fa12 transfer --value 1 --from $ALICE_ADDRESS --to $BOB_ADDRESS
Copied!
Команда выдает следующий результат (для краткости опуская включенный в контракт код Майкельсона):
1
Node is bootstrapped, ready for injecting operations.
2
This simulation failed:
3
Manager signed operations:
4
From: tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm
5
Fee to the baker: ꜩ0
6
Expected counter: 32
7
Gas limit: 800000
8
Storage limit: 60000 bytes
9
Transaction:
10
Amount: ꜩ0
11
From: tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm
12
To: KT1P33YQj5LQGBAYxvpXCsa6v2BXJ8N4i6PF
13
Parameter: (Left (Left (Left (Pair "tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm"
14
(Pair "tz1aSkwEot3L2kmUvcoxzjMomb9mvBNuzFK6" 1)))))
15
This operation FAILED.
16
17
Runtime error in contract KT1P33YQj5LQGBAYxvpXCsa6v2BXJ8N4i6PF:
18
001: { parameter
19
...
20
585: NIL operation ;
21
586: PAIR } } } } } }
22
At line 23 characters 87 to 95,
23
script reached FAILWITH instruction
24
with (Pair "TokenOperationsArePaused" Unit)
25
Fatal error:
26
transfer simulation failed
Copied!
Чтобы возобновить контракт:
1
$ fa12 setPause --paused False
Copied!
1
$ tezos-client get contract storage for $FA12_ADDRESS
2
3
Pair 0 (Pair "tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm" (Pair False 7))
Copied!

Установка нового администратора

Чтобы сделать Боба новым администратором:
1
$ fa12 setAdministrator --new-administrator-address $BOB_ADDRESS
Copied!
Мы можем убедиться, что администратор был обновлен, используя:
1
$ fa12 getAdministrator --callback-contract $ADDRESS_STORAGE_ADDRESS
2
$ tezos-client get contract storage for $ADDRESS_STORAGE_ADDRESS
3
"tz1RwoEdg4efDQHarsw6aKtMUYvg278Gv1ir"
Copied!
1
$ echo $BOB_ADDRESS
2
3
tz1RwoEdg4efDQHarsw6aKtMUYvg278Gv1ir
Copied!
Наша функция оболочки fa12 настроена для вызова операций с использованием $ALICE_ADDRESS, так что теперь, когда $ALICE_ADDRESS больше не является администраторским, попытки вызвать точки входа администратора с этого адреса потерпят неудачу:
1
$ fa12 mint --value 5 --to $ALICE_ADDRESS
2
...
3
586: PAIR } } } } } }
4
At line 447 characters 86 to 94,
5
script reached FAILWITH instruction
6
with (Pair "SenderIsNotAdmin" Unit)
Copied!

Взаимодействие с использованием PyTezos

Установка PyTezos

Если вы используете Debian или Ubuntu Linux, установите зависимости с помощью apt:
1
sudo apt install libsodium-dev libsecp256k1-dev libgmp-dev
Copied!
В Arch Linux установите эти пакеты с помощью pacman:
1
sudo pacman libsodium libsec256k1 gmp
Copied!
Вам также может потребоваться установить python-wheel
В противном случае, если у вас Mac OS, установите пакеты с помощью brew:
1
brew tap cuber/homebrew-libsecp256k1
2
brew install libsodium libsecp256k1 gmp
Copied!
Затем установите PyTezos с помощью pip3:
1
pip3 install pytezos
Copied!

Создание контракта

Предполагая, что $ALICE_ADDRESS определен, мы можем создать копию FA1.2 почти так же, как с lorentz-contracts.
Примечание: См. Руководство по настройке клиента, чтобы создать кошелек и определить $ALICE_ADDRESS.
Начнем с открытия python3, установки key и shell и указания fa12 в качестве контракта:
Примечание: замените ~/Downloads/tz1R3vJ5TV8Y5pVj8dicBR23Zv8JArusDkYr.json на путь к файлу .json вашего кошелька.
1
$ python3
2
Python 3.7.4 (default, Sep 7 2019, 18:27:02)
3
[Clang 10.0.1 (clang-1001.0.46.4)] on darwin
4
Type "help", "copyright", "credits" or "license" for more information.
5
>>> from pytezos import pytezos
6
>>> pytezos = pytezos.using(key='~/Downloads/tz1R3vJ5TV8Y5pVj8dicBR23Zv8JArusDkYr.json', shell='babylonnet')
7
8
>>> alice_address = 'tz1R3vJ5TV8Y5pVj8dicBR23Zv8JArusDkYr'
9
>>> bob_address = 'tz1bDCu64RmcpWahdn9bWrDMi6cu7mXZynHm'
10
>>> nat_storage_address = 'KT1J4mhVAaMYAPC4aPEkhC9i48PHBHxavkJ2'
Copied!
Затем мы определяем Contract из копии ManagedLedger.tz с аннотациями:
1
>>> from pytezos import Contract
2
>>> import requests
3
4
>>> contract_url = 'https://gitlab.com/tzip/tzip/raw/16ca4fbb60f2ab52958136b76a1d12b342beba58/Proposals/TZIP-0007/ManagedLedger.tz'
5
>>> fa12src = Contract.from_michelson(requests.get(contract_url).text)
Copied!
Нам нужно создать начальное хранилище для создания контракта.
Чтобы помочь с этим, мы можем просмотреть схему хранилища контракта:
1
>>> fa12src.storage
2
<pytezos.michelson.contract.ContractStorage object at 0x10d984590>
3
4
$storage:
5
{
6
"ledger": { $address : $ledger_item , ... } /* big_map */,
7
"admin": $address,
8
"paused": bool,
9
"totalSupply": $nat
10
}
11
12
$ledger_item:
13
{
14
"balance": $nat,
15
"approvals": { $address : $nat , ... }
16
}
17
18
$nat:
19
int /* Natural number */
20
21
$address:
22
string /* Base58 encoded `tz` or `KT` address */
23
24
25
Helpers
26
.big_map_decode()
27
.big_map_diff_decode()
28
.big_map_diff_encode()
29
.big_map_id()
30
.big_map_init()
31
.big_map_query()
32
.decode()
33
.default()
34
.encode()
Copied!
Затем мы выбираем начальные значения хранилища и кодируем их для подготовки к созданию контракта:
1
>>> init_storage = fa12src.storage.encode({
2
...: "ledger": {},
3
...: "admin": pytezos.key.public_key_hash(),
4
...: "paused": False,
5
...: "totalSupply": 0
6
...: } )
Copied!
Затем мы создаем контракт:
1
>>> origination_op = pytezos.origination(script=dict(code=fa12src.code, storage=init_storage)).autofill().sign().inject()
2
>>> origination_hash = origination_op['hash']
3
>>> origination_hash
4
'opXxLwE3j9ZY9Rv99Pomh6u7SonKAoywzpU6KkdWtFryUhBbXdP'
Copied!
Однако создание контракта не возвращает адрес полученного контракта, поэтому нам нужно найти нашу завершенную операцию в сети и получить из нее адрес контракта:
1
>>> opg = pytezos.shell.blocks[-5:].find_operation(origination_hash)
2
>>> contract_id = opg['contents'][0]['metadata']['operation_result']['originated_contracts'][0]
3
>>> contract_id
4
'KT1GV7wkUgZpEznQ48VR1UUSgXAU5Lk1SfpH'
5
6
>>> fa12 = pytezos.contract(contract_id)
Copied!
Примечание: команда find_operation может завершиться ошибкой, если операция еще не была обработана:
1
>>> opg = pytezos.shell.blocks[-5:].find_operation(origination_op)
2
Traceback (most recent call last):
3
File "<stdin>", line 1, in <module>
4
File "/usr/local/lib/python3.7/site-packages/pytezos/tools/docstring.py", line 67, in __call__
5
return method(self.class_instance, *args, **kwargs)
6
File "/usr/local/lib/python3.7/site-packages/pytezos/rpc/search.py", line 207, in find_operation
7
raise StopIteration(operation_group_hash)
8
StopIteration: oonhxpbH9Jc7fpbjfzvfbetppEBnjUTFmkbziVFV3B5KhjVdzpd
Copied!

Просмотр схемы контракта

Мы можем просмотреть схему параметров контракта, чтобы узнать, какие точки входа поддерживает контракт и каковы их аргументы:
1
>>> fa12.contract.parameter
2
<pytezos.michelson.contract.ContractParameter object at 0x10ce5d910>
3
4
$parameter:
5
{ "transfer": $transfer } ||
6
{ "approve": $approve } ||
7
{ "getAllowance": [ $address , $address , $contract (nat) ] } ||
8
{ "getBalance": [ $address , $contract (nat) ] } ||
9
{ "getTotalSupply": [ $unit , $contract (nat) ] } ||
10
{ "setPause": bool /* setPause */ } ||
11
{ "setAdministrator": $address /* setAdministrator */ } ||
12
{ "getAdministrator": [ $unit , $contract (address) ] } ||
13
{ "mint": $mint } ||
14
{ "burn": $burn }
15
16
$burn:
17
{
18
"from": $address,
19
"value": $nat
20
}
21
22
$mint:
23
{
24
"to": $address,
25
"value": $nat
26
}
27
28
$approve:
29
{
30
"spender": $address,
31
"value": $nat
32
}
33
34
$transfer:
35
{
36
"from": $address,
37
"to": $address,
38
"value": $nat
39
}
40
41
$contract:
42
string /* Base58 encoded `KT` address */
43
44
$nat:
45
int /* Natural number */
46
47
$address:
48
string /* Base58 encoded `tz` or `KT` address */
49
50
$unit:
51
None /* Void */
52
53
54
Helpers
55
.decode()
56
.encode()
57
.entries()
Copied!

Взаимодействие с FA1.2

Наконец, используя схему параметров, мы можем выполнить передачу, используя следующие шаги:
    Выпуск 5 токенав на alice_address
    Перевод 3 токенов от alice_address к bob_address
    Хранение баланса bob_address в nat_storage_address
    Получить значение, которое храниться в nat_storage_address
1
>>> op = fa12.mint(to=alice_address, value=5).inject()
2
>>> op['hash']
3
'opDS6FUYmzXBRpX1DxpnucWBrcyEvCmAsSdjmHJMNpf7xQhGsRW'
4
5
>>> op = fa12.transfer(**{'from': alice_address, 'to': bob_address, 'value': 3}).inject()
6
>>> op['hash']
7
'ooQRsxqkV3vEtaDdarMzvzFuZLeKe6qfJkZEx9PntzqHGxVo8FU'
8
9
>>> op = fa12.getBalance(bob_address, nat_storage_address).inject()
10
>>> op['hash']
11
'opUVaphfSFgeUTACVmspr6bXrY82RLJ4mSf4DgT2kNZ6SiEcuh6'
12
13
>>> pytezos.contract(nat_storage_address).storage()
14
3
Copied!
Примечание. Почему .transfer(**{'from': ..}) вместо .transfer(from=..)? В Python from является ключевым словом и не может использоваться для указания аргумента, поэтому мы используем **{..} для преобразования словаря в аргументы ключевого слова.

Исправление проблем

Counter _ already used

Эта ошибка возникает, когда зависимая операция еще не включена, и может принимать одну из следующих форм:
1
$ tezos-client --wait none transfer 0 from $ALICE_ADDRESS to $FA12_ADDRESS --arg ..
2
3
Waiting for the node to be bootstrapped before injection...
4
Current head: BMe8VmYBa1Ye (timestamp: 2019-08-12T15:34:56-00:00, validation: 2019-08-12T15:35:00-00:00)
5
Node is bootstrapped, ready for injecting operations.
6
Counter 565668 already used for contract tz1QLne6uZFxPRdRfJG8msx5RouENpJoRsfP (expected 565669)
7
Fatal error:
8
transfer simulation failed
Copied!
1
$ tezos-client --wait none transfer 0 from $ALICE_ADDRESS to $FA12_ADDRESS --arg ..
2
3
Waiting for the node to be bootstrapped before injection...
4
Current head: BL7QrQjGhkut (timestamp: 2019-08-12T15:39:26-00:00, validation: 2019-08-12T15:39:45-00:00)
5
Node is bootstrapped, ready for injecting operations.
6
Estimated gas: 212314 units (will add 100 for safety)
7
Estimated storage: no bytes added
8
Unregistred error:
9
{ "kind": "generic",
10
"error":
11
"Error while applying operation op1imCEMKFm7bTN9cwX4uoKPb6FjHJDv6NCkWKGVE7srh4XN6UP:\nbranch refused (Error:\n
12
Counter 565670 already used for contract tz1QLne6uZFxPRdRfJG8msx5RouENpJoRsfP (expected 565671)\n)" }
13
Fatal error:
14
transfer simulation failed
Copied!
Чтобы исправить эту ошибку вы можете предпринять одно из двух:
    Дождитесь включения операции
    Запустите tezos-client wait for [Operation Hash] to be includedс зависимыми операциями Operation Hash прежде чем продолжить
      В качестве альтернативы вы можете запустить: `tz get receipt for
      [Operation Hash]`

Higher than the configured burn cap

Эта ошибка может возникнуть, если параметр --burn-cap не указан или установлен слишком низким для текущей операции:
1
$ tezos-client --wait none transfer 0 from $ALICE_ADDRESS to $FA12_ADDRESS --arg ..
2
3
Waiting for the node to be bootstrapped before injection...
4
Current head: BLBsvLowXAPf (timestamp: 2019-08-12T15:41:56-00:00, validation: 2019-08-12T15:42:45-00:00)
5
Node is bootstrapped, ready for injecting operations.
6
Fatal error:
7
The operation will burn ꜩ0.021 which is higher than the configured burn cap (ꜩ0).
8
Use `--burn-cap 0.021` to emit this operation.
Copied!
Чтобы исправить, замените или добавьте --burn-cap с данной рекомендацией (в данном случае --burn-cap 0.021)
Материалы разработаны TQ Tezos переведены на русский язык Tezos Ukraine
Last modified 1yr ago