evernym moblie sdk 2. Wallet 및 Cloud Agent 초기화

박소정·2021년 10월 12일
0

블록체인

목록 보기
2/5

https://gitlab.com/evernym/mobile/mobile-sdk/-/blob/main/docs/2.Initialization.md
원문서 링크


1. 소개

Evernym 모바일 SDK를 사용하려면, 현재 SDK가 Evernym에서 호스팅되고 프로비저닝 되는 클라우드에 연결되고 이에 의존해야 한다. 후에 Evernym 클라우드 에이전트를 다른 공급업체의 에이전트로 교체해도 Evernym 모바일 SDK와 함게 사용할 수 있다. 에이전트는 저장 후 전달 서비스, 지속성 및 가용성, 장치에 알람 푸시하거나 http를 통해 후원자에게 전달하는 기능에 사용된다. 기본적으로 Evernym 호스팅 클라우드 서비스는 잠겨있다. 모바일 SDK 인스턴스가 새로운 호스팅 클라우드 에이전트를 프로비저닝 할 수 있는 권한이 있음을 증명하려면 프로비저닝 토큰을 제공해야 한다.

  • 프로비저닝 : 사용자의 요구에 맞게 시스템 자원을 할당, 배치, 배포해 두었다가 필요 시 시스템을 즉시 사용할 수 있는 상태로 미리 준비해 두는 것

2. 정의

  • Sponsor
    나 = 후원자. 자체 모바일 앱 내에서 Evernym 모바일 SDK를 사용하는 식
    Sponsor 토근 발행을 수행할 백엔드 서버가 있어야 한다. 후원자는 고객이 Evernym 클라우드 에이전트에 권한을 제공할 수 있도록 프로비저닝 토큰을 제공한다.

  • Sponsee
    모바일 장치에서 개별 응용프로그램을 설치한 고객

  • Evernym Cloud Service
    Evernym은 클라우드 에이전트의 프로비저닝 및 관리를 용이하게 하는 클라우드 서비스를 호스팅 한다.

  • 프로비저닝 토큰
    Evernym 호스팅 클라우드 에이전트에서 Sponsee 중 한 명을 프로비저닝 할 수 있도록 하기 위해 에버님에서 제공한다.

