# Анализ **Аудитория**: Архитекторы приложений, разработчики смарт-контрактов и приложений, представители бизнес-функций Проанализируем коммерческие ценные бумаги несколько подробнее. Участники PaperNet, такие как MagnetoCorp и DigiBank, пользуются транзакциями с ценными бумагами для своих бизнес-целей -- взгляните на структуру коммерческой ценной бумаги и на изменяющие ее транзакции. Также давайте рассмотрим, какие организации в PaperNet должны удостоверять транзакции, исходя из отношений доверия между организациями в сети. Впоследствии мы сосредоточимся на тонкостях денежных потоков между покупателями и продавцами, а сейчас - на первой ценной бумаге, выпущенной MagnetoCorp. ## Жизненный цикл коммерческой ценной бумаги Ценная бумага 00001 выпущена MagnetoCorp 31 мая. Дадим себе немного времени на изучение первого **состояния** этой бумаги, его характеристики и величины переменных: ``` Issuer = MagnetoCorp Paper = 00001 Owner = MagnetoCorp Issue date = 31 May 2020 Maturity = 30 November 2020 Face value = 5M USD Current state = issued ``` Это состояние ценной бумаги является результатом транзакции **issue** (выпуск/эмиссия) и оно в первую очередь создает саму эту ценную бумагу. Обратите внимание на номинал этой ценной бумаги - 5M USD, который и будут выплачен при погашении позже. Обратите внимание, что `Issuer` (эмитент) и `Owner` (владелец) идентичны для бумаги 00001 в момент выпуска. Обратите внимание на уникальный идентификатор бумаги - `MagnetoCorp00001`, который состоит из комбинации свойств `Issuer` и `Paper`. И напоследок, обратите внимание на свойство `Current state = issued`, которое сразу же показывает этап жизненного цикла состояния бумаги MagnetoCorp, как "выпущенная". Чуть позже бумагу купит DigiBank. Посмотрите на изменение состояния ценной бумаги в результате транзакции **buy** (купить): ``` Issuer = MagnetoCorp Paper = 00001 Owner = DigiBank Issue date = 31 May 2020 Maturity date = 30 November 2020 Face value = 5M USD Current state = trading ``` Важнейшее изменение наступило для свойства `Owner` (владелец) -- убедитесь, как бумага, которой сначала владела `MagnetoCorp`, теперь принадлежит `DigiBank`. Легко представить, как изменится свойство `Owner`, если бумагу потом продадут брокеру BrokerHouse или фонду HedgeMatic. Заметьте, что `Current state` (текущее состояние) говорит нам о том, что в настоящее время бумага торгуется (`trading`). По истечении 6 месяцев, если DigiBank до сих пор является держателем бумаги, он может предъявить ее MagnetoCorp для погашения: ``` Issuer = MagnetoCorp Paper = 00001 Owner = MagnetoCorp Issue date = 31 May 2020 Maturity date = 30 November 2020 Face value = 5M USD Current state = redeemed ``` И вот эта последняя транзакция **redeem** (погасить) завершает жизненный цикл ценной бумаги - его можно считать законченным. Часто участники рынка обязаны хранить записи о погашении ценных бумаг, и в этом случае нам легко знать весь их список по значению состояния `redeemed` (погашена). Значение свойства `Owner` (владелец) ценной бумаги, позволяет контролировать допуск к транзакции **redeem** (погасить), сопоставляя значение `Owner` (владелец) с идентификатором создателя транзакции. В Fabric это реализуется посредством [`getCreator()` chaincode API](https://github.com/hyperledger/fabric-chaincode-node/blob/{BRANCH}/fabric-shim/lib/stub.js#L293). Если в качестве языка чейнкода используется Go, тогда для извлечения других атрибутов создателя транзакции используется [библиотека чейнкода идентификации клиента](https://github.com/hyperledger/fabric-chaincode-go/blob/{BRANCH}/pkg/cid/README.md). ## Транзакции Жизненный цикл ценной бумаги 00001 нагляден и прямолинеен -- он продвигается по стадиям от `issued` (выпущен) до `trading` (торгуется) и `redeemed` (погашен) последовательно как результат транзакций **выпустить**, **купить**, или **погасить** соответственно. Эти транзакции инициируются MagnetoCorp и DigiBank (два раза), и меняют состояние ценной бумаги 00001. Рассмотрим подробности этих транзакций: ### Выпуск Вот первая транзакция, инициированная MagnetoCorp: ``` Txn = issue Issuer = MagnetoCorp Paper = 00001 Issue time = 31 May 2020 09:00:00 EST Maturity date = 30 November 2020 Face value = 5M USD ``` Транзакция **выпустить** задается структурой свойств и значений. Структура транзакции отличается от структуры бумаги 00001, но в точности ей соответствует. Различие определяется тем, что бумага 00001 отражает состояние сети PaperNet, которое явилось результатом транзакции **выпустить** (выпуск). Именно благодаря внутренней логике (которая нам не видна), транзакция **выпустить** создает бумагу на основании перечисленных свойств. Поскольку транзакция **создает** бумагу, между их структурами есть тесная взаимосвязь. Единственная организация - участник транзакции **выпустить**, это - MagnetoCorp. Логично, что MagnetoCorp должна удостоверять эту транзакцию - именно эмитент бумаги должен удостоверять транзакцию выпуска/эмиссии новой ценной бумаги. ### Купить Теперь изучим транзакцию покупки **купить**, которая передает право собственности бумаги 00001 от MagnetoCorp к банку DigiBank: ``` Txn = buy Issuer = MagnetoCorp Paper = 00001 Current owner = MagnetoCorp New owner = DigiBank Purchase time = 31 May 2020 10:00:00 EST Price = 4.94M USD ``` Заметьте, что транзакция **купить** содержит меньше свойств, чем записываются в бумагу. Причиной этому - то, что транзакция лишь **модифицирует** эту бумагу. В результате транзакции изменяется только `New owner = DigiBank`, все остальное остается неизменным. Это нормально - самое важное в транзакции *купить** это смена собственника, и после указания нового транзакции достаточно еще лишь указать текущего собственника, MagnetoCorp. Вы спросите, почему время покупки (`Purchase time`) и цена (`Price`) не указаны в свойствах бумаги 00001? Эта особенность происходит из той разницы, которая существует между транзакцией и бумагой. Ценник в 4.94 M USD на самом деле является свойством исключительно транзакции, но не свойством самой бумаги. Подумайте над этим отличием, оно не такое простое, как кажется. В дальнейшем будет видно, что в реестр записывается и та и другая информация -- история всех транзакций, которые влияли на эту бумагу, как и ее последнее зарегистрированное состояние. Крайне важно иметь в виду, что одна информация отделена от другой. Стоит помнить также, что бумага 00001 может быть перепродана много раз. Забегая немного вперед, давайте посмотрим, что мы **могли бы** видеть, если бы бумага 00001 поменяла владельца. В случае покупки фондом BigFund: ``` Txn = buy Issuer = MagnetoCorp Paper = 00001 Current owner = DigiBank New owner = BigFund Purchase time = 2 June 2020 12:20:00 EST Price = 4.93M USD ``` Затем ее купил фонд HedgeMatic: ``` Txn = buy Issuer = MagnetoCorp Paper = 00001 Current owner = BigFund New owner = HedgeMatic Purchase time = 3 June 2020 15:59:00 EST Price = 4.90M USD ``` Выше показано, как меняется собственник бумаги, а также как в данном случае меняется ее цена. Можете доказать, почему цена ценной бумаги MagnetoCorp снижается? Интуитивно ясно что транзакция покупки (**купить**) требует, чтобы ее удостоверила как продающая, так и покупающая сторона, что отражает и будет служить доказательством достижения взаимного согласия сторон о параметрах сделки. ### Погашение Транзакция погашения **погасить** для бумаги 00001 завершает ее жизненный цикл. В сравнительно простом примере покажем, как фонд HedgeMatic инициирует транзакцию, при помощи которой передает коммерческую ценную бумагу обратно в собственность MagnetoCorp: ``` Txn = redeem Issuer = MagnetoCorp Paper = 00001 Current owner = HedgeMatic Redeem time = 30 Nov 2020 12:00:00 EST ``` И снова транзакция **погасить** содержит достаточно мало свойств; все изменения, которые происходят с бумагой 00001, могут быть выведены из логики транзакции погашения: новым собственником становится эмитент (`Issuer`), а текущее состояние `Current state` меняется на "погашена" (`redeemed`). Свойство, обозначающее текущего владельца `Current owner` в нашем случае имеет конкретное определение, так что его можно сопоставить со значением текущего владельца в состоянии бумаги. С точки зрения доверия, к транзакции **погасить** применяется ровно та же логика, что и к транзакции **купить**: транзакцию должны заверить обе стороны. ## Реестр В этой главе мы объяснили, почему двумя важнейшими концепциями для сети PaperNet являются концепция транзакции и концепция состояния ценной бумаги. Два этих элемента являются фундаментом для любого распределенного [реестра](../ledger/ledger.html) Hyperledger Fabric -- глобальное состояние, содержащее актуальные значения переменных всех объектов, и блокчейн, в который записывается вся история транзакций, приведших к данному глобальному состоянию. Обязательство по заверению транзакций предписывается правилами, с которыми сверяются перед записью транзакции в реестр. И лишь в случае наличия всех необходимых заверений, транзакция будет признана действительной со стороны Fabric. Теперь самое время перевести эти идеи в собственный смарт-контракт. Не беда, если вы не очень уверенно программируете - мы дадим подсказки к пониманию кода. Если вы достигнете уверенного понимания смарт-контракта коммерческой ценной бумаги, это станет первым шагом к разработке собственного приложения. Ну, а если вы бизнес-аналитик, и можете немного программировать, не бойтесь продвигаться в своем понимании дальше!