Мы не принимаем generate транзакции. Объекты транзакции: блоки генерации и завершения

Тема: «Объекты транзакции: блоки ГЕНЕРАЦИИ и ЗАВЕРШЕНИЯ (GENERATE и TERMINATE). Блок УСОВЕРШЕНСТВОВАНИЯ (ADVANCE) в среде программирования «GPSS World».

Учебные цели:

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

2. Научиться делать задержку времени в моделировании.

Объекты транзакции: блоки ГЕНЕРАЦИИ и ЗАВЕРШЕНИЯ

(GENERATE и TERMINATE).

GPSS Транзакция – объект с набором атрибутов. Каждая Транзакция отличается тем, что может быть идентифицирована уникальным Номером Транзакции. Транзакции, созданные в моделировании, пронумерованы, последовательно начиная с 1. Кроме того, Вы можете изменять атрибуты, связанные с каждой Транзакцией. Атрибуты находятся в форме приоритетных, согласно планируемому времени, Наборе Трансляций, и "Параметры Транзакции", назначенные имена или числа являются данными пользователя. Параметры Транзакции - подобно письмам в мешке почтового курьера, которые адресованы конкретному человеку. Параметры несут информацию относительно Транзакции, которая является уникальной только к этой Транзакции. Вы можете использовать Окна Кадра (Snapshot Windows), чтобы просмотреть информацию, которую несут эти Параметры.



В отличие от универсальных языков программирования, каждая Транзакция в GPSS имеет маркер места. В то время как имеется только одно место в компьютерной программе, которую нужно вспомнить, в GPSS моделировании могут иметься тысячи Транзакций, размещенных в различных Блоках. Транзакции не обязательно начинаются наверху программы. GPSS моделирование может иметь много инструкций GENERATE, каждая из которых создает много Транзакций, которая имеет маркер места.

Транзакции могут быть созданы в пакете или в Блоке GENERATE. Модель должна иметь, по крайней мере, один Блок GENERATE. Давайте рассматривать случай, когда новая Транзакция создается в модели 60 раз. Если нет противоречий специальный модуль времени пока не определен. Пусть один модуль времени работает каждую секунду. Рассмотрим соответствующую форму для Блока GENERATE, которая создает новую Транзакцию каждую минуту: GENERATE 60; Создается новая Транзакция

Как только в GPSS World установлены часы с плавающей запятой, можно говорить о создании Транзакции в незначительных интервалах.

GENERATE 1; Создайте новую Транзакцию

Затем, если вы захотите представить второй интервал, можно представлять 1/60 минуты или 0.01666667. Вы можете выбрать событие, которое является наиболее значимым в вашей модели. Здесь используемое выражение должно быть колеблющимся.

Запустите Сеанс GPSS World, для этого вы должны сделать следующее.

ВЫБЕРИТЕ Файл / Новый

Так как модель уже выбрана

Введите тип инструкция GENERATE в странице Окна Модели, которое появляется. Затем, транслируйте вашу модель из одной строки. Нажмите Клавишу табуляции.

НАЖМИТЕ

НАЖМИТЕ

НАЖМИТЕ

ТИП; Создает новую Транзакцию

Вы использовали кнопку табуляции для того, чтобы модель выстроить в строку. Но это не необходимо для частей GPSS строки модели, чтобы она располагалась в некоторых столбцах, но делается для того, чтобы было легче читать. Вы можете изменять интервалы, редактируя Параметры настройки Объекта Модели. Рассмотрим это позже.

В диалоговом окне в высвеченной области

ВЫБЕРИТЕ Command /Create Simulation

ВЫБЕРИТЕ Window / Simulation Window / Blocks Window

Ваш Блок GENERATE в Окне Блоков. Блоки всегда нумеруются с 1. Это - "ДЕТАЛИЗИРОВАННЫЙ ВИД" Окна Блоков, где наиболее важная информация относительно каждого Блока перечислена в столбцах.

Выключите "ДЕТАЛИЗИРОВАННЫЙ ВИД". Для этого

Это "переключает" окно из "ДЕТАЛИЗИРОВАННОГО ВИДА" в «Недетализированный вид». Блоки помещаются снизу своих предшественников. Если следующий Блок не умещается снизу предшественника, «Недетализированный вид» продвинет его вверх следующего столбца направо. Расположение Блоков зависит также от размера окна и Вы можете изменять размеры окна.

А теперь обратно к "ДЕТАЛИЗИРОВАННОМУ ВИДУ".

ВЫБЕРИТЕ View / Entity Details

Блок TERMINATE, удаляет Транзакции из моделирования. Когда Транзакция входит в Блок TERMINATE, она разрушается. Также, имеется оптимальный операнд, которому присвоен специальный номер, названный "Счет Завершения". Когда Вы напечатаете START 123, Вы устанавливаете Счет Завершения на 123. Эти средства управления определяют как долго моделирование должно выполняться. Если Вы помещаете 1 в операнд Блока TERMINATE, каждый раз Транзакция разрушена тем Блоком, Счет Завершения которого меньше 1. Когда Счет Завершения становится 0 или меньше, моделирование закончено или подавлено Операндом START. Стандартный Отчет записывается автоматически. Счет Завершения может быть меньше, чем ноль, когда моделирование заканчивается, если Операнд Блока TERMINATE больше чем 1.

Добавим Блок TERMINATE к нашей модели. Нажмите на Область заголовка MyModel.gps Окна Модели. В Окне Модели запускают новую линию после GENERATE строки Блока, курсором в конце GENERATE строки Блока

НАЖМИТЕ

НАЖМИТЕ

ТИП TERMINATE

НАЖМИТЕ

НАЖМИТЕ

ТИП; Уничтожьте Транзакцию

ВЫБЕРИТЕ Command / Retranslate (рис. 5.1)

Эти два Блока представляют крошечное моделирование. Они могли бы

представлять ситуацию, где заказчик достигает памяти каждую минуту.

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

Операции буфера обмена Вырезать, Копировать и Вставить доступны, поскольку Вы формируете вашу модель. Большие сегменты блоков могут быть выбраны и затем скопированы, перемещены или удалены. Не стесняйтесь экспериментировать.

Прежде, чем вы начнете моделирование, Вы должны знать о работе двух списков Транзакций, названных Цепочкой Текущих событий(Current Events Chain) и Цепочкой Будущих Событий (Future Events Chain). Чтобы понимать эти цепочки, Вы должны иметь в виду " часы системы ", которые сообщают, каково текущее моделируемое время. Каждая Транзакция имеет атрибут, который указывает, когда будет сделана попытка следующего входа Блока. Если текущие моделируемые часы еще не достигли указанного времени, для этого существует Будущая Цепочка Событий. Будущая Цепочка Событий - задерживающая область для Транзакций, которые планируются в будущем.

При создании второй Транзакции каждый раз вводится Блок GENERATE, вторая Транзакция создана. Но новая Транзакция не вводит Блок GENERATE сразу же, вместо этого она помещается в Будущую Цепочку Событий согласно интервалу времени, который Вы определили в Блоке GENERATE.

Цепочка Текущих событий - набор Транзакций, которые все еще имеют

Блоки, которые будут введены в текущие часы системы. Транзакции принимаются из передней стороны Цепочки Текущих событий. По одному вводите столько Блоков, насколько считаете нужным. Когда закончится введение Транзакций на Цепочке Текущих событий, GPSS World продвинет часы системы.

Рассмотрим Цепочку Текущих событий и Будущую Цепочку Событий в нашей Текущей Модели. Сначала установите Условие Останова, которое заставит моделирование останавливаться на каждом предпринятом входе Блока.

Удостоверитесь, что Окно Блоков высвечено. Вы должны теперь видеть два блока

НАЖМИТЕ НА Generate Пиктограмму Блока

В пиктограммах отладки в Инструментальной панели Отладки наверху

Окна Блоков Вы увидите пиктограмму в форме индикатора останова.

НАЖМИТЕ НА Пиктограмму Места в Инструментальной панели Отладки наверху Окна

Это поместит STOP в Генерируемый Блок. Моделирование остановится

на предпринятом входе в Блок GENERATE. Команда STOP обсуждена в Главе 6 GPSS World Reference Manual. Прежде, чем вы запустите моделирование, посмотрите, что находится в Цепочке Текущих событий (Current Events Chain) и Цепочке Будущих Событий (Future Events Chain).

ВЫБЕРИТЕ Window / Simulation Snapshot / CEC Snapshot

