wiki

Новости GOLOS•CORE

Golos·Core подготовил к выпуску новую версию блокчейна HardFork (HF•18) с обновленным API

Общее

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

Рекомендация пользователям
Новые функциональные и технические возможности вносят изменения в правила экономической модели блокчейна. Поскольку измененные правила в обновленном блокчейне отменяют действия старых правил, всем пользователям системы следует обновить кодовую базу на своих серверах блокчейн до новой версии HF•18.

На этой странице:

Перечень новых функциональных возможностей в HF•18

Перечень новых технических возможностей в HF•18

Измененные и новые плагины в HF•18

Изменения в плагине private_message

В данный плагин добавлена возможность постраничного вывода списка личных сообщений. Изменены следующие методы (шрифтом bold выделены добавленные аргументы):

Метод get_inbox возвращает список входящих сообщений начиная с даты, заданной в newest.
Метод get_outbox возвращает список исходящих сообщений начиная с даты, заданной в newest.
limit — ограничивает количество сообщений (максимально допустимое значение — 100).
offset — номер сообщения, с которого выполняется операция (начиная с №).

Новый плагин witness_api

Плагин witness_api образован перемещением части методов с часто используемыми полями из плагина database_api. В него вошли следующие методы:

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

Изменения в плагине account_history

Плагин account_history дополнен следующим методом:

Метод перемещен из database_api без изменений во входных параметрах и выдаваемых результатах.

Новый плагин operation_history

Плагин operation_history образован перемещением методов из плагина database_api. Создание данного плагина позволяет отделить индексирование операций в блокчейне от истории пользователей. Пользователь может запрашивать и получать информацию об операциях в транзакциях (блоках) без ведения истории по аккаунтам. Это обеспечивает снижение нагрузки на сервер и на потребляемую память.

Плагин operation_history дополнен следующими методами:

Методы перемещены из database_api без изменений во входных параметрах и выдаваемых результатах.

Изменения в плагине social_network

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

Введен опциональный параметр vote_limit для задания максимального количества проголосовавших в ответе пользователю. По умолчанию его значение принимается равным 10000. Например, количество комментариев к посту может достигать 1000 и более, что затрудняет их просмотр и поиск интересующей информации. Пользователь может с использованием тэга сформировать запрос на получение комментариев, выбранных (отсортированных) в соответствии с указанными в тэге признаками. Параметр vote_limit позволяет уменьшить размер отправляемого от сервера ответа. При этом в ответе добавляется дополнительное поле active_votes_count, информирующее об общем количестве проголосовавших (без необходимости получать полный список).

Изменена результирующая структура:

struct discussion {
	"active_votes_count": uint, // <— Добавлено. Общее количество голосов для vote_limit
      ...
}

Изменения внесены в методы, возвращающие структуру discussion и массив discussion. В этот перечень вошли следующие методы:

Фоном выделены параметры, которыми были дополнены методы.

Следующие методы, дублирующие функции плагина tag, были удалены из плагина social_network:

Новый плагин tags

В плагин tags перемещены методы, выполняющие операции с тэгами (например, получение наиболее популярных тэгов; получение списка языков; получение тэгов, используемых автором). Это позволяет сэкономить размер файла разделяемой памяти тем пользователям, которые не используют данную функциональность.

Методы, которые перемещены из social_network без изменений:

В метод get_discussions_by_author_before_date добавлен новый параметр vote_limit (шрифтом bold выделен добавленный параметр):

Изменения в плагине follow

В плагине follow изменена структура метода get_account_reputations в соответствии со следующим представлением:

Изменения в плагине database_api

Плагин database_api дополнен новыми методами для выполнения новых операций.

Новые методы:

Новые операции:

Неизменяемая часть database_api

Часть методов из database_api перемещена в плагины witness_api, account_history, operationt_history и follow. Сохраненными в database_api без изменений остались следующие методы:

Изменения в методах database_api

Поля average_bandwidth и average_market_bandwidth были удалены из плагина database_api как неиспользуемые. Заменяемые их в выполнении операций поля new_average_bandwidth, new_average_market_bandwidth были переименованы в первоначальные их имена average_bandwidth и average_market_bandwidth соответственно.

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

Из описания типа bandwidth_type, используемого в вызове метода get_account_bandwidth, удалены поля old_forum и old_market.

