Technology, Tutorials

클레이튼 온라인 툴킷 사용해보기 #1: 멀티시그

👋 클레이튼 온라인 툴킷 시리즈#1 멀티시그#2 RoleBased 기능 사용하기

클레이튼은 개발자부터 초보자까지, 클레이튼 플랫폼의 다양한 기능을 접할 수 있도록 사용성을 개선하기 위해 노력하고 있습니다. 그 일환으로 개발팀이 열심히 개발 중인 클레이튼 온라인 툴킷은 클레이튼의 다양한 기능을 사용해볼 수 있는 페이지로, Klaytn SDK (caver-js)를 사용하여 만들어 졌습니다.

개발자들은 오픈소스로서 깃헙에 공개되어 있는 코드를 참고할 수 있고, 초보자들도 코딩 부담 없이 클레이튼의 기능들을 사용해볼 수 있습니다. 여러 기능들이 추가되고 있으니 많은 관심 부탁드립니다.

그래서 클레이튼의 DevRel 팀에서는 더 많은 분들이 툴킷을 사용해볼 수 있도록 “클레이튼 온라인 툴킷 사용해보기” 시리즈를 준비했습니다. 첫 번째 아티클에서는 멀티시그 사용 방법에 대해서 다룰 예정입니다.

클레이튼 온라인 툴킷을 사용하여 계정을 생성하고, 그 계정의 키를 멀티시그 키로 업데이트 한 뒤, 멀티시그 계정으로 KLAY 전송까지 하는 과정을 살펴볼 것입니다. 멀티시그 지원에 관해 더 알고 싶다면 이 포스팅을 참고하세요.

계정의 키를 멀티시그 키로 업데이트 하기 전 확인해야 할 사항

  1. 업데이트 할 계정이 필요합니다. 이 글에서는 이 계정을 Sender라고 칭하겠습니다. 새로운 계정은 아래 계정 생성 후 키스토어 다운로드 하기를 따라 생성하실 수 있습니다. Sender는 transaction fee를 지불할 수 있는 KLAY를 소유하고 있어야 합니다. 계정 업데이트 트랜잭션이 처리되면, 이 Sender 계정의 주소는 그대로 사용하되 private key가 바뀌게 됩니다.
  2. 업데이트에 사용되는 private key들이 필요합니다. 각 private key는 1번에서와 마찬가지로 아래 계정 생성 후 키스토어 다운로드 하기를 따라 생성한 뒤, keystore 파일을 다운받으실 수 있습니다. keystore를 다운 받을 때 설정한 비밀번호를 잘 보관하시길 바랍니다.
  3. 계정을 업데이트 하기 위해 **가중치(weight)**와 **임계치(threshold)**를 설정해야합니다. 각 키는 가중치 값을 가지며, 트랜잭션에 서명한 키들의 가중치 합이 임계치를 넘어야 유효한 트랜잭션으로 인정됩니다. 예를 들어 세 개의 키(k1, k2, k3)의 가중치가 모두 1이며, 해당 계정의 임계치가 2라고 한다면, 세 개의 키 중 두개 이상 서명할 때 트랜잭션이 유효한 트랜잭션으로 인정되는 것입니다.

계정 생성 후 키스토어 다운로드 하기: 링크

  1. Single / Multiple / Role-Based 중 Single 버튼이 선택 되어 있는지 확인합니다. 이 세 개는 클레이튼에서 제공하는 주소와 개인 키를 포함하는 키링(keyring)의 종류를 의미합니다. SingleKeyring은 사용자가 개인 키 하나로 서명을 하는 것입니다. Multiple Keyring은 사용자가 다수의 개인키로 서명하는 것이고, Role-based Keysing은 역할에 따른 개인키로 서명을 하게 됩니다. 자세한 설명은 클레이튼 문서를 참고하시길 바랍니다. 이 글에서는 멀티시그 키로 계정을 업데이트 하기 위해 SingleKeyring을 생성해서 사용하겠습니다.

2. Generate Key 버튼을 누르면 Private Key와 Address가 생성됩니다. 이 때 함께 생성되는 주소(Address)는 Private Key — Public Key 키쌍의 Public Key에서 파생되는 주소 입니다.