Ничего нет в CEC, но есть несколько Транзакций в FEC! Дело в том, что Блок GENERATE был "Первым", создавая, таким образом, первую Транзакцию, когда Вы ввели Команду STOP. Как только Вы введете Команду START, 1 Транзакция будет перемещаться в Цепочку Текущих событий и время будет установлено 60.

Закройте каждое из Окон Кадра (Snapshot Windows).

НАЖМИТЕ НА X-верхнем Правом углу Каждого Окна

Эти окна - не похожи на окна, что Вы выбираете Window / Simulation Window. Snapshots - статические виды текущего условия и не будут изменяться, поскольку моделирование выполняется. Они могут регенерироваться, останавливая моделирование и открывая окно, когда Вы готовы посмотреть текущую информацию. Вы не можете остановить моделирование, не сохранив информацию в Окне Кадра о текущим состоянии моделирования.

Удостоверитесь, что Вы можете видеть Окно Журнала. Нажмите на Об-

ласть заголовка, если Вы нуждаетесь в этом.

ВЫБЕРИТЕ Command / START

И в диалоговом окне, замените 1

Это устанавливает Счет Завершения 100, перемещает 1 Транзакцию в Цепочку Текущих событий, и начинается моделирование. Но не забудьте, что Вы установили Условие Останова. Именно поэтому моделирование останавливается перед первым входом в Блок и пишет второе сообщение в Окне Журнала. Вы могли бы также помещать Условие Останова в любой Блок, используя остановку в меню Окна Блоков. Текущие Условия Останова могут просматриваться в специальном окне Кадра Моделирования.

Давайте работать с первой Транзакцией, вводя Блок GENERATE. Воспользуйтесь Командой ШАГ 1, которая была описана в функциональных клавишах.

НАЖМИТЕ

Теперь рассмотрите Цепочку Текущих событий и Цепочку Будущих Событий, используя меню Window / Simulation Snapshot Menu, как делали минуту назад.

Ваши окна должны выглядеть так, как рисунок 5.2 и 5.3.

Теперь рассмотрите FEC Кадр так, что бы Вы могли видеть Транзакцию, ждущую информацию для моделирования. FEC Время - "Block Departure Time" BDT, который является часами системы времени, когда Транзакции в FEC планируются, чтобы возвратиться в моделирование. Следующий столбец Блока показывает номер Блока, в который будет введена Транзакция. Номер 1 Блока - Блок GENERATE и номер 2 Блока – Блок TERMINATE. 2 Транзакция ждет введения в Блок GENERATE.

Теперь давайте рассматривать Расширенный вид CEC. CEC Окно Кадра НАЖМИТЕ НА + в CEC Окне (рис. 5.4)

1 Транзакция ввела Блок GENERATE, создавая, таким образом, 2 Транзакцию, которая идет в Цепочку Будущих Событий. 1 Транзакция находится в Цепочке Текущих событий с M1, время входа в моделирование 60 секунд, а 2 Транзакция находится в Цепочке Будущих Событий, готовая ввести Блок GENERATE, когда моделируемые часы будут равны 120 секундам. Работа Блока GENERATE должна вводить новую Транзакцию каждые 60 моделируемых секунд. Вы увидите эту информацию в различных видах этих окон. Позже вы увидите, что к параметрам Транзакции можно легко обращаться в этих окнах.

Закройте Окна Кадра, как Вы это делали несколько минут назад.

Посмотрим, каким является текущее время. Для этого активизируйте Окно Журнала.

ВЫБЕРИТЕ Command / SHOW

В диалоговом окне:

ВЫБЕРИТЕ ОК

AC1 - SNA, которое возвращает значение абсолютных часов системы. 1

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

Давайте загружать команду SHOW в .

ВЫБЕРИТЕ Edit / Settings

В Записной книжке Параметров настройки Модели выберите закладку Функциональные клавиши (Function Keys).

В F8 блоке

1 Транзакция будет разрушена, входя в Блок TERMINATE. Это делается так.

НАЖМИТЕ

Транзакция переместится на один Блок в ответ на команду ШАГ 1 (STEP 1), которая была вызвана одиночным нажатием клавиши. 1 Транзакция была разрушена. Следующая Транзакция, которая перемещается в моделировании – 2 Транзакция, удаленная из FEC.

