Теперь, когда мы немного знакомы с Майкельсоном, давайте взглянем на блокчейн Tezos, который представляет собой «среду», в которой фактически будут выполняться наши контракты Майкельсона.

Это не будет исчерпывающим обзором Tezos; мы собираемся сосредоточиться на тех аспектах, которые наиболее важны с точки зрения программиста Майкельсона. Мы собираемся рассмотреть несколько полезных инструментов, таких как tezos-client программа, которая находится в alphanet контейнере docker, который мы установили в предыдущей главе, и онлайн-обозреватель блокчейнов.

Эти инструменты, как и сам Tezos, еще незрелы и быстро развиваются. По большей части они используют стиль пользовательского интерфейса «info-dump», который отлично работает, например, для разработчик ядра Tezos, но может быть очень ошеломляющим для новичков. В рамках этого руководства нас особенно интересует, как программировать на Michelson, поэтому мы можем в основном абстрагироваться от деталей, отображаемых инструментами, которые были бы более актуальными в других обстоятельствах, например, если бы мы хотели запустить пекарь. Некоторые из этих деталей будут рассмотрены более подробно в следующих главах.

На данный момент наша цель - получить общее представление о том, как использовать текущий инструментарий Tezos, с целью к концу следующей главы запустить и взаимодействовать с простым контрактом Майкельсона на Tezos alphanet.

Блокчейн Tezos

В вашем терминале в каталоге, в который вы установили контейнер alphanet из предыдущей главы, выполните следующую команду:

$ ./alphanet.sh head

Предполагая, что узел запущен (если нет, запустите его с ./alphanet.sh start), это должно вывести что-то вроде:

Warning: 
                   This is NOT the Tezos Mainnet.
      The node you are connecting to claims to be running on the 
                 Tezos Alphanet DEVELOPMENT NETWORK. 
         Do NOT use your fundraiser keys on this network. 
         Alphanet is a testing network, with free tokens.
{ "protocol": "PsddFKi32cMJ2qPjf43Qv5GDWLDPZb3T3bF6fLKiF5HtvHNU7aP",    "chain_id": "NetXgtSLGNJvNye", 
"hash": "BLe9jhCFStAkeYVpp4Czuh1Kp18qKUq1v5XWasbm1MiBMT1LGAs", 
"level": 27750, "proto": 1, "predecessor": "BLcZcNKP6ETkC9QRku27VFhSbWwFLqzjpEiMY4U6k5qJnfThVcn", 
"timestamp": "2018-12-13T12:53:28Z", 
"validation_pass": 4, 
"operations_hash": "LLoaaw91Q5k48SfBL96ttQe54WcUdn32BGKyNoDZ8sCA5KAEwJGMb", 
"fitness": [ "00", "00000000000bf429" ], 
"context": "CoWNoFZFhB2hGWhXv5VqEZgL6mS4UFtdJbYKrM7VY6Yt8MgZXiEp", "priority": 0, 
"proof_of_work_nonce": "00000003e24de8c8", 
"signature":
"sigk66tvEvH2aYRTb3wurhqrRhw2SnGXuXreZii5Vg55mWgrDL98PJkXeDJ2Q8yZwJPLbTFPCUg9WT6bxYS6x5kBpqqK4Qa2" }

Пожалуйста, пока проигнорируйте все, кроме следующей строки:

"hash": "BLe9jhCFStAkeYVpp4Czuh1Kp18qKUq1v5XWasbm1MiBMT1LGAs",

Скопируйте значение справа, мы скоро его воспользуемся. Обратите внимание, что фактическое значение, отображаемое в вашем терминале, почти наверняка будет отличаться от того, что я здесь записал. Скопируйте значение со своего терминала.

Теперь откройте в браузере обозреватель блоков alphanet tzcan.io, вставьте в поле поиска хеш и нажмите Enter.

Вы должны увидеть что-то вроде этого:

Это хеш-значение блока, который, по мнению вашего узла, в настоящее время является главой блокчейна Tezos alphanet.

Блокчейны: краткий обзор

Посмотрите разделы, в которых говорится

Predecessor: BLcZcNKP6ETkC9QRku27VFhSbWwFLqzjpEiMY4U6k5qJnfThVcn Successor: BL5CZUh1CePUW4gwjKAJvyUsGrZwyExMwwjUPJGsHcC6vDWmU6j

