계정 생성과 관리

이 페이지는 Wallet API로 클레이튼 계정을 생성하고 관리하는 방법을 안내합니다.

튜토리얼에 앞서

  • API 호출에 사용되는 x-chain-id 값은 8217(Cypress) 또는 1001(Baobab)입니다.

  • API 호출에 필요한 필수 파라미터는 각 예시에 설명됩니다.

API 호출 시 사용자가 입력해야 하는 값은 중괄호 1개({})로 표시합니다. 사용자가 입력해야 하는 값은 아래 테이블과 같습니다.

API 인증 키가 있으면 모든 KAS 서비스를 사용할 수 있으며 Wallet API를 호출해 만든 Klaytn 계정에 대한 모든 권한을 소유합니다. 모든 권한에는 Klaytn 계정의 자산(KLAY 등) 이동이나 트랜잭션 전송 및 실행 권한이 포함됩니다. 만약 API 인증 키에 타인이 접근한다면 Klaytn 계정 권한을 탈취당해 원치 않는 트랜잭션이 발생할 수 있습니다.

KAS/Klaytn 계정 보안을 위해 KAS API 인증 키(Secret Access Key)를 타인과 함부로 공유하지 말고 주의해 관리하십시오.

KAS SDK(caver-js/caver-java extension) 설치, 실행에 관한 자세한 내용은 KAS SDK를 확인하십시오. 계정 저장소 생성, 계정 생성, 계정 선택에 관한 자세한 내용은 Getting Started를 확인하십시오.

클레이튼 계정

클레이튼 계정은 블록체인 플랫폼인 클레이튼에서 KLAY, FT, NFT와 같은 가상자산을 소유, 거래하거나 스마트 컨트랙트를 배포하고 실행하는 주체입니다. 클레이튼 계정에 관한 자세한 내용은 다음을 확인하십시오.

Klaytn 계정 만들기

계정 저장소 생성

KAS는 여러 클레이튼 계정을 관리하는 계정 저장소를 제공합니다. KAS를 사용하려면 여러분은 KAS 콘솔에서 계정 저장소를 만들고, 계정 생성 API로 콘솔에서 만든 계정 저장소에 새로운 클레이튼 계정을 만들어야 합니다. 여러분은 KAS 콘솔에서 하나 이상의 계정 저장소를 생성할 수 있으며, 각 계정 저장소의 KRN값을 클레이튼 계정 생성 API 호출 헤더의 x-krn에 입력하면 해당 계정 저장소에 새로운 클레이튼 계정을 만들 수 있습니다.

  • 기본 계정 저장소

기본 계정 저장소란 KAS API를 호출 시 사용할 계정 저장소를 별도로 지정하지 않을 때 기본으로 사용하는 계정 저장소입니다. API를 호출 시 헤더의 x-krn에 사용할 계정 저장소의 KRN을 입력하지 않으면 기본 계정 저장소에 있는 클레이튼 계정이 사용됩니다. 기본 계정 저장소는 KAS 콘솔 - Service - Wallet - Accounts 화면에서 확인할 수 있으며 DEFAULT 태그가 붙습니다.

여러분이 가장 먼저 생성한 계정 저장소가 자동으로 기본 계정 저장소로 지정됩니다. 예를 들어, 여러분이 KAS 콘솔에서 계정 저장소 "A"를 만들었다면, 이후 API 호출 시 사용할 계정 자장소를 별도로 지정하지 않을 경우 "A" 계정 저장소에 있는 클레이튼 계정이 API 호출에 사용됩니다. 만약 계정 저장소가 없는 상태에서 클레이튼 계정을 생성하는 API를 호출하면 KAS는 자동으로 기본 계정 저장소를 생성한 후 이 기본 저장소에 여러분이 생성한 클레이튼 계정을 저장합니다.

KAS 콘솔 - Service - Wallet - Accounts

KAS 콘솔 - Service - Wallet - Accounts 메뉴에서 "생성" 버튼을 클릭합니다. 버튼을 클릭하면 아래와 같이 클레이튼 계정 저장소를 생성하는 화면이 나타납니다.

계정 저장소 생성

클레이튼 계정 저장소를 만듭니다. 계정 저장소의 이름은 현재 KAS 계정의 다른 계정 저장소 이름과 중복되지 않아야 합니다.

계정 저장소 확인

계정 저장소를 만들었다면, 계정 저장소 목록에서 생성한 저장소를 확인할 수 있습니다.

계정 저장소를 만들고 얻는 KRN을 API 호출 시 x-krn 헤더에 입력하면, 이 계정 저장소에 있는 클레이튼 계정으로 API를 호출합니다.

이 문서 혹은 KAS에 관한 문의는 개발자 포럼을 방문해 도움을 받으십시오.

클레이튼 계정 생성

API 호출

클레이튼 계정 생성 API를 아래와 같이 호출합니다. API 호출 시 REST API 또는 SDKs(caver-js, caver-java extensions)를 사용할 수 있습니다.

//KAS에서 제공하는 기본 계정 저장소를 사용하는 예시이며 `x-krn` 헤더 파라미터를 생략
curl --location --request POST "https://wallet-api.klaytnapi.com/v2/account" \
-u {access-key-id}:{secret-access-key} \
--header "x-chain-id: {chain-id}"

//여러분이 만든 계정 저장소를 사용하는 예시이며 `x-krn` 헤더 파라미터 포함
curl --location --request POST "https://wallet-api.klaytnapi.com/v2/account" \
-u {access-key-id}:{secret-access-key} \
--header "x-chain-id: {chain-id}"
--header "x-krn: krn:8217:wallet:6698d79e-78ee-439a-815d-f293ec6ae736:account-pool:ap1"

API 응답

클레이튼 계정 생성 API의 응답은 아래와 같습니다.

//KAS 기본 저장소에 계정을 만들었을 때 응답 예시
{
  "address": "0xa809284C83b901eD106Aba4Ccda14628Af128e14",
  "chainId": 1001,
  "createdAt": 1599187293,
  "keyId": "krn:1001:wallet:68ec0e4b-0f61-4e6f-ae35-be865ab23187:account-pool:default:0x4cbbcb974e32a7960e1b356edf60087613101919ed83199f12e872cba068a50f",
  "krn": "krn:1001:wallet:68ec0e4b-0f61-4e6f-ae35-be865ab23187:account-pool:default",
  "publicKey": "0x04cdccfb99b2905561e3dd886687b429a004718f11b04914f17ce68fd3a0db46c598a45da85caa61fe84cb78a0f2eaa9983ec7b8805a93ef9428eb1350a8558237",
  "updatedAt": 1599187293
}

//여러분이 만든 계정 저장소에 계정을 만들었을 때 응답 예시
{
  "address": "0xa809284C83b901eD106Aba4Ccda14628Af128e14",
  "chainId": 1001,
  "createdAt": 1599187293,
  "keyId": "krn:8217:wallet:6698d79e-78ee-439a-815d-f293ec6ae736:account-pool:ap1:0x4cbbcb974e32a7960e1b356edf60087613101919ed83199f12e872cba068a50f",
  "krn": "krn:8217:wallet:6698d79e-78ee-439a-815d-f293ec6ae736:account-pool:ap1",
  "publicKey": "0x04cdccfb99b2905561e3dd886687b429a004718f11b04914f17ce68fd3a0db46c598a45da85caa61fe84cb78a0f2eaa9983ec7b8805a93ef9428eb1350a8558237",
  "updatedAt": 1599187293
}

이 API에 관한 자세한 내용은 다음을 확인하십시오. 이 문서 혹은 KAS에 관한 문의는 개발자 포럼을 방문해 도움을 받으십시오.

클레이튼 계정 조회하기

클레이튼 계정 조회 API는 생성된 클레이튼 계정의 정보를 조회할 때 사용됩니다.

API 호출

계정 EOA를 입력하고 클레이튼 계정 조회 API를 호출합니다. API 호출 시 REST API 또는 SDKs(caver-js, caver-java extensions)를 사용할 수 있습니다.

curl --location --request GET "https://wallet-api.klaytnapi.com/v2/account/0xa809284C83b901eD106Aba4Ccda14628Af128e14" \
-u {access-key-id}:{secret-access-key} \
--header "x-chain-id: {chain-id}"

API 응답

클레이튼 계정 조회 API의 응답은 아래와 같습니다.

{
  "address": "0xa809284C83b901eD106Aba4Ccda14628Af128e14",
  "chainId": 1001,
  "createdAt": 1599187293,
  "keyId": "krn:1001:wallet:68ec0e4b-0f61-4e6f-ae35-be865ab23187:account-pool:default:0x4cbbcb974e32a7960e1b356edf60087613101919ed83199f12e872cba068a50f",
  "krn": "krn:1001:wallet:68ec0e4b-0f61-4e6f-ae35-be865ab23187:account-pool:default",
  "publicKey": "0x04cdccfb99b2905561e3dd886687b429a004718f11b04914f17ce68fd3a0db46c598a45da85caa61fe84cb78a0f2eaa9983ec7b8805a93ef9428eb1350a8558237",
  "updatedAt": 1599187293
}

