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 가이드

DApp 개발에 들어가기 전에

  1. 루니버스 콘솔에서 하이퍼레저 패브릭 Open Beta 사용 등록을 하고, 체인코드를 배포한 이후 DApp 개발을 진행하시기 바랍니다.
    참고 : Open Beta 네트워크 사용하기
    참고 : Console에서 체인코드(Chain Code) 배포하기
  1. 하이퍼레저 패브릭의 Transaction Flow에 대해 대략적인 이해가 있음을 전제로 하고 있습니다. 따라서 공식 하이퍼레저 문서를 참조하여 관련 내용을 확인하시길 바랍니다.
    하이퍼레저 공식 문서 확인하기

DApp 개발 준비하기

  1. [Download SDK Configuration]을 클릭하여 SDK Configuration을 로컬 PC에 다운로드 받습니다. 파일 이름은 connection-profile-<네트워크이름>.yaml 과 같은 형식으로 저장됩니다.

  2. [Download MSP Info]를 클릭하여 MSP 정보를 로컬 PC에 다운로드 받습니다. MSP 정보 파일은 zip으로 압축되어 있으며 압축을 풀면 cert.pem, key.pem 파일이 포함되어 있습니다.

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

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 Open Beta에서의 보증 정책은 두 개의 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 18 days ago

하이퍼레저 DApp 개발하기 A-Z 가이드


Suggested Edits are limited on API Reference Pages

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