Предложение. Вы можете оставить эту идею нам или кому-то другому для разработки, либо реализовать её самостоятельно.
Если вы намерены реализовать предложение самостоятельно, сделайте следующее:
feat: Описание функции
Объяснение функции
Закрывает #1234
api-changes
.Примечание: функции, требующие изменений API, могут занять больше времени для реализации и утверждения, поскольку они требуют от разработчиков библиотеки Iroha обновить свой код.
Вопрос — это любое обсуждение, которое не является ошибкой, запросом на функцию или оптимизацию.
Пожалуйста, публикуйте свои вопросы на одной из наших платформ мгновенного обмена сообщениями, чтобы сотрудники и члены сообщества могли помочь вам своевременно.
Вы, как часть вышеупомянутого сообщества, также должны рассмотреть возможность помощи другим. Если вы решите помочь, пожалуйста, делайте это в уважительной манере.
Пожалуйста форкните репозиторий и создайте ветку функций для своих вкладов. При работе с запросами на включение изменений из форков, проверьте это руководство.
— Следуйте Rust Style Guide и Руководству по стилю документации. — Убедитесь, что написанный вами код покрыт тестами. Если вы исправили ошибку, превратите минимальный рабочий пример, который воспроизводит ошибку, в тест.
— Следуйте Git Style Guide.
— Сжимайте ваши фиксации либо до, либо во время слияния.
— Если во время подготовки вашего запроса на включение изменений ваша ветка устарела, перебазируйте её локально с помощью git pull --rebase upstream main
. В качестве альтернативы вы можете использовать раскрывающееся меню для кнопки «Обновить ветку» и выбрать опцию «Обновление с перебазированием».
В интересах облегчения этого процесса для всех старайтесь не иметь более нескольких фиксаций для запроса на включение изменений и избегайте повторного использования веток функций.
— Используйте соответствующее описание запроса на включение изменений, заполнив шаблон описания. По возможности избегайте отклонения от этого шаблона. — Добавьте соответствующим образом отформатированный заголовок запроса на включение изменений. — Если вы чувствуете, что ваш код не готов к объединению, но хотите, чтобы разработчики посмотрели на него, создайте черновик запроса на включение изменений.
— Запрос на включение изменений должен пройти все автоматические проверки перед объединением. Как минимум, код должен быть отформатирован, проходить все тесты и не иметь активных предупреждений clippy
.
— Запрос на включение изменений не может быть... В соответствующих коммитах, отдельно от остальной работы:
— Для запуска тестов на основе исходного кода выполните команду cargo test
в корне Iroha. Обратите внимание, что это длительный процесс.
— Чтобы запустить бенчмарки, выполните команду cargo bench
из корня Iroha. Чтобы помочь в отладке выходных данных бенчмарков, установите переменную среды debug_assertions
следующим образом: RUSTFLAGS="--cfg debug_assertions" cargo bench
.
— Если вы работаете над определённым компонентом, помните, что при выполнении команды cargo test
в рабочей области будут выполняться только тесты для этой рабочей области, которые обычно не включают интеграционные тесты.
— Если вы хотите протестировать свои изменения в минимальной сети, предоставленный файл docker-compose.yml
создаёт сеть из 4 пиров Iroha в контейнерах Docker, которую можно использовать для тестирования логики консенсуса и распространения активов. Мы рекомендуем взаимодействовать с этой сетью либо с помощью iroha-python
, либо с включённым клиентским CLI Iroha.
— Не удаляйте неудачные тесты. Даже игнорируемые тесты в конечном итоге будут запущены в нашем конвейере.
— По возможности проводите бенчмаркинг своего кода до и после внесения изменений, так как значительное снижение производительности может нарушить работу существующих пользователей.
Если один из ваших тестов не проходит, вы можете захотеть уменьшить максимальный уровень ведения журнала. По умолчанию Iroha регистрирует только сообщения уровня INFO
, но сохраняет возможность создавать журналы уровней DEBUG
и TRACE
. Этот параметр можно изменить либо с помощью переменной среды LOG_LEVEL
для основанных на коде тестов, либо с помощью конечной точки /configuration
на одном из пиров в развёрнутой сети.
Хотя журналов, напечатанных в stdout
, достаточно, вам может показаться более удобным создавать журналы в формате json
в отдельный файл и анализировать их с помощью node-bunyan или rust-bunyan.
Установите переменную среды LOG_FILE_PATH
в соответствующее место для хранения журналов и проанализируйте их с помощью указанных пакетов.
Иногда для отладки может быть полезно проанализировать задачи tokio с помощью tokio-console.
В этом случае вы должны скомпилировать Iroha с поддержкой консоли tokio следующим образом:
RUSTFLAGS="--cfg tokio_unstable" cargo build --features tokio-console
Порт для консоли tokio можно настроить через параметр конфигурации LOG_TOKIO_CONSOLE_ADDR
(или переменную окружения). Использование консоли tokio требует, чтобы уровень журнала был TRACE
, его можно включить через параметр конфигурации или переменную среды LOG_LEVEL
.
Пример запуска Iroha с консолью tokio с использованием scripts/test_env.sh
:
# 1. Скомпилируйте Iroha
RUSTFLAGS="--cfg tokio_unstable" cargo build --features tokio-console
# 2. Запустите Iroha с уровнем журнала TRACE
LOG_LEVEL=TRACE ./scripts/test_env.sh setup
# 3. Получите доступ к Iroha. Пиры будут доступны на портах 5555, 5556, ...
tokio-console http://127.0.0.1:5555
Чтобы оптимизировать производительность, полезно профилировать Iroha.
Для этого вы должны скомпилировать Iroha с профилем profiling
и с функцией profiling
:
RUSTFLAGS="-C force-frame-pointers=on" cargo +nightly -Z build-std build --target your-desired-target --profile profiling --features profiling
Затем запустите Iroha и подключите профилировщик по вашему выбору к идентификатору процесса Iroha (PID).
Также можно собрать Iroha... Внутри Docker с поддержкой профилировщика и профиль Iroha таким образом.
docker build -f Dockerfile.glibc --build-arg="PROFILE=profiling" --build-arg='RUSTFLAGS=-C force-frame-pointers=on' --build-arg='FEATURES=profiling' --build-arg='CARGOFLAGS=-Z build-std' -t iroha:profiling .
Например, используя perf (доступно только на Linux):
# для захвата профиля
sudo perf record -g -p <PID>
# для анализа профиля
sudo perf report
Чтобы иметь возможность наблюдать за профилем исполнителя во время профилирования Iroha, исполнитель должен быть скомпилирован без удаления символов. Это можно сделать, выполнив:
# скомпилировать исполнитель без оптимизаций
cargo run --bin iroha_wasm_builder -- build ./path/to/executor --out-file executor.wasm
С включённой функцией профилирования Iroha предоставляет конечную точку для очистки профилей pprof:
# профилировать Iroha в течение 30 секунд и получить профиль protobuf
curl host:port/debug/pprof/profile?seconds=30 -o profile.pb
# проанализировать профиль в браузере (требуется установленный go)
go tool pprof -web profile.pb
Пожалуйста, следуйте этим рекомендациям при внесении кода в наш проект:
cargo +nightly fmt --all
, чтобы форматировать код (мы используем group_imports
и imports_granularity
).Правила кодирования:
Если не указано иное, обратитесь к лучшим практикам Rust.
Используйте стиль mod.rs
. Самоназванные модули не пройдут статический анализ, за исключением как trybuild
тестов.
Используйте структуру модулей, ориентированную на домен.
Пример: не делайте constants::logger
. Вместо этого инвертируйте иерархию, поместив объект, для которого он используется, первым: iroha_logger::constants
.
Используйте expect
с явным сообщением об ошибке или доказательством безошибочности вместо unwrap
.
Никогда не игнорируйте ошибку. Если вы не можете panic
и не можете восстановиться, это, по крайней мере, должно быть записано в журнале.
Предпочитайте возвращать Result
вместо panic!
.
Группируйте связанную функциональность пространственно, предпочтительно внутри соответствующих модулей.
Например, вместо того чтобы иметь блок со struct
определениями и затем impl
s для каждой отдельной структуры, лучше иметь impl
s, связанные с этой struct
, рядом с ней.
Объявите перед реализацией: операторы use
и константы вверху, модульные тесты внизу.
Старайтесь избегать операторов use
, если импортированное имя используется только один раз. Это облегчает перемещение вашего кода в другой файл.
Не заглушайте clippy
линты без разбора. Если вы это сделаете, объясните свою аргументацию комментарием (или сообщением expect
).
Предпочитайте #[outer_attribute]
#![inner_attribute]
, если любой из них доступен.
Если ваша функция не изменяет ни один из своих входных данных (и она не должна изменять ничего другого), пометьте её как #[must_use]
.
Избегайте Box<dyn Error>
если возможно (мы предпочитаем строгую типизацию).
Если ваша функция является геттером/сеттером, пометьте её #[inline]
.
Если ваша функция — конструктор (т. е. она создаёт новое значение из входных параметров и вызывает default()
), пометьте его #[inline]
.
Избегайте привязки вашего кода к конкретным структурам данных; rustc
достаточно умён, чтобы превратить Vec<InstructionExpr>
в impl IntoIterator<Item = InstructionExpr>
и наоборот, когда ему нужно.
Рекомендации по именованию:
len
, typ
).tx
, wsv
и т. д.), TODO ссылка на глоссарий.msg <- message
).Комментарии к коду:
Мы используем закреплённые зависимости. Следуйте этим рекомендациям по управлению версиями:
Наши участники сообщества активны в:
Сервис | Ссылка |
---|---|
StackOverflow | https://stackoverflow.com/questions/tagged/hyperledger-iroha |
Mailing List | https://lists.lfdecentralizedtrust.org/g/iroha |
Telegram | https://t.me/hyperledgeriroha |
Discord | https://discord.com/channels/905194001349627914/905205848547155968 |
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )