Amazon Web Services 한국 블로그

Amazon Managed Blockchain 기반 Hyperledger Fabric 애플리케이션 개발 및 배포

지난 AWS re:Invent 2018에서 완전관리형 블록체인 서비스인 Amazon Managed Blockchain을 발표했습니다. 이 서비스를 사용하면 주요 오픈 소스 프레임워크인 Hyperledger Fabric 및 Ethereum을 사용하여 조정 가능한 블록체인 네트워크를 손쉽게 생성하고 관리할 수 있습니다. Hyperledger Fabric 프레임워크 지원과 함께 이 서비스를 미리 볼 수 있으며 Ethereum에 대한 지원도 곧 제공될 예정입니다. Managed Blockchain에 대한 자세한 내용은 What Is Amazon Managed Blockchain을 참조하십시오. 서비스를 사용하려면 미리 보기에 등록하십시오.

이 게시물에서는 Managed Blockchain을 사용하여 Hyperledger Fabric 블록체인 네트워크를 구축하는 방법을 배워볼 수 있습니다. 여기서는 Fabric 네트워크를 생성한 후 네트워크를 사용하여 비영리 조직에 대한 기부금을 추적하는 3계층 애플리케이션을 배포합니다. 비영리 조직의 목표는 후원자를 파악하고 기부금의 지출 내역을 투명하게 유지하는 것입니다. 기부자가 낸 각 기부금에 대해 Hyperledger Fabric은 기부금 지출의 세부 내역을 추적합니다. 기부자는 이 정보를 사용하여 비영리 조직에서 기부금이 예상대로 쓰여지고 있는지 여부를 확인할 수 있습니다.

블록체인은 기부 조직, 투자자, 자선 기관, 공급업체 및 비영리 조직 자체를 포함하는 모든 네트워크 멤버 간의 신뢰를 증진하기 때문에 이 시나리오에 적합합니다. 네트워크의 모든 멤버는 기부금 및 지출 레코드의 고유한 복사본을 가지며 이 복사본은 변경 불가능하고 암호로 보호됩니다. 멤버들은 이 레코드를 사용하여 기부금이 얼마나 효과적으로 지출되고 있는지를 개별적으로 검토할 수 있습니다. 이와 같은 투명성은 비영리 조직에서 효율적으로 비용을 절감할 수 있게 할 뿐 아니라 비용 절감에 대한 정보를 보다 쉽게 파악할 수 있도록 합니다.

아키텍처 개요

애플리케이션은 다음 계층으로 구성됩니다.

  1. Fabric 피어 노드에서 실행되는 Hyperledger Fabric 체인코드. 체인코드는 Fabric 네트워크에서 데이터를 쿼리하고 트랜잭션을 호출하는 스마트 계약입니다.
  2. Hyperledger Fabric Client SDK를 사용하여 Fabric 네트워크와 상호 작용하고 체인코드가 제공하는 함수를 표시하는 RESTful API. Hyperledger Fabric Client SDK는 채널 생성/조인, 체인 코드 설치/인스턴스화 및 데이터 쿼리 또는 트랜잭션 호출을 위한 API를 제공합니다.
  3. RESTful API가 제공한 API를 호출하는 사용자 인터페이스 애플리케이션.

이 아키텍처는 애플리케이션의 최종 사용자에게 Hyperledger Fabric 네트워크의 내부 작동이 표시되지 않는 방식으로 느슨한 결합 및 추상화를 제공합니다. 실제로 Fabric 네트워크에서 수신된 블록을 표시하는 사용자 인터페이스의 슬라이더 구성 요소를 제외하면 최종 사용자에게 이 아키텍처의 기반 기술이 블록체인임을 드러내는 표시는 어디에도 없습니다.

사용자 인터페이스 개발자는 이 느슨한 결합을 통해 Hyperledger Fabric 또는 체인코드에 대한 지식 없이 RESTful API가 제공하는 기능을 사용할 수 있습니다. 이와 같이 느슨한 결합은 익숙한 환경에서 웹, 모바일 또는 기타 유형의 애플리케이션을 포함하는 다양한 애플리케이션을 개발할 수 있게 합니다.

이 문서의 나머지 부분은 다음과 같이 아키텍처의 서로 다른 계층을 설명하는 4개 섹션으로 구분되어 있습니다.

  • 1부에서는 Amazon Managed Blockchain을 사용하여 Hyperledger Fabric 네트워크를 구축합니다.
  • 2부에서는 체인코드 형태의 비즈니스 논리를 Fabric 네트워크에 배포합니다.
  • 3부에서는 Hyperledger Fabric Client SDK를 사용하여 체인코드와 상호 작용하는 RESTful API를 배포합니다.
  • 4부에서는 RESTful API를 통해 표시되는 기능을 사용하는 애플리케이션을 배포합니다.

최종 사용자의 요청은 그림 1에 표시된 것과 같이 계층을 따라 흐릅니다. 사용자가 사용자 인터페이스에서 작업을 수행하면 REST API가 RESTful API 서버를 호출합니다. 이어서 API는 Fabric SDK를 사용해 Managed Blockchain의 Hyperledger Fabric 구성 요소와 상호 작용하여 트랜잭션을 호출하거나 데이터를 쿼리합니다.

그림 1 – 사용자와 Hyperledger Fabric 애플리케이션의 상호 작용

소스코드 리포지터리

이 게시물에 필요한 코드는 Git 리포지토리에 있으며, 아래 4단계를 통해 최종 애플리케이션을 생성하는 데 필요한 아티팩트가 있습니다.

https://github.com/aws-samples/non-profit-blockchain

이 게시물의 각 단계는 Git 리포지토리의 일치하는 단계에 연결됩니다. 이 게시물에서는 각 단계를 진행하면서 수반된 리포지토리에 있는 README 파일의 단계를 자세히 설명합니다.

Managed Blockchain 미리 보기 자체에는 현재 요금이 부과되지 않지만 이 게시물의 단계를 실행하면 다른 AWS 리소스가 소비되므로 해당하는 요금이 청구됩니다.

1. Hyperledger Fabric 네트워크 구축

먼저, AWS 계정이 Managed Blockchain 미리 보기에 추가되었는지 확인합니다. 다음으로 AWS Management Console에서 클릭 몇 번으로 Managed Blockchain을 사용하는 Hyperledger Fabric 네트워크를 생성합니다. Managed Blockchain 콘솔에서 [Create a network]를 선택합니다. [Hyperledger Fabric] 프레임워크를 선택하고 네트워크 이름을 지정합니다. [Next]를 선택합니다.

네트워크에 추가할 초기 멤버의 이름을 입력합니다. 멤버는 Hyperledger Fabric 조직에 해당하며 주로 실제 조직에 매핑됩니다. 상호 거래하는 조직의 컨소시엄으로 Fabric 네트워크를 만들려는 경우 이 컨소시엄의 단일 조직이 멤버가 될 수 있습니다.

마지막으로 멤버 관리자의 사용자 이름과 암호를 입력합니다. Amazon Managed Blockchain 네트워크의 개별 멤버는 사용자의 멤버 등록을 담당하는 자체 CA(인증 기관)가 있습니다. 여기에 이 정보를 입력하면 이 Hyperledger Fabric 멤버에 대한 관리자 역할을 가진 ID가 정의됩니다.

입력한 세부 정보를 검토한 후 네트워크 및 멤버를 생성합니다.

이러한 단계에 대한 자세한 내용은 수반된 리포지토리에서 Part 1, Step 1: Create the Hyperledger Fabric blockchain network를 참조하십시오.

Managed Blockchain은 완전관리형 서비스입니다. 이 서비스는 Hyperledger Fabric 주문 서비스와 각 멤버를 위한 Fabric CA 같은 공유 구성 요소를 생성하고 관리하며 이러한 구성 요소를 엔드포인트에 표시합니다. 이후 단계에서는 VPC(Virtual Private Cloud) 종단점을 사용하여 이러한 구성 요소의 엔드포인트를 계정의 VPC에 제공합니다.

Hyperledger Fabric 피어 노드 생성

Hyperledger Fabric 네트워크 및 멤버가 활성 상태가 되면 Fabric 피어 노드를 생성할 수 있습니다. 피어 노드는 Fabric 스마트 계약(예: 체인코드)이 실행되는 위치입니다. 또한 피어 노드에는 암호로 보호되어 변경 불가능한 트랜잭션 로그(또는 “블록체인”)를 보관하는 저널과 원장의 현재 상태를 저장하는 키-값 스토어(world state)의 두 부분으로 구성되는 Fabric 원장이 포함됩니다.

1부, 2단계에는 피어 노드를 생성하는 단계가 포함되어 있습니다. 네트워크의 각 멤버는 고유한 피어 노드를 생성하므로 이전에 생성한 멤버를 선택하고 링크를 선택하여 피어 노드를 생성합니다. 인스턴스 유형과 해당 노드의 스토리지 양을 선택하고 피어 노드를 생성합니다.

주문 서비스 및 CA와 마찬가지로 각 멤버의 피어 노드는 Amazon Managed Blockchain을 통해 관리되며 VPC에서 VPC 종단점을 통해 액세스할 수 있습니다.

이 단계를 완료하면 고가용성 주문 서비스 및 CA와 단일 피어가 포함된 Hyperledger Fabric 네트워크가 만들어집니다. 이 게시물의 나머지 부분에서는 범위를 좁히기 위해 이 단일 멤버 네트워크를 유지합니다. 그러나 다중 멤버의 분산 네트워크를 시뮬레이션하는 대부분의 강력한 테스트 또는 프로덕션 시나리오에서는 Amazon Managed Blockchain 콘솔 또는 API를 사용하여 네트워크에 조인할 다른 멤버를 초대할 수 있습니다. 다음 블로그 게시물에서는 이러한 단계를 살펴봅니다.

이제 채널을 생성하고 체인코드를 설치하고 트랜잭션을 호출할 때 Fabric 네트워크와 상호 작용할 방법이 필요합니다.

VPC에 Hyperledger Fabric 클라이언트 노드 생성

Amazon Managed Blockchain으로 프로비저닝된 Fabric 구성 요소와 상호 작용하려면 오픈 소스 Hyperledger Fabric CLI 또는 SDK를 다운로드하고 사용합니다. Managed Blockchain에 의해 표시되는 엔드포인트와 상호 작용하도록 이러한 클라이언트를 구성해야 합니다. 이 CLI는 체인코드를 설치, 쿼리 및 호출하고 채널을 생성 및 조인하는 데 사용되는 피어 바이너리입니다.

그림 2에 나와 있듯이 Amazon Managed Blockchain으로 관리되는 Hyperledger Fabric 구성 요소는 계정의 VPC에 프로비저닝한 Fabric 클라이언트 노드(예: 클라이언트 A)를 통해 액세스됩니다. Fabric 클라이언트 노드는 오픈 소스 Hyperledger Fabric CLI를 호스팅하며 사용자는 이 클라이언트 노드에서 VPC 종단점을 통해 Fabric 네트워크와 상호 작용할 수 있습니다. VPC와 관리형 Fabric 네트워크 간의 모든 네트워크 트래픽은 AWS 백본을 통해 발생하며 퍼블릭 인터넷에 공개되지 않습니다.

그림 2 – 2개 멤버를 포함하는 Amazon Managed Blockchain 네트워크의 레이아웃

AWS CloudFormation을 사용하여 AWS 계정의 새 VPC, Fabric 클라이언트 노드로 구성된 Amazon EC2 인스턴스 및 Fabric 네트워크와의 통신을 위한 VPC 종단점을 프로비저닝합니다.

GitHub 리포지토리의 1부, 3 및 4단계에 Fabric 클라이언트 노드를 프로비저닝하고 준비하는 방법이 설명되어 있습니다. 1부의 사전 조건에 따라 AWS Cloud9 환경을 생성하는 것을 잊지 마십시오. AWS Cloud9는 브라우저를 통해 코드를 작성하고 실행하고 디버깅할 수 있는 클라우드 기반 IDE(통합 개발 환경)입니다. 그러나 이 IDE 기능은 사용하지 않을 것입니다. 대신 AWS Cloud9를 통해 제공되는 Linux 명령줄을 사용합니다. 여기에는 AWS CLI 등 필요한 일부 패키지가 미리 설치되어 있습니다.

Hyperledger Fabric 채널 생성 및 체인코드 설치

이제 Fabric 클라이언트 노드에서 Fabric 네트워크에 채널을 생성합니다. Hyperledger Fabric의 채널은 애플리케이션과 피어 노드의 상호 작용과 비공개 상호 거래에 사용되는 수단입니다. Fabric 네트워크는 각 채널의 멤버 조합이 서로 다른 다수의 채널을 지원할 수 있습니다.

채널 생성 프로세스에는 프로필 형태의 채널 정의가 있는 채널 구성 파일(configtx.yaml)을 생성하는 작업이 포함됩니다. Hyperledger Fabric 채널 구성(configtxgen) 도구를 사용하여 configtx.yaml의 프로필 중 하나를 기반으로 바이너리 채널 생성 트랜잭션 파일을 생성합니다. 그런 다음 채널 생성 트랜잭션 파일을 Fabric 주문 서비스에 제출하면 채널이 생성됩니다. 이때 블록 0, 즉 채널 기원 블록이 생성됩니다. 이 블록은 채널에 추가되고 피어 노드로 반환되며 피어는 이 블록을 사용하여 채널에 조인할 수 있습니다.

채널을 생성한 후 샘플 체인코드를 피어 노드에 설치하고 채널의 체인코드를 인스턴스화합니다. 샘플 체인코드는 Hyperledger Fabric 샘플 리포지토리에서 가져온 것이며 Fabric 클라이언트 노드에 미리 복제되었습니다. 체인코드 설치는 체인코드를 패키지로 만들고 피어에 복사하는 단순한 작업이지만 체인코드 인스턴스화는 체인코드를 채널에 바인딩하는 바인딩 프로세스입니다.

체인코드를 인스턴스화할 때는 다수의 작업이 수행됩니다.

  • 체인코드에 대한 인증 정책이 설정됩니다. 자세한 내용은 Hyperledger Fabric 사이트의 Endorsement policies를 참조하십시오.
  • 체인코드를 인스턴스화하는 피어 노드에서 체인코드를 시작하는 Docker 이미지가 구축됩니다.
  • 체인코드에서 원장을 시작하는 init 메서드가 호출됩니다.

채널을 생성하고 체인코드를 설치 및 인스턴스화하려면 GitHub 리포지토리에서 1부의 5~9단계를 따릅니다.

체인코드 쿼리 및 트랜잭션 호출

10~12단계에서 체인코드를 쿼리하고 체인코드 트랜잭션을 호출한 다음 체인코드를 다시 쿼리하여 트랜잭션의 결과를 확인합니다. 그림 3에 나와 있듯이 체인코드 쿼리는 피어 노드에서 수행됩니다. 여기서 체인코드는 원장의 현재 상태를 저장하는 키-값 스토어인 world state를 쿼리합니다. 채널에 조인한 각 피어 노드에는 world state의 동일한 복사본이 저장됩니다.

그림 3 – 피어를 통한 체인코드와 Hyperledger Fabric 원장의 상호 작용

이 그림은 트랜잭션을 호출할 때 시작되는 트랜잭션 흐름을 보여줍니다. Fabric 클라이언트 애플리케이션이 인증을 위해 네트워크의 인증 피어에 트랜잭션 제안을 전송합니다. 인증 피어는 트랜잭션을 시뮬레이션하고 클라이언트 애플리케이션으로 결과를 반환합니다. 클라이언트 애플리케이션은 인증된 모든 트랜잭션 응답을 패키지로 만들고 이 패키지를 주문 서비스에 제출합니다. 트랜잭션이 주문되고 블록으로 분할된 후 채널에 조인한 모든 피어 노드로 다시 전송됩니다. 여기서 트랜잭션이 검증되고 트랜잭션의 읽기/쓰기 세트가 확인되며 각 트랜잭션은 world state를 업데이트합니다. 블록은 최종적으로 원장에 추가됩니다.