В поле lifetime_bandwidth хранится суммарное значение bandwidth, используемое аккаунтом за все время его работы. В поле average_bandwidth хранится среднее значение bandwidth, по которому определяется порог чрезмерной активности аккаунта.

Внесены изменения в выдаваемый результат следующего метода:

Новый метод get_proposed_transaction

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

Новый метод get_database_info

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

Новый метод get_vesting_delegations

Этот метод возвращает массив значений с описанием операции делегирования (далее — блок делегирования) аккаунта (делегированный другим аккаунтам или же полученный от других аккаунтов).

Пример возвращаемого блока делегирования: массив vesting_delegation_api_object [{id: 0, delegator: "zzz", delegatee: "zxcat", vesting_shares: "90.000000 GESTS", min_delegation_time: "2018-04-25T21:48:15"}].

Новый метод get_expiring_vesting_delegations

Этот метод используется для получения списка возвращаемых (отозванных и «замороженных») делегированных средств аккаунта. Метод возвращает результат в виде массива значений с описанием операции возврата делегированных средств (далее — блок отозванного делегирования)

Пример возвращаемого модулем блока отозванного делегирования: массив vesting_delegation_expiration_api_object, [{id: 0, delegator: "zxcat", vesting_shares: "123.000000 GESTS", expiration: "2018-05-25T11:18:45"}].

Новая операция: изменение или возврат делегирования Силы Голоса

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

delegate_vesting_shares
{
	delegator: string,	// делегирующий аккаунт
	delegatee: string,	// аккаунт-получатель
	vesting_shares: asset	// новое количество делегируемой Силы Голоса
}

Для выполнения этой опирации требуется подпись ключом active.

Для изменения количества делегирования Силы Голоса в поле vesting_shares следует задать новое значение. Для полного возврата делегированной части Силы Голоса в поле vesting_shares следует задать значение вида “0.000000 GESTS”. При изменении значения в сторону уменьшения делегированная Сила Голоса сразу снимется с аккаунта-получателя и переходит в «замороженное» состояние сроком на семь дней (в случае создания аккаунта с делегированием этот период определяется параметром create_account_delegation_time).

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

Новая операция: создание аккаунта с делегированием Силы Голоса

Операция выполняется с использованием следующей процедуры:

account_create_with_delegation
{
      fee: asset,		// комиссия, в GOLOS
      delegation: asset,	// делегируемая доля, в GESTS
      creator: string,		
      new_account_name: string,
      owner: authority,
      active: authority,
      posting, authority,
      memo_key: string,
      json_metadata: string,
      extensions: extensions_type	// Не используется, исходное значение — пусто
}

Для выполнения этой опирации требуется подпись ключом active.

Для создания аккаунта с делегированием необходимо, чтобы выполнялись следующие два условия:

	1. fee ≥ create_account_min_golos_fee
	2. (delegation) ≥ (create_account_min_delegation)

где
fee — размер комиссионных отчислений;
create_account_min_golos_fee — минимальный размер комиссионных отчислений в криптовалюте Голос, требуемых на создание аккаунта с делегированием;
delegation — делегированная часть Силы Голоса;
create_account_min_delegation — минимальное количество Силы Голоса, необходимое для создания аккаунта с делегированием.

При создании аккаунта с делегированием бо́льшую часть комиссии можно оплатить с «заморозкой» на период, определяемый параметром create_account_delegation_time. Делегированная Сила Голоса может быть отозвана в любой момент (например, в случае злоупотребления полученной делегированной частью новым аккаунтом). При этом делегированная Сила Голоса будет снята с нового аккаунта сразу, а на делегирующий аккаунт будет возвращена по истечении срока «заморозки». Время «заморозки» является параметром, определяемым по результатам голосования. Его значение выбирается по медиане из списка всех значений, полученных от делегатов с помощью операции chain_properties_update_operation.

Новая операция: изменение json_metadata аккаунта

Пользователю предоставляется возможность изменять метаданные своего профиля без использования ключа active. Поля профиля хранятся в json_metadata. Для изменения любого поля профиля требовалась подпись только ключом active, что не всегда было приемлемым.

Было принято решение разделить поля на две группы. В состав первой группы вошли поля с наиболее значимыми данными профиля (ключи: posting, active, owner и memo), а в другую — с менее значимыми, но часто используемыми (аватар, пол, местонахождение и пр.). Процедура изменения полей первой группы сохранена и требует подписи только ключом active. В версии HF•18 вносить изменения в поля второй группы стало возможным с использованием ключа posting для подписи.