이 API에 관한 자세한 내용은 다음을 확인하십시오. 이 문서 혹은 KAS에 관한 문의는 개발자 포럼을 방문해 도움을 받으십시오.

클레이튼 계정 목록 조회하기

클레이튼 계정 목록 조회 API는 생성된 클레이튼 계정 목록을 조회할 때 사용됩니다.

API 호출

클레이튼 계정 목록 조회 API를 호출합니다. API 호출 시 REST API 또는 SDKs(caver-js, caver-java extensions)를 사용할 수 있습니다.

쿼리 파라미터

여러분은 커서 방식 페이지네이션을 사용해 API 응답값을 받아올 수 있습니다. 검색 범위를 초단위로 지정할 수 있습니다.

curl --location --request GET "https://wallet-api.klaytnapi.com/v2/account?&size=100&cursor=&from-timestamp=1592360291&to-timestamp=15991809920" \
-u {access-key-id}:{secret-access-key} \
--header "x-chain-id: {chain-id}"

API 응답

클레이튼 계정 목록 조회 API의 응답은 아래와 같습니다.

{
  "cursor": "",
  "items": [
    {
      "address": "0xa809284C83b901eD106Aba4Ccda14628Af128e14",
      "chainId": 1001,
      "createdAt": 1599187293,
      "keyId": "krn:1001:wallet:68ec0e4b-0f61-4e6f-ae35-be865ab23187:account-pool:default:0x4cbbcb974e32a7960e1b356edf60087613101919ed83199f12e872cba068a50f",
      "krn": "krn:1001:wallet:68ec0e4b-0f61-4e6f-ae35-be865ab23187:account-pool:default",
      "publicKey": "0x04cdccfb99b2905561e3dd886687b429a004718f11b04914f17ce68fd3a0db46c598a45da85caa61fe84cb78a0f2eaa9983ec7b8805a93ef9428eb1350a8558237",
      "updatedAt": 1599187293
    },
    {
      "address": "0x78B123CCCCd50f41E3192a60e6ED92B15E21b1B5",
      "chainId": 1001,
      "createdAt": 1599187194,
      "keyId": "krn:1001:wallet:68ec0e4b-0f61-4e6f-ae35-be865ab23187:account-pool:default:0x6c4419647e7724853f9e50b0c54b5985d0870470ac37b3ef865e62c3ccfa4ea4",
      "krn": "krn:1001:wallet:68ec0e4b-0f61-4e6f-ae35-be865ab23187:account-pool:default",
      "publicKey": "0x0463cc38f08dd15dfd416966e9d0da93942e26d2a9a9bcac08d614f487f94a7e46e4418d1acda9e21706f19c917486de40c974eb20c12a2eca2eea91895499d379",
      "updatedAt": 1599187194
    },
   ...
   ,
    {
      "address": "0x7ec5169EA28B2e3fFEF143a3513D7eC1CeFF2cB4",
      "chainId": 1001,
      "createdAt": 1599187161,
      "keyId": "krn:1001:wallet:68ec0e4b-0f61-4e6f-ae35-be865ab23187:account-pool:default:0xd3ee56e2616c8d412918e7f0e9222c805aacf5bad6d84b70b83c2229d61f21c9",
      "krn": "krn:1001:wallet:68ec0e4b-0f61-4e6f-ae35-be865ab23187:account-pool:default",
      "publicKey": "0x043ccf257d2ad3f8c3b2128969302efc6bf59d8cd8e578bcfdac8a4ac9cea6d4747350c98edaec5d23fafa9b3288a3b45816d2e9b3bb28443cc2486ad6bca652f1",
      "updatedAt": 1599187161
    }
  ]
}

이 API에 관한 자세한 내용은 다음을 확인하십시오. 이 문서 혹은 KAS에 관한 문의는 개발자 포럼을 방문해 도움을 받으십시오.

클레이튼 계정 삭제하기

클레이튼 계정 삭제 API는 클레이튼 계정을 삭제할 때 사용됩니다.

클레이튼 계정을 삭제하면 해당 계정으로는 서명할 수 없습니다.

API 호출

삭제할 계정 주소(EOA)를 입력하고 클레이튼 계정 삭제 API를 호출합니다. API 호출 시 REST API 또는 SDKs(caver-js, caver-java extensions)를 사용할 수 있습니다.