1부에서는 다음 작업을 수행했습니다.

  • Amazon Managed Blockchain 및 프로비저닝된 피어 노드를 사용하여 Hyperledger Fabric 네트워크 생성
  • VPC 종단점을 통해 Fabric 네트워크에 연결하는 Fabric 클라이언트 노드에서 새 VPC 생성
  • 새 채널 생성
  • 피어에 체인코드 설치 및 채널의 채널코드 인스턴스화
  • 체인코드를 쿼리하고 트랜잭션을 호출하여 world state를 업데이트하고 새 블록을 블록체인에 추가

2. 비영리 조직의 트랜잭션에 대한 체인코드 배포 및 테스트

체인코드 배포 프로세스는 1부에서 익혔습니다. 2부에서 유일한 차이점은 Hyperledger Fabric 클라이언트 노드에 이미 있는 샘플 체인코드를 배포하지 않고 비영리 조직의 애플리케이션에 대한 체인코드를 리포지토리에서 가져와서 배포하는 것입니다.

Fabric 클라이언트 노드에 대한 배경 지식이 있으면 이 프로세스를 보다 확실히 이해할 수 있습니다. Fabric 클라이언트 노드는 cli라는 이름의 Docker 컨테이너를 실행하는 EC2 인스턴스입니다. 직접 보려면 SSH를 사용하여 Hyperledger Fabric 클라이언트 노드에 연결한 후 docker ps를 입력합니다. docker inspect cli를 입력하면 Docker 컨테이너에 탑재된 호스트 EC2 인스턴스의 디렉터리를 포함하여 cli 컨테이너에 대한 자세한 정보가 표시됩니다. 예를 들어 /home/ec2-user/fabric-samples/chaincode 디렉터리가 탑재된 경우 EC2 Fabric 클라이언트 노드의 이 디렉터리에 체인코드(또는 모든 파일)를 복사하기만 하면 cli 컨테이너에서 사용할 수 있게 됩니다. cli 컨테이너에서 사용할 수 있게 된 후에는 peer chaincode install 명령을 사용하여 피어 노드에 체인코드를 설치할 수 있습니다.

채널에서 비영리 조직의 체인코드를 복사, 설치 및 인스턴스화하려면 GitHub 리포지토리에서 Part 2: Non-profit (NGO) Chaincode의 단계를 수행합니다.

3. RESTful API 서버 배포

RESTful API 서버는 Hyperledger Fabric Client SDK를 사용하여 Fabric 네트워크와 상호 작용하는 Node.js Express 애플리케이션입니다. 이전에 언급했듯이 Hyperledger Fabric Client SDK는 풍부한 기능을 제공합니다. 여기에는 채널을 생성 및 조인하고, 체인코드를 설치 및 인스턴스화하고, 블록 높이 및 채널 구성 정보 같은 블록체인 메타데이터를 쿼리하는 API가 포함됩니다. 이 게시물에서는 일부 SDK 기능을 사용하여 체인코드를 쿼리하고 트랜잭션을 호출합니다.

RESTful API Node.js 애플리케이션을 Fabric 네트워크에 연결하려면 두 가지 옵션을 선택할 수 있습니다.

  1. Hyperledger Fabric Client SDK가 제공하는 API를 사용하여 네트워크의 주문 서비스, CA 및 피어 노드에 연결합니다.
  2. Fabric 네트워크의 구조를 설명하는 YAML 파일인 연결 프로필을 생성합니다. 이 파일을 Fabric Client SDK에 전달합니다. SDK는 이 파일을 사용하여 Fabric 네트워크에 연결하고 상호 작용합니다.

여기서는 연결 프로필을 생성하는 두 번째 접근 방식을 사용합니다. 스크립트를 사용하여 네트워크에 대한 단순한 연결 프로필을 생성하는 3부의 3단계에서 이 방법을 확인할 수 있습니다.

