Luniverse User Guide

루니버스 사용을 환영합니다!
이 페이지에서는 루니버스 서비스 사용 가이드를 제공합니다.
루니버스를 사용하여 다양한 디앱(DApp)을 제작해보세요.

Welcome to Luniverse!
This page provides a guide to using the Luniverse service.
Try to create various DApps by utilizing Luniverse.

Guides

하이퍼레저 DApp 개발하기 A-Z가이드 Free Trial 버전

DApp 개발 준비하기

패브릭 클라이언트(DApp)를 만들기 위해서는 패브릭 네트워크에 대한 접속 정보 파일(Connection Profile)과 사용자의 MSP 정보(인증서와 비밀키)가 필요합니다. 루니버스에서는 패브릭 네트워크 접속 정보 파일과 MSP 정보 파일을 자동으로 생성해주며, 사용자는 이 것들을 루니버스 콘솔에서 쉽게 다운로드 받을 수 있습니다.


하이퍼레저 패브릭 Free Trial 체인

루니버스 콘솔에서 하이퍼레저 Free Trial 탭을 선택한 뒤 mychannel을 클릭하면 아래과 같이 Free Trial 체인의 간략한 Overview를 볼 수 있는 화면이 나옵니다.

  • [Download SDK Configuration]을 클릭하여 Free Trial 네트워크의 접속 정보 파일(Connection Profile)을 다운로드 받을 수 있습니다.
  • [Download MSP Info]를 클릭하여 MSP 정보(인증서와 비밀키)를 다운로드 받을 수 있습니다. MSP 정보 파일은 zip으로 압축되어 있으며 압축을 풀면 cert.pem(인증서), key.pem(비밀키) 파일이 포함되어 있습니다.

하이퍼레저 패브릭 SDK 다운로드

하이퍼레저 패브릭 DApp 개발을 위해 원하는 개발 언어에 맞는 SDK를 아래 공식 github에서 다운로드 받아 설치합니다. 루니버스 하이퍼레저 패브릭은 Go, Java, Node.js SDK를 지원합니다.

DApp 서비스코드 작성하기

앞의 과정에서 다운로드 받은 파일들과 SDK를 활용하여 DApp 서비스 코드를 작성합니다. 상세한 SDK 활용 방법은 각각 SDK의 API 문서를 참조 바랍니다.

📘

여기에서는 Java로 개발할 때의 필요한 과정을 Sample Code와 함께 설명합니다. 개발 과정은 참고용이며 반드시 이 순서를 따를 필요는 없습니다.

  1. 루니버스 콘솔에서 다운로드 받은 하이퍼레저 Configuration 파일을 읽어서 채널 객체를 생성합니다. Configuration 파일이 “/Users/glory/connection-profile-hyperledger.yaml” 에 저장되어 있다고 하면 다음과 같은 코드가 됩니다.
org.hyperledger.fabric.sdk.NetworkConfig networkConfig = NetworkConfig.fromYamlFile(new File(“/Users/glory/connection-profile-hyperledger.yaml”));
org.hyperledger.fabric.sdk.HFClient client = HFClient.createNewInstance();
org.hyperledger.fabric.sdk.Channel channel = client.loadChannelFromConfig(“mychannel”, networkConfig);
  1. 루니버스 콘솔에서 다운로드 받은 MSP 정보 파일을 이용하여 FabricUser 객체와 HFClient 객체를 생성합니다. 이 과정은 다음과 같은 코드로 작성됩니다.
java.io.String certificate = new java.io.String(IOUtils.toByteArray(new java.io.FileInputStream(new java.io.File("./cert.pem"))), "UTF-8");
java.io.File privatekeyfile = new java.io.File("./key.pem");

EnrolleMentImpl enrollment = null;
try {
    java.security.PrivateKey privateKey = getPrivateKeyFromBytes( org.apache.commons.io.IOUtils.toByteArray(new java.io.FileInputStream(privatekeyfile)));
    enrollment = new EnrolleMentImpl(privateKey, certificate);
} catch(Exception e){
    e.printStackTrace();
}