3. 생성하고자 하는 키스토어 포맷에 맞게 Generate Keystore(v3), Generate Keystore(v4) 버튼 중 하나를 선택해서 누르면, 각 버전의 keystore 파일이 생성되고 내용이 아래 텍스트칸에 뜹니다. Download 버튼을 누르면 “keystore-{address}-{year}-{month}-{day}.json” 이름으로 파일이 저장됩니다.

4. 다운로드 이후 새로운 계정을 생성하고 싶으시면 Single 버튼을 누르고 위 절차를 반복하면 됩니다.

계정을 멀티시그 키로 업데이트 하기: 링크

이 페이지는 Upload Sender Keystore File, Upload Keystore File for Private Keys, Update Account 세 개의 섹션으로 구성되어 있습니다. 첫 번째 섹션에서는 Sender의 트랜잭션 서명을 위해Sender의 keystore를 업로드 하고, 두 번째 섹션에서는 멀티시그로 사용될 Private key 들을 업로드 하고, 마지막 섹션에서는 가중치와 임계치를 설정한 뒤, 계정 업데이트 트랜잭션을 전송할 수 있습니다.

  1. 먼저, Upload Sender Keystore File 섹션에서 진행해보도록 하겠습니다. Mainnet, Testnet 중 어느 네트워크에서 진행할 지 선택합니다.

2. 업데이트 할 계정(Sender)의 keystore 파일을 업로드 하고, 해당 keystore 파일의 password를 입력하고 Decrypt 버튼을 누릅니다. Password가 제대로 입력된 경우 Decryption succeeds! 라는 메시지가 뜨고, 틀린경우 Error: Key derivation failed 라는 에러 메시지가 뜰 것 입니다. 이렇게 Sender의 keystore 파일을 업로드 하는 것은 완료되었습니다.


<성공적으로 Sender의 keystore가 업로드 된 경우>
<Sender의 Keystore password가 틀린 경우>

3. 이제 아래의 Upload Keystore File for Private Keys 섹션으로 넘어가서 멀티시그로 사용할 Private Key들을 설정해보도록 하겠습니다. 업데이트 할 때 사용될 Private Key의 Keystore 파일을 업로드 하고 Password를 입력한 뒤 Decrypt 버튼을 누릅니다. 2번 스텝과 마찬가지로 Password가 제대로 입력된 경우 Decryption succeeds! 라는 메시지가 뜨고, 틀린 경우 Error: Key derivation failed 라는 에러 메시지가 뜹니다. Private key의 개수에 따라 여러번 업로드 가능합니다.

<Private Key의 keystore 파일 업로드>

4. 3번 단계에서 Keystore 를 하나씩 추가하면 Update Account 섹션 내의 Decrypted Keystore List 아래에 파일 이름이 추가되는 걸 볼 수 있습니다. 이 추가된 private key들로 Sender 계정의 키가 업데이트 되는 것 입니다.

<Keystore가 업로드 되지 않았을 때>
<두 개의 Keystore 파일이 업로드 된 경우>

5. 3번 과정이 끝나고 나면, Account Update 섹션으로 넘어가서 진행합니다. 계정을 업데이트 하기 위해 가중치(weight)와 임계치(threshold)를 설정합니다. 각 키의 가중치와 계정의 임계치를 설정한 뒤, Account Update 버튼을 누르게 되면, 계정 업데이트 트랜잭션이 전송되고, 처리될 때까지 Account Update 버튼은 비활성화 됩니다. 트랜잭션이 처리된 후 성공하면, Account is successfully updated! 라는 메시지가 뜹니다. 실패한다면 에러메시지가 뜰 것입니다.

<Account Update 트랜잭션이 처리된 경우>

6. Sender 계정의 address를 사용해서 KlaytnFinder 나 Klaytnscope에서 계정 업데이트 트랜잭션을 확인하실 수 있습니다.

<KlaytnFinder 에서 확인한 모습>

멀티시그 키를 사용해서 KLAY 전송하기 : 링크