Part 3: RESTful API to expose the Chaincode의 단계에 따라 Node.js RESTful API 서버를 배포합니다.

4. Node.js/Angular 사용자 인터페이스 애플리케이션 실행

사용자 인터페이스 애플리케이션은 RESTful API 서버를 통해 제공되는 API를 호출하는 Node.js/Angular 애플리케이션입니다. 이 애플리케이션은 Hyperledger Fabric Client SDK를 사용하지 않으며 Fabric 네트워크에 연결하지도 않습니다. 대신 애플리케이션에서 작업을 수행할 때마다 해당하는 REST API 함수가 호출됩니다.

또한 모든 애플리케이션 데이터는 Fabric 네트워크가 소유합니다. 갤러리에 표시되는 이미지를 제외한 모든 데이터는 Fabric world state 데이터베이스에서 RESTful API 및 Fabric 체인코드를 통해 검색됩니다. 이 애플리케이션은 다음과 같은 기능을 포함하여 기부자가 기부금 지출 내역을 추적하는 데 필요한 기능을 제공합니다.

  • 기부자는 각 비영리 조직을 검토하고, 이러한 조직에 자금을 제공하고, 조직을 평가할 수 있습니다.
  • 기부자는 각 비영리 조직에서 자금을 지출한 품목을 보고, 각 지출 품목에 사용된 기부금의 액수를 볼 수 있습니다.
  • 기부자는 개인적으로 기부한 금액을 추적할 수 있습니다.

애플리케이션 배포 단계는 모든 Node.js 애플리케이션에서 동일합니다. RESTful API에 대한 엔드포인트를 Node.js 애플리케이션에 제공하기 위해 3단계에 설명된 대로 한 가지 항목만 간단히 편집하면 됩니다.

Part 4: The User Interface의 단계에 따라 Node.js 사용자 인터페이스 애플리케이션을 배포합니다.

결론

이 게시물의 단계를 완료하느라 수고가 많으셨습니다. 이 게시물에서는 Amazon Managed Blockchain을 사용하여 Hyperledger Fabric 네트워크를 구축하고, 체인코드, RESTful API 및 사용자 인터페이스 애플리케이션으로 구성된 다중 계층 애플리케이션을 배포했습니다. 또한 블록체인을 기반 데이터 원본으로 사용하는 작동하는 애플리케이션을 배포했습니다.

사용자 인터페이스에서 Hyperledger Fabric 네트워크로부터 수신한 블록을 보여주는 슬라이더 구성 요소를 제외하면 최종 사용자에게 기반 기술이 블록 체인임을 드러내는 표시는 어디에도 없습니다. 웹 및 모바일 같은 다중 채널을 지원할 수 있는 REST API를 사용하여 블록체인에서 애플리케이션을 추상화하고, 표준 WebSocket 프로토콜을 통해 블록 알림을 제공했습니다.

다음 단계에서는 이 애플리케이션을 분산 아키텍처에서 시뮬레이션하는 테스트 네트워크를 만들기 위해 Fabric 네트워크에 멤버를 추가하고 이러한 멤버를 통해 동일한 채널에 조인하는 피어를 프로비저닝합니다. 이후 블로그 게시물에서는 이 주제에 대해 다룰 것입니다.

미리 보기에 등록하여 Amazon Managed Blockchain을 평가해 보십시오.

감사의 말

  • 훌륭한 UI 애플리케이션을 구축해주신 Siva Puppala, Khan Iftikhar, Rangavajhala Srikanth 및 Pentakota Deekshitulu 님
  • 수반된 리포지토리를 검토하고 테스트해주신 Michael Braendle 님

 

Michael Edge 는 AWS Professional Services에서 블록체인, 컨테이너 및 마이크로서비스를 전문적으로 다루는 수석 클라우드 아키텍트입니다.

이 글은 AWS Database 블로그 Build and deploy an application for Hyperledger Fabric on Amazon Managed Blockchain의 한국어 번역입니다.