curl --location --request DELETE "https://wallet-api.klaytnapi.com/v2/account/0xa809284C83b901eD106Aba4Ccda14628Af128e14" \
-u {access-key-id}:{secret-access-key} \
--header "x-chain-id: {chain-id}"

API 응답

클레이튼 계정 삭제 API의 응답은 아래와 같습니다.

{
  "status": "deleted"
}

이 API에 관한 자세한 내용은 다음을 확인하십시오. 이 문서 혹은 KAS에 관한 문의는 개발자 포럼을 방문해 도움을 받으십시오.

클레이튼 계정 비활성화하기

클레이튼 계정 비활성화 API는 생성된 클레이튼 계정을 비활성화할 때 사용됩니다.

API 호출

비활성화할 계정 주소(EOA)를 입력하고 클레이튼 계정 비활성화 API를 호출합니다. API 호출 시 REST API 또는 SDKs(caver-js, caver-java extensions)를 사용할 수 있습니다.

curl --location --request PUT "https://wallet-api.klaytnapi.com/v2/account/0xa809284C83b901eD106Aba4Ccda14628Af128e14/disable" \
-u {access-key-id}:{secret-access-key} \
--header "x-chain-id: {chain-id}"

API 응답

클레이튼 계정 비활성화 API의 응답은 아래와 같습니다.

{
  "address": "0xa809284C83b901eD106Aba4Ccda14628Af128e14",
  "krn": "krn:1001:wallet:68ec0e4b-0f61-4e6f-ae35-be865ab23187:account-pool:default",
  "updatedAt": 1599187344
}

이 API에 관한 자세한 내용은 다음을 확인하십시오. 이 문서 혹은 KAS에 관한 문의는 개발자 포럼을 방문해 도움을 받으십시오.

클레이튼 계정 활성화하기

클레이튼 계정 활성화 API는 생성된 클레이튼 계정을 활성화할 때 사용됩니다.

API 호출

활성화할 계정 주소(EOA)를 입력하고 클레이튼 계정 활성화 API를 호출합니다. API 호출 시 REST API 또는 SDKs(caver-js, caver-java extensions)를 사용할 수 있습니다.

curl --location --request GET "https://wallet-api.klaytnapi.com/v2/account/0xa809284C83b901eD106Aba4Ccda14628Af128e14/enable" \
-u {access-key-id}:{secret-access-key} \
--header "x-chain-id: {chain-id}"

API 응답

클레이튼 계정 활성화 API의 응답은 아래와 같습니다.

{
  "address": "0xa809284C83b901eD106Aba4Ccda14628Af128e14",
  "krn": "krn:1001:wallet:68ec0e4b-0f61-4e6f-ae35-be865ab23187:account-pool:default",
  "updatedAt": 1599187359
}

이 API에 관한 자세한 내용은 다음을 확인하십시오. 이 문서 혹은 KAS에 관한 문의는 개발자 포럼을 방문해 도움을 받으십시오.

계정으로 특정 트랜잭션에 서명하기

클레이튼 계정으로 특정 트랜잭션 ID를 가진 트랜잭션에 서명합니다. 이 API는 트랜잭션이 다중 서명을 받아야 할 때 사용하는 API입니다. 트랜잭션이 다중 서명을 받아야 하는 상황이 아니라면 Wallet API가 여러분을 대신해 자동으로 트랜잭션에 서명하므로 이 API를 사용할 필요가 없습니다.

트랜잭션이 다중 서명을 받아야 하는 상황이란 트랜잭션을 보내려는 클레이튼 계정이 다중 서명 키를 가진 상황을 의미합니다. 트랜잭션에 다중 서명을 받아 전송하는 방법에 관한 자세한 내용은 다음을 확인하십시오.

클레이큰 계정 키에 관한 자세한 내용은 다음을 확인하십시오.

API 호출

서명하려는 클레이튼 계정 주소(EOA)와 서명을 받을 트랜잭션의 ID값을 입력하고 트랜잭션 서명 API를 호출합니다. API 호출 시 REST API 또는 SDKs(caver-js, caver-java extensions)를 사용할 수 있습니다.

트랜잭션 ID는 보류 중인 트랜잭션 목록 조회 API 응답값에서 얻을 수 있습니다.

curl --location --request POST "https://wallet-api.klaytnapi.com/v2/account/0xa809284C83b901eD106Aba4Ccda14628Af128e14/tx/{transaction-id}/sign" \
-u {access-key-id}:{secret-access-key} \
--header "x-chain-id: {chain-id}"

API 응답

트랜잭션 서명 API의 응답은 아래와 같습니다. ECDSA 서명 정보(R,S)와 공개키 복원정보(V)를 반환합니다.

{
  "R": "0x670a63ca525b80f67cd412a88ffb5cabb84616fb4cb43ff827552586fc722403",
  "S": "0x2f20ad3f4b3c2483a4ae4213a871e404f7214ffd84845fad022c3316eb0af09b",
  "V": "0x7f6"
}

이 API에 관한 자세한 내용은 다음을 확인하십시오. 이 문서 혹은 KAS에 관한 문의는 개발자 포럼을 방문해 도움을 받으십시오.

공개키로 계정 정보를 조회하기

이 API는 Wallet API를 통해 생성한 클레이튼 계정 중에서 특정 공개키(Public Key)를 가진 계정 정보를 조회합니다.

API 호출

공개키를 입력하고 이 공개키를 가진 클레이튼 계정 정보를 조회하는 API를 호출합니다. API 호출 시 REST API 또는 SDKs(caver-js, caver-java extensions)를 사용할 수 있습니다.

curl --location --request GET "https://wallet-api.klaytnapi.com/v2/pubkey/0x049e00f9fbc12f01./account" \
-u {access-key-id}:{secret-access-key} \
--header "x-chain-id: {chain-id}"

API 응답

공개키를 사용한 클레이튼 계정 조회 API의 응답은 아래와 같습니다.

{
  "items": [
    {
      "address": "0x0b7caaf70e7A0a5399041c64711E535CE8B3cf7d",
      "chainId": 1001
    },
    {
      "address": "0xc6C9356887b7F7887918Bf577417E5D8De253295",
      "chainId": 1001
    }
  ]
}

이 API에 관한 자세한 내용은 다음을 확인하십시오. 이 문서 혹은 KAS에 관한 문의는 개발자 포럼을 방문해 도움을 받으십시오.

내 계정을 다중 서명 계정으로 업데이트하기

다중 서명 계정이란 다중 서명 키를 가진 클레이튼 계정입니다. 어떤 트랜잭션을 보낼 때 여러 계정이 트랜잭션에 서명해야 하는 다중 서명 트랜잭션을 보내려면 다중 서명 계정을 사용해야 합니다. KAS도 클레이튼과 마찬가지로 다중 서명 트랜잭션을 지원합니다. KAS에서 다중 서명 트랜잭션을 보내려면 여러분의 클레이튼 계정 키가 다중 서명 키여야 합니다.

다중 서명 계정을 간단히 설명하면, 다중 서명을 위해 여러 키(개인키-공개키 쌍)을 가진 계정이며, 이 키들은 각각 다른 클레이튼 계정들이 소유하고 있습니다. 그리고 각 키에는 가중치(weight)를 설정할 수 있습니다.

예를 들어, 어떤 클레이튼 계정 A가 키 2개짜리 다중 서명 계정이라면 계정 A의 키는 (계정 B의 key, 계정 C의 key)의 2개 키로 구성되고, 각 키의 가중치는 (weight1, weight2)일 수 있습니다. 만약 이 상황에서 계정 B만 자신의 AccountKey로 트랜잭션에 서명했다면 서명에 사용된 AccountKey 가중치의 합은 weight1입니다. 그리고 이 상태에서 계정 C도 트랜잭션에 서명한다면 서명에 사용된 AccountKey 가중치의 합은 weight1 + weight2입니다. 이렇게, 서명에 사용된 모든 AccountKey weight의 합이 기준치(threshold)보다 크거나 같아야 트랜잭션이 전송됩니다. 기준치는 여러분의 클레이튼 계정을 다중 서명 계정으로 업데이트할 때(=계정 키를 다중 서명 키로 업데이트 할 때) 입력 파라미터로 설정할 수 있습니다.

다중 서명 계정에 관한 자세한 내용은 다음을 확인하십시오.

다중 서명 계정을 만들기 위해서는 클레이튼 계정 생성을 완료한 상태여야 합니다. 또, 다중 서명 계정에 포함될 키를 지닌 계정은 모두 똑같은 계정 저장소에 있어야 합니다. 여기에서는, "0x07DAe1aAb1e1b42A7184E12Ad50CEAc07A890640"라는 EOA를 가진 클레이튼 계정을 키 2개를 가진 다중 서명 계정으로 업데이트하는 예시를 소개합니다.

클레이튼 계정 생성

어떤 클레이튼 계정 A가 키 2개짜리 다중 서명 계정이라면 계정 A의 키는 (계정 B의 key, 계정 C의 key)의 2개 키로 구성될 수 있습니다. 계정 A가 다중 키를 가지려면 해당 키를 가지는 클레이튼 계정(계정 B, 계정 C)가 KAS에 존재해야 하며, KAS에 클레이튼 계정을 만드는 방법에 관한 자세한 내용은 클레이튼 계정 생성을 확인하십시오.

아래는 생성한 클레이튼 계정 예시입니다.

//계정 A
{
  "address": "0xa809284C83b901eD106Aba4Ccda14628Af128e14",
  "chainId": 1001,
  "createdAt": 1599187293,
  "keyId": "krn:1001:wallet:68ec0e4b-0f61-4e6f-ae35-be865ab23187:account-pool:default:0x4cbbcb974e32a7960e1b356edf60087613101919ed83199f12e872cba068a50f",
  "krn": "krn:1001:wallet:68ec0e4b-0f61-4e6f-ae35-be865ab23187:account-pool:default",
  "publicKey": "0x04cdccfb99b2905561e3dd886687b429a004718f11b04914f17ce68fd3a0db46c598a45da85caa61fe84cb78a0f2eaa9983ec7b8805a93ef9428eb1350a8558237",
  "updatedAt": 1599187293
}
//계정 B
{
  "address": "0x78B123CCCCd50f41E3192a60e6ED92B15E21b1B5",
  "chainId": 1001,
  "createdAt": 1599187194,
  "keyId": "krn:1001:wallet:68ec0e4b-0f61-4e6f-ae35-be865ab23187:account-pool:default:0x6c4419647e7724853f9e50b0c54b5985d0870470ac37b3ef865e62c3ccfa4ea4",
  "krn": "krn:1001:wallet:68ec0e4b-0f61-4e6f-ae35-be865ab23187:account-pool:default",
  "publicKey": "0x0463cc38f08dd15dfd416966e9d0da93942e26d2a9a9bcac08d614f487f94a7e46e4418d1acda9e21706f19c917486de40c974eb20c12a2eca2eea91895499d379",
  "updatedAt": 1599187194
}
//계정 C
{
  "address": "0x7ec5169EA28B2e3fFEF143a3513D7eC1CeFF2cB4",
  "chainId": 1001,
  "createdAt": 1599187161,
  "keyId": "krn:1001:wallet:68ec0e4b-0f61-4e6f-ae35-be865ab23187:account-pool:default:0xd3ee56e2616c8d412918e7f0e9222c805aacf5bad6d84b70b83c2229d61f21c9",
  "krn": "krn:1001:wallet:68ec0e4b-0f61-4e6f-ae35-be865ab23187:account-pool:default",
  "publicKey": "0x043ccf257d2ad3f8c3b2128969302efc6bf59d8cd8e578bcfdac8a4ac9cea6d4747350c98edaec5d23fafa9b3288a3b45816d2e9b3bb28443cc2486ad6bca652f1",
  "updatedAt": 1599187161
}

계정 A를 다중 서명 계정으로 업데이트

다중 서명 계정 업데이트 API는 여러분의 계정을 다른 Klaytn 계정들도 함께 서명해야 트랜잭션을 보낼 수 있는 다중 서명 계정으로 업데이트합니다. 여기에서는, "0xa809284C83b901eD106Aba4Ccda14628Af128e14"라는 EOA를 가진 클레이튼 계정(=계정 A)을 키 2개(계정 B, 계정 C의 키), 키별 가중치는 각각 (3, 1), 기준치는 4를 가진 다중 서명 계정으로 업데이트하는 예시를 소개합니다.

계정을 업데이트하려면 계정 업데이트 API를 호출해 계정 업데이트 트랜잭션을 전송해야 합니다. 업데이트 트랜잭션을 전송하는 계정은 트랜잭션 수수료 이상의 잔고를 보유해야 합니다.

API 호출

다중 서명 계정 업데이트 API를 호출합니다. API 호출 시 REST API 또는 SDKs(caver-js, caver-java extensions)를 사용할 수 있습니다.

curl --location --request PUT "https://wallet-api.klaytnapi.com/v2/account/0xa809284C83b901eD106Aba4Ccda14628Af128e14/multisig" \
-u {access-key-id}:{secret-access-key} \
--header "x-chain-id: {chain-id}" \
--header "Content-Type: application/json" \
--data-raw "{
    "threshold": 4,
    "weightedKeys": [
        {
            "weight": 3,
            "publicKey": "0x0463cc38f08dd15dfd416966e9d0da93942e26d2a9a9bcac08d614f487f94a7e46e4418d1acda9e21706f19c917486de40c974eb20c12a2eca2eea91895499d379"
        },
        {
            "weight": 1,
            "publicKey": "0x043ccf257d2ad3f8c3b2128969302efc6bf59d8cd8e578bcfdac8a4ac9cea6d4747350c98edaec5d23fafa9b3288a3b45816d2e9b3bb28443cc2486ad6bca652f1"
        }
    ]
}"

API 응답

다중 서명 계정 업데이트 API의 응답은 아래와 같습니다.

{
    "code": 0,
    "result": {
        "address": "0xa809284C83b901eD106Aba4Ccda14628Af128e14",
        "krn": "krn:1001:wallet:test:account-pool:rp1",
        "multiSigKeys": [
            {
                "publicKey": "0x0463cc38f08dd15dfd416966e9d0da93942e26d2a9a9bcac08d614f487f94a7e46e4418d1acda9e21706f19c917486de40c974eb20c12a2eca2eea91895499d379",
                "weight": 3
            },
            {
                "publicKey": "0x043ccf257d2ad3f8c3b2128969302efc6bf59d8cd8e578bcfdac8a4ac9cea6d4747350c98edaec5d23fafa9b3288a3b45816d2e9b3bb28443cc2486ad6bca652f1",
                "weight": 1
            }
        ],
        "threshold": 4,
        "transactionHash": "0x2b0f6ecd671e4a7075f22c7f46ea43ab8016747e6aae05d8dac4f487a3e640a0",
        "updatedAt": 1597297768
    }
}

이 API에 관한 자세한 내용은 다음을 확인하십시오. 이 문서 혹은 KAS에 관한 문의는 개발자 포럼을 방문해 도움을 받으십시오.

KAS로 Klaytn 계정 마이그레이션하기

KAS로 Klaytn 계정 마이그레이션하기 기능은 기존에 사용하던 클레이튼 계정을 KAS Wallet API를 통해 안전하게 관리하고 싶은 경우 사용할 수 있습니다.

KAS SDK를 통해 마이그레이션하기

기존 사용하던 Klaytn 계정을 KAS 로 마이그레이션을 하기 위한 방법은 KAS SDK 를 사용하는 방법과 직접 마이그레이션 코드를 작성하는 방법이 있습니다.

첫번째로 KAS SDK 를 사용하는 방법은 아래와 같습니다.

const keyring = caver.keyringContainer.keyring.generate()
const address = keyring.address
const key = keyring.key.privateKey
const nonce = 0

const ret = await caver.kas.wallet.migrateAccounts([{ address, key, nonce }])

// 아래와 같이 nonce를 직접 기입해주시지 않고도 사용하실 수 있습니다. nonce 값은 마이그레이션 과정에서 자동으로 채워집니다.
// const ret = await caver.kas.wallet.migrateAccounts([{ address, key }])

REST API를 이용하여 마이그레이션하기

월렛서 사용할 공개 키 생성

API 호출

기존에 사용하던 Klaytn 계정을 KAS로 마이그레이션하기 위해서는 KAS에서 관리하는 공개 키를 이용해 업데이트해야 합니다. KAS에서 관리할 공개 키를 생성하기 위해서는 키 생성 API를 사용합니다. 공개 키는 한번에 최대 100개까지 생성할 수 있습니다. 아래와 같이 원하는 키의 갯수를 size 파라미터로 전달합니다.

curl --location --request POST 'https://wallet-api.klaytnapi.com/v2/key' \
--header 'x-chain-id: 1001' \
-u {access-key-id}:{secret-access-key} \
--header 'Content-Type: application/json' \
--data-raw '{
    "size": 1
}'

API 응답

키 생성 API의 응답은 아래와 같습니다.

// 하나의 키 생성에 대한 응답 예시
{
    "items": [
        {
            "blob": "0x43bfd97caaeacc818cd6b62abccf21de569649f31f644142eb1fcfd5beb69e61",
            "keyId": "krn:1001:wallet:test:account-pool:default:0xd80ff4019cfd96f0812adece82dd956c5e781b79ca707cb5e957c97f27593221",
            "krn": "krn:1001:wallet:test:account-pool:default",
            "publicKey": "0x04a081eaf8603b9be528b86da338ba8051bfc073876dbdf00f5161b393b5735f85a76634ea38c43fbbc5d7a630b76ca2a1d81d446debc937b24a77eb3b352a1b6d"
        }
    ]
}

이 API에 관한 자세한 내용은 다음을 확인하십시오. 이 문서 혹은 KAS에 관한 문의는 개발자 포럼을 방문해 도움을 받으십시오.

계정 업데이트 트랜잭션 생성

기존에 사용하던 계정의 개인 키로 계정 업데이트 트랜잭션을 생성해야 합니다. 반드시 공개키 타입대납 계정 업데이트 트랜잭션으로 생성해야 하니 이 점을 주의해주세요. 공개 키 타입이 아닌 다른 계정 업데이트 트랜잭션을 만들면 계정을 사용하지 못할 수 있습니다.

Multisig 계정을 사용하고자 하는 경우에는 마이그레이션 절차를 모두 수행한 후에, Wallet API의 Multisig 계정 업데이트 API를 통해서 변경해 주시길 바랍니다.

API

// Klaytn 계정을 KAS Wallet API로 마이그레이션하기 위해서는 트랜잭션을 생성하고 이를 서명하여 KAS로 전송해야 합니다.
// 트랜잭션에 서명하기 위해 Klaytn 계정으로 Keyring 인스턴스를 생성하고 이를 KeyringContainer에 추가합니다.
// 만약 Klaytn 계정의 키가 `AccountKeyWeigthedMultiSig`이거나 `AccountKeyRoleBased`인 경우
// `keyringContainer.keyring.create` 의 두 번째 파라미터를 배열 혹은 이중 배열로 넘기면 됩니다.
// 더욱 자세한 내용은 https://docs.klaytn.com/bapp/sdk/caver-js/api-references/caver.wallet/keyring#caver-wallet-keyring-create 를 참고해 주세요.
const keyringContainer = new caver.keyringContainer()
const keyring = keyringContainer.keyring.create('0xc756f6809bc34c2458fcb82fb16d5add3dbad9e3', '0x{private key}')
keyringContainer.add(keyring)

// KAS Wallet API에 키를 생성합니다.
// `caver.kas.wallet.createKeys`를 통해 리턴되는 값의 형태는 아래와 같습니다.
// {
//     items: [
//         { blob: '0x06000...', keyId: 'krn:1001:...', krn: 'krn:1001:...', publicKey: '0x0400e...', },
//     ],
// }
const createdKeys = await caver.kas.wallet.createKeys(1)
const key = createdKeys.items[0]

// FeeDelegatedAccountUpdate 트랜잭션을 생성합니다.
// account 필드에 할당되는 값은 `caver.account.createWithAccountKeyPublic`를 사용하여 생성할 수 있으며
// 마이그레이션 하고자 하는 계정의 주소, 그리고 KAS Wallet API에 생성된 키(public key string 형태)를 파라미터로 전달해야 합니다.
const updateTx = new caver.transaction.feeDelegatedAccountUpdate({
    from: keyring.address,
    account: caver.account.createWithAccountKeyPublic(keyring.address, key.publicKey),
    gas: 1000000,
})

// 트랜잭션에 서명합니다.
await keyringContainer.sign(keyring.address, updateTx)

const result = {
    keyId: key.keyId,
    address: keyring.address,
    rlp: updateTx.getRLPEncoding(),
}

계정 마이그레이션 수행

이전 섹션에서 만들어진 계정 업데이트 트랜잭션의 결과를 이용하여 계정 마이그레이션을 수행합니다. API 호출에 앞서 이전 섹션의 결과값을 상기해보면 아래와 같습니다.

{
    keyId: "krn:1001:wallet:test:account-pool:default:0xd80ff4019cfd96f0812adece82dd956c5e781b79ca707cb5e957c97f27593221",
    address: "0xc756f6809bc34c2458fcb82fb16d5add3dbad9e3",
    rlp: "0x....",
}

API 호출

curl --location --request POST 'https://wallet-api.klaytnapi.com/v2/registration/account' \
--header 'x-chain-id: 1001' \
-u {access-key-id}:{secret-access-key} \
--header 'Content-Type: application/json' \
--data-raw '[
    {
        "keyId": "krn:1001:wallet:test:account-pool:default:0xd80ff4019cfd96f0812adece82dd956c5e781b79ca707cb5e957c97f27593221",
        "address": "0xc756f6809bc34c2458fcb82fb16d5add3dbad9e3",
        "rlp": "0x..."
    }
]'

API 응답

// 성공
{
    "status": "ok"
}
// 실패
{
    "failures": {
        "0xc756f6809bc34c2458fcb82fb16d5add3dbad9e3": "failed to send a raw transaction to klaytn node; -32000::invalid transaction v, r, s values of the sender"
    },
    "status": "all failed"
}

이 API에 관한 자세한 내용은 다음을 확인하십시오. 이 문서 혹은 KAS에 관한 문의는 개발자 포럼을 방문해 도움을 받으십시오.

Last updated