Все значимые изменения в этом проекте будут задокументированы в этом файле. Проект придерживается Semantic Versioning.
proposer
была расширена. Теперь он также может использоваться для удаления транзакций из пула неподтверждённых транзакций. Модуль был переименован в pool
, и соответствующие имена были обновлены соответствующим образом. (#1840)node.toml
в разделе api
(например, json_payload_size = 1048576
). (#1918)Теперь можно кэшировать результаты проверки правильности транзакций, что приводит к умеренному улучшению производительности узла. (#1844)
Backtrace теперь включён в ExecutionError
. (#1850)
Добавлена возможность использовать доменные имена вместе с IP-адресами на этапе генерации конфигураций и в списке подключений. (#1870)
Введено новое свойство max_total_wal_size
в секции конфигурации базы данных для настройки максимального размера журнала WAL журнала rocksdb. (#1961)
Внутренняя база данных rocksdb была заменена на структуру данных в памяти в TemporaryDB. (#1872)
rocksdb
был обновлён до версии 0.19. (#2069)
TemporaryDB можно использовать в двух вариантах:
persisted_tempdb
). (#2071)Хрупкий ящик был заменён на time
как устаревший и неподдерживаемый. (#2009)
protobuf
был обновлен до версии 3. (#2073)
ctrl + c
(в Windows). Эти обработчики сигналов можно отключить с помощью NodeBuilder::disable_signals()
. (#1834)run-dev
. Ранее использование существующих файлов конфигурации в blockchain-path
приводило к ошибке. (#1827)create_patch
и commit
в BlockchainMut
были обобщены для поддержки пропуска блоков (см. раздел Новые функции для получения более подробной информации). (#1820)run-dev
была переработана. Теперь она не очищает файлы базы данных после запуска. Параметр artifacts-dir
был переименован в blockchain-path
. Файлы конфигурации теперь хранятся в подкаталоге config
. (#1822)MigrationRequest стал неисчерпывающим. (#1823)
Конечные точки POST
теперь ожидают ввода, закодированного в формате JSON, а не в шестнадцатеричном формате Protobuf. (#1823)
Метод supervisor_name был удалён. Вместо этого используйте Supervisor::NAME. (#1823)
command
стали общедоступными. (#1821)Узлы Exonum теперь могут настраивать способ создания предложений блоков. Это можно использовать для внесения в белый или чёрный список авторов транзакций или служб, определения приоритета транзакций по расширенным критериям, реализации сложных ограничений скорости и т. д. Функциональность доступна через модуль pool
. (#1820)
Узлы Exonum теперь могут пропускать генерацию блоков на определённой эпохе алгоритма консенсуса. Это можно использовать, чтобы поддерживать «пульс», когда нагрузка сети низкая, без увеличения объёма хранилища, используемого узлами. (#1820)
— Служба Supervisor поддерживает замораживание службы. (#1781)
— Добавлена конечная точка supervisor/services
, которая получает информацию о развёрнутых артефактах и доступных службах. (#1790)
— Служба Supervisor поддерживает выгрузку артефактов. (#1798)
— Службы Rust поддерживают замораживание. (#1780)
— HTTP API служб Rust теперь включается во время миграции данных. (#1780)
— Сервер Testkit теперь возвращает информацию об эмулируемых узлах. (#1799)
— Core теперь предоставляет более подробные / контекстно-зависимые описания ошибок, связанных с жизненным циклом службы. (#1806)
— Очистка индекса теперь использует диапазон удалений для RocksDB, обеспечивая значительное повышение производительности этой операции. (#1791)
— Исправлена ошибка, связанная с тем, что узлы забывали транзакции после выполнения блока с ними. Ранее узлы забывали все транзакции в выполненных блоках; такие транзакции были удалены из эфемерного кэша транзакций, но не были сброшены в БД или куда-либо ещё. Это могло привести к зависанию консенсуса. (#1809)
— Устранена потенциальная остановка узла, если узел получил предложение и сверхбольшинство транзакций, одобряющих его, до того, как станут известны все транзакции в предложении. (#1781)
— Отключено вещание транзакций, которые узел считает неправильными. (#1781)
— Исправлено неправильное аннулирование предложений блоков. (#1782)
— Обеспечена чёткая когерентность периода пула транзакций путём введения параметра конфигурации mempool.flush_config_strategy
. Ранее транзакции сбрасывались в постоянный пул только при фиксации блока. Это приводило к неожиданному поведению некоторых API, таких как конечная точка получения транзакций в службе проводника. (#1809)
— Устранено состояние гонки, когда два узла пытаются установить исходящие соединения друг с другом одновременно. (#1804)
— Testkit теперь не включает неправильные транзакции в блоки или пул памяти, аналогично реальным узлам Exonum. (#1785)
— Введён метод получения ссылки на базовый клиент API для TestKitApi
. (#1811)
— Хук before_commit
был переименован в after_transactions
. (#1577)
— Хуки before_transactions
и after_transactions
в службах Rust теперь возвращают Result
. Семантика такая же, как и для транзакций; ошибка или паника в хуке приведёт к откату состояния блокчейна. (#1576)
— Теперь ошибки, возникающие при выполнении транзакций и хуков before_transactions
/ after_transactions
, агрегируются внутри каждого блока, а не глобально. Ошибки можно получить с помощью BlockWithTransactions
. (#1576)
— Интерфейс Rust и представление Protobuf ExecutionError
были переработаны. Поля ошибок были сделаны закрытыми, и была добавлена информация о неудачном вызове. (#1585)
— Макрос IntoExecutionError
был переработан в отдельный признак ExecutionFail
и соответствующий макрос деривации. (#1585)
— Агрегация хеш-состояния теперь выполняется автоматически MerkleDB. Соответствующие методы в Runtime
и Service
в среде выполнения Rust были удалены. (#1553)
— commit_service
был переименован в update_service_status
и теперь принимает InstanceStatus
в качестве дополнительного аргумента. start_adding_service
было переименовано в initiate_adding_service
, чтобы лучше различать запуск и остановку службы. (#1605)
— Хук after_transactions
теперь вызывается для генезисного блока встроенных служб. Обратите внимание, что вызов blockchain::Schema::height
внутри хука after_transactions
вызовет панику для встроенной службы. (#1619)
— Поле proposer_id
в Block
было перемещено в дополнительные заголовки блоков. (#1602)
— Изменён способ взаимодействия со службами из среды выполнения Rust. Вместо использования признака Transaction
теперь можно использовать... Интерфейсы сервисов
напрямую как черты Rust. Эти интерфейсные черты могут быть применены к ключевой паре (для генерации подписанных транзакций), к CallContext (для вызова другого сервиса) и некоторым другим типам. Подробнее см. документацию по среде выполнения Rust. (#1606)
Следующие публичные API были удалены или сделаны приватными:
— blockchain::{error reexports}
(доступно из runtime::
);
— публичный реэкспорт blockchain::FatalError
;
— структура blockchain::InstanceCollection
;
— методы Blockchain::pool_size
, Blockchain::get_saved_peers
и Blockchain::remove_peer_with_pubkey
;
— функция helpers::path_relative_from
;
— черта helpers::ZeroizeOnDrop
;
— тип helpers::Milliseconds
;
— модули helpers::config
и helpers::user_agent
;
— функции helpers::generate_testnet_config
, helpers::create_rust_runtime_and_genesis_config
и helpers::clear_consensus_messages_cache
;
— макрос impl_serde_hex_for_binary_value
(перемещён в merkledb
);
— модуль proto
;
— модуль runtime::error
(catch_panic
был добавлен в список публичных реэкспортов из runtime::error
).
Модуль node
и P2P-сообщения из модуля message
(за исключением AnyTx
и Precommit
) были перемещены в отдельный ящик exonum-node
. Перемещённые P2P-сообщения стали приватными вместе с типами / методами, логически связанными с реализацией алгоритма консенсуса (например, NodeHandler
и типы, используемые им). (#1698)
Идентификатор артефакта теперь имеет первоклассную семантическую версию. Ранее он был специфичен для среды выполнения Rust. (#1590)
Поле name
идентификатора артефакта не может содержать символ :
. (#1590)
Формат конечной точки proto-sources
в среде выполнения Rust был изменён. Чтобы получить основные источники Protobuf, используйте конечную точку с запросом type=core
. Чтобы получить источники артефакта, используйте запрос type=artifact&name=$name&version=$version
, где $name
и $version
заменяются соответствующими значениями. (#1590)
Модуль среды выполнения Rust был перемещён из ящика exonum
в отдельный ящик exonum-rust-runtime
. (#1641)
update_service_status
теперь не возвращает значение. (#1659)
Теперь BlockchainBuilder::build
возвращает BlockchainMut
вместо Result
. (#1659)
Тип позиции транзакции в блоке был изменён на u32
. (#1668)
Ошибка DispatcherError
была разделена на два разных типа: CoreError
и CommonError
. (#1680)
Вариант Common
был добавлен в перечисление ErrorKind
. (#1680)
Модуль API ящика exonum
был перемещён в 2 отдельных ящика (#1690):
— ящик exonum-api
, определяющий базовую HTTP-оболочку;
— ящик exonum-system-api
, реализующий системные API-конечные точки.
Добавлен новый метод initiate_resuming_service
в трейт Runtime
. Этот метод используется для возобновления ранее остановленных служб. (#1693)
Был переработан ExecutionContext
(#1711):
— ExecutionContext
был расширен методами из exonum_rust_runtime::CallContext
, поэтому больше нет необходимости использовать CallContext
.
Публичные поля в ExecutionData
были заменены соответствующими геттерами.
Прямой доступ fork
в ExecutionContext
был заменён на BlockchainData::unstructured_access
, который возвращает доступ только для чтения ко всем данным блокчейна.
Общедоступные структуры и перечисления были сделаны неисчерпывающими. (#1710)
Доступ к данным блокчейна из ExecutionContext
после ошибки во вложенном вызове запрещён. (#1733)
Объявления Protobuf были организованы в соответствии с их пакетами и, в случае пакета exonum.runtime
, разделены на более мелкие фрагменты. Основные сообщения были перемещены из exonum.messages
в пакет exonum
. (#1756)
BlockchainBuilder
теперь принимает GenesisConfig
в качестве отдельного аргумента, а не как часть конструктора new
. Конфигурацию можно пропустить, если гарантирована инициализация блокчейна. (#1761)
Параметр supervisor-mode
был добавлен для подкоманды generate-template
. (#1598)
NodeBuilder::with_service
был... renamed to the with_rust_service
(#1765)
exonum-crypto
exonum-explorer
content
структуры CommittedTransaction
и вариант перечисления InPool
перечисления TransactionInfo
были переименованы в message
(#1721).exonum-supervisor
Supervisor
больше не является универсальной (#1587).DeployConfirmation
переименовали в DeployResult
и расширили полем success
(#1648).exonum-merkledb
Iter
, Keys
и Values
(#1628).SparseListIndex::indices
был переименован в SparseListIndex::indexes
(#1629).AccessExt::touch_index
был заменён на index_type
(#1630).CopyAccessExt
. Этот трейт полезен для ссылок, реализующих Access
, таких как &Fork
или &dyn Snapshot
. Методы из трейта AccessExt
теперь принимают self
по ссылке (#1739).ProofPath
во время вычислений хэша карты была унифицирована. Теперь она использует формат LEB128(bit_length) || bytes
, который ранее использовался для ветвей, но не для одноэлементных карт (#1743).ProofPath
в Protobuf-сообщениях MapProof
была изменена на более компактный и независимый от реализации формат (#1743).Entries
, Keys
и Values
(#1762).KeySetIndex::insert
теперь принимает элемент по ссылке (#1762).KeySetIndex
теперь поддерживает ключи без размера. Его методы получения больше не параметризуются типом ключа, аналогично MapIndex
/ ProofMapIndex
(#1762).exonum-proto
exonum-rust-runtime
interface_method
, либо с опцией auto_ids
(#1701).exonum-testkit
compare
;txvec
;TestKit::probe_all
и TestKit::probe
.TestKitBuilder::create
был переименован в build
(#1740).TestNode
возвращает KeyPair
вместо кортежа (PublicKey, SecretKey)
(#1761).exonum-time
exonum
before_transactions
для сервисов (#1577).ErrorMatch
для проверки (например, с помощью testkit), что ExecutionError
имеет ожидаемый тип, сообщение об ошибке и/или местоположение (#1585).v1/call_status/transaction
— получает статус транзакции;v1/call_status/before_transactions
— получает статус хука before_transactions
;v1/call_status/after_transactions
— получает статус хука after_transactions
.
(#1612).Supervisor
. Остановленный сервис больше не участвует в бизнес-логике, то есть он не выполняет транзакции, не обрабатывает события, не предоставляет пользовательские API и т. д. Данные сервиса становятся недоступными для других сервисов, но всё ещё существуют. Имя и идентификатор остаются зарезервированными для остановленного сервиса и не могут быть повторно использованы для добавления новых сервисов. (#1605).blockchain::Schema
был добавлен новый метод next_height
в качестве альтернативы height
, которая не вызывает панику (#1619).in_genesis_block
был добавлен в... CallContext для проверки выполнения сервисного хука для генезис-блока. (#1619)Добавлены новые варианты ошибок api::Error: Gone и MovedPermanently. (#1607)
Теперь API-конечные точки могут быть помечены как устаревшие. (#1607)
Добавлен ProtobufConvert для Verified, BlockProof и IndexProof. (#1643)
Косая черта (/) теперь может быть частью имени артефакта/экземпляра. (#1681)
exonum-build теперь полностью поддерживает иерархические пути к файлам Protobuf. (#1756)
Можно отказаться от включения источников файлов в вывод, генерируемый ящиком. (#1756)
Blockchain::new теперь поддерживает любой тип, конвертируемый в KeyPair. (#1761)
Добавлена команда обслуживания restart-migration для перезапуска скрипта миграции. (#1728)
В NodeBuilder добавлены методы with_instance и with_default_rust_service, которые запускают экземпляры служб сразу после создания генезис-блока. (№1765)
Добавлен конструктор NodeBuilder::development_node, который можно использовать для быстрой настройки одноузловой сети разработки. (#1765)
MerkleDB теперь выполняет автоматическую агрегацию состояний, позволяя создавать доказательства для своего содержимого. Хешированные индексы, не входящие в группу, участвуют в этой агрегации. Подробнее о том, как работает агрегация, см. в документации по ящику. (#1553)
Добавлена хешированная версия Entry, называемая ProofEntry, которая участвует в агрегации состояний. (#1553)
Поддержка ключей без размера добавлена в MapIndex и ProofMapIndex. (#1621, #1626)
Добавлен механизм расширения заголовка блока. Блок теперь содержит хранилище значений ключей additional_headers, которое может содержать двоичные данные. (#1602)
Временную базу данных TemporaryDB теперь можно очистить. Это удалит содержимое всех индексов и сотрёт метаданные индекса. (#1630)
Макрос impl_serde_hex_for_binary_value перемещён из ядра в merkledb. (#1629)
Теперь можно перебирать ключи индексов внутри группы. (#1662)
Небезопасные оптимизации / экспериментальные функции теперь отключены по умолчанию. (#1740)
MerkleDB теперь предоставляет перечисления для всех поддерживаемых типов доступа к БД, которые можно использовать для упрощения универсального кода (например, в привязках). (#1747)
Теперь можно получить доступ только для чтения к данным вилки со статическим временем жизни. (#1763)
Модуль времени выполнения Rust был перенесён из ящика exonum в отдельный ящик exonum-rust-runtime. (#1641)
CallContext заменён на ExecutionContext. (#1711)
Служба Supervisor теперь может иметь начальную конфигурацию и реализует интерфейс Configure. (#1587)
Был добавлен ConfigChange::StopService, чтобы отправлять запросы на остановку экземпляра службы. (#1605)
Была добавлена новая частная конечная точка deploy-status. (#1648)
Добавлена поддержка возобновления ранее остановленных служб. (#1706)
Supervisor теперь поддерживает миграции. (#1727)
Модуль sandbox был перемещён в test-suite/consensus-tests. (#1627)
Некоторые общие тесты были перемещены в test-suite/node-tests. (#1633)
Исправлена реализация Snapshot для Patch. Предыдущая реализация могла привести к устареванию чтения из Patch или Fork. (#1611)
Максимальное значение высоты в ProofListIndex было исправлено с фиктивного значения 58 до... 56. (#1762)
Устранена некорректная установка пустого ключа для ListIndex
. (#1762).
ProofListIndex
теперь корректно обрабатывает все значения индекса; ранее некоторые его методы вызывали панику при вызове с индексом, превышающим 2 ** 56
. (#1768).
Самое важное: введена новая функция Dynamic Services. Подробнее см. раздел «Функция Dynamic Services» в журнале изменений.
Используемая версия rust
обновлена до 1.38.0. (#1481).
Формат сериализации транзакций изменён на protobuf
. (#1283).
Реализован метод create_checkpoint
для структуры RocksDB
. Этот метод использует функциональность контрольных точек RocksDB под капотом.
Сообщение об ошибке NotFound
для конечной точки explorer/v1/block
теперь включает фактическую высоту блокчейна. (#1498).
Конечная точка system/v1/rebroadcast
удалена. (#1445).
Добавлена возможность указать алгоритм сжатия для базы данных. (#1447).
Обновлена зависимость hex
с изменениями в сигнатурах методов ToHex
. (#1468).
Ключи валидатора теперь получаются из одного главного ключа. Главный ключ хранится в зашифрованном файле. (#1459).
Параметры командной строки --service-key-pass
и --consensus-key-pass
были удалены в пользу параметра --master-key-pass
. Например, теперь вы можете запустить узел с помощью команды ниже. (#1459):
cargo run -- run -d 0/db/ -c 0/node.toml --master-key-pass pass:123
Метод StoppedTestKit::resume
принимает список времени выполнения вместо списка служб.
Удалён устаревший метод TestKit::blockchain_mut
, а TestKit::blockchain
теперь возвращает значение вместо ссылки.
Символ точки больше не допускается в именах служб. (#1558).
Службы теперь могут использовать типы BlockchainData
и SnapshotExt
для доступа к данным из блокчейна более структурированным образом. (#1523).
Тип GenesisConfig
выделен в отдельную сущность. BlockchainBuilder
, Node
и Testkit
явно принимают его во время создания. (#1541).
Добавлен признак DefaultInstance
для объявления встроенных служб. (#1541).
Вложенные доказательства для ProofListIndex
заменены плоским (нерекурсивным) форматом. (#1450).
Введён дифференцированный доступ (только для чтения / чтение-запись) к базе данных. (#1523).
Теперь можно иметь доступ только для чтения к индексам, заданным через Fork
, с помощью оболочки ReadonlyFork
. Доступ только для чтения работает как RefCell::borrow
(в отличие от RefCell::borrow_mut
для Fork
); можно создать неограниченное количество индексов только для чтения на основе одной и той же вилки. (#1523).
Схемы служб теперь могут использовать декларативный макет, в котором каждое поле соответствует отдельному индексу или группе индексов. Можно создать конструктор для таких схем с помощью макроса FromAccess
. (#1523, #1562).
Добавлено новое ограничение на имена индексов. (#1558):
__
и не содержащие точки .
, зарезервированы и используются только для системных индексов.exonum-proto
. Признак ProtobufConvert
перемещён в этот ящик. (#1496).Представлен новый ящик exonum-protobuf-convert
. Макрос derive
ProtobufConvert
перемещён в этот ящик. (#1501).
Макрос derive
ProtobufConvert
больше не выводит признаки BinaryValue
и ObjectHash
. Для них есть отдельные макросы derive
в ящике exonum-derive
. (#1501).
protobuf_generate
теперь является приватным, используйте exonum_build::ProtobufGenerator
вместо него. (#1496).ProtobufGenerator::frequently_used
был удалён. (#1581).Методы read_keys_from_file
и generate_keys
перемещены в новый модуль keys
в exonum
. (#1459).
Сериализация protobuf для криптотипов теперь реализована в ящике exonum-crypto
. (#1496). Обзор
В версии 0.13 в exonum представлен новый рабочий процесс сервиса под названием «Динамические сервисы».
Основные моменты этой функции:
— exonum теперь поддерживает различные среды выполнения кода (среды выполнения). По умолчанию включён только собственный rust-runtime, но поддержку различных языков программирования можно легко добавить.
Подробнее см. документацию по признаку Runtime и пример sample_runtime.
— Сервисы больше не связаны статически с скомпилированным двоичным файлом. Существует поддержка добавления новых типов сервисов (также известных как артефакты) динамически и запуска новых экземпляров сервисов.
Подробнее см. документацию модуля runtime.
— Теперь у сервисов могут быть параметры инициализации, предоставляемые в процессе запуска сервиса.
— Теперь сервисы поддерживают изменения конфигурации через интерфейс Configure.
— Сервис configuration был заменён на сервис supervisor, который способен не только изменять конфигурацию, но также развёртывать и запускать сервисы. Подробнее см. сервис supervisor.
Руководство по миграции
Выпуск 0.13 содержит множество несовместимых изменений. Чтобы увидеть изменения, сравните версии примера сервиса Cryptocurrency для выпусков [0.12.1] и [0.13.0].
Ключевые моменты:
— Схема Merkledb теперь декларативна и может содержать индексы в качестве полей.
— Доступ к базе данных теперь изолирован для сервисов. Сервис не может получить доступ на запись к другому сервису или схеме блокчейна.
— Транзакции больше не имеют метода execute. Вместо этого сервис определяет и реализует интерфейсный признак, содержащий всю бизнес-логику.
— По умолчанию сервисы не запускаются при запуске узла. Для запуска сервиса используйте инструмент exonum-launcher.
Важные PR для динамических сервисов
Ниже вы можете найти список запросов на вытягивание, которые имеют существенное значение для реализации функции динамических сервисов. Запросы на вытягивание упорядочены хронологически.
Полная история реализации динамических сервисов
Ниже вы можете найти список всех запросов на вытягивание, связанных с реализацией функции динамических сервисов. Запросов на вытягивание упорядочен хронологически.
#1245: Добавить базовый интерфейс среды выполнения + реализация на Rust.
#1253: Моки интерфейса для динамических сервисов.
#1261: Базовая функциональность диспетчера.
#1263: Добавить новый интерфейс сервисов на Rust.
#1267: Переместить службу конфигурации в ядро.
#1269: Артефакт Rust и дополнительная функциональность для среды выполнения Rust.
#1270: Динамическая служба конфигурации.
#1275: Интеграция динамических служб.
#1287: Удалить макрос из определения признака интерфейса службы.
#1290: Добавить поддержку расчёта хэша состояния в средах выполнения и службах.
#1291: Изменить конструктор службы и веб-API.
#1325: Динамические службы: исправить компиляцию службы времени.
#1326: Удалить genesis_init из динамических служб [ECR-3226].
#1327: Убрать небезопасный код из сред выполнения.
#1330: Небольшое количество улучшений кода. [ECR-3222].
#1331: Переименовать диспетчер в call_info.
#1332: Исправить тесты в модуле блокчейна.
#1334: Исправить тесты песочницы в динамических службах [ECR-3230].
#1336: Переименовать методы признаков в динамических службах [ECR-3222].
#1337: Исправить множество тестов в динамических службах.
#1338: Уточнить логику start_service [ECR-3222, ECR-3235].
#1340: Исправить testkit [ECR-3229].
#1343: Добавить имя службы и идентификатор в методы признака Service. [ECR-3235].
#1345: Реализовать новый признак Transaction [ECR-3222].
#1346: Исправить бенчмарки транзакций в динамических службах.
#1348: Исправить большую регрессию производительности в динамических службах.
#1349: Не проверять SignedMessage во время десериализации.
#1350: Рефакторинг кода проверки подписи [ECR-3222].
#1353: Переработать обозреватель блокчейна [ECR-3259].
#1354: Исправить компиляцию «cargo test --all».
#1357: Некоторые рефакторинги по предложению clippy.
#1361: Первый шаг реализации постоянных динамических служб [ECR-3276].
#1367: Переименовать ArtifactSpec в ArtifactId [ECR-3291].
#1371: Основная реализация службы супервизора [ECR-3291], [ECR-3298].
#1374: Улучшить код и сделать Трэвиса почти счастливым.
#1375: Добавить deadline_height в транзакцию StartService [ECR-3298].
#1376: Восстановить системные API-конечные точки.
#1378: Завершить логику развёртывания артефакта [ECR-3291].
#1379: Реализовать вычисление state_hash для диспетчера.
#1380: Сделать тесты зелёными снова.
#1381: Включить источники файлов proto в информацию об артефактах. [ECR-3309].
#1382: Заменить impl_service_dispatcher атрибутом в service_interface [ECR-3222].
#1387: Улучшить обработку ошибок выполнения для динамических служб [ECR-3236].
#1389: Проверить и улучшить процедуру проверки сообщений [ECR-3272].
#1392: Реализовать проверку для ArtifactId и InstanceSpec с помощью модульных тестов [ECR-3360].
#1393: Добавить макрос для реализации шестнадцатеричного представления serde для типов BinaryValue [ECR-3222].
#1394: Обновить документацию модуля сообщений [ECR-3275].
#1396: Документировать жизненный цикл среды выполнения [ECR-3275].
#1405: Тесты супервизора динамических служб [ECR-3266].
#1411: Уточнить Runtime-признак [ECR-3412].
#1427: Попытаться повторно развернуть артефакт перед регистрацией.
#1429: Провести обзор unwraps в динамических службах [ECR-3419].
#1430: Расширить документацию по использованию параметров конфигурации [ECR-3463].
#1431: Обновить информацию о диспетчере, чтобы показать изменения в списке развёрнутых артефактов.
#1432: Уточнить exonum-derive crate поверх darling [ECR-3343].
#1434: Заменить атрибут dispatcher в exonum_service на service_interface в ServiceFactory [ECR-3474].
#1438: Удалить ссылку на диспетчер из признака Runtime.
#1443: Заменить модуль fabric на exonum-cli crate [ECR-3457].
#1446: MVP интерфейсов служб [ECR-3474], [ECR-3484].
#1451: Добавить опцию имени интерфейса службы в файлы proto.
#1452: Удалить реализацию state_hash по умолчанию.
#1454: Упростить конфигурацию блокчейна [ECR-3357].
#1462: Исправить API Freeze при запуске.
#1465: Улучшить ProtobufConvert для вариантов перечислений.
#1467: Реализовать интерфейс Configure [ECR-3306].
#1472: Исправить некоторые проигнорированные doctests в testkit.
#1473: Извлечь службу супервизора из ядра.
#1476: Улучшить поддержку дополнительных сред выполнения в TestKit [ECR-3444].
#1482: Добавить метод shutdown в признак среды выполнения.
#1483: Использовать... Строки для файлов protobuf:
#1484: Реализовать логику обновления конфигурации в Supervisor [ECR-3583].
#1488: Добавить поддержку внешних сред выполнения в exonum-cli.
#1489: Избежать ожидания в конечной точке add_transaction
[ECR-3222].
#1490: Исправить создание Supervisor.
#1491: Доработать Testkit [ECR-3222].
#1492: Выполнить запуск и инициализацию сервиса за один шаг [ECR-3222].
#1493: Документировать сервисы среды выполнения Rust [ECR-3275].
#1494: Улучшения в Testkit.
#1495: Реализовать API-конечные точки, которые показывают предложения конфигурации в Supervisor [ECR-3610].
И другие пункты из запроса.
В NetworkConfiguration
добавлены новые параметры конфигурации http_backend_config.server_restart_max_retries
и http_backend_config.server_restart_retry_timeout
. Они предназначены для настройки параметров перезапуска HTTP-сервера (#1536).
Теперь у exonum
есть библиотека python
для реализации интеграционных тестов (#1516).
У BlockchainMut
теперь есть метод check_tx
, который используется для проверки транзакций перед их добавлением в пул транзакций. Транзакции, для которых check_tx
завершается неудачно, считаются недействительными и не могут быть включены в блок (#1579).
ProofListIndex
теперь реализует методы truncate()
и pop()
, позволяющие удалять элементы из списка (#1455).
Для нескольких новых типов реализован признак IndexAccess
, в частности, Rc<dyn Snapshot>
, Arc<dyn Snapshot>
и Rc<Fork>
(#1455).
Метод HashTag::hash_list()
был расширен для поддержки значений любого подходящего типа, а не только Hash
(#1455).
Реализован ProtobufConvert
для MapProof
(#1512) и ListProof
(#1513).
Представлен новый вариант ProofMapIndex
— RawProofMapIndex
. Он используется для ключей, которые напрямую сопоставляются с ProofPath
, например Hash
и PublicKey
(#1531).
По умолчанию ProofMapIndex
используется для ключей, реализующих ObjectHash
.
Для ключей Hash
оба варианта карты работают одинаково, потому что реализация ObjectHash
для Hash
возвращает сам хеш.
Старый модуль fabric
заменён новым ящиком exonum-cli
(#1443).
exonum-cli
предоставляет публичный реэкспорт ящика structopt
(#1461).
system/v1/shutdown
...Далее идёт текст, который невозможно перевести из-за наличия специальных символов или непечатаемых символов. Текст запроса: with 0x04 prefix, root node with 0x03 (#1293).
Renamed method merkle_root
of ProofMapIndex
and ProofListIndex
to
object_hash
(#1293).
Several mutable indexes now can be create from immutable reference to Fork
(#1293)
Relaxed trait bounds for the ProofMapIndex
keys (#1293)
Now keys should just implement BinaryKey
trait instead of the
ProofMapKey
, which will be ordered according to their binary
representation, as in the MapIndex
.
Changed ProofListIndex
hashing rules for leaf nodes and branch nodes according
to the certificate transparency
specification. Leaf nodes contain hashes with 0x00 prefix, branch nodes - with
0x01. (#1293)
Перевод: с префиксом 0x04, корневой узел с 0x03 (№1293).
— Метод merkle_root
в ProofMapIndex
и ProofListIndex
переименован в
object_hash
(№1293).
— Несколько изменяемых индексов теперь можно создать из неизменяемой ссылки на Fork
(№1293).
— Ослаблены ограничения признаков для ключей ProofMapIndex
(№1293).
Теперь ключи должны просто реализовывать признак BinaryKey
, а не ProofMapKey
, который будет упорядочен в соответствии с их двоичным представлением, как в MapIndex
.
— Изменены правила хеширования ProofListIndex
для листовых и узловых узлов в соответствии со спецификацией прозрачности сертификатов. Листовые узлы содержат хэши с префиксом 0x00, узловые — с 0x01 (№1293). Крейт теперь используется вместо exonum_rocksdb (#1286):
Добавлена новая конечная точка system/v1/services для отображения информации о доступных сервисах. (#1288).
Теперь используется крейт rocksdb вместо exonum_rocksdb. (#1286).
Реализована реализация признака From для Fork. (#1403).
exonum-testkit:
exonum:
Секретные ключи узлов теперь хранятся в отдельных файлах безопасным способом. Расширен интерфейс командной строки для генерации конфигураций узлов и запуска узлов, чтобы отразить эти изменения. (#1222, #1096, #1235).
Изменён ответ для конечной точки /healthcheck. (#1252).
Изменён код ответа для конечной точки /block в случае, если запрошенный блок не существует. (#1262).
Удалён подкоманду generate-testnet из интерфейса командной строки. (#1264).
exonum-crypto:
exonum:
По умолчанию добавлен allow-origin для localhost для публичного и приватного API в режиме разработки. (#1234).
Реализован ProtobufConvert для Signature. (#1241).
exonum:
exonum:
exonum-crypto:
exonum:
Обновлены зависимости. (#1111, #1162, #1167, #1168).
Добавлен обработчик ctrl+c для корректной остановки узла. (#1163).
exonum-crypto:
Изменено сообщение формата, что, в свою очередь, привело к изменениям в байтовом представлении транзакций и сообщений precommit. (#916).
Transaction::execute теперь принимает TransactionContext в качестве второго параметра. TransactionContext предоставляет открытый ключ автора транзакции, ID текущей службы и хэш транзакции. (#943).
Метод Transaction::verify был удалён. (#1085).
Каждая транзакция, содержащая открытый ключ автора, была переработана для использования автора, указанного в TransactionContext. (#984 #980 #979 #975 #971).
Конечная точка /transactions/ теперь может обрабатывать сообщения транзакций в шестнадцатеричном формате. Службы, которые использовали пользовательские конечные точки, были переработаны для использования explorer/v1/transactions. (#943 #984 #980 #979 #975 #971).
Параметр majority_count был перемещён из StoredConfiguration в ConfigurationService. (#828).
Удалена устаревшая опция enable_blockchain_explorer из NodeApiConfig. (#891).
Сообщения консенсуса и внутренние структуры теперь сериализуются с помощью protobuf. (#1028).
Параметр tx_pool_capacity был удалён из MemoryPoolConfig. (#1036).
Пользовательская сериализация была удалена. (#1088). Раунд-таймаут был переименован в фаст-раунд-тайм-аут.
Теперь время ожидания для раунда r составляет *фаст-раунд-тайм-аут + (r-1)раунд-увеличения, где раунд-увеличение определяется как определённый процент от фаст-раунда-тайм-аута. Значение этого процента определено в константе ConsensusConfig::TIMEOUT_LINEAR_INCREASE_PERCENT (10%). (#848)
Методы missing_keys, entries, all_entries класса CheckedMapProof и метод MapProof::missing_keys_unchecked теперь возвращают impl Iterator вместо Vec. (#918)
Поле сообщения Connect addr с SocketAddr было удалено, вместо него используется pub_addr со строкой неразрешённого внешнего адреса узла. (#942)
Конечная точка v1/peers теперь возвращает ConnectInfo во входящих соединениях вместо отдельных IP-адресов. (#959)
Метод Fork::remove_by_prefix() теперь определяет префикс как Option<&[u8]> вместо Option<&Vec>. (#1042)
TransactionResult теперь сериализуется с использованием protobuf. Пустое описание результата теперь эквивалентно отсутствию описания результата. (#1075)
Service::tx_from_raw теперь использует failure::Error в качестве типа ошибки. (#1088)
Макрос transactions! был удалён, вместо него следует использовать макрос TransactionSet из exonum-derive. (#1088)
Макрос encoding_struct! был удалён, теперь следует использовать protobuf. (#1088)
Структуры в тестах и примерах теперь сериализуются с помощью protobuf. (#1078)
Структуры в тестах и примерах теперь сериализуются с помощью protobuf. (#1081)
Структуры в тестах и примерах теперь сериализуются с помощью protobuf. (#1081)
Vote и VoteAgainst теперь сохраняют хэш транзакции вместо полного сообщения о транзакции. (#984)
Структуры теперь сериализованы с использованием protobuf. (#1086)
Структуры теперь сериализованы с использованием protobuf. (№1086)
Добавлен модуль utils с функциями create_keys_file для создания и read_keys_from_file для чтения файлов, содержащих открытый ключ и зашифрованный секретный ключ. (#1056)
Добавлена возможность использования доменных имён вместо IP-адресов в качестве адресов узлов. (#826)
Добавлена конечная точка v1/rebroadcast, которую можно использовать для трансляции всех транзакций из пула на другие узлы. (#859)
Каждый последующий раунд теперь длиннее предыдущего на некоторый постоянный процент от фаст-раунд-тайм-аута. (#848)
Добавлена конечная точка /v1/blocks/subscribe для отслеживания событий фиксации блоков через WebSockets (#792).
Добавлен метод MapProof::all_entries_unchecked. Он используется для более эффективных вычислений в Exonum Java Bindings, но также может использоваться для целей отладки. (#918)
В командной строке добавлена опция listen-address для указания другого внешнего адреса (peer-address) и адреса прослушивания при создании файлов конфигурации. (#942)
Адрес узла разрешается при подключении, а не при запуске узла. (#942)
Теперь узлам требуется только одно соединение для обмена сообщениями между ними. (#945)
Добавлен crate exonum-build для упрощения написания файлов build.rs для сервисов, использующих генерацию кода protobuf. (#1076)
Добавлен crate exonum-derive с пользовательскими производными для ProtobufConvert и TransactionSet. (#1055)
Исправлена ошибка переполнения размера пула. (#853)
Исправлена ошибка в NoiseWrapper::decrypt_msg, вызванная неправильным вычислением размеров зашифрованных и расшифрованных сообщений. (#873)
Исправлено тестирование производительности проверки подписи транзакций. (#673)
Узел больше не паникует, когда в пуле транзакций много транзакций, а консенсус находится в раунде 0. (#673)
Узел теперь работает правильно после повторного включения консенсуса через API. (#902)
Исправлена ошибка с некорректной обработкой EOF при декодировании сетевых сообщений. (#917)
Исправлена ошибка, приводящая к удалению избыточных данных при очистке индекса, принадлежащего семейству индексов. Были внесены исправления. (#1042)
NodeHandler::run_handler теперь возвращает Result<(), failure::Error> вместо io::Result. (#879)
Добавлен бенчмарк для проверки подписи транзакций. (#808)
Была добавлена новая функция storage::proof_list_index::root_hash(), которая позволяет эффективно вычислять корневой хеш Меркла из списка хешей без промежуточного ProofListIndex. Также была оптимизирована проверка корневых хешей блоков. (#802)
Теперь NoiseHandshake::finalize возвращает ошибку, если открытый ключ удалённого узла не находится в ConnectList. (#811)
Узлы быстрее переходят на min_propose_timeout для тайм-аута предложения блока, если они получают более propose_timeout_threshold транзакций во время max_propose_timeout. (#844)
Было удалено пользовательское форматирование журнала (вместе с зависимостями colored и term) в пользу env_logger. (#857)
Были обновлены несколько зависимостей. (#861, #865, #871)
Транзакции теперь проверяются в пуле потоков. Размер пула по умолчанию установлен на оптимальное значение (количество ядер ЦП) или может быть настроен вручную. (#673)
Команда finalize теперь не включает сам узел как доверенный узел в сгенерированной конфигурации. (#892)
Появилась возможность создать ServiceApiBuilder с блокчейном. (#929)
ConnectInfo и ConnectList теперь хранят неразрешённые адреса в виде строк. (#942)
Модуль network теперь использует PublicKeys для идентификации узлов. (#942)
Конечная точка system/v1/peers теперь правильно возвращает входящие и исходящие соединения узла. (#942)
Версия failure обновлена до 0.1.2, чтобы исправить проблему сборки с failure_derive. (#845)
Исправлена ошибка с «неизвестным предложением» выполнения. (#841)
Признак Command в модуле helpers::fabric стал общедоступным. (#778) Путь миграции: Если вы переопределяете метод ServiceFactory::command и выполняете сопоставление по имени команды, просто добавьте импорт use helpers::fabric::Command.
Поле schema_version в Block было удалено. (#774)
Хранилище в exonum теперь версионировано. Старые базы данных не будут работать с этим обновлением. (#707)
Веб-API на основе Iron был заменён новой реализацией на основе actix-web. (#727) Путь миграции: Для бэкенда: — Удалите старые зависимости от iron и его компаньонов bodyparser, router и других. — Упростите обработчики API следующим образом:
fn my_handler(state: &ServiceApiState, query: MyQueryType)
-> Result<MyResponse, ApiError>
{
// ...
}
где тип MyQueryType реализует признак Deserialize, а MyResponse — признак Serialize. — Замените старые методы public_api_handler и private_api_handler признака Service одним методом wire_api, который принимает ServiceApiBuilder. Вы можете использовать этот построитель как фабрику для вашего сервисного API. — Методы get, get_err и post в TestKitApi были заменены более удобными. РайзБравнер.
Не забудьте обновить тесты API на основе тест-кита.
Для фронтенда:
Смотрите наши примеры для получения дополнительной информации.
— Модуль storage::base_index стал приватным вместе с типами BaseIndex и BaseIndexIter (#723).
— Черта ServiceFactory была расширена функцией service_name (#730).
— Метод name был удалён из структур Run, GenerateCommonConfig, GenerateNodeConfig, Finalize, GenerateTestnet и Maintenance (модуль helpers/fabric) (#731).
— Whitelist был заменён на ConnectList. Теперь соединение между узлами может быть установлено только в том случае, если узлы существуют в списках соединений друг друга (#739).
Путь миграции:
— Конечные точки healthcheck и consensus (v1/healthcheck и v1/consensus_status) были объединены в v1/healthcheck (#736, #766).
— Файл конфигурации узла теперь обновляется при обновлении ConnectList. Это достигается через новую сущность ConfigManager (#777).
Путь миграции (требуется только если вы создаёте узел вручную):
Если вам нужно обновить ConnectList в файловой системе, передайте Some(path_to_node_config) в качестве последнего аргумента метода Node::new. В противном случае передайте None.
— Типы exonum::crypto теперь имеют усечённые представления Display/Debug (#797).
Путь миграции:
Используйте encoding::serialize::ToHex вместо Display для создания полного шестнадцатеричного представления. Вы должны вручную проверить, нужно ли переключаться или можно продолжать использовать усечённое представление.
Используйте encoding::serialize::FromHex вместо FromStr для обратного преобразования. Реализация FromStr была удалена из криптотипов, чтобы избежать ошибок.
— Существующая криптографическая подсистема на базе sodiumoxide за опциональной функцией sodiumoxide-crypto. Она также позволяет использовать собственную криптографическую библиотеку с exonum (#756).
— Добавлен новый тип команд CLI: команда info, которую можно использовать для получения различной информации от узла, который ещё не запущен (#731). В настоящее время поддерживаются следующие подкоманды: * core-version — печатает версию Exonum в виде простой строки. * list-services — печатает список служб, с которыми построен узел, в формате JSON.
— Введён модуль exonum::crypto::x25519 для преобразования ключей из Ed25519 в формат X25519 (#722).
— У модуля storage::Entry появились методы take и swap (#781).
— При обработке входящего сообщения Connect добавлена удалённая проверка подлинности открытого ключа (#786).
— Исправлена ошибка с неправильным статусом пиров для выключенного узла (#730).
— handle_consensus больше не записывает предупреждение для сообщения с предыдущей высоты (#729).
— К индексу Entry добавлен конструктор new_in_family (#790).
— В окончательную конфигурацию аудитора добавлено отсутствующее поле external_address (#805).
— BlockResponse отправляет транзакции по Hash вместо RawMessage. Если у узла нет некоторых транзакций, создаются запросы для соответствующих транзакций. Из-за этих изменений размер блока значительно уменьшился (#664).
— Структура RunDev стала общедоступной, поэтому её можно расширить.
— Команда RunDev теперь генерирует значения по умолчанию для адресов API в конфиге.
— Обновлены версии зависимостей:
Доказательства существования / отсутствия для ProofMapIndex были переработаны. Теперь они имеют линейную структуру с двумя компонентами: пары ключ-значение и дополнительная доказательная информация, позволяющая восстановить корень Меркла всего индекса. Интерфейс MapProof был переработан соответствующим образом. (#380)
Путь миграции:
Конструктор with_prefix всех типов индексов был переименован в new_in_family. Теперь он использует index_id вместо префиксов. Более того, метод blockchain::gen_prefix был удалён. Вместо этого любой тип, реализующий признак StorageKey, может служить index_id. (#531)
Несколько методов Schema были переименованы (#565):
SystemTime, ранее использовавшийся в качестве ключа или значения хранилища, показал различное поведение на разных платформах и, следовательно, был заменён на chrono::DateTime, который ведёт себя одинаково в любой среде. (#557)
Путь миграции:
Метод Blockchain tx_from_raw() теперь возвращает Result<Box, MessageError> вместо Option<Box>. (#567)
Модуль events становится приватным. (#568)
Признак CryptoHash больше не реализуется для Hash. (#578)
Атрибут network_id был удалён из NodeInfo и RawMessage. HEADER_LENGTH остаётся прежним, первый байт RawMessage теперь зарезервирован и всегда установлен в 0. (#579)
Модуль exonum::explorer был переработан для добавления новой функциональности. (#535, #600). В частности:
Путь миграции:
Добавлен параметр validators-count в командной строке. Теперь при генерации шаблона конфигурации с помощью команды generate-template необходимо указать количество валидаторов. (#586)
Параметр majority_count добавлен в StoredConfiguration. Подробнее см. изменения в exonum-configuration. (#546)
Механизм отката в Testkit переработан для работы с контрольными точками (#582):
Путь миграции:
В API Testkit теперь есть два метода для работы с пулом транзакций (#549):
Путь миграции:
Метод TestKitApi::get_err теперь возвращает ApiError. Скорее, чем десериализованный объект, как это происходит для get. Для проверки таких результатов в тестах вы можете использовать assert_matches.
Метод ExecutionError::with_description теперь принимает Into вместо String, что позволяет передавать &str напрямую. (#592).
Новое поле database добавлено в NodeConfig. Эта дополнительная настройка регулирует параметры, специфичные для базы данных, такие как количество одновременно открытых файлов. (#538).
Добавлен метод v1/user_agent с информацией об Exonum, Rust и версиях ОС. (#548).
ProofMapIndex теперь позволяет получить доказательство присутствия / отсутствия для произвольного числа элементов одновременно с помощью метода get_multiproof. Соответственно, MapProof позволяет проверять доказательства для произвольного количества элементов. (#380).
Представлена черта storage::UniqueHash, представляющая собой уникальную, но не обязательно криптографическую хеш-функцию. (#579).
Реализованы черты CryptoHash, Field, StorageKey и StorageValue для uuid::Uuid. (#588).
Для типов из модуля crypto реализована черта Display. (#590).
Макрос transactions! теперь допускает пустое тело. (#593).
Методы create_block* класса TestKit теперь возвращают информацию о созданном блоке. (#535).
Метод TestKit::explorer() позволяет получить доступ к обозревателю блокчейна. (#535).
RawTransaction теперь имеет собственную реализацию признака fmt::Debug вместо #[derive(Debug)]. Шаблон сообщения отладки RawTransaction — Transaction { version: #, service_id: #, message_type: #, length: #, hash: Hash(###) }. (#603).
Неподтверждённые транзакции теперь постоянно хранятся в хранилище, а не в пуле памяти. (#549).
Песочные тесты были перенесены внутрь ядра exonum. (#568).
Запрошенные транзакции в TransactionsRequest теперь отправляются пакетами, а не по одной. Количество пакетов зависит от ограничений размера сообщения. (#583).
Введена черта exonum::crypto::CryptoHash, и методы StorageValue::hash и Message::hash удалены. (#442). Путь миграции: — Для реализаций StorageValue переместите метод hash в реализацию CryptoHash. — Для реализаций Message просто удалите метод hash, существует общая реализация impl of CryptoHash для Message. — Добавьте use exonum::crypto::CryptoHash для использования метода hash.
Черта StorageKey повторно реализована для целочисленных типов со знаком (i8, i16, i32 и i64), чтобы добиться естественного упорядочения создаваемых ключей. (#443). Это изменение нарушит индексы, использующие целые числа со знаком в качестве ключей. Чтобы эмулировать старую реализацию, вы можете создать оболочку вокруг типа (например, struct). Хранилище данных и криптографический хэш реализованы для типа bool. (#385)
Высота реализует std::str::FromStr. (#474)
Конечная точка v1/transactions дополнена статусом выполнения транзакции. (#488)
Интерфейс Key-indexes теперь позволяет использовать заимствованные типы для операций поиска. (#392)
Добавлена конечная точка v1/shutdown для корректного завершения работы узла. (#526)
TransactionInfo из модуля public api стал публичным. (#537)
Изменена сигнатура метода TestKitApi::send, который ранее не принимал Box. (#505)
В TestKitBuilder появилась возможность инициализировать регистратор. (#524)
Информация о конфигурациях в конечных точках /v1/configs/actual, /v1/configs/following и /v1/configs/committed дополнена хэшем соответствующего предложения и голосами за предложение. (#481)
Реализована обработка ошибок на основе кодов ошибок. (#496)
Для F32 и F64 реализован признак ExonumJsonDeserialize. (#461)
Проверяются время раунда и время предложения. (#523)
Исправлена ошибка с дополнительным созданием конфигурации генезиса. (#527)
Во время завершения работы узла исправлен сбой «невозможно отменить процедуру». (#530)
Сообщения консенсуса сохраняются постоянно (в базе данных), поэтому перезапуск не влияет на поведение узла. (#322)
Выполнены проверки типов во время выполнения для каждого индекса. (#525)
Это изменение влияет на то, как строятся деревья Меркла Патриции для ProofMapIndex: биты в каждом байте ключа DBKey теперь перечисляются от младшего значащего бита (LSB) к старшему значащему биту (MSB), по сравнению с порядком MSB-to-LSB, использовавшимся ранее. Обратите внимание: это изменение нарушит работу старых хранилищ, использующих доказательства карт.
Упрощена черта Database: больше не требуется реализовывать метод клонирования с разделением состояния. Вместо этого метод merge теперь принимает общую ссылку на self. (#422)
message! и encoding_struct! больше не требуют ручной спецификации SIZE и смещения. (#413)
Метод from_raw(raw: RawMessage) перемещён в черту Message. Чтобы выполнить миграцию, добавьте use exonum::messages::Message. (#427)
Итераторы над данными Patch и Changes заменены на пользовательские типы вместо стандартных итераторов коллекций. (#393)
Исправлена опечатка в SparceListIndexKeys и SparceListIndexValues. (#398)
Убрана реализация state_hash по умолчанию в черте Service. (#399)
Из черты Transaction удалён метод info. (#402)
Заменено значение config param timeout_events_capacity на internal_events_capacity. (#388)
Черта Transaction теперь наследуется от ExonumJson. (#402)
Переименован DBKey в ProofPath и часть его функциональности перенесена в черту BitsRange. (#420)
.toml
. (#429)merge_sync
. В этой функции запись будет сброшена из буфера кэша операционной системы, прежде чем запись будет считаться завершённой. (#368)Service
или Transaction
. (#366)ServiceContext
, который может быть полезен для альтернативных реализаций узлов. (#366)AsRef<RawMessage>
для любых сообщений Exonum, созданных с помощью макроса message!
. (#372)open
в модуле rocksdb
. RocksDBOptions
должен передаваться по ссылке. (#369)ValidatorState
в ServiceContext
заменён на ValidatorId
. (#366)add_transaction
в ServiceContext
заменена на transaction_sender
, которая реализует черту TransactionSend
. (#366)Node
теперь требует переменные db
и services
вместо экземпляра blockchain
. (#366)Blockchain
теперь требует пару ключей сервисов и экземпляр ApiSender
. (#366)mount_*_api
в экземпляре Blockchain
теперь не требуют ApiContext
. (#366)last_height
переименован в height
в Schema
. (#379)last_block
теперь возвращает Block
вместо Option<Block>
. (#379)rocksdb
на более общий db-path
. (#376)HexValue
заменён признаками FromHex
и ToHex
. (#372)Patch
и Changes
заменены на непрозрачные структуры. (#371)round
из ServiceContext
. (#366)FromRaw
. (#372)current_height
в Schema
. (#379)crate_authors!
, этот макрос не может возвращать статическую строку в новой версии clap. (#370)ServiceContext
. (#366)tokio
с разделёнными очередями для сетевых событий и тайм-аутов и разными потоками для сетевого кода и кода узла (#300)SparseListIndex
. Это список элементов, хранящихся в последовательном порядке. Аналогично ListIndex
, но он может содержать индексы без элементов (#312)FromStr
и ToString
для публичных типов натрия (#318)metric!
для сбора статистической информации (#329)DBKey
публичным, поскольку он используется в MapProof
(#306)RocksDB
является хранилищем по умолчанию (#178)events_pool_capacity
в MemoryPoolConfig
заменено новой конфигурацией EventsPoolCapacity
(#300)new
и добавлен новый метод сборки with_prefix
для индексов (#178)gen_prefix
в модуле schema
(#178)NodeBuilder
работает с ServiceFactory
как объект признака вместо (#357)Transaction.info()
(#345)LevelDB
удалена (#178)Первый выпуск Exonum.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )