KMS API
클라우드 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로 서명
- 서명한 트랜잭션을 블록체인 네트워크에 전송
Note
KMS 서명 API로 서명할 수 있는 트랜잭션은 KMS 지갑 키로 생성한 트랜잭션뿐입니다.
사전 준비
클라우드 KMS Credentials를 Hive 콘솔 > 블록체인 > KMS 인증 정보 > 인증 정보 추가하기 에 등록합니다.
블록체인 계정 지갑 주소와 KMS 지갑 키 생성
클라우드 서비스 계정으로 KMS에 지갑 키를 생성하고, 이 지갑 키를 기반으로 블록체인 계정 지갑 주소를 생성합니다. 지갑 키는 KMS에 저장되고 확인할 수 없습니다. 키 생성 시 지연이 발생하면 지갑 주소가 응답값에 포함되지 않을 수 있습니다. 지갑 주소는 KMS 지갑 정보 조회 API에서 키 아이디(keyId)를 사용해 조회할 수 있습니다.
Request URL
| 필드명 | 설명 | 타입 | 필수 여부 |
| x-network | 블록체인 네트워크 | string | Y |
| x-credential-id | Hive 콘솔에 Credentials 등록 시 얻는 고유한 값 | string | Y |
| Authorization | API를 호출하기 위한 인증 토큰 | string | Y |
Request parameters
| 필드명 | 설명 | 타입 | 필수 여부 |
| keyName | 생성할 키 이름으로 원하는 내용을 입력합니다. | string | Y |
| keyOptions | KMS 지갑 키 옵션 정보 | json | Y |
| keyOptions.location | 키를 저장할 위치입니다. 각 클라우드에서 사용하는 KMS 위치 정보입니다. | string | - GCP: Y (location, 예시: asia-northeast3)
- AWS: Y (region, 예시: ap-northeast-2d)
|
| 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
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
{
"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
| 필드명 | 설명 | 타입 | 필수 여부 |
| x-network | 블록체인 네트워크 | string | Y |
| x-credential-id | Hive 콘솔에 Credentials 등록 시 얻는 고유한 값 | string | Y |
| Authorization | API를 호출하기 위한 인증 토큰 | string | Y |
Request parameters
| 필드명 | 설명 | 타입 | 필수 여부 |
| keys | KMS 지갑 키 정보 | array(json) | Y |
| keys.keyId | 생성한 키 고유 ID | string | Y |
| keys.keyVersion | GCP 사용 시 키 버전 정보 | string | |
| keyOptions | 키 옵션 정보 | json | Y |
| keyOptions.location | 키를 저장할 위치입니다. 각 클라우드에서 사용하는 KMS 위치 정보입니다. | string | - GCP: Y (location, 예시: asia-northeast3)
- AWS: Y (region, 예시: ap-northeast-2d)
|
| 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
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
{
"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
Path parameters
| 필드명 | 설명 | 타입 | 필수 여부 |
| key | 키 고유 ID 또는 키 이름 | string | Y |
| 필드명 | 설명 | 타입 | 필수 여부 |
| 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
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
{
"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
| 필드명 | 설명 | 타입 | 필수 여부 |
| x-network | 블록체인 네트워크 | 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
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
{
"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
| 필드명 | 설명 | 타입 | 필수 여부 |
| x-credential-id | Hive 콘솔에 Credentials 등록 시 얻는 고유한 값 | string | Y |
| Authorization | API를 호출하기 위한 인증 토큰 | string | Y |
Request parameters
| 필드명 | 설명 | 타입 | 필수 여부 |
| from | 서명을 진행할 KMS 지갑 주소입니다. 트랜잭션을 생성하는 API(예시) Request Body의 from과 동일해야 합니다. | string | Y |
| unsignedTx | 서명되지 않은 트랜잭션 데이터입니다. 트랜잭션을 생성하면 응답값으로 받는 data.rawTx입니다. 아래 종류를 지원합니다. 1. 트랜잭션 데이터 2. 다중 서명 트랜잭션 데이터(x-network가 polygon일 때) | string | Y |
Responses
| 필드명 | 설명 | 타입 |
| code | API 호출 결과 코드, 0:성공 | number |
| message | 결과 메시지 | string |
| data | API 응답 데이터 | json |
| data.signedTx | 서명된 트랜잭션 정보 | string |
Request sample
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
{
"code": 0,
"message": "success",
"data": {
"signedData": "string"
}
}