Операция выполняется с использованием следующей процедуры:

account_metadata
{
	account: string,	// изменяемый аккаунт
	json_metadata: string	// новое значение json_metadata
}

Для выполнения этой опирации требуется подпись ключом posting.

Новая операция: предложение на транзакцию

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

Операция выполняется с использованием следующей процедуры:

proposal_create_operation
{
	author: string, // автор предлагаемой транзакции
	title: string,  // заголовок предложенной транзакции.
	memo: string,   // примечание
	proposed_operations: [ operation ], // список операций в предлагаемой транзакции
	expiration_time: datetime, // максимальное время, отведенное на транзакцию
	review_period_time: datetime, // время на принятие решения участников транзакции. Опциональный параметр
	extensions: extensions_type // расширение, по аналогии с другими операциями. Исходное значение — пусто
}

Для выполнения этой опирации требуется подпись ключом active.

Создаваемая транзакция должна быть уникальной по сочетанию полей author-title. По этой паре author-title идентифицируется транзакция в случае внесения в нее изменений или ее удаления.

В поле proposed_operations задается список операций для выполнения их в транзакции (например, {["delete_comment_operation":{"autor":"jim", "permlink":"hello"}}]). На каждую операцию из этого списка должна быть получена подпись автора, которому она предназначена. Право проставления подписи на выполнение любой операции из списка имеет также каждый из участников транзакции. Например, операция публикации поста назначается одному автору, а операция перечисления вознаграждения за нее — другому. В случае несогласия другого автора с выполнением второй операции он может удалить подпись на выполнение первой операции предложенной транзакции.

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

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

Новая операция: обновление предложенной транзакции

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

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

Операция выполняется с использованием следующей процедуры:

proposal_update_operation
{
	author: string, // автор предложенной транзакции
	title: string,  // заголовок предложенной транзакции.
	active_approvals_to_add: [string], // список аккаунтов для подписи. Транзакция должна быть  
					// подписана ключом active
	active_approvals_to_remove: [string], // список аккаунтов для удаления подписи из предложенной  
					// транзакции. Транзакция должна быть подписана ключом active
	owner_approvals_to_add: [string], // список аккаунтов для подписи на операции в предложенной  
					// транзакции. Транзакция должна быть подписана ключом owner
	owner_approvals_to_remove: [string], // список аккаунтов для удаления подписи из предложенной  
					//транзакции. Транзакция должна быть подписана ключом owner
	posting_approvals_to_add: [string], // список аккаунтов для подписи на операции в предложенной  
					// транзакции. Транзакция должна быть подписана ключом posting 
	posting_approvals_to_remove: [string], // список аккаунтов для удаления подписи из предложенной  
					// транзакцию. Транзакция должна быть подписана ключом posting
	key_approvals_to_add: [string], // список ключей public для проставления подписей в предложенной  
					// транзакции
	key_approvals_to_remove: [string], // список ключей public для удаления подписей из предложенной  
					// транзакции
	extensions: extensions_type // расширение, по аналогии с другими операциями. Исходное значение — пусто
}

Подпись зависит от списка операций, предлагаемых на подписание.

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

Новая операция: удаление предложенной транзакции

В случае отказа кого-либо из участников транзакции в выполнении операции он может сформировать запрос на удаление предложенной транзакции. Идентификация транзакции осуществляется по паре author-title.

Операция выполняется с использованием следующей процедуры:

proposal_delete_operation
{
	author: string, // автор предложенной транзакции
	title: string,  // заголовок предложенной транзакции
	requester: string, // псевдоним запросившего удаление транзакции или автор предложенной транзакции
	extensions: extensions_type // расширение, по аналогии с другими операциями. Исходное значение — пусто
}

Для выполнения этой опирации требуется подпись ключом active.

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

Новая операция: изменение параметров блокчейна

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

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

Операция выполняется с использованием следующей процедуры:

chain_properties_update_operation
{
     owner: string, // автор изменения
     props: {
       account_creation_fee: asset,
       maximum_block_size: uint,
       sbd_interest_rate: uint,
       create_account_min_golos_fee: uint,
       create_account_min_delegation: uint,
       create_account_delegation_time: uint,
       min_delegation: uint	
     }
}

Для выполнения этой опирации требуется подпись ключом active.