멀티시그 키로 계정을 업데이트 했으니, 이번엔 멀티시그 키를 사용해서 KLAY를 전송해보도록 하겠습니다. 이때 계정 업데이트가 정상적으로 되었다면, 사용 할 private key의 가중치의 합이 임계치보다 작을 때 트랜잭션 전송에 실패하게 되고, 임계치보다 크거나 같으면 전송에 성공합니다. 이렇게 계정이 업데이트가 잘 되었는지 확인해볼 수 있습니다.

이 페이지는 트랜잭션 정보를 입력하고 서명 및 전송을 하는 Transaction Information 섹션, 서명에 필요한 Private Key들을 업로드 하는 Upload Keystore FIle 섹션, 그리고 업로드된 keystore 파일들을 확인하고 삭제할 수 있는 Decrypted Keystore List 섹션으로 이루어져 있습니다.

  1. 먼저 Transaction Information 섹션에서 Mainnet, Testnet 중 어느 네트워크에서 진행할 지 선택합니다. KLAY를 선택하면 KLAY를 전송할 수 있고, KIP-7/ERC-20을 선택하면 contract address(token address)를 입력하고 해당 토큰을 전송할 수 있습니다. 이 예시에서는 KLAY를 보내겠습니다. KLAY를 보내는 주소와 받는 주소를 입력하고, 보낼 KLAY의 수량을 입력합니다.

2. Upload Keystore File섹션에서 KLAY를 보낼 Sender가 서명할 때 필요한 Private key를 위해서 Keystore 파일들을 업로드 합니다. Keystore 파일을 업로드하고 Password를 입력한 뒤 Decrypt 버튼을 누른 뒤 성공적으로 해독이 되면, 아래 Decrypted Keystore List 섹션에서 추가 되는걸 보실 수 있습니다. Remove 버튼을 눌러서 삭제를 할 수도 있습니다. 서명에 필요한 키의 개수만큼 Keystore 파일 업로드를 통해 Private Key를 추가하실 수 있습니다.

<Keystore가 업로드 되지 않았을 때>
<하나의 Keystore가 업로드 된 경우>

3. 서명에 필요한 키가 모두 업로드 되면 다시 Transaction Information 섹션으로 돌아가서 Sign Transaction 버튼을 눌러 트랜잭션에 서명을 합니다. 성공적으로 서명이 되면 Transaction hash값과 함께 Transaction is signed! 라는 메시지가 뜹니다.

<트랜잭션 서명 완료 후>

3. 서명이 완료된 이후, Send Transaction 버튼을 누르게 되면 서명된 트랜잭션이 네트워크에 전송됩니다. 트랜잭션이 처리되는 중에는 Sign Transaction 버튼과 Send Transaction 버튼이 비활성화됩니다. 처리가 완료되면, Transaction is confirmed! 라는 메시지와 함께 트랜잭션의 hash값이 뜹니다. 이 Hash값을 클릭하면 KlaytnFinder에서 해당 transaction 페이지를 볼 수 있습니다. 만약 서명한 키의 가중치 합이 임계치보다 작다면, 유효하지 않은 트랜잭션이 되고, Error: Returned error: invalid transaction v, r, s values of theSender라는 에러메시지가 뜹니다.

<트랜잭션 처리 완료 후>
<KlaytnFinder의 트랜잭션 페이지>

오늘 아티클에서는 클레이튼 온라인 툴킷을 사용해 멀티시그 기능을 살펴봤습니다. 다음 편도 기대해주세요! 이번 아티클에 대한 질문이나 클레이튼에 대한 궁금증이 있으시면 클레이튼 포럼에 남겨주세요.

참고 자료

  1. Medium blog: [Caver] How to Update Klaytn Account Keys with Caver #2 — AccountKeyWeightedMultiSig
  2. Medium blog: Klaytn 사용성 개선 Series #2: 플랫폼에서의 멀티시그 지원
  3. 클레이튼 계정 관련 docs: https://ko.docs.klaytn.foundation/klaytn/design/accounts
  4. 클레이튼 키링 관련 (caver-js): https://ko.docs.klaytn.foundation/dapp/sdk/caver-js/api-references/caver.wallet/keyring
  5. Account Update Code Example: https://github.com/klaytn/caver-js-examples/blob/master/account/update_account_with_account_key_weighted_multisig/index.js