{
   "sponseeId":     String,
   "sponsorId":     String,
   "nonce":         String,
   "timestamp":     String,
   "sig":           String,
   "sponsorVerKey": String,
 } 
  • sponseeId : 고객을 식별/참조하는 데 사용하는 식별자이다. 이것은 백엔드 데이터베이스에서 고객을 식별하는 데 사용되는 고객 ID일 수 있다. 즉 앱 사용자의 ID
  • sponsorId : Sponsor 온보딩 프로세스가 완료된 후 Evernym 지원팀에서 부여한 ID이다.
  • nonce : 무작위로 생성된 문자열로 등록 시 일회성 보안 토큰으로 사용된다.
    ex) random.number.toString()
  • timestamp : RFC 3339 및 ISO 8601 날짜 및 시간 문자열
    ex) 1996-12-19T16:39:57-08:00
  • RFC 3339 & ISO 8601 : 날짜와 시간의 표기에 관한 국제 표준 규격
  • sig : Evernym의 클라우드 에이전트로 프로비저닝할 수 있도록 고객에게 서명을 제공한다.

    Sponsor가
    1. nonce + timestamp + sponseeId + sponsorId 순서로 문자열을 만든다.
    2. 온보딩 프로세스 중에 등록된 키로 결과 문자열에 서명한다.
    키 : sponsorVerkey
    3. Base64는 서명의 결과를 인코딩한다.
    ex) Base64Encode(Sign(nonce+timestamp+sponseeId+sponsorId)

  • sponsorVerKey : 스폰서 온보딩 중에 Evernym 지원팀에서 제공한 키이다.

3. 스폰서 서버

링크텍스트
스폰서 서버 링크


4. Evernym의 클라우드 서비스를 통한 후원 : 온보딩

온보딩에 등록하려면 support@evernym.com 으로 문의!
메일로 학생인데 공부해보고 싶다~ 하면서 문의 보냈더니 거의 두시간만에 답장왔다. 기 메일을 여러번 주고받았는데 거의 답이 정말 빠르게 옴!! 고맙습니다..!
이메일 보낼 때 포함해야 하는 것
1. organization 이름 : 온보딩 아이디가 될 것이니 필수로 작성해야 한다.
2. 확인 키 : 클라우드 서비스에서 프로비저닝하는 동안 고객의 프로비저닝 토큰을 확인하고 인증하는 데 사용된다. 개인키는 보내면 안됨!!! 당연함..
https://github.com/sovrin-foundation/launch/raw/master/sovrin-keygen.zip 여기서 간단하게 생성할 수 있다.
3. endpoint : 클라우드 서비스가 고객에게 메시지를 전달할 때 이용하는 URL. 앱에 푸시알람을 보낼 때 사용하는데 나는 고객 없이 예제를 따라 갈 것이라고 설명했더니, 필수로 보내지는 않아도 된다고 하셨다. 나중에 추가하고 싶을 때 말하면 추가해준다고 하심
=> 필수는 1, 2번

메일을 보내면, 만들어 주겠다는 답메일이 오고 몇시간 뒤면 아이디를 보내주신다.

구성도


5. 모바일 SDK 고객 프로비저닝 개요

  1. 프로비저닝 토큰 받기
  • 스폰서는 고객을 위한 프로비저닝 토큰에 서명해야 한다. 모바일 앱은 토큰을 받기 위해 스폰서와 통신해야한다.
  • 토큰에는 고객의 앱이 그렇게 할 수 있는 권한이 있는지 확인하기 위해 스폰서가 생성한 서명이 포함된다.
  • 토큰필드의 sig 필드는 토큰에 서명하는 방법을 설명한다.
  • 타임스탬프도 포함되어 있다. 토큰이 사전 정의된 시간 프레임 내에 Evernym의 클라우드 서비스에 전달되지 않으면 토큰은 무효가 된다.
  • 어떤 이유든간에 프로비저닝이 실패하면, 고객의 앱은 스폰서에게로 새 토큰을 요청하고, 프로비저닝을 다시시도 해야한다.
  1. 프로비저닝
  • 앱에 프로비저닝 토큰이 있으면 SDK 함수를 호출하여 수신된 토큰으로 프로비저닝을 해야한다.
  • 이 API에는 문자열 유형의 두 매개변수가 필요하다. 이 문자열은 다음 형식을 가진 JSON 문자열화된 객체이다.
  • 이 API에서 반환된 값은 SDK 초기화 기능에 대한 입력이 된다. 프로비저닝 단계는 각 애플리케이션에서 한 번만 수행하면 된다. 다음 실행에서 애플리케이션은 프로비저닝 후 받은 구성 JSON을 사용하고 라이브러리 초기화를 직접 수행해야 한다. 이 시점에서 앱은 클라우드 에이전트와 함께 Evernym 의 클라우드 서비스에 프로비저닝 되고 로컬 지갑이 초기화 되지만 열리지는 않는다. 다음 단계에서 구성 JSON으로 VCX라이브러리를 초기화해야 한다. (그 때 지갑이 열리고 세팅 설정)
    - VCX : 가상 디스크 정의 파일

프로비저닝구성도

  1. 고객의 미래 메시지 수신
    Cloud Agent는 상대방으로부터 메시지를 받기 위해 필요하다. 애플리케이션이 클라우드 에이전트를 프로비저닝 하면 두 가지 방법으로 클라우드 에이전트에섣 메시지를 수신할 수 있다.
  • 폴링 : 고객 애플리케이션이 때때로 Cloud Agent를 호출하여 수신된 모든 메시지를 가져온다. (샘플 애플리케이션에서 쓸 방법)
  • 푸시 알림 : 클라우드 에이전트가 메시지를 전달한 스폰서에게 전달하고, 스폰서가 앱에게 알람을 준다.

6. 애플리케이션 초기화 단계에 자세한 정보

개요

  1. 애플리케이션 환경 데이터 준비
  • 기관 정보는 Cloud Agent 프로비저닝에 사용된다.
  • Pool Ledger Network에 대한 Genesis 트랜잭션이 사용된다.
  • 애플리케이션 메타 정보 (name, logo)
  1. 1단계 : 응용프로그램 초기화
  • 지갑이 위치할 디렉토리를 생선한다.
  • (선택사항) 지갑 키를 생성한다. 이 키는 지갑에 저장된 SDK 데이터의 암호화에 사용되는 키를 파생하는 데 사용된다.
  • 스폰서 서버 백엔드 API를 호출하여 프로비저닝 토큰을 가져온다.
  • VCX 함수를 호출하여 수신된 토큰으로 Cloud Agent 프로비저닝
    안드로이드 : VcxApi.vcxInitWithConfig
  1. 2단계 : 응용프로그램 실행
  • 애플리케이션 초기화 후 수신된 프로비저닝된 JSON 구성을 읽는다.
  • VCX 함수를 호출하여 준비된 JSON 구성으로 라이브러리 초기화한다.
    안드로이드 : VcxApi.vcxInitWithConfig

호출시에 볼 수 있는 에러들

  • GNR-115 : 사용하려는 에이전시에 정보가 저장되지 않은 경우 반환된다.
  • GNR-117 : 이미 사용중임을 나타낸다. 따라서 앱은 스폰서 토큰 엔드포인트를 호출하고 새 프로비저닝 토큰을 가져와야 한다. 그런다음 새 토큰으로 ㄷ사ㅣ 호출해야한다.
  • Provision Agent Error: Error Creating a wallet
    Caused by: Could not create wallet ...: "Error: IO error Caused by: Operation not permitted (os error 1)"
    : 애플리케이션 권환과 관련있다. MSDK가 안드로이드 외부 저장소에 .indy_sdk폴더를 만들려고 하지만 IO 오류가 발생한다.
    Os.setenv("EXTERNAL_STORAGE", Utils.getRootDir(config.context), true);프로비저닝 단계 전에 특정 위치 에 추가하여 문제를 해결해야 한다.

안드로이드

링크텍스트
참조 문서

  1. libVcx 는 slf4j 로깅 라이브러리를 사용한다. 지정된 파일에 libVcs 로그를 저장하기 위한 구성 샘플 : ConnectMeVcx.java#131

  2. 네트워크 구성에 사용된 Genesis 트랜잭션 풀 Constants.java#3.
    이 구성은 프로덕션 네트워크를 대상으로 한다. 앱이 다른 네트워크와 함께 작동하는 경우 다른 환경에 대한 해당 제네시스 트랜잭션 파일은 https://github.com/sovrin-foundation/sovrin/tree/master/sovrin 에서 찾을 수 있다. 파일은 파일 시스템에 저장해야 하며 libVcs에 액세스 할 수 있어야 한다. 샘플 : ConnectMeVcx.java#L146

  3. 첫 번째 초기화 시(JSON 구성을 채우지 않은 경우) 다음 단계를 수행해야 한다.

    1. 지갑이 위치할 디렉토리를 생성한다.
    2. 지갑 키를 생성한다. ConnectMeVcx.java#L195
    3. 구성 JSON을 준비한다. https://gitlab.com/evernym/mobile/mobile-sdk/-/blob/main/docs/2.Initialization.md#sdk-provisioning-config-sample
    4. 스폰서 서버 백엔드 API를 호출하여 프로비저닝 토큰을 가져온다 MainActivity.java#202
    5. 필요한 필드를 채우기 위해 준비된 함수 호출 UtilsApi#vcxAgentProvisionWithToken()
    6. 결과 JSON은 나중에 사용할 수 있도록 저장해야 한다. 이 JSON은 libVcx를 초기화하는 데 사용된다.
  4. 두 번째 및 기타 애플리케이션 초기화 시 스토리지에거 구성(첫 번째 애플리케이션 실행 중 3단계에서 생성됨)을 가져와야 하고 libVcx를 직접 초기화해야 한다. ConnectMeVcx.java#L320


7. 원장 및 클라우드 서비스 선택

풀 원장

Indy 기반 풀 원장 네트워크는 검증 가능한 자격 증명 교환에 사용되는 엔티티를 저장하는데 사용하는 공개적으로 사용 가능한 분산 스토리지를 나타낸다.

  • demo : 개발 및 테스트 중 테스트 목적으로 사용된다
  • prod : 프로덕션 환경, AppStored 앱 출시 용

Evernym 클라우드 서비스

사용 Agency Url, Agency DID및 Agency Verification Key특정 환경에서 값을 준비하는 agency_did, agency_url그리고 agency_verkeySDK를 초기화 설정 필드.

SDK 프로비저닝 구성 샘플

{
  // These fields are used for agency configuration
  "agency_url": "http://agency.pps.evernym.com", // URL of agency to use
  "agency_did": "3mbwr7i85JNSL3LoNQecaW", // DID of agency
  "agency_verkey": "2WXxo6y1FJvXWgZnoYUP5BJej2mceFrqBDNPE3p6HDPf", // Verification key of the agency

  //These fields are used for wallet configuration
  "wallet_name": "wallet-name-wwwww-wallet",  // Name of the wallet
  "wallet_key": "viM/BUU7I+Ypn+AdXAIQUAGX59pteVzau7Z7Jv3Ll6nzmYsSHrFqRdT71tjoMhTPRM2uSnqt8tDTSOLMP1KVf0fl1uP/dPsWu7cjucMsqfK8ohb92amhAWnNn+8s8UWC5owLN3EXZuilqYtjtRZtRUm/hhK5ycQ/OuxMgNPpfUQ=", // Name of the wallet

  // Communication Protocol
  "protocol_type": "3.0", // Type of the protocol

  // Pool Ledger
  "path": "/data/user/0/me.connect.sdk.java.sample/files/connectMeVcx/pool_transactions_genesis", // path to file containing pool genesis transactions

  // User Meta
  "logo": "https://robothash.com/logo.png", // url leading to image
  "name": "real institution name" // name to use
}

0개의 댓글