클라우드 KMS(Key Management System)는 클라우드가 사용자를 대신해 암호화된 키들을 관리해주는 서비스입니다(Google Cloud Platform (GCP) KMS, Amazon Web Services (AWS) KMS).
블록체인 Open API – KMS API는, 이렇게 클라우드 KMS에 보관된 키를 블록체인 계정 지갑 키(Private Key, 지갑 개인키)로 사용할 수 있게 해주는 API입니다. KMS API를 사용하면 사용자가 블록체인 계정 지갑 키를 직접 관리하지 않아도 KMS에 보관된 키로 트랜잭션을 생성하고, 트랜잭션에 서명하고, 이를 블록체인에 전송할 수 있습니다. KMS API가 지원하는 클라우드 KMS 플랫폼은 GCP와 AWS입니다.
예시로, 다음과 같이 KMS API를 사용할 수 있습니다.
클라우드 KMS에 이미 키가 있는 경우
- 클라우드 크리덴셜 준비
- Hive 콘솔 > 블록체인 > KMS 인증 정보 > 인증 정보 추가하기에서 클라우드 서비스 계정 정보(
Credentials
)를 등록하고x-credential-id
를 획득 - 클라우드 KMS 키 정보 준비
- 지갑 주소 등록 API 호출
- 지갑 주소 획득
- KMS 지갑 정보 조회
- KMS 지갑으로 트랜잭션을 생성: 토큰 전송, 스마트 컨트랙트 배포 등 새로운 트랜잭션을 생성하는 API를 호출
- 생성한 트랜잭션에 KMS 서명 API로 서명
- 서명한 트랜잭션을 블록체인 네트워크에 전송
클라우드 KMS를 사용하지 않거나, KMS에 키가 없는 경우
- 클라우드 KMS 서비스 계정 준비
- 지갑 키 생성: 지갑 키 생성 API로 생성
- 클라우드 크리덴셜 준비
- 블록체인 API 인증 키 준비
- Hive 콘솔 > 블록체인 > KMS 인증 정보 > 인증 정보 추가하기에서 클라우드 서비스 계정 정보(
Credentials
)를 등록하고x-credential-id
를 획득 x-credential-id
와 API 인증 키를 사용해 KMS 지갑 키 생성- 지갑 키와 지갑 주소 획득
- KMS 지갑 정보 조회
- KMS 지갑으로 트랜잭션을 생성: 토큰 전송, 스마트 컨트랙트 배포 등 새로운 트랜잭션을 생성하는 API를 호출
- 생성한 트랜잭션에 KMS 서명 API로 서명
- 서명한 트랜잭션을 블록체인 네트워크에 전송
사전 준비
클라우드 KMS Credentials
를 Hive 콘솔 > 블록체인 > KMS 인증 정보 > 인증 정보 추가하기에 등록합니다.
블록체인 계정 지갑 주소와 KMS 지갑 키 생성
클라우드 서비스 계정으로 KMS에 지갑 키를 생성하고, 이 지갑 키를 기반으로 블록체인 계정 지갑 주소를 생성합니다. 지갑 키는 KMS에 저장되고 확인할 수 없습니다. 키 생성 시 지연이 발생하면 지갑 주소가 응답값에 포함되지 않을 수 있습니다. 지갑 주소는 KMS 지갑 정보 조회 API에서 키 아이디(keyId
)를 사용해 조회할 수 있습니다.
Request URL
Live URL | https://bc-api.qpyou.cn/core/v1/kms |
---|---|
Sandbox URL | https://sandbox-bc-api.qpyou.cn/core/v1/kms |
HTTP Method | POST |
Content-Type | application/json |
Header Parameters
필드명 | 설명 | 타입 | 필수 여부 |
---|---|---|---|
x-network | 블록체인 네트워크 {ploygon, xpla} | string | Y |
x-credential-id | Hive 콘솔에 Credentials 등록 시 얻는 고유한 값 |
string | Y |
Authorization | API를 호출하기 위한 인증 토큰 | string | Y |
Request Body
필드명 | 설명 | 타입 | 필수 여부 |
---|---|---|---|
keyName | 생성할 키 이름으로 원하는 내용을 입력합니다. | string | Y |
keyOptions | KMS 지갑 키 옵션 정보 | json | Y |
keyOptions.location | 키를 저장할 위치입니다. 각 클라우드에서 사용하는 KMS 위치 정보입니다. | string |
|
keyOptions.project | GCP 프로젝트 ID | string |
|
keyOptions.keyRing | GCP 키링 정보 | string |
|
Responses
필드명 | 설명 | 타입 |
---|---|---|
code | API 호출 결과 코드, 0:성공 | number |
message | 결과 메시지 | string |
data | API 응답 데이터 | json |
data.keyId | 생성한 키의 고유ID | string |
data.keyName | 생성한 키의 별칭 | string |
data.address | KMS 키로 생성한 블록체인 계정 지갑 주소 | string |
data.purpose | 키 사용 용도 | string |
data.algorithm | 키 생성 알고리즘 종류 | string |
data.cloudType | 클라우드 플랫폼 종류 | string |
data.network | 키를 사용할 블록체인 네트워크 | string |
data.options | 키 옵션 정보 | json |
data.options.project | GCP 프로젝트 ID | string |
data.options.location | 키가 저장되는 위치 | string |
data.options.keyRing | GCP 키링 정보 | string |
data.options.keyVersion | GCP 키 버전 정보 | string |
data.regId | 키 등록자 ID | string |
data.modId | 키 수정자 ID | string |
data.createdAt | 키 등록일 | string |
data.updatedAt | 키 수정일 | string |
Request Sample
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
curl -X 'POST' \ 'https://sandbox-bc-api.qpyou.cn/core/v1/kms' \ -H 'accept: application/json' \ -H 'x-credential-id: eb6cc005-b8d0-bc96-8b60-a531c2f15fd2' \ -H 'x-network: polygon' \ -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJrZXlObyI6MSwiaWQiOiJwbGF0Zm9ybSIsImNvbXBhbnkiO... \ -H 'Content-Type: application/json' \ -d '{ "keyName": "test-key", "keyOptions": { "project": "test-project", "location": "asia-northeast3", "keyRing": "test-keyring" }, "requesterId": "system" }' |
Response Sample
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
{ "code": 0, "message": "success", "data": { "keyId": "test1-game-provider", "keyName": "projects/tribal-octane-403302/locations/asia-northeast3/keyRings/test-keyring-001/cryptoKeys/test1-game-provider/cryptoKeyVersions/1", "address": "0xc5AC98006fe612395b132742Fbe80a6Dc184670a", "purpose": "ASYMMETRIC_SIGN", "algorithm": "EC_SIGN_SECP256K1_SHA256", "cloudType": "gcp", "network": "polygon", "options": { "project": "project", "location": "asia-northeast3", "keyRing": "keyring", "keyVersion": "1" }, "regId": "test", "modId": null, "createdAt": "2024-02-22T08:28:04.000Z", "updatedAt": null } } |
블록체인 계정 지갑 주소 등록
KMS 지갑 키를 기반으로 블록체인 계정 지갑 주소를 생성하고 이를 Hive 서버에 등록합니다. GCP 사용 시 키 버전(keyVersion
)을 명시해야 합니다.
Request URL
Live URL | https://bc-api.qpyou.cn/core/v1/kms/import |
---|---|
Sandbox URL | https://sandbox-bc-api.qpyou.cn/core/v1/kms/import |
HTTP Method | POST |
Content-Type | application/json |
Header Parameters
필드명 | 설명 | 타입 | 필수 여부 |
---|---|---|---|
x-network | 블록체인 네트워크 {ploygon, xpla} | string | Y |
x-credential-id | Hive 콘솔에 Credentials 등록 시 얻는 고유한 값 |
string | Y |
Authorization | API를 호출하기 위한 인증 토큰 | string | Y |
Request Body
필드명 | 설명 | 타입 | 필수 여부 |
---|---|---|---|
keys | KMS 지갑 키 정보 | array(json) | Y |
keys.keyId | 생성한 키 고유 ID | string | Y |
keys.keyVersion | GCP 사용 시 키 버전 정보 | string |
|
keyOptions | 키 옵션 정보 | json | Y |
keyOptions.location | 키를 저장할 위치입니다. 각 클라우드에서 사용하는 KMS 위치 정보입니다. | string |
|
keyOptions.project | GCP 프로젝트 ID | string |
|
keyOptions.keyRing | GCP 키링 정보 | string |
|
requesterId | 요청자 ID입니다. API 호출 주체를 구분하기 위한 임의의 값입니다. KMS 지갑 생성 시 Hive 콘솔에서 로그인한 계정 ID가 입력됩니다. | string | N |
Responses
필드명 | 설명 | 타입 |
---|---|---|
code | API 호출 결과 코드, 0:성공 | number |
message | 결과 메시지 | string |
data | API 응답 데이터 | json |
data.keyId | 생성한 키의 고유ID | string |
data.keyName | 생성한 키의 별칭 | string |
data.address | KMS 키로 생성한 블록체인 계정 지갑 주소 | string |
data.purpose | 키 사용 용도 | string |
data.algorithm | 키 생성 알고리즘 종류 | string |
data.cloudType | 클라우드 플랫폼 종류 | string |
data.network | 키를 사용할 블록체인 네트워크 | string |
data.options | 키 옵션 정보 | json |
data.options.project | GCP 프로젝트 ID | string |
data.options.location | 키가 저장되는 위치 | string |
data.options.keyRing | GCP 키링 정보 | string |
data.options.keyVersion | GCP 키 버전 정보 | string |
data.regId | 키 등록자 ID입니다. requesterId 와 동일합니다. |
string |
data.modId | 키 수정자 ID | string |
data.createdAt | 키 등록일 | string |
data.updatedAt | 키 수정일 | string |
Request Sample
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
curl -X 'POST' \ 'https://sandbox-bc-api.qpyou.cn/core/v1/kms/import' \ -H 'accept: application/json' \ -H 'x-credential-id: 9b3c0c1d-868c-71ea-a1a9-e615148b7f14' \ -H 'x-network: polygon' \ -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJrZXlObyI6MSwiaWQiOiJwbGF0Zm9ybSIsImNvbXBhbnkiOm51bGwsInJvb...' \ -H 'Content-Type: application/json' \ -d '{ "keys": [ { "keyId": "test1-game-provider", "keyVersion": "1" } ], "keyOptions": { "project": "kms-test", "location": "asia-northeast3", "keyRing": "key-ring" }, "requesterId": "system" }' |
Response Sample
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
{ "code": 0, "message": "success", "data": { "keyId": "kms-key-002", "keyName": "projects/quixotic-carver-412405/locations/asia-northeast3/keyRings/keyring/cryptoKeys/kms-key-002/cryptoKeyVersions/1", "address": "0x1e0481127b0ed12b6b6911bec32d414d76042860", "purpose": "ASYMMETRIC_SIGN", "algorithm": "EC_SIGN_SECP256K1_SHA256", "cloudType": "gcp", "network": "polygon", "options": { "project": "quixotic-carver-412405", "location": "asia-northeast3", "keyRing": "keyring", "keyVersion": "1" }, "regId": "system", "modId": null, "createdAt": "2024-02-22T08:28:04.000Z", "updatedAt": null } } |
KMS 지갑 키 정보와 계정 지갑 주소 조회
KMS 지갑 키 고유 ID(keyId
) 또는 키 이름(keyName
)으로 KMS 지갑 키 정보와 계정 지갑 주소를 조회합니다. 키 생성 시 지갑 주소를 확인하지 못했다면 사용할 수 있습니다.
Request URL
Live URL | https://bc-api.qpyou.cn/core/v1/kms/{key} |
---|---|
Sandbox URL | https://sandbox-bc-api.qpyou.cn/core/v1/kms/{key} |
HTTP Method | GET |
Content-Type | application/json |
Path Parameters
필드명 | 설명 | 타입 | 필수 여부 |
---|---|---|---|
key | 키 고유 ID 또는 키 이름 | string | Y |
Header Parameters
필드명 | 설명 | 타입 | 필수 여부 |
---|---|---|---|
x-credential-id | Hive 콘솔에 Credentials 등록 시 얻는 고유한 값 |
string | Y |
Authorization | API를 호출하기 위한 인증 토큰 | string | Y |
Responses
필드명 | 설명 | 타입 |
---|---|---|
code | API 호출 결과 코드 , 0:성공 | number |
message | 결과 메시지 | string |
data | API 응답 데이터 | json |
data.keyId | 생성한 키의 고유ID | string |
data.keyName | 생성한 키의 별칭 | string |
data.purpose | 키 사용 용도 | string |
data.algorithm | 키 생성 알고리즘 종류 | string |
data.cloudType | 클라우드 플랫폼 종류 | string |
data.network | 키를 사용할 블록체인 네트워크 | string |
data.options | 키 옵션 정보 | json |
data.options.project | GCP 프로젝트 ID | string |
data.options.location | 키가 저장되는 위치 | string |
data.options.keyRing | GCP 키링 정보 | string |
data.options.keyVersion | GCP 키 버전 정보 | string |
data.regId | 키 등록자 ID | string |
data.modId | 키 수정자 ID | string |
data.createdAt | 키 등록일 | string |
data.updatedAt | 키 수정일 | string |
Request Sample
1 2 3 4 5 6 7 |
curl -X 'GET' \ 'https://sandbox-bc-api.qpyou.cn/core/v1/kms/kms-key-002' \ -H 'accept: application/json' \ -H 'x-credential-id: 9b3c0c1d-868c-71ea-a1a9-e615148b7f14' \ -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJrZXlObyI6MSwiaWQiOiJwbGF0Zm9ybSIsImNvbXBhbnkiOm51bGwsInJvbGUiOiJhZG1pb...' |
Response Sample
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
{ "code": 0, "message": "success", "data": { "keyId": "test1-game-provider", "keyName": "projects/tribal-octane-403302/locations/asia-northeast3/keyRings/test-keyring-001/cryptoKeys/test1-game-provider/cryptoKeyVersions/1", "address": "0xc5AC98006fe612395b132742Fbe80a6Dc184670a", "purpose": "ASYMMETRIC_SIGN", "algorithm": "EC_SIGN_SECP256K1_SHA256", "cloudType": "gcp", "network": "polygon", "options": { "project": "project", "location": "asia-northeast3", "keyRing": "keyring", "keyVersion": "1" }, "regId": "test", "modId": null, "createdAt": "2024-02-22T08:28:04.000Z", "updatedAt": null } } |
KMS 지갑 키 정보와 계정 지갑 주소 목록 조회
KMS 지갑 키 정보와 계정 지갑 주소 목록을 조회합니다.
Request URL
Live URL | https://bc-api.qpyou.cn/core/v1/kms |
---|---|
Sandbox URL | https://sandbox-bc-api.qpyou.cn/core/v1/kms |
HTTP Method | GET |
Content-Type | application/json |
Header Parameters
필드명 | 설명 | 타입 | 필수 여부 |
---|---|---|---|
x-network | 블록체인 네트워크 {ploygon, xpla} | string | Y |
x-credential-id | Hive 콘솔에 Credentials 등록 시 얻는 고유한 값 |
string | Y |
Authorization | API를 호출하기 위한 인증 토큰 | string | Y |
Query Parameters
필드명 | 설명 | 타입 | 필수 여부 |
---|---|---|---|
page | 현재 페이지 번호 | number | N |
limit | 한 페이지에 노출할 KMS 지갑 키 정보와 계정 지갑 주소의 개수 | number | N |
Responses
필드명 | 설명 | 타입 |
---|---|---|
code | API 호출 결과 코드, 0:성공 | number |
message | 결과 메시지 | string |
data | API 응답 데이터 | json |
data.kms | KMS 지갑 키 정보와 지갑 주소 목록 | array(json) |
data.meta | 페이지네이션 정보 | json |
data.meta.totalItems | 조회 결과 총 개수(KMS 지갑 키와 지갑 주소 정보 개수) | number |
data.meta.itemsPerPage | 한 페이지에 노출되는 KMS 지갑 키와 지갑 주소 정보 개수 | number |
data.meta.totalPages | 총 페이지 수 | number |
data.meta.currentPage | 현재 페이지 번호 | number |
data.kms
배열에 담기는 각 원소 정보: KMS 지갑 키 정보와 계정 지갑 주소
필드명 | 설명 | 타입 |
---|---|---|
keyId | 생성한 키의 고유ID | string |
keyName | 생성한 키의 별칭 | string |
address | KMS 키로 생성한 블록체인 계정 지갑 주소 | string |
purpose | 키 사용 용도 | string |
algorithm | 키 생성 알고리즘 종류 | string |
cloudType | 클라우드 플랫폼 종류 | string |
network | 키를 사용할 블록체인 네트워크 | string |
options | 키 옵션 정보 | json |
options.project | GCP 프로젝트 ID | string |
options.location | 키가 저장되는 위치 | string |
options.keyRing | GCP 키링 정보 | string |
options.keyVersion | GCP 키 버전 정보 | string |
regId | 키 등록자 ID | string |
modId | 키 수정자 ID | string |
createdAt | 키 등록일 | string |
updatedAt | 키 수정일 | string |
Request Sample
1 2 3 4 5 6 7 8 |
curl -X 'GET' \ 'https://sandbox-bc-api.qpyou.cn/core/v1/kms?page=1&limit=10' \ -H 'accept: application/json' \ -H 'x-credential-id: 41e26545-547e-7632-be1f-289f75c092d2' \ -H 'x-network: polygon' \ -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJrZXlObyI6MSwiaWQiOiJwbGF0Zm9ybSIsImNvbXBhbnkiOm51bGwsInJv...' |
Response Sample
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
{ "code": 0, "message": "success", "data": { "kms": [ { "keyId": "test-polygon-001", "keyName": "projects/tribal-octane-403302/locations/asia-northeast3/keyRings/test-keyring-001/cryptoKeys/test-polygon-001/cryptoKeyVersions/1", "address": "0x599220fb6cd54553b9c2dfda3b0f711d7ebc21fb", "purpose": "ASYMMETRIC_SIGN", "algorithm": "EC_SIGN_SECP256K1_SHA256", "cloudType": "gcp", "network": "polygon", "options": { "project": "tribal-octane-403302", "location": "asia-northeast3", "keyRing": "test-keyring-001", "keyVersion": "1" }, "regId": "system", "modId": null, "createdAt": "2024-02-22T08:27:58.000Z", "updatedAt": null },{ "keyId": "kms-key-002", "keyName": "projects/quixotic-carver-412405/locations/asia-northeast3/keyRings/keyring/cryptoKeys/kms-key-002/cryptoKeyVersions/1", "address": "0x1e0481127b0ed12b6b6911bec32d414d76042860", "purpose": "ASYMMETRIC_SIGN", "algorithm": "EC_SIGN_SECP256K1_SHA256", "cloudType": "gcp", "network": "polygon", "options": { "project": "quixotic-carver-412405", "location": "asia-northeast3", "keyRing": "keyring", "keyVersion": "1" }, "regId": "system", "modId": null, "createdAt": "2024-02-22T08:28:04.000Z", "updatedAt": null } ], "meta": { "totalItems": 2, "itemCount": 2, "itemsPerPage": 10, "totalPages": 1, "currentPage": 1 } } } |
KMS 서명
KMS 지갑 키로 트랜잭션에 서명합니다. KMS 지갑 계정으로 생성한 트랜잭션만 KMS 지갑 키로 서명할 수 있습니다.
Request URL
Live URL | https://bc-api.qpyou.cn/core/v1/kms/sign |
---|---|
Sandbox URL | https://sandbox-bc-api.qpyou.cn/core/v1/kms/sign |
HTTP Method | POST |
Content-Type | application/json |
Header Parameters
필드명 | 설명 | 타입 | 필수 여부 |
---|---|---|---|
x-credential-id | Hive 콘솔에 Credentials 등록 시 얻는 고유한 값 |
string | Y |
Authorization | API를 호출하기 위한 인증 토큰 | string | Y |
Request Body
필드명 | 설명 | 타입 | 필수 여부 |
---|---|---|---|
from | 서명을 진행할 KMS 지갑 주소입니다. 트랜잭션을 생성하는 API(예시) Request Body의 from 과 동일해야 합니다. |
string | Y |
unsignedTx | 서명되지 않은 트랜잭션 데이터입니다. 트랜잭션을 생성하면 응답값으로 받는 data.rawTx 입니다. 아래 종류를 지원합니다.
|
string | Y |
Responses
필드명 | 설명 | 타입 |
---|---|---|
code | API 호출 결과 코드, 0:성공 | number |
message | 결과 메시지 | string |
data | API 응답 데이터 | json |
data.signedTx | 서명된 트랜잭션 정보 | string |
Request Sample
1 2 3 4 5 6 7 8 9 10 11 12 |
curl -X 'POST' \ 'http://sandbox-bc-api.qpyou.cn/core/v1/kms/sign' \ -H 'accept: application/json' \ -H 'x-credential-id: eb6cc005-b8d0-bc96-8b60-a531c2f15fd2' \ -H 'Content-Type: application/json' \ -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6ImNvbS5jb20yd...' \ -d '{ "from": "0xc5AC98006fe612395b132742Fbe80a6Dc184670a", "unsignedTx": "0x5a0ca3a7eebbafa946da6ed0160930fc4f334887dbf11a9b38937ab8831fd125..." }' |
Response Sample
1 2 3 4 5 6 7 8 9 |
{ "code": 0, "message": "success", "data": { "signedData": "string" } } |