1 Транзакция ушла. Так как это исчерпало Цепочку Текущих событий (Current Events Chain), больше ничего нет, чтобы выполнялось за время 60. GPSS World продвинул часы к следующему планируемому времени 120. 2 Транзакция удалена из Цепочки Будущих Событий (Future Events Chain) и помещена на Цепочку Текущих событий (Current Events Chain). Цепочка Будущих Событий теперь пуста. Однако, 2 Транзакция собирается вводить Блок GENERATE. Это создаст 3 Транзакцию и планируется это для будущих моделей 60 раз. Затем Транзакция 2 продолжит путь. Позволим 2 Транзакции войти в Блок GENERATE.

НАЖМИТЕ

Теперь рассмотрите цепочки.

ВЫБЕРИТЕ Window / Simulation Snapshot / СEC Snapshot

И с CEC Окном Кадра, имеющим центр

НАЖМИТЕ НА Знак +

Затем в Основном Окне

ВЫБЕРИТЕ Window / Simulation Snapshot / FEC Snapshot

Разместите окна одно выше другого. Затем удлините их, чтобы Вы смогли увидеть всю информацию. 3 Транзакция - в Цепочке Будущих Событий и ее время 180, и 2 Транзакция вошла в Блок TERMINATE. Когда это произойдет, она будет разрушена и моделирование закончится во время 120.

Не забудьте, что Транзакция 1 уже введена в Блок TERMINATE. Это означает, что Счет Завершения уменьшился на 1. Давайте проверим TG1, SNA, которая показывает оставшийся Счет Завершения. В меню Окна Модели

ВЫБЕРИТЕ Command / SHOW

В диалоговом окне.

Значение записывается в Окно Журнала, а также на Линию Состояния на дне Основного Окна.

Таким образом, мы устанавливаем Блок TERMINATE, чтобы вычесть 1 из Счета Завершения, вводя каждый раз Транзакцию. Так как это было введено раньше, Счет Завершения теперь 99. Если бы Вы удалили Условие Останова и позволили выполниться моделированию, оно остановилось бы автоматически, когда Счет Завершения достиг 0.

Вы можете загрузить другие команды в Функциональные клавиши и полностью ознакомиться с созданием и работой транзакций в Цепочке Текущих событий. Для этого используйте Окна Кадра (Snapshot Windows), чтобы изучить эти изменения. После изучения закройте любые Окна Кадра (Snapshot Windows), которые будут открытыми.

Теперь откройте Окно Выражения на Часах, на Счете Завершения и Активном номере Транзакции.

ВЫБЕРИТЕ Window / Simulation Window / Expression Window

В диалоговом окне, для Метки (Label)

И для Выражения (Expression)

НАЖМИТЕ НА View

ЩЕЛЧОК НА Memorize

Вы увидите выражение в текущем Окне Выражения (Expression Window) и Запоминание (Memorize), это позволит Вам сохранять информацию с моделированием и Вы не будете вводить информацию в следующий раз. Вы можете отображать это в Окне выражения (Expression Window) или Графике (Plot Window). Вы можете также вводить выражения, которые Вы желаете сохранить с моделью, используя Edit / Settings настройки. Щелкая на вкладку Выражений (Expressions), Вы сохраняете модель для выражений, которые введены. Выражения будут запоминаться и будут доступны в следующий раз, если Вы будете создавать моделирование из этой модели.

Теперь добавьте следующее выражение. Напечатайте его в Метке (Label) и Выражении (Expression) в диалоговом окне, удаляя предыдущую информацию.

ТИП Act. Xact

НАЖМИТЕ НА View

НАЖМИТЕ НА Memorize

И повторите процедуру для третьего выражения в диалоговом окне для

Метки и Выражения,

НАЖМИТЕ НА View

НАЖМИТЕ НА Memorize

Закройте Диалог Окна Выражения Редактирования

Вы должны теперь увидеть новое Окно Выражения.

Для ускорения удалите все Условия Останова.

ВЫБЕРИТЕ Window / Simulation Snapshot / User Stops

ЩЕЛЧОК НА Удалить Все (Remove All)

Рассмотрите Окно Блоков снова.

НАЖМИТЕ НА Anyplace на Окне Блоков

НАЖМИТЕ

Проделайте это несколько раз, чтобы наблюдать эффекты движения

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

Когда Вы будете готовы, используйте Продолжающуюся пиктограмму в Инструментальной панели Отладки наверху Окна Блоков или загруженные Функциональные клавиши, чтобы продолжать моделирование.

НАЖМИТЕ НА Пиктограмму (Continue) в Инструментальной панели

Отладки наверху Окна Или

НАЖМИТЕ

Моделирование скоро закончится и будет отчет. Вы можете исследовать отчет позже, если захотите.

Сделаем обзор. GPSS World планирует транзакцию для будущего моделирования. Для этого она помещает Транзакцию в цепочку Транзакций, названных Будущей Цепочкой Событий или FEC. FEC увеличивает значения планируемого времени. Другими словами, Транзакция, планируемая во времени 200 будет предшествовать Транзакции, планируемой во времени 300. Когда нет данных на моделируемых часах, GPSS World берет Транзакции от Будущей Цепочки Событий, которое имеет самое низкое планируемое значение времени.

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

Цепочка Текущих событий или CEC, используется как задерживающая область для Транзакций, которые моделирует текущее время. Отсутствие Транзакций на CEC означает, что события отсутствуют в текущий момент моделируемого времени. GPSS World перемещает все Транзакции, планируемые в самое низкое время на FEC к CEC, и продвигает часы системы к новому значению.

Пожалуйста, обратите внимание, что, когда планируемые Транзакции повторяются при вводе в моделирование, они перемещаются от FEC до CEC, их порядок рандомизирован. Это предотвращает некоторые непреднамеренные последовательности синхронизаций от разработки. Вы можете предотвращать эту рандомизацию, устанавливая время связи рандомизация к нулю в Произвольной Странице Записной книжки Параметров настройки Модели. Если Вы хотите рассмотреть эту установку

ВЫБЕРИТЕ Edit / Settings

Выберите закладку Произвольная Страница (Random Page).

Важно помнить, что каждый раз усовершенствуя моделируемые часы Транзакции, Транзакция должна приниматься из Цепочки Будущих Событий.

Время в цифровом компьютерном моделировании не течет гладко. Моделирование обычно состоит из множества Блоков в данных часах времени, сопровождаемое внезапным переходом на следующие часы времени. Интерпретация моделирования проходит все GPSS Блоки, встречающиеся в данных часах, время идет мгновенно. Быстрые переходы момента времени часто позволяют моделированию выполняться намного быстрее, чем смоделированный процесс реального времени. Моделируемая продолжительность времени всегда связывается с новыми Транзакциями, принимаемыми из FEC.

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

НАЖМИТЕ НА X-в правом верхнем углу Основного Окна

Если Вы хотите использовать модель на следующем занятии, отвечаете, "Нет" на вопрос " Вы хотите сохранять изменения... " вопрос для Объекта Моделирования (.sim) и Объекта Отчета (.gpr), и "Да" для сохранения Объекта Модели (.gps).

Synopsis

This operator generates an ExampleSet that represents transaction data. The number of transactions, number of customers, number of items and number of clusters can be specified by the user.

Description

The Generate Transaction Data operator generates an ExampleSet representing transaction data. This ExampleSet can be used when you do not have a data set that represents a real transaction data. It can also be used as a placeholder for such a requirement. This data set has 2 regular attributes and 1 special attribute. The regular attributes are Item (nominal) and Amount (integer). The special attribute is Id (nominal). This Id attribute represents the customer Id. All items purchased by a single customer are listed in form of multiple examples with the same customer Id. The Item attribute tells which item was purchased and the Amount attribute tells the quantity of the item that was purchased. The number of transactions can be set by the number transactions parameter. To have a look at this ExampleSet, just run the attached Example Process.

Output

Parameters

  • number_transactions This parameter specifies the number of generated transactions. Range: integer
  • number_customers This parameter specifies the number of generated customers. Range: integer
  • number_items This parameter specifies the number of generated items. Range: integer
  • number_clusters This parameter specifies the number of generated clusters. Range: integer
  • use_local_random_seed This parameter indicates if a local random seed should be used for randomization. Using the same value of local random seed will produce the same ExampleSet. Changing the value of this parameter changes the way examples are randomized, thus the ExampleSet will have a different set of values. Range: boolean
  • local_random_seed This parameter specifies the local random seed . This parameter is only available if the use local random seed parameter is set to true. Range: integer

Tutorial Processes

Introduction to the Generate Transaction Data operator

