Hyperledger Fabric SDK를 사용하여 애플리케이션 개발

애플리케이션은 SDK(소프트웨어 개발 키트)를 사용하여 원장에 대한 쿼리 및 업데이트를 허용하는 API에 액세스합니다.Hyperledger Fabric SDK를 설치하고 사용하여 Oracle Blockchain Platform용 애플리케이션을 개발할 수 있습니다.

Oracle Blockchain Platform에서 제공하는 REST API는 최대한의 유연성을 염두에 두고 만들어졌습니다. 트랜잭션을 호출하거나, 쿼리를 호출하거나, 트랜잭션 상태를 볼 수 있습니다. Oracle Blockchain Platform용 REST API를 참조하십시오.

그러나 이는 애플리케이션에서 기존 API 엔드포인트를 래핑하여 객체 레벨 제어를 제공하고자 할 수 있음을 의미합니다. 응용 프로그램에는 훨씬 더 세분화된 작업이 포함될 수 있습니다.

SDK 버전

여러 버전의 Hyperledger Fabric SDK를 사용할 수 있습니다. 인스턴스가 기반으로 하는 Hyperledger Fabric 버전과 일치하는 SDK 버전을 사용합니다.

Node.js용 Hyperledger Fabric SDK 설치

Node.js용 Fabric SDK 사용 방법에 대한 자세한 내용은 Hyperledger Fabric SDK for Node.js documentation를 참조하십시오.

개발자 툴 탭에서 애플리케이션 개발 창을 엽니다.

Java용 Hyperledger Fabric SDK 설치

Java용 Fabric SDK 사용 방법에 대한 정보는 Hyperledger Fabric SDK for Java 설명서에서 확인할 수 있습니다.

개발자 툴 탭에서 애플리케이션 개발 창을 엽니다.

Apache Maven과 같은 빌드 툴을 설치합니다.

애플리케이션 구성

Java 응용 프로그램은 다음과 같이 구성되어야 합니다.

/Application
  /artifacts
    /cypto
      /orderer
        Contains the certificates required for the application to act on the orderer node
        In participant instances only contains TLS certificates
      /peer
        Contains the certificates required for the application to act on the peer node
    /src
      chaincode.go if installing and deploying chaincode to the blockchain
  /java
    pom.xml or other build configuration files
    /resources
      Any resources used by the Java code, including artifacts such as the endorsement policy yaml file and blockchain configuration properties
    /src
      Java source files

Node.js 애플리케이션은 다음과 유사하게 구성되어야 합니다.

/Application
  /artifacts
    /cypto
      /orderer
        Contains the certificates required for the application to act on the orderer node
        In participant instances only contains TLS certificates
      /peer
        Contains the certificates required for the application to act on the peer node
    /src
      chaincode.go if installing and deploying chaincode to the blockchain
  /node
    package.json file
    application.js
    /app
      Any javascript files called by the application
      /tools

애플리케이션 실행

이제 애플리케이션을 실행하고 테스트할 준비가 되었습니다. 애플리케이션에서 반환되는 상태 메시지 외에도 Oracle Blockchain Platform 콘솔에서 원장을 확인하여 변경사항을 확인할 수 있습니다.

  1. 콘솔의 채널 탭으로 이동하여 블록체인을 실행하는 채널의 이름을 찾아 클릭합니다.
  2. 채널의 원장 창에서 체인코드의 원장 요약을 봅니다.

Oracle Blockchain Platform에서 작동하도록 Hyperledger Fabric v2.x SDK 업데이트

OCI 인프라 구성요소와 Hyperledger Fabric v2.x에서 제공되는 Java SDK 간에는 비호환성이 있습니다. 이 문제를 해결하려면 이 항목의 단계를 따르십시오.

Hyperledger Fabric SDK를 업데이트하는 방법

SDK를 업데이트하는 방법은 두 가지가 있습니다.

  • 콘솔에서 수정된 패키지를 다운로드합니다. 수정이 필요한 Java SDK에서 참조하는 모듈인 업데이트된 grpc-netty-shaded-1.38.0.jar 파일을 생성했습니다.
  • 이 항목에 설명된 대로 패키지를 수동으로 빌드합니다.

grpc-netty-shaded-1.38.0.jar 파일을 다운로드하려면 콘솔의 개발자 툴 탭을 누른 다음 애플리케이션 개발 창을 선택합니다.

수동으로 패키지 작성

