1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/hyperledger-fabric-sdk-java

Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Примечание: этот API устарел. При разработке приложений для Hyperledger Fabric версии 2.4 и более поздних рекомендуется использовать клиентский API Fabric Gateway (https://hyperledger.github.io/fabric-gateway/). При разработке приложений для более ранних версий Fabric настоятельно рекомендуется использовать высокоуровневый API, подробно описанный ниже.

Этот проект предоставляет низкоуровневый API для взаимодействия с блокчейн-сетями Hyperledger Fabric и используется высокоуровневым Hyperledger Fabric Gateway SDK для Java:

Приведённая ниже информация предназначена для участников этого репозитория.


Введение для участников

SDK предоставляет уровень абстракции поверх основанного на протоколе wire-level протокола связи, используемого клиентскими приложениями для взаимодействия с сетью блокчейна Hyperledger Fabric. Это позволяет приложениям на Java управлять жизненным циклом каналов Hyperledger и пользовательского chaincode. SDK также предоставляет средства для выполнения пользовательского chaincode, запроса блоков и транзакций в канале и мониторинга событий в канале.

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

Обратите внимание, что SDK не предоставляет средств сохранения для определённых приложением каналов и пользовательских артефактов на клиенте. Это остаётся на усмотрение встраивающего приложения. Каналы могут быть сериализованы с помощью сериализации Java в контексте клиента. Десериализованные каналы не находятся в инициализированном состоянии. Приложения должны обрабатывать миграцию сериализованных файлов между версиями.

SDK также предоставляет клиент для центра сертификации Hyperledger. Однако SDK не зависит от конкретной реализации центра сертификации. Другие центры сертификации могут использоваться путём реализации интерфейса Enrollment SDK.

Это краткое изложение шагов, необходимых для начала работы со сборкой и использованием Java SDK. Обратите внимание, что это не документация по API или учебник по SDK, это только поможет вам ознакомиться с SDK, если вы новичок в этой области.

Примечания к выпуску

Версия Примечания Резюме
2.1 Примечания к выпуску v2.1 Незначительное обновление
2.0 примечания к выпуску v2.0
  • Новое управление жизненным циклом chaincode
  • Обработчики конфигурации соединения
  • Исполнитель службы настройки приложения
  • Очередь слушателя блоков
1.4 Нет Незначительные обновления без изменений Fabric
1.3 примечания к выпуску v1.3
  • Поддержка Java chaincode
  • Запрос конфигурации коллекции chaincode
  • Поддержка неотслеживаемости транзакций Identity Mixer
1.2 примечания к выпуску v1.2
  • Поддержка частной коллекции данных
  • Обнаружение служб
  • API сертификата Fabric CA
1.1 примечания к выпуску v1.1
  • События службы канала
  • FilterBlocks
  • Соответствие JCA/JCE
  • События chaincode
  • Цепочка узлов

Проверка SDK из Github

git clone https://github.com/hyperledger/fabric-sdk-java.git
cd fabric-sdk-java/

Производственные приложения Java

Для приложений Java используйте последнюю выпущенную версию SDK версии 1.4.x:

     <!-- https://mvnrepository.com/artifact/org.hyperledger.fabric-sdk-java/fabric-sdk-java -->
     <dependency>
         <groupId>org.hyperledger.fabric-sdk-java</groupId>
         <artifactId>fabric-sdk-java</artifactId>
         <version>1.4.7</version>
     </dependency> ### Работа над версией 2.0, можно использовать сборки 2.0.0 SNAPSHOT

Для работы можно использовать версии 2.0 сборок 2.0.0 SNAPSHOT, добавив следующее в файл pom.xml вашего приложения:
<repositories>
    <repository>
        <id>snapshots-repo</id>
        <url>https://oss.sonatype.org/content/repositories/snapshots</url>
        <releases>
            <enabled>false</enabled>
        </releases>
        <snapshots>
            <enabled>true</enabled>
        </snapshots>
    </repository>
</repositories>
    <!-- https://mvnrepository.com/artifact/org.hyperledger.fabric-sdk-java/fabric-sdk-java -->
    <dependency>
        <groupId>org.hyperledger.fabric-sdk-java</groupId>
        <artifactId>fabric-sdk-java</artifactId>
        <version>2.0.0-SNAPSHOT</version>
    </dependency>
``` ### Среда Java и Node Chaincode

Также может потребоваться явно извлечь среды Java и Node chaincode для сети Fabric на основе Docker-развёртывания версии v2.1.

docker pull hyperledger-fabric.jfrog.io/fabric-nodeenv:amd64-2.1.0-stable&&docker tag hyperledger-fabric.jfrog.io/fabric-nodeenv:amd64-2.1.0-stable hyperledger/fabric-nodeenv:amd64-latest&&docker tag hyperledger-fabric.jfrog.io/fabric-nodeenv:amd64-2.1.0-stable hyperledger/fabric-nodeenv

docker pull hyperledger-fabric.jfrog.io/fabric-javaenv:amd64-2.1.0-stable&&docker tag hyperledger-fabric.jfrog.io/fabric-javaenv:amd64-2.1.0-stable hyperledger/fabric-javaenv:amd64-latest&&docker tag hyperledger-fabric.jfrog.io/fabric-javaenv:amd64-2.1.0-stable hyperledger/fabric-javaenv

Известные ограничения и ограничения


Зависимости SDK

SDK зависит от нескольких сторонних библиотек, которые должны быть включены в ваш путь к классам при использовании файла JAR. Чтобы получить список зависимостей, обратитесь к файлу pom.xml или запустите <code>mvn dependency:tree</code> или <code>mvn dependency:list</code>.

Альтернативно, <code> mvn dependency:analyze-report </code> создаст отчёт в формате HTML в целевом каталоге со списком всех зависимостей в более читаемом формате.

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

  • JDK 1.8 или выше
  • Apache Maven 3.5.0

Для запуска интеграционных тестов требуются Fabric и Fabric CA:

  • Docker 18.03
  • Docker compose 1.21.2

Использование SDK

Настройка Eclipse

Если вы хотите начать использовать Fabric Java SDK с Eclipse, обратитесь к инструкциям по адресу: ./docs/EclipseSetup.md

Компиляция

После того как ваша переменная JAVA_HOME будет указывать на вашу установку JDK 1.8 (или выше), а JAVA_HOME/bin и Apache maven будут в вашем PATH, выполните следующую команду для создания файла jar: <code> mvn install </code> или <code> mvn install -DskipTests </code>, если вы не хотите запускать модульные тесты.

Запуск модульных тестов

Чтобы запустить модульные тесты, используйте <code>mvn install</code>, который запустит модульные тесты и создаст файл jar.

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

[INFO] BUILD SUCCESS В конце обычно очень надёжное указание на то, что все тесты успешно пройдены!

Выполнение интеграционных тестов

Сценарий ниже устанавливает тестовую среду и запускает тесты.

./scripts/run-integration-tests.sh

Сквозной тестовый сценарий

Следуя приведённым ниже примерам интеграционных тестов/кода, вы увидите почти всё, что может делать SDK.

Сначала изучите End2endIT.java и End2endAndBackAgainIT.java, прежде чем исследовать другие образцы. Затем, когда вы их поймёте, вы можете вырезать и вставлять оттуда в своё приложение. ( живой демо ).

Примечание: эти образцы предназначены для тестирования. Валидация среды и демонстрация использования API. Большинство демонстрируют простой перевод баланса.

Интеграционный тест Резюме и примечания
End2endLifecycleIT.java Новые API управления цепным кодом жизненного цикла (v2.0): огонь! Fabric read the docs: Цепной код для операторов
End2endIT.java Регистрация и регистрация пользователей в центре сертификации Fabric. Создание канала в первый раз. Установка цепного кода. Устарело, см. примечания к выпуску v2.0! Инстанцирование цепного кода. Устарело, см. примечания к выпуску v2.0! Выполнение цепного кода. Запрос информации о канале. Слушатель событий цепного кода. Обход блока для получения информации. Предварительное условие для всех остальных тестовых случаев.
End2endAndBackAgainIT.java Воссоздание канала. Обновление цепного кода. Проверка установленного и инстанцированного цепного кода. Устарело, см. примечания к выпуску v2.0!
End2endNodeIT.java Показывает выполнение End2endIT.java, но с цепным кодом узла. Обратите внимание на подклассы класса En2endIT.
End2endJavaIT.java Показывает выполнение End2endIT.java, но с Java цепным кодом. Обратите внимание на подклассы класса En2endIT.
End2endIdemixIT.java Показывает выполнение End2endIT.java, но с учётными данными Idemix. Обратите внимание на подклассы класса En2endIT.
NetworkConfigIT.java Показывает воссоздание канала с общим профилем подключения. Определяемые пользователем обработчики для создания одноранговых узлов и организаторов ** (v2.0) :fire: **
PrivateDataIT.java Показывает инстанцирование и установку цепного кода, который определяет личные данные. Информацию о личных данных Fabric можно найти в документации.
UpdateChannelIT.java Показывает обновление конфигурации канала. Подробности о конфигурациях каналов можно найти в документации Конфигурация канала. Очередь блоков слушателя ** (v2.0)**: огонь!
(https://github.com/hyperledger/fabric-sdk-java/blob/8044bac1bfe9baf9d6360b067e0d6b5445cc953d/src/test/java/org/hyperledger/fabric/sdkintegration/ServiceDiscoveryIT.java)
  • Показывает обнаружение служб.
  • Подробности об обнаружении служб можно найти в документации «Обнаружение служб» (https://hyperledger-fabric.readthedocs.io/en/release-1.3/discovery-overview.html).
  • Примечание: требуется добавить записи в файл хоста, чтобы переназначить адреса Docker Fabric Peer и Orderers на localhost.

End to end test environment

Тест определяет один Fabric orderer и две организации (peerOrg1, peerOrg2), каждая из которых имеет по 2 пиров, одну службу fabric-ca.

Сертификаты и другие криптографические артефакты

Fabric требует, чтобы у каждой организации были закрытые ключи и сертификаты для использования при подписании и проверке сообщений, отправляемых клиентам, пирам и orderers. Каждая организация группирует эти артефакты в MSP (Membership Service Provider) с соответствующим уникальным MSPID.

Кроме того, предполагается, что каждая организация генерирует эти артефакты самостоятельно. Проект fabric-ca является примером такой службы генерации сертификатов. Fabric также предоставляет инструмент cryptogen для автоматического создания всех криптографических артефактов, необходимых для сквозного тестирования. В каталоге src/test/fixture/sdkintegration/e2e-2Orgs/channel

Команда, используемая для генерации end2end crypto-config артефактов:

v1.0 build/bin/cryptogen generate --config crypto-config.yaml --output=crypto-config

v1.1 cryptogen generate --config crypto-config.yaml --output=v1.1/crypto-config

Для удобства назначения портов и сопоставления артефактов с физическими файлами все пиры, orderers и fabric-ca запускаются как контейнеры Docker, управляемые через файл конфигурации docker-compose.

Файлы, используемые для сквозного теста:

  • src/test/fixture/sdkintegration/e2e-2Orgs/vX.0 (всё необходимое для начальной загрузки orderer и создания каналов)
  • src/test/fixture/sdkintegration/e2e-2Orgs/vX.0crypto-config (как есть. Используется configtxgen и docker-compose для сопоставления каталогов MSP)
  • src/test/fixture/sdkintegration/docker-compose.yaml

Артефакты сквозного тестового примера хранятся в каталоге src/test/fixture/sdkintegration/e2e-2Org/channel.

TLS-соединение с Orderer и Peers

IBM Java нужны следующие свойства, определённые для использования TLS 1.2 для получения HTTPS-соединений с Fabric CA.

-Dcom.ibm.jsse2.overrideDefaultTLS=true   -Dhttps.protocols=TLSv1.2

В настоящее время в pom.xml настроено использование netty-tcnative-boringssl для TLS-соединения с Orderer и Peers, однако вы можете изменить pom.xml (раскомментировать несколько строк), чтобы использовать альтернативное TLS-соединение через ALPN.

Среда TLS для тестов интеграции SDK

Тесты интеграции SDK можно включить, добавив перед ./fabric restart следующее:

ORG_HYPERLEDGER_FABRIC_SDKTEST_INTEGRATIONTESTS_TLS=true ORG_HYPERLEDGER_FABRIC_SDKTEST_INTEGRATIONTESTS_CA_TLS=--tls.enabled ./fabric.sh restart

Затем запустите тесты интеграции с помощью:

ORG_HYPERLEDGER_FABRIC_SDKTEST_INTEGRATIONTESTS_TLS=true mvn clean install -DskipITs=false -Dmaven.test.failure.ignore=false javadoc:javadoc

Политики одобрения цепочки блоков

Вы создаёте политику с помощью инструмента Fabric (пример показан в JIRA issue FAB-2376) и предоставляете её SDK либо в виде файла, либо в виде массива байтов. SDK, в свою очередь, будет использовать эту политику при создании запросов на создание экземпляров цепочки блоков.

Чтобы ввести политику в SDK, используйте класс ChaincodeEndorsementPolicy.

Для целей тестирования существует 2 файла политики в каталоге src/test/resources

  • policyBitsAdmin (которая имеет политику AND(DEFAULT.admin), означающую, что требуется 1 подпись от администратора DEFAULT MSP)
  • policyBitsMember (которая имеет политику AND(DEFAULT.member), означающую, что требуется 1 подпись члена DEFAULT MSP )

и один файл в src/test/fixture/sdkintegration/e2e-2Orgs/channel — каталог, предназначенный специально для использования в сценарии тестирования «конец-в-конец».

members_from_org1_or_2.policy (который имеет политику OR(peerOrg1.member, peerOrg2.member)) означает, что требуется одна подпись от участника любой из организаций peerOrg1 или PeerOrg2).

Также можно использовать класс ChaincodeEndorsementPolicy, предоставив ему файл YAML, в котором определена политика.

Примеры этого можно найти в тестовых сценариях End2endIT, которые используют src/test/fixture/sdkintegration/chaincodeendorsementpolicy.yaml.

Файл chaincodeendorsementpolicy.yaml содержит комментарии, помогающие понять, как создавать эти политики. В первом разделе перечислены все идентификаторы подписей, которые можно использовать в политике. В настоящее время поддерживаются только типы ролей. Раздел политики состоит из элементов n-of и signed-by. Затем n-of (1-of, 2-of) требует, чтобы в этом разделе было истинно (true) столько (n). Signed-by ссылается на идентификатор в разделе идентификаторов.

Артефакты создания канала

Файлы конфигурации канала и файлы начальной загрузки для упорядочивателя (см. каталог src/test/fixture/sdkintegration/e2e-2Orgs) необходимы при создании нового канала. Это создаётся с помощью инструмента Hyperledger Fabric configtxgen. Этот инструмент должен быть запущен после cryptogen, и в каталоге, где вы работаете, должен быть создан каталог crypto-config.

Если инструмент build/bin/configtxgen отсутствует, запустите make configtxgen.

Для интеграционного теста версии 1.0 команды следующие:

  • build/bin/configtxgen -outputCreateChannelTx foo.tx -profile TwoOrgsChannel -channelID foo;
  • build/bin/configtxgen -outputCreateChannelTx bar.tx -profile TwoOrgsChannel -channelID bar.

Для интеграции версии 1.1 команды используют профили v11 в configtx.yaml. На данный момент необходимо скопировать configtx.yaml из e2e-20orgs в каталог v1.1 и запустить оттуда:

  • configtxgen -outputBlock orderer.block -profile TwoOrgsOrdererGenesis_v11;
  • configtxgen -outputCreateChannelTx bar.tx -profile TwoOrgsChannel_v11 -channelID bar;
  • configtxgen -outputCreateChannelTx foo.tx -profile TwoOrgsChannel_v11 -channelID foo.

Для интеграции версии 1.2 команды используют профили v12 в configtx.yaml:

  • configtxgen --configPath . -outputBlock orderer.block -profile TwoOrgsOrdererGenesis_v12;
  • configtxgen --configPath . -outputCreateChannelTx bar.tx -profile TwoOrgsChannel_v12 -channelID bar;
  • configtxgen --configPath . -outputCreateChannelTx foo.tx -profile TwoOrgsChannel_v12 -channelID foo. Это должно создать в каталоге v1.2 файлы bar.tx, foo.tx и orderer.block.

Для версий 1.3 и 1.4 интеграции перейдите в каталог src/test/fixture/sdkintegration/e2e-2Orgs/v1.3 и выполните следующие команды:

  • configtxgen --configPath . -outputBlock orderer.block -profile TwoOrgsOrdererGenesis_v13;
  • configtxgen --configPath . -outputCreateChannelTx foo.tx -profile TwoOrgsChannel_v13 -channelID foo;
  • configtxgen --configPath . -outputCreateChannelTx bar.tx -profile TwoOrgsChannel_v13 -channelID bar.

Для версии 2.1 интеграции перейдите в каталог src/test/fixture/sdkintegration/e2e-2Orgs/v2.1 и выполните:

  • configtxgen --configPath . -outputCreateChannelTx v2channel.tx -profile TwoOrgsChannel_v20 -channelID v2channel;
  • configtxgen --configPath . -outputBlock orderer.block -profile TwoOrgsOrdererGenesis_v20 -channelID systemordererchannel.

Это должно привести к созданию файлов orderer.block, foo.tx и bar.tx в том же каталоге.

Примечание: Выше описано, как это было сделано. Если вы повторите это, будут созданы файлы закрытых ключей с уникальными именами, которые не будут соответствовать ожидаемым в интеграционных тестах. Одним из примеров этого является docker-compose.yaml (поиск по sk).

Цепочка блоков на языке Go Lang

Зависимости цепочки блоков на языке Go lang должны содержаться в папке vendor. Для объяснения этого см. Объяснение папки Vendor. Репозиторий

Для рассматриваемого релиза должен существовать файл fabric-sdk-java-<release>-javadoc.jar.

Для сборок SNAPSHOT ищите в репозитории Sonatype:

  • найдите каталог <release> -SNAPSHOT;
  • затем найдите последний файл fabric-sdk-java-<release>-<latest timestamp>-javadoc.jar.

Вопросы и ответы

  1. Поддерживается ли Android? Нет.
  2. Есть ли API для запроса всех существующих каналов? Нет.
  3. Следует ли приложению создавать более одного HFClient? В одном приложении в этом нет необходимости. Все запросы SDK являются потокобезопасными. Пользовательский контекст, установленный на клиенте, может быть переопределён для всех запросов путём установки пользовательского контекста для этого конкретного запроса.
  4. Пользователи Idemix или тестовые случаи Idemix (IdemixIdentitiesTest) просто зависают или выполняются бесконечно. Скорее всего, это происходит на виртуальной машине, которая не имеет достаточной энтропии. Поищите информацию о том, как добавить энтропию на виртуальные машины или посмотрите статью «Виртуальные машины и энтропия» (https://web.archive.org/web/20191202062101/http://giovannitorres.me/increasing-entropy-on-virtual-machines.html). Если вы используете Linux, попробуйте установить пакет rng-tools.
  5. Брандмауэры, балансировщики нагрузки, сетевые прокси-серверы Иногда они могут незаметно убивать сетевые соединения и препятствовать их автоматическому повторному подключению. Чтобы исправить это, рассмотрите возможность добавления в Peers и Orderer свойств подключения: grpc.NettyChannelBuilderOption.keepAliveTime, grpc.NettyChannelBuilderOption.keepAliveTimeout, grpc.NettyChannelBuilderOption.keepAliveWithoutCalls. Примеры этого есть в End2endIT.java.
  6. Отсутствуют классы protobuf. Пожалуйста, перечитайте этот файл, выполняя точно шаги для запуска всех тестов. Они не могут отсутствовать, если тесты проходят.
  7. Размер сообщения grpc превышает максимальный размер. Возвращаемое сообщение от сервера Fabric слишком велико для размера кадра grpc по умолчанию. На Peer или Orderer добавьте свойство grpc.NettyChannelBuilderOption.maxInboundMessageSize. См. constructChannel в End2endIT (https://github.com/hyperledger/fabric-sdk-java/blob/b649868113e969d851720c972f660114b64247bc/src/test/java/org/hyperledger/fabric/sdkintegration/End2endIT.java#L846).
  8. Конфигурация и установка значений по умолчанию — таймауты и т. д. Все значения по умолчанию SDK находятся в файле Config.java (https://github.com/hyperledger/fabric-sdk-java/blob/a2140f9bba57a63c58d9ee8579fea7164bf3beb2/src/main/java/org/hyperledger/fabric/sdk/helper/Config.java#L33-L40). В config.properties также есть некоторые описания того, что они делают. Большинство тайм-аутов запросов сервера можно переопределить с помощью конкретного запроса.
  9. В чём разница между присоединением и добавлением узла к каналу? Вы только присоединяетесь к узлу, принадлежащему вашей собственной организации, на канал один раз в начале. Вы бы только добавляли узлы от других организаций или узлы вашей собственной организации, которые вы уже присоединили, например, при воссоздании объекта канала SDK.
  10. Транзакция, отправленная на ордер, приводит к будущему с исключением код проверки: xxx. Где я могу узнать, что это значит? См. TxValidationCode в Fabric protobuf protos/peer/transaction.proto (https://github.com/hyperledger/fabric/blob/dce0e5d8e7bbce5315d0895e5d1460640700285b/protos/peer/transaction.proto#L115-L143).
  11. java.security.InvalidKeyException: Illegal key size Если вы получаете эту ошибку, это означает, что ваш JDK не способен обрабатывать криптоалгоритмы неограниченной силы. Чтобы устранить эту проблему, вам необходимо загрузить библиотеки JCE для вашей версии JDK. Следуйте инструкциям здесь, чтобы загрузить и установить JCE для вашей версии JDK (http://stackoverflow.com/questions/6481627/java-security-illegal-key-size-or-default-parameters).

Общение с разработчиками и другими пользователями

Войдите в систему (ссылка удалена). Hyperledger project's Rocket chat

Для этого вам также понадобится Linux Foundation ID.

Присоединитесь к каналу fabric-sdk-java.

Сообщение о проблемах

Если у вас возникли проблемы с созданием среды разработки Fabric, пожалуйста, обсудите это в канале #fabric-dev-env на rocket.chat.

Чтобы сообщить о проблеме, используйте JIRA Hyperledger. Для входа вам потребуется Linux Foundation ID (LFID), который вы можете получить на сайте The Linux Foundation, если у вас его ещё нет.

Поля JIRA должны быть следующими:

Тип
Ошибка или новая функция
Компонент
fabric-sdk-java
Версии исправления
v1.4

Пожалуйста, предоставьте как можно больше информации о возникшей проблеме: трассировки стека, логи.

Также предоставьте вывод команды java -XshowSettings:properties -version.

Включение логирования для SDK

Логирование для SDK можно включить, задав переменные окружения:

ORG_HYPERLEDGER_FABRIC_SDK_LOGLEVEL=TRACE

ORG_HYPERLEDGER_FABRIC_CA_SDK_LOGLEVEL=TRACE

ORG_HYPERLEDGER_FABRIC_SDK_DIAGNOSTICFILEDIR=<полный путь к каталогу> # создаёт дампы protobuf и диагностических данных. Может создавать большие объёмы данных!

Отладка Fabric

Отладка Fabric по умолчанию включена в файле docker-compose.yaml SDK:

На Orderer:

ORDERER_GENERAL_LOGLEVEL=debug

На пирах: CORE_LOGGING_LEVEL=DEBUG

Fabric CA запускается командой с параметром -d.

При возможности загрузите полные логи в JIRA, а не только те, где возникла проблема.

Трассировка

SDK настроен на трассировку всех gRPC-коммуникаций:

  • Все исходящие сообщения имеют метаданные трассировки, что позволяет коррелировать их с партнёрами.
  • Каждый запрос/ответ вычисляется как диапазон.
  • Если вы используете OpenTelemetry в своей программе, диапазон gRPC будет коррелироваться с родительским контекстом с помощью локального контекста потока.

SDK принимает все переменные среды, описанные в спецификации OpenTelemetry.

Creative Commons License
Эта работа лицензирована в соответствии с международной лицензией Creative Commons Attribution 4.0.

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Описание недоступно Развернуть Свернуть
Apache-2.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/hyperledger-fabric-sdk-java.git
git@api.gitlife.ru:oschina-mirror/hyperledger-fabric-sdk-java.git
oschina-mirror
hyperledger-fabric-sdk-java
hyperledger-fabric-sdk-java
main