The Generate Transaction Data operator is applied for generating an ExampleSet that represents transaction data. The number transactions parameter is set to 1000, thus the ExampleSet will have 1000 examples. The number customers parameter is set to 50, thus there will be 50 unique values in the Id attribute. The number items parameter is set to 80, thus there will be 80 unique values in the Item attribute. You can see the ExampleSet in the Results Workspace. The use local random seed parameter is set to false in this Example Process. Set the use local random seed parameter to true and run the process with different values of local random seed. You will see that changing the values of local random seed changes the randomization.

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

Генератор транзакций позволяет:

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

Развитие и инновации
В процессе локализации системы Equation потребовалось средство, позволяющее настраивать правила учета операций. Такое средство было разработано. Первые версии EHI создавались для функционирования совместно с системой кассира, отсюда и название продукта: EHI, Enhanced CS Host Interface («Расширенный хост интерфейс системы кассира»). EHI применялся для настройки правил формирования проводок и их выполнения при совершении кассовых операций. Следующее поколение продукта было расширено, появилась возможность использовать EHI в любом приложении, где требуется гибкий настраиваемый учет операций.

Цели разработки учетного модуля
В процессе создания типичного модуля выполнения учетных операций разработчику необходимо учесть три основных аспекта:

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

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

Интеграция учетного модуля
Для интеграции пользовательских модулей в требуемые приложения должны использоваться стандартные механизмы системы Equation. Они обеспечивают как возможность интеграции в систему собственных разработок банка, так и изменение работы стандартных модулей системы посредством вызова пользовательских процедур.
Для вызова runtime модуля EHI для обработки заранее определенной транзакции соответствующее приложение должно передать EHI следующие параметры:

  • тип транзакции (или «макет» — используется для получения настроек транзакции);
  • режим функционирования (определяет режим работы EHI);
  • шифр транзакции. Уникальный референс, позволяющий идентифицировать данную транзакцию в таблицах EHI. Может быть оставлено пустым, тогда модуль сформирует референс в соответствии с правилом формирования референса (настраивается в функции «Определение макета EHI»);
  • дополнительные параметры. Дополнительные параметры могут быть использованы для передачи в «Генератор транзакций» специфических бизнес-данных. Разработчик может определить структуру параметров в соответствии со своими требованиями (при помощи функции «Настройка карт переменных»).
EHI выполнит формирование транзакции в соответствии с настройками и сформирует список выполненных действий, который будет передан в вызывающее приложение (посредством временной таблицы). Если возникнут ошибки или предупреждения, то они также будут переданы.

Режимы функционирования Учетный модуль EHI может работать в следующих режимах:

  • Generate — выполняется только построение списка действий по транзакции. Сами действия не выполняются;
  • Validate — выполняется построение списка действий, каждое действие отдельно проверяется на возможность выполнения. Если возникнут какие-либо ошибки или предупреждения (разные валюты, недостаточно средств и т. п.), то они будут возвращены в вызывающее приложение;
  • Post — выполняется построение и применение списка действий. В случае возникновения ошибки при обработке какого-либо действия все ранее выполненные действия отменяются.
  • Query — этот режим используется для получения информации о ранее выполненных действиях. Вызывающее приложение должно передать в EHI шифр транзакции для поиска информации;
  • Delete — аналогичен режиму Query, только все выполненные действия удаляются. Например, если проводка генерировалась сегодня, то она будет удалена. Если проводка выполнялась в предыдущие дни, то будет сформирована обратная или корректирующая проводка.

Определение параметров вызова
При вызове EHI параметры передаются в виде области данных (массива), которая состоит из двух основных частей: стандартных параметров и дополнительных параметров. Дополнительные параметры могут содержать любую бизнес-информацию, специфичную для данного приложения (номера счетов, суммы и т. д.). Для того чтобы EHI мог понять структуру дополнительных параметров, разработчик должен настроить так называемую карту параметров, содержащую информацию о каждой составляющей дополнительных параметров.
На основе статических дополнительных параметров можно определить виртуальные параметры, являющиеся результатами вычисления выражений. Эти выражения могут содержать любой из ранее определенных параметров.

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