fabric-sdk-java 프로젝트의 경우 다음 단계를 완료하여 TLS를 통해 피어 및 주문자를 grpcs 클라이언트에 연결하도록 grpc-netty-shaded 패키지를 재구축합니다. grpc-netty-shaded 패키지는 grpc-java의 하위 프로젝트입니다.

  1. 프로젝트 종속성 설치:
    mvn install
  2. grpc-java 소스 코드를 다운로드합니다.

    git clone https://github.com/grpc/grpc-java.git
  3. fabric-sdk-java에서 사용하는 grpc 버전을 찾아 코드를 확인합니다.
    grpc-java 디렉토리에서 fabric-sdk-java가 사용하는 grpc의 버전을 확인합니다.
    cd grpc-java && git checkout v1.38.0
  4. 서버측에서 alpn 오류가 발생하지 않도록 코드를 변경합니다. 다음 내용으로 grpc-java-patch 패치 파일을 만듭니다.
    diff --git a/netty/src/main/java/io/grpc/netty/ProtocolNegotiators.java b/netty/src/main/java/io/grpc/netty/ProtocolNegotiators.java
    index 19d3e01b7..ebc4786a3 100644
    — a/netty/src/main/java/io/grpc/netty/ProtocolNegotiators.java
    +++ b/netty/src/main/java/io/grpc/netty/ProtocolNegotiators.java
    @@ -611,7 +611,8 @@ final class ProtocolNegotiators {
    SslHandshakeCompletionEvent handshakeEvent = (SslHandshakeCompletionEvent) evt;
    if (handshakeEvent.isSuccess()) {
    SslHandler handler = ctx.pipeline().get(SslHandler.class);
    
        if (sslContext.applicationProtocolNegotiator().protocols()
        + if (handler.applicationProtocol() == null
        + || sslContext.applicationProtocolNegotiator().protocols()
        .contains(handler.applicationProtocol())) {
        // Successfully negotiated the protocol.
        logSslEngineDetails(Level.FINER, ctx, "TLS negotiation succeeded.", null);
  5. 패치를 적용합니다:

    git apply grpc-java.patch
  6. 프로젝트를 작성하여 대상 패치된 패키지를 생성합니다. gradle을 사용하여 grpc-java-shaded 프로젝트 빌드:

    cd netty/shaded
    gradle build -PskipAndroid=true -PskipCodegen=true

    빌드가 완료되면 grpc-java/netty/build/libs/grpc-netty-shaded-1.38.0.jar에서 대상 패치 .jar 패키지를 사용할 수 있습니다.

  7. 패치된 패키지를 Maven 로컬 저장소에 추가합니다.

    다음 두 가지 방법 중 하나로 원래 grpc-netty-shaded .jar 패키지를 패치된 패키지로 바꿉니다.
    • Maven을 사용하여 로컬 파일로 패키지를 설치합니다.
      mvn install:install-file -Dfile=grpc-netty-shaded-build/grpc-netty-shaded-1.38.0.jar -DgroupId=io.grpc -DartifactId=grpc-netty-shaded -Dversion=1.38.0 -Dpackaging=jar
      groupid, artifactidversion 대상은 바꿀 패키지와 동일하게 유지해야 합니다.
    • 수동으로 패키지를 교체합니다. 로컬 Maven 저장소로 이동하여 대상 패키지가 있는 디렉토리를 찾고 패키지를 패치된 패키지로 바꿉니다.

  8. 프로젝트를 실행합니다.

Oracle Blockchain Platform에서 작동하도록 Hyperledger Fabric v1.4.7 SDK 업데이트

Hyperledger Fabric v1.4.7과 함께 제공되는 OCI 인프라 구성요소와 Node.js 및 Java SDK 간에는 비호환성이 있습니다. 이 문제를 해결하려면 이 항목의 단계를 따르십시오.

Hyperledger Fabric SDK를 업데이트하는 방법

SDK를 업데이트하는 방법은 두 가지가 있습니다.

  • Oracle 스크립트를 사용하여 설치 시 코드를 패치할 Node.js SDK 또는 Java SDK를 다운로드하고 설치합니다.
  • 이 항목에 설명된 대로 수동으로 수행합니다.

스크립트를 사용하려면 콘솔의 개발자 툴 탭에서 애플리케이션 개발 창을 선택합니다. Node.js SDK와 Java SDK를 모두 다운로드할 수 있는 링크에는 설치 시 코드를 패치할 업데이트가 내장되어 있습니다.

  • Fabric Java SDK: 수정이 필요한 Java SDK에서 참조하는 모듈인 업데이트된 grpc-netty-1.23.0.jar 파일을 만들었습니다.
  • Fabric Node.js SDK: 사용자가 Node.js Fabric 클라이언트 패키지를 다운로드하고 설치하기 위해 수행할 표준 Fabric npm install 작업을 대체하기 위해 npm_bcs_client.sh 스크립트를 만들었습니다. 이 스크립트는 동일한 npm 명령을 실행하지만 필요한 구성 요소를 패치하고 재구축합니다.

Fabric Node.js SDK 수동 업데이트

TLS를 통해 grpcs 클라이언트와 피어 및 주문자를 연결하도록 grpc-node 모듈을 재구축하려면 다음을 수행합니다.
  1. grpc 모듈의 빌드 스크립트를 실행하지 않고 fabric-client를 설치합니다.
    npm install --ignore-scripts fabric-client
  2. Windows에서는 ALPN을 명시적으로 비활성화해야 합니다.

    • 다음을 변경하여 node_modules/grpc/binding.gyp 업데이트:
      '_WIN32_WINNT=0x0600'
      to
      '_WIN32_WINNT=0x0600','TSI_OPENSSL_ALPN_SUPPORT=0'
    • https://github.com/nodejs/node/issues/4932에 설명된 문제로 인해 Windows에서 grpc-node를 빌드하려면 먼저 <node_root_dir>/include/node/openssl/를 제거해야 합니다. 다음을 실행하여 <node_root_dir>를 찾습니다.
      node-gyp configure
  3. 재구축 grpc

    npm rebuild --unsafe-perm --build-from-source
이제 필요한 다른 모듈을 설치하고 프로젝트를 실행할 수 있습니다.

수동으로 Fabric Java SDK 업데이트

fabric-sdk-java의 경우 다음 단계를 수행하여 피어 및 주문자를 grpcs 클라이언트(tls를 통해)와 연결하도록 grpc-netty 패키지를 재구축합니다. grpc-nettygrpc-java의 하위 프로젝트입니다.

  1. 프로젝트 종속성 설치:
    mvn install
  2. grpc-java 소스 코드 다운로드:

    git clone https://github.com/grpc/grpc-java.git
  3. fabric-sdk-java에서 사용하는 grpc 버전을 찾아 코드를 체크아웃합니다.

    fabric-sdk-java 버전마다 다른 버전의 grpc를 사용할 수 있습니다. pom.xml에서 fabric-sdk-java가 사용하는 grpc 버전을 확인합니다. 예를 들어, fabric-sdk-java 1.4.11pom.xml에 있는 grpc-java 1.23.0(https://github.com/hyperledger/fabric-sdk-java/blob/v1.4.11/pom.xml)를 사용합니다.

    grpc-java 디렉토리에서 fabric-sdk-java가 사용하는 grpc의 버전을 체크아웃합니다.
    git checkout -b v1.23.0
  4. 서버측에서 alpn 오류가 발생하지 않도록 코드를 변경합니다.
    • grpc-java_root/netty/src/main/java/io/grpc/netty/ProtocolNegotiators.java의 대상 코드 변경
    • userEventTriggered0 함수에서 다음을 변경합니다.
      if (NEXT_PROTOCOL_VERSIONS.contains(handler.applicationProtocol())) {
      to
      if (handler.applicationProtocol() == null || NEXT_PROTOCOL_VERSIONS.contains(handler.applicationProtocol())) {
      코드는 다음과 같습니다.
          @Override
          protected void userEventTriggered0(ChannelHandlerContext ctx, Object evt) throws Exception {
            ...
                if (handler.applicationProtocol() == null || NEXT_PROTOCOL_VERSIONS.contains(handler.applicationProtocol())) {
                  // Successfully negotiated the protocol.
                  logSslEngineDetails(Level.FINER, ctx, "TLS negotiation succeeded.", null);
            ...
          }
  5. 프로젝트를 작성하여 대상 패치된 패키지를 생성합니다. gradle을 사용하여 grpc-java 프로젝트 빌드 또는 grpc netty 디렉토리 gradle build에서 grpc-netty 하위 프로젝트만 재구축할 수 있습니다.

    빌드가 완료되면 대상 패치 jar 패키지를 grpc-java\netty\build\libs\grpc-netty-1.23.0.jar 디렉토리에 가져올 수 있습니다.

  6. 패치된 패키지를 Maven 로컬 저장소에 추가합니다.

    다음 두 가지 방법 중 하나로 공식 grpc-netty jar 패키지를 패치된 패키지로 바꿉니다.
    • Maven을 사용하여 로컬 파일로 패키지를 설치합니다.
      mvn install:install-file -Dfile=local_patched_grpc_netty_package_root/grpc-netty-1.23.0.jar -DgroupId=io.grpc -DartifactId=grpc-netty -Dversion=1.23.0 -Dpackaging=jar
      groupid, artifactidversion 대상은 바꿀 패키지와 동일하게 유지해야 합니다.
    • 수동으로 패키지를 교체합니다. 로컬 Maven 저장소로 이동하여 대상 패키지가 있는 디렉토리를 찾고 패키지를 패치된 패키지로 바꿉니다.

  7. 프로젝트를 실행합니다.