Вкратце, цепочка блоков, как следует из названия, представляет собой цепочку блоков. Каждый блок включает в себя хэш своего предшественника, который, в свою очередь, включает хэш своего предшественника, и так далее, вплоть до первого (или «генезисного») блока в цепочке, у которого нет предшественника. (Обратите внимание, что в блоке на самом деле находится только хэш-предшественник, последующий хеш - это внеполосная часть информации, которую tzScan добавил для нашего удобства).

Вы можете посмотреть блок alphanet Genesis здесь: https://alphanet.tzscan.io/0

Причина, по которой каждый блок включает хэш своего предшественника, состоит в том, чтобы создать структуру данных, которую непозволительно сложно изменить тайно.

Например, предположим, что я хочу отредактировать свою копию блока BLe9jh... и добавить транзакцию, которая зачислила на один из моих счетов 1 миллиард tez, я мог бы это сделать. Но для всех было бы очевидно, что я подделал блок, потому что хэш блока больше не будет совпадать.

Вся информация в блоке (при сериализации) - это просто число. Хэш блока - это просто результат определенной хеш-функции для этого числа:

Hash(serializedBlock) = BLe9jh...

Поэтому, если я добавляю транзакцию и изменяю информацию о блоке, я изменяю сериализованный номер, представляющий этот блок, что изменит хэш блока. Поскольку выполнение хеш-функций требует незначительного времени и затрат, если я попытаюсь отправить свою измененную копию блока кому-либо еще, они могут легко пересчитать хеш-функцию и обнаружить, что хеш-коды не совпадают.

Более того, поскольку каждый блок включает в себя хэш своего предшественника, изменение любого блока изменяет все остальные блоки, находящиеся «ниже по потоку». Это означает, что до тех пор, пока мы с вами согласны с тем, какой последний блок в цепочке (головной), мы можем прийти к согласию по всей истории цепочки. (Согласование головы - это проблема, решаемая алгоритмом консенсуса, который в Tezos является вариантом делегированного доказательства доли владения).

Этот тип структуры данных, в общем, называется хеш-деревом или деревом Меркла. Важно подчеркнуть, учитывая различные злоупотребления этим термином, что все, что относится к цепочке блоков, - это хеш-дерево, узлы которого являются блоками транзакций. Это термин из той же категории, что и карта значений ключей или связанный список.

Tezos Mainnet, Alphanet, Zeronet

Возвращаясь к нашему проводнику блоков:

Мы видим, что в блоке BLe9jh.. фактически нет транзакций. (ваш конкретный блок может). Это связано с тем, что Tezos Alphanet предназначен для тестирования, поэтому транзакции довольно редки, а блоки - часты (одна каждые 30 секунд). Alphanet tez имеют незначительную ценность и фактически раздаются бесплатно всем, кто хочет их, через безлимитный кран (который мы будем использовать позже). Alphanet не децентрализован и периодически сбрасывается с момента создания каждые несколько недель.

Tezos имеет три параллельных блокчейна: Mainnet, Alphanet и Zeronet.

Mainnet - это место, где tez имеют реальную долларовую стоимость и где сеть децентрализована. Zeronet - это новейшая тестовая сеть, используемая в основном разработчиками ядра и сбрасываемая обычно несколько раз в день.

Чтобы увидеть блок с актуальными транзакциями, перейдите в Список блокировки основной сети.

В этом руководстве мы проделаем большую часть работы с Alphanet, хотя в следующей главе мы рассмотрим загрузку нашей собственной тестовой сети с новым блоком генезиса.

Кстати, при повторном запуске:

$ ./alphanet.sh head

Вы заметите, что пока вы читали этот раздел, заголовок обновился.

Взаимодействие с Tezos Alphanet

Теперь, когда мы рассмотрели достаточно контекста, мы собираемся сделать несколько вещей в Alphanet.

Во-первых, нам понадобится идентификатор, перейдите к вашему терминалу и запустите:

$ ./alphanet.sh shell

Это помещает нас внутрь контейнера докеров, так что мы можем напрямую выполнять команды на tezos-узле. Ваше приглашение может измениться, и вы можете выполнить несколько команд, чтобы убедиться, что вы находитесь внутри контейнера докеров:

$ pwd /home/tezos ~ 
$ whoami tezos ~ 
$ ls -a . .. .ash_history .tezos-client .tezos-node

Вы можете использовать <Ctrl-D> или

$ exit

чтобы вернуться к обычному запросу.

Создание идентичности Alphanet

$ ./alphanet shell 
$ tezos-node identity generate

Это займет немного времени, так что читайте, пока он работает.

Айдентика Tezos состоит из следующих вещей:

  1. peer_id, который однозначно идентифицирует нас в сети. Вы можете увидеть список пиров alphanet на сетевой странице tzScan
  2. Пара ключей public_key, secret_key, которая позволяет нам безопасно общаться с другими узлами. Например. мы можем использовать наш секретный ключ для генерации транзакций, которые другие партнеры могут подтвердить, что они пришли от нас, используя наш открытый ключ.
  3. proof_of_work_stamp, который показывает, что мы проделали некоторую вычислительную работу при создании идентичности. Вот почему команда identity generate занимает некоторое время и предназначена для предотвращения распространения спама в сети путем создания бесконечного числа идентификаторов.

Вы можете узнать больше о создании личности с помощью

$ tezos-node identity --help

Теперь, когда это сделано, мы можем увидеть файл удостоверений, созданный при выполнении:

$ cat /home/tezos/.tezos-node/identity.json 
{ "peer_id": "idtRhgUQFQcUFJLW5HXQbRcdYkaUr4", 
"public_key":"34a911ff9258d7c23b44844372a54c2a2a031d41e275e6a7d1251d1aeb95e207", 
"secret_key": xxxx 
"proof_of_work_stamp":"70e5ea8e85745a54f1a1d11b7c650e56f57f5c76243c072f"

(На самом деле этот .tezos-node/identity.json файл является фиктивным файлом, контейнер докеров хранит настоящую личность в /var/run/tezos/node/data/identity.json, но если вы установили tezos из исходного кода, он будет в .tezos-node)

Не забывайте никогда и никогда нигде не публиковать свой секретный ключ. Если кто-то кроме вас узнает ваш секретный ключ, вся ваша личность будет скомпрометирована. На Alphanet это не имеет особого значения, но неплохо было бы практиковать хорошую операционную безопасность, даже когда это не имеет значения, чтобы это стало привычкой, когда это имеет значение.

Активируйте учетную запись с помощью $$ Free Money $$

Кран Tezos Alphanet - это веб-сайт, управляемый разработчиками Tezos, который позволяет нам загружать файл кошелька. По сути, всякий раз, когда разработчики сбрасывают alphanet, они включают кучу финансируемых учетных записей в генезис-блок, а затем бесплатно передают ключи от этих учетных записей всем, кто хочет провести тестирование alphanet.

Перейдите на https://faucet.tzalpha.net/ и загрузите файл.

Теперь выйдите из контейнера докеров alphanet и скопируйте содержимое этого файла:

$ exit 
$ cat ~/Downloads/tz1M1tuK4BM53S2niKvQDn6SbACiVk6zbjx4.json 
{ "mnemonic": [ "xxxx", "xxxx", "xxxx", "xxxx", "xxxxx "xxxx", "xxxx", "xxxx", "xxxx", "xxxx", "xxxx" "xxxx", "xxxx", "xxxx", "xxxx", ], 
"secret": "xxxx", 
"amount": "7489334243", 
"pkh": "tz1M1tuK4BM53S2niKvQDn6SbACiVk6zbjx4", 
"password": "xxxx" "email": "[email protected]" 
}%

Для нас важны две линии:

"amount": "7489334243", 
"pkh": "tz1M1tuK4BM53S2niKvQDn6SbACiVk6zbjx4",

Этот файл кошелька, как и файл идентификации, имеет криптографический секретный ключ. После активации учетной записи, указанной в этом файле, вы собираетесь сообщить сети, что хотите выполнить передачу, путем широковещательной рассылки сообщения транзакции (подписанного этим секретным ключом) по одноранговой сети с использованием p2p-идентификатор, который мы создали ранее. Другие одноранговые узлы могут проверить правильность транзакций (достаточно ли у нас tez для выполнения перевода), проверив нашу подпись с помощью открытого ключа нашей учетной записи, который является «адресом» учетной записи, а также просмотрев наш баланс в блокчейн.

Теперь давайте активируем аккаунт, присвоив ему локальный псевдоним alice:

$ ./alphanet client activate account alice with "container:/home/jcb/Downloads/tz1M1tuK4BM53S2niKvQDn6SbACiVk6zbjx4.json"

Это должно вывести:

Node is bootstrapped, ready for injecting operations. 
Operation successfully injected in the node. 
Operation hash: onotiUDrveZX1NRt39zQmPxVbVkxS2qfpM5gucFTV8BvvfPZoRB Waiting for the operation to be included... 
Operation found in block: BM5RPwciV64Bz5nG3FbYY6xusrFt2j6EHTBrA7Hhye9fzWUhMK1 (pass: 2, offset: 0) This sequence of operations was run: 
  Genesis account activation: Account: tz1M1tuK4BM53S2niKvQDn6SbACiVk6zbjx4 
Balance updates: tz1M1tuK4BM53S2niKvQDn6SbACiVk6zbjx4 ... +ꜩ7489.334243 
The operation has only been included 0 blocks ago. We recommend to wait more. Use command tezos-client wait for onotiUDrveZX1NRt39zQmPxVbVkxS2qfpM5gucFTV8BvvfPZoRB to be included --confirmations 30 and/or an external block explorer. 
Account alice (tz1M1tuK4BM53S2niKvQDn6SbACiVk6zbjx4) activated with ꜩ7489.334243.

Давайте откроем tzScan и посмотрим на блок BM5RPwciV64Bz5nG3FbYY6xusrFt2j6EHTBrA7Hhye9fzWUhMK1, который включает эту активацию:

И теперь, если мы нажмем на активацию учетной записи, мы должны увидеть:

с балансом!

(Для отображения транзакций на tzScan может потребоваться до нескольких минут, поэтому, если вы не видите свою транзакцию, просто подождите немного, пока будут подтверждены другие блоки, и повторите попытку.)

Создание новой учетной записи

Теперь давайте создадим новую учетную запись под названием «bob» без баланса tez:

$ ./alphanet.sh client gen keys bob

Это должно просто выводить предупреждение Alphanet, но мы можем зайти внутрь контейнера докеров и увидеть учетные записи, которые мы создали или активировали с помощью

$ ./alphanet.sh shell 
$ cat /var/run/tezos/client/public_key_hashs 
[ { "name": "bob", "value": "tz1QCUKL2YZuGLSdTesXtVHJB8zRcG6XTz8f" }, 
  { "name": "alice", "value": "tz1M1tuK4BM53S2niKvQDn6SbACiVk6zbjx4" } ]

Все внутренние сохраненные данные клиента находятся в /var/run/tezos/client в контейнере докера и в .tezos-client, если вы установили из источника.

Однако клиент предоставляет лучший интерфейс для внутренних хранимых данных:

$ ./alphanet.sh client list known addresses 
bob: tz1QCUKL2YZuGLSdTesXtVHJB8zRcG6XTz8f (unencrypted sk known) 
alice: tz1M1tuK4BM53S2niKvQDn6SbACiVk6zbjx4 (unencrypted sk known)

Перенос tez от алисы к бобу

Давайте проверим остатки для alice и bob:

$ ./alphanet.sh client get balance for alice 
7489.334243 ꜩ
$ ./alphanet.sh client get balance for bob 
0 ꜩ

Переведем 420 токенов на bob от alice:

$ ./alphanet.sh client transfer 420.5 from alice to bob --fee 0.5 
Fatal error: The operation will burn ꜩ0.257 which is higher than the configured burn cap (ꜩ0). Use `--burn-cap 0.257` to emit this operation.

В клиенте есть burn-cap параметр, который предотвращает случайную отправку транзакции, в результате которой будет сожжено больше tez, чем нужно:

Λ ➜ ./alphanet.sh client transfer 420.5 from alice to bob --fee 0.5 --burn-cap 0.257 
Node is bootstrapped, ready for injecting operations. 
Estimated gas: 10100 units (will add 100 for safety) 
Estimated storage: 257 bytes added (will add 20 for safety) 
Operation successfully injected in the node. 
Operation hash: opXPyuAXx2yWoReQvWF6tra4aREqS2NgCBQNDtyo4rtZJAuizrM 
Waiting for the operation to be included... 
Operation found in block: BMRY5jRXjTtU2LeVoWFgSo9D7BU4eFqNB6UCSeZ6neWZhu5AXPt (pass: 3, offset: 0) 
This sequence of operations was run:
Manager signed operations: 
From: tz1M1tuK4BM53S2niKvQDn6SbACiVk6zbjx4 
Fee to the baker: ꜩ0 
Expected counter: 5807 
Gas limit: 10000 
Storage limit: 0 bytes 
Revelation of manager public key: 
  Contract: tz1M1tuK4BM53S2niKvQDn6SbACiVk6zbjx4
  Key: edpkuS9a1795Cwwrstx6B6Q3Bugo3CKJ2NxtohxnjEaQGiJkWTD5YE 
  This revelation was successfully applied 
  Consumed gas: 10000 
Manager signed operations: 
From: tz1M1tuK4BM53S2niKvQDn6SbACiVk6zbjx4 
Fee to the baker: ꜩ0.5 
Expected counter: 5808 
Gas limit: 10200 
Storage limit: 277 bytes 
Balance updates: tz1M1tuK4BM53S2niKvQDn6SbACiVk6zbjx4 ... -ꜩ0.5 
fees(tz3NdTPb3Ax2rVW2Kq9QEdzfYFkRwhrQRPhX,14) ........... +ꜩ0.5 
Transaction: 
  Amount: ꜩ420.5 
  From: tz1M1tuK4BM53S2niKvQDn6SbACiVk6zbjx4 
  To: tz1QCUKL2YZuGLSdTesXtVHJB8zRcG6XTz8f 
  This transaction was successfully applied 
  Consumed gas: 10100 
Balance updates: 
tz1M1tuK4BM53S2niKvQDn6SbACiVk6zbjx4 ... -ꜩ420.5 
tz1QCUKL2YZuGLSdTesXtVHJB8zRcG6XTz8f ... +ꜩ420.5 
tz1M1tuK4BM53S2niKvQDn6SbACiVk6zbjx4 ... -ꜩ0.257 
The operation has only been included 0 blocks ago. 
We recommend to wait more.
Use command tezos-client wait for opXPyuAXx2yWoReQvWF6tra4aREqS2NgCBQNDtyo4rtZJAuizrM to be included --confirmations 30 and/or an external block explorer.

Это напечатает для нас красивую квитанцию ​​с подробным описанием того, что случилось с нашим tez.

Давайте посмотрим на bob или tz1QCUKL2YZuGLSdTesXtVHJB8zRcG6XTz8f на tzScan:

Но подождите, а почему это 420.5 tez? Разве мы не заплатили пошлину в размере 0.5 tez? Еще раз взгляните на разделы квитанции об обновлении баланса (я добавил примечания для адреса alice и bob)

... Balance updates: 
      alice tz1M1tuK4BM53S2niKvQDn6SbACiVk6zbjx4 ....... -ꜩ0.5
      fees(tz3NdTPb3Ax2rVW2Kq9QEdzfYFkRwhrQRPhX,14) .... +ꜩ0.5   
      ... 
      Balance updates: 
        alice tz1M1tuK4BM53S2niKvQDn6SbACiVk6zbjx4 ... -ꜩ420.5 
        bob tz1QCUKL2YZuGLSdTesXtVHJB8zRcG6XTz8f ......+ꜩ420.5 
        alice tz1M1tuK4BM53S2niKvQDn6SbACiVk6zbjx4 ... -ꜩ0.257

Комиссии были сняты со счета alices отдельно от транзакции. Таким образом, общая alice выплаченная сумма составила -ꜩ421.257

Вывод

На этом мы завершаем нашу главу об основных операциях Tezos. В следующей главе мы объединим то, что мы узнали здесь, с Майкельсоном, который мы узнали в главе I, чтобы фактически запустить контракт Майкельсона в реальном времени на блокчейне Tezos!

Упражнения

Упражнение 1. Клиент Tezos поставляется с руководством, к которому вы можете получить доступ с помощью

$ ./alphanet.sh client man

По умолчанию это выводит руководство в цветном формате. Используйте руководство, чтобы выяснить, какие параметры передать команде client man, чтобы выключить цвета.

Здесь могут быть полезны инструменты Unix grep и less, также есть копия в Интернете: http://tezos.gitlab.io/alphanet/api/cli-commands.html

Упражнение 2. Войдите в оболочку контейнера докеров (как описано ранее) и запустите

$ tezos-admin-client-p2p stat

Прокрутите до раздела с надписью Известные одноранговые узлы. В своем браузере откройте страницу tzScan's alphanet Network Stats.

Найдите идентификатор однорангового узла, который отображается в обоих списках.

Упражнение 3. Найдите хэши генезис-блоков Mainnet, Alphanet и Zeronet. Чем они отличаются?

Упражнение 4. Создайте в своем клиенте четыре новых адреса с именами eenie, meenie, meinie и mo. Выполните переводы на каждый адрес так, чтобы eenie было 1 tez, meenie было ровно 2 tez, meinie было ровно 3 и mo было ровно 4.

Первоначально опубликовано на странице https://gitlab.com/camlcase-dev/michelson-tutorial/tree/master/02.

Получайте лучшие предложения по программному обеспечению прямо в свой почтовый ящик