Интерпретация выражений
В учетный модуль встроено средство, позволяющее выполнять интерпретацию выражений простейшего basic-подобного языка. Он работает с тремя основными типами данных: символьной строкой, числом и логическим значением.
Поддерживаются основные операторы, такие как «плюс», «минус», «разделить», «умножить» и т. д. Выражения могут содержать переменные, определенные в карте параметров. Кроме того, поддерживаются такие функции, как SUBSTR, ROUND, MIN, MAX и другие. EHI-интерпретатор может вызывать дополнительные EHI-, Equation- или OS400-связанные функции. Например, CONVERT — конвертация суммы из одной валюты в другую на основе розничных курсов, CHECKACC — проверка наличия счета, DAJOBCTL — получение содержимого области данных DAJOBCTL и т. д. Кроме того, банк может определить собственные функции и интегрировать их в интерпретатор EHI.

Расширение базовой функциональности учетного модуля В случае необходимости расширения базовой функциональности учетного модуля банк может:

  • разработать дополнительные функции для использования в интерпретаторе выражений EHI. Вместе с EHI поставляется среда разработки, содержащая документацию и шаблоны программ на языках RPG и ILE C;
  • разработать дополнительные типы действий. Для этого необходимо создать три дополнительных модуля: модуль добавления действия, модуль проверки действия, модуль отмены действия. Документация по EHI содержит информацию о том, как это сделать. Кроме того, вместе с EHI поставляются некоторые утилиты, применяемые для быстрого создания новых типов действий на основе журналов системы Equation;
  • использовать точки вызова пользовательских программ в учетном модуле. Стандартная версия EHI не содержит точек вызова пользовательских программ, однако данная функциональность может быть добавлена по запросу банка.

Интеграция внешних систем
EHI позволяет использовать для интеграции внешних систем стандартный механизм системы Equation — Cashier Host Interface.
Механизм Cashier Host Interface позволяет выполнить из внешних систем вызов программного объекта (Action Module), которому передается стандартный перечень параметров, содержащих информацию, необходимую для выполнения операции в системе Equation.
Action Module осуществляет (в случае необходимости) дополнительное преобразование данных и выполнение требуемых операций.
В составе EHI поставляется Action Module, позволяющий использовать функциональность модуля «Генератор транзакций» из внешних приложений, использующих Cashier Host Interface, к примеру, Cashier System, EBA и собственные разработки банка.

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

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

Как транзакции попадают в пул

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

  1. Проверить правильность синтаксиса транзакции.
  2. Убедиться, что списки входов и выходов транзакции не пусты.
  3. Убедиться, что размер транзакции в байтах меньше, чем максимальный размер блока.
  4. Убедиться, что все выходы и их сумма являются допустимыми денежными значениями.
  5. Убедиться, что транзакция не является coinbase-транзакцией.
  6. Убедиться, что значение nLockTime не превышает максимальное целое число (INT_MAX), что размер транзакции составляет как минимум 100 байтов и что количество операндов подписи меньше или равно 2.
  7. Отклонить транзакцию, если алгоритм scriptSig или scriptPubKey выполняет в ней какие-либо нестандартные действия.
  8. Отклонить транзакцию, если транзакция уже есть в пуле или главной ветви блока.
  9. Отклонить транзакцию, если какой-либо из ее входов ссылается на выход другой транзакции в пуле.
  10. Найти для каждого входа транзакции в главной ветви блока или пуле транзакцию с соответствующим выходом. Если у какого-либо входа ее нет, добавить транзакцию в группу «транзакций-сирот».
  11. Для каждого входа: если транзакция с соответствующим выходом является coinbase-транзакцией, убедиться, что она имеет как минимум 100 (COINBASE_MATURITY) подтверждений, в противном случае отклонить транзакцию.
  12. Для каждого входа: если соответствующего входу выхода не существует, отклонить транзакцию.
  13. Используя транзакции с соответствующими выходами, убедиться, что каждый вход и сумма являются допустимыми денежными значениями.
  14. Если сумма входов меньше, чем сумма выходов, отклонить транзакцию.
  15. Если комиссия за транзакцию (определяемая как разность между суммой входов и суммой выходов) слишком мала для включения транзакции в пустой блок, отклонить транзакцию.
  16. Проверить правильность алгоритма scriptPubKey для каждого входа и, если какая-либо из проверок завершается неудачей, отклонить транзакцию.
  17. Добавить транзакцию в пул.
  18. Если транзакция адресована самому узлу, добавить ее в кошелек.
  19. Ретранслировать транзакцию другим узлам.
  20. Для каждой транзакции-сироты, в которой текущая транзакция используется в качестве одного из входов, рекурсивно выполнить все 20 описанных этапов.

Если транзакция проходит все эти проверки, она помещается в пул и узел начинает ретранслировать ее. Если нет, транзакция не ретранслируется.

Как получение нового блока влияет на состояние пула

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


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

Что происходит при исчерпании памяти узла

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

В более поздних версиях bitcoind (0.12+) при приближении размера пула к объему доступной памяти узел задает минимальную комиссию. Транзакции, в которых комиссия на 1 КБ данных не достигает этого порога, немедленно удаляются из пула, после чего в пул допускаются только транзакции с достаточной комиссией.


Со временем узел снижает пороговую комиссию, постепенно возвращая его к значению minrelayfee. За пороговой комиссией можно следить с помощью RPC-команды getmempoolinfo. Ниже показан пример изменения минимальной комиссии пула за случайный интервал времени.


DRAFT — ЧЕРНОВИК (Статья находится в процессе доработки)

В последнее время нагрузка на сеть эфира выросла. К тому же часто проводятся ICO которые могут поднять нагрузку на сеть почти в три раза.

Увеличение нагрузки на сеть может привести к ситуации когда ваша транзакция находится в состоянии pending очень долго.

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

На момент написания статьи при нормальной нагрузке на сеть количество транзакций в состоянии pending от 2000 до 4000 тысяч. Когда кто-от начинает ICO количество транзакций в pending может возрасти до 8-11 тысяч . На изображении как раз показан такой резкий скачек.

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

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

Почему транзакция pending от появляется то исчезает и время ожидания обнуляется?

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

Как протолкнуть или удалить запирающую транзакцию

Стоит отметить, что ожидание транзакции 2-3 часа хоть и не является нормальным, но все же допустимо.

Транзакции в блоке имеют свои уникальные номера — nonce . Если отправить в сеть две транзакции с одинаковым nonce , то только одна из них обработается. А другая будет считаться некорректной. Поэтому нам достаточно повторить транзакцию с тем же nonce но увеличить стоимость газа. В этом случае нода возьмет транзакцию с наибольшей стоимостью в обработку, а запирающую отклонит как некорректную. И мы решим нашу проблему.

Как это сделать?

Итак, если вы хотите именно удалить запирающую транзакцию, то достаточно отправить пустую транзакцию с высокой ценой газа. Возможности установить цена газа нет в кошельке mist или ethereum wallet. Поэтому мы воспользуемся MyEtherWallet .

  1. Найдите запирающую транзакцию. Для этого зайдите на etherscan.io и введите в поле address адрес с которого отправляли транзакции и нажмите кнопку go .
  2. Появится список всех транзакций с вашего аккаунта, нажмите на ссылку «pending Txns»
  3. Перед вами отобразится список всех транзакций в состоянии pending, а также отобразится цена газа. Как правило запирающая транзакция самая первая. Так и есть в мы видим что в первой транзакции цена газа 1 Gwei. А следующая уже за ней в очереди хоть и имеет цену газа 21 Gwei, но не обработается пока не обработается запирающая транзакция. Нажмите на ссылку хэша запирающей транзакции чтобы посмотреть подробности.
  4. В подробностях скопируйте число none и адрес from (собственно это адрес аккаунта с которого вы отправляли транзакцию)
  5. Теперь зайдите в на на https://www.myetherwallet.com/ и выберите вкладку Send Offline (Оффлайн перевод).
  6. Теперь из всех полей нам надо заполнить следующие:
  7. Теперь наша задача разблокировать кошелек удобным вам способом. Сделайте это самостоятельно. После разблокировки вам будет доступна кнопка generate transaction. Нажимаем на нее. А затем нажмите на send transaction .
  8. В появившемся окне нажмите синюю кнопку «Yex, I am sure! Make transaction.»

Теперь ваша транзакция должна через некоторое время удалиться. Откройте etherscan.io с вашим адресом и наблюдайте за процессом. Если среди последующих транзакций есть с низким газом, то для них также нужно проделать эту процедуру. В нашем примере после транзакции с 1 Gwei идет транзакция уже с 21 GWei, поэтому нам достаточно убрать только первую.