org.hyperledger.fabric.sdk.FabricUser user = neworg.hyperledger.fabric.sdk.FabricUser();
user.setMspId(clientOrg.getMspId());
user.setName(userName);
user.setOrganization(clientOrg.getName());
user.setEnrollment(enrollment);

org.hyperledger.fabric.sdk.HFClient client client = org.hyperledger.fabric.sdk.HFClient.createNewInstance();
client.setCryptoSuite(CryptoSuite.Factory.getCryptoSuite());
client.setUserContext(user);

static final class EnrolleMentImpl implements Enrollment, Serializable {
        private static final long serialVersionUID = -2784835212445309006L;
        private final PrivateKey privateKey;
        private final String certificate;

        public EnrolleMentImpl(PrivateKey privateKey, String certificate) {
                this.certificate = certificate;
                this.privateKey = privateKey;
        }

        @Override
        public PrivateKey getKey() {
                return privateKey;
        }

        @Override
        public String getCert() {
                return certificate;
        }
}
  1. HFClient 객체를 이용하여 Peer에 원하는 Transaction Proposal을 전송합니다. 실행하고 싶은 Chaincode 이름을 "mycc", 버전을 "1.0", 호출하려는 함수를 "invoke", 인자(arguments)를 "a,10"이라고 하면 다음과 같은 코드가 생성됩니다.
org.hyperledger.fabric.sdk.ChaincodeID chaincodeID = org.hyperledger.fabric.sdk.ChaincodeID.newBuilder().setName(“mycc”).setVersion(“1.0”).build();

org.hyperledger.fabric.sdk.TransactionProposalRequest transactionProposalRequest = client.newTransactionProposalRequest();
transactionProposalRequest.setChaincodeID(chaincodeID);
transactionProposalRequest.setChaincodeLanguage(TransactionRequest.Type.JAVA);
transactionProposalRequest.setFcn(“invoke”);
transactionProposalRequest.setArgs(“a, 10”);

Collection<org.hyperledger.fabric.sdk.ProposalResponse> proposalResponse = channel.sendTransactionProposal(proposalRequest, channel.getPeers());
  1. Peer에 전송한 Proposal 결과를 확인합니다. Proposal 결과에 따라 성공한 경우 Orderer에 Transaction을 전송하고, 실패한 경우 DApp 서비스에서 실패 처리를 하거나 혹은 Proposal을 재시도 할 수 있습니다.
    결과에 따른 동작 방식은 DApp 서비스의 요구 사항에 맞게 구현하면 됩니다. 현재 루니버스 하이퍼레저 패브릭 BaaS에서의 보증 정책은 여러 개의 Peer 중 하나만 성공해도 Transaction을 처리할 수 있도록 되어 있으나, DApp 자체적으로 2개 Peer 모두 Proposal이 성공해야만 Transaction을 전송하는 방식으로 구현하는 것도 가능합니다. 아래의 샘플 코드와 같이 Transaction을 전송합니다.
for (org.hyperledger.fabric.sdk.ProposalResponse response :proposalResponse) {
    if (response.getStatus() == ProposalResponse.Status.SUCCESS) {
    channel.sendTransaction(response);
    }
}
  1. 모든 Peer에 대해 Proposal 성공 응답을 받고 Transaction을 전송해도 하이퍼레저 패브릭의 스펙상 실제로 Transaction이 Ledger에 반영이 안될 수 있습니다. 따라서 하이퍼레저 패브릭에서는 Transaction 요청의 성공, 실패에 대한 Event를 가급적이면 받아서 처리하는 것을 권장하고 있습니다.
    Java SDK에서도 이를 지원하며 아래와 같은 방식으로 Transaction 전송 코드를 작성하면 됩니다.
channel.sendTransaction(response).thenApply(transactionEvent -> {
    System.out.println("tx success - id : " + transactionEvent.getTransactionID());
    // 성공처리
}).exceptionally(e -> {
    // 실패처리
}).get(5000, TimeUnit.SECONDS);

Updated about a month ago

하이퍼레저 DApp 개발하기 A-Z가이드 Free Trial 버전


Suggested Edits are limited on API Reference Pages

You can only suggest edits to Markdown body content, but not to the API spec.