직접 생성한 keyring을 KAS의 account-pool에 등록하는 방법 문의

저희 플랫폼에서는 토큰을 통해 상품을 거래하기 때문에 유저끼리 토큰을 주고 받습니다. 그런데 KAS에서 생성된 계정은 프라이빗 키를 발급받지 않기 때문에 유저들은 해당 계정을 플랫폼 내에서만 사용할 수 있고 토큰을 거래소 또는 타 계정으로 전송하기 위해서는 재단에서 transfer 서비스를 제공해줘야만 합니다.
이러한 문제가 있어서 keyring을 직접 생성하여 KAS에 등록시켜서 재단이 트랜잭션을 대신 서명해주기도 하고 유저들도 프라이빗 키를 통해서 직접 트랜잭션을 서명할 수 있도록 하려고 합니다.
그래서 현재 caver-js-ext-kas 모듈의 caver.wallet.keyring.generate() 통해서 keyring을 발급까지 진행된 상태이고 이 것을 KAS account-pool에 등록해야 하는데 그 방법을 알려주시면 감사하겠습니다.

안녕하세요, 클레이튼 포럼에 질문을 올려주셔서 감사드립니다.

account-pool에는 기본적으로 HSM에서 관리하는 private key만 저장하게 됩니다. 외부에서 private key를 import하는 경우, 보안상 이슈가 발생할 수 있어서 그러한 기능은 제공되지 않습니다.

만약 해당 계정에 대한 해킹사고가 발생했을 경우 그게 유저의 문제인지 KAS 서비스의 문제인지 판단하기 어렵기 때문입니다.

원하시는 기능을 이용하시려면 multisig account key를 사용하시는 것을 권장드립니다.

Klaytn에서는 플랫폼 레벨에서 Multisig를 지원하기 때문에, 키 한개는 KAS를 통해 보관하시고 다른 하나는 사용자에게 제공하면, 둘 중 어떤 키를 사용하더라도 트랜잭션 서명을 하실 수 있습니다.

보다 자세한 내용은 내 계정을 다중 서명 계정으로 업데이트하기를 참고 부탁드립니다.

감사합니다.

1개의 좋아요

말씀해주신대로 테스트코드를 짜보았습니다. 의도에 맞게 짠건지 검토 한번 부탁드려도 될까요? 테스트코드와 에러메세지 공유드립니다.

const account = await caver.kas.wallet.createAccount()

     console.log("account.address: ", account.address);

     console.log("originPulbicKey: ", account.publicKey);

    const keyring = caver.wallet.keyring.generate();

     console.log("키페어생성에 의한 address: ", keyring._address);

    const privateKey = keyring._key._privateKey;

    const publicKey = keyring.getPublicKey();

    console.log("publicKey: ", publicKey);

    console.log("privateKey: ", privateKey);

    const weightedMultisig = {

        threshold: 2,

        weightedKeys: [

            {

                weight: 1,

                publicKey: account.publicKey

            },

            {

                weight: 1,

                publicKey: publicKey

            }

        ]

    };

    const result = await caver.kas.wallet.updateToMultiSigAccount(account.address, weightedMultisig);

    console.log("result", result);

ErrorResponse {
_code: 1061010,
_message: “data don’t exist”,
_requestId: ‘7a71eaf6-3bc6-4528-9dc0-325af498bdca’
}

문서바탕으로 조금만 더 연구해보고 다시 질문드리겠습니다. 문서 윗부분을 참고하지 못했었네요…

유저가 kas계정으로도 Klaytn IDE같은 툴을 이용해서 직접 토큰전송등을 할 수 있도록 알려주신 방법대로 멀티시그계정을 생성하였습니다.

멀티시그 계정을 만들기 위해 caver.keyringContainer.keyring.generate()를 이용해서 키링을 만들고 또 하그 것을 caver.kas.wallet.migrateAccounts을 통해 KAS에 등록하여서 caver.kas.wallet.updateToMultiSigAccount으로 멀티시그계정을 생성하였습니다.
그런데 Klaytn IDE에서 프라이빗키를 입력하니까 멀티시그계정이 아닌 멀티시그를 만들기위해 생성했던 키링의 계정이 뜹니다. 제가 기대했었던 건 멀티시그계정이 뜨게 되는거였는데… 제 의도에 맞는 방법이 있을까요?

Klaytn IDE에서는 멀티시그 계정을 지원하지 않아서 생기는 문제 같습니다. 아쉽지만 현재 원하시는 기능을 수행할만한 적합한 방법은 없어보입니다.

Klaytn IDE 개발팀에게 해당 내용 전달드리도록 하겠습니다.

감사합니다.

1개의 좋아요

klaytn IDE 와 같이 유저들이 트랜잭션을 일으킬 수 있는 툴이 존재하지 않다는 말씀이신가요? klaytn IDE에서 추 후에 멀티시그 계정을 지원할지 여부와 한다면 언제 쯤부터 지원이 될 예정인지 피드백을 받고 싶습니다. 저희 서비스에서도 다른 방향으로 가야할지 대비를 해야할 것 같아서요!

안녕하세요, caver-js/java를 이용하시면 멀티시그 트랜잭션을 발생시킬 수 있습니다.

아래 링크를 참고 부탁드립니다.

감사합니다.

1개의 좋아요

개발자적인 방법 말고 일반 유저들도 쉽게 직접 트랜잭션을 발생시킬 수 있어야 합니다. 이더리움에서 일반 유저들도 MyEtherWallet이나 etherscan의 UI를 통해 트랜잭션을 발생시키듯 클레이튼에서는 klaytn IDE가 유일한 것 같은데 여기에 멀티시그가 지원이 되질 않아서 klaytn IDE에서 추 후 지원이 될 건지, 그렇지 않다면 저희 플랫폼내에서 별도로 트랜스퍼 기능을 제공해줘야 하는 문제가 있어서 질문드립니다.

안녕하세요,

Klaytn IDE에서 해당 기능에 대한 계획은 가지고 있지 않습니다. Klaytn IDE에서 제공된다 하더라도 일반 유저가 쉽게 사용하는 방법은 아닐 것 같습니다.

제일 처음 주신 질문처럼 동작하기를 원하시는거라면, 유저에게 원래의 키를 제공하고 서비스에서 별도의 키를 추가 등록해서 관리한다면 사용자 입장에서는 키 하나 사용하는 것과 동일하게 사용하실 수 있을 것 같습니다.

참고 부탁드리겠습니다.

감사합니다.

1개의 좋아요

답변감사드립니다. Klaytn IDE도 말씀하신대로 유저가 사용하기엔 어려울 것 같습니다.

유저에게 원래의 키를 제공한다면 keyring으로 생성한 계정의 프라이빗키를 말씀하시는건가요? 그리고 서비스에서 별도의 키를 추가 등록한다는 부분을 이해하지 못했습니다. 조금만 더 풀어서 설명 부탁드려도 될까요?

안녕하세요, (Private key A, public key A) - address A가 Klaytn account의 기본 가정입니다. 이건 이더리움도 마찬가지이고요. 여기서 클레이튼은 Address A에 별도의 키를 추가로 맵핑할 수 있는 기능을 제공하고 있습니다.

아래와 같이 Address A에 A, B 두 개의 키를 연결시키도록 계정을 업데이트 할 수 있습니다.
[(private key A, public key A), (private key B, public Key B)] - address A

이렇게 해놓고 기존과 그대로 유저는 private key A를 가지고, 서비스는 private key B를 가지면, 서비스와 유저 모두 각각 서로 다른 키를 가지면서 address A의 트랜잭션을 생성하실 수 있습니다.

감사합니다.

1개의 좋아요

답변감사드립니다.
멀티시그 기능을 말씀해 주신 것 같습니다. 멀티시그기능을 테스트해보았었는데 AddressA에 KeyA, KeyB 로 멀티시그계정을 발생시킬 경우 KeyA(privatekey)로는 서명이 안됐었습니다. 혹시 이유가 KeyA는 KAS에서 관리하는 Key이기 때문에 만약 해킹사고가 발생할 경우 어느 측 문제인지 알 수 없기 때문에 막아놓은 것일까요? KeyB로 트랜잭션을 발생시켜보는 테스트는 해보지 못했는데 KeyB로는 서명이 가능한건가요? 그렇다면 유저와 서비스가 가용한 Key를 가지려면 기본 private Key는 못쓰기 때문에 KeyB, KeyC까지 총 세개가 되야 되는건지 여쭙니다.

그리고 docs의 멀티시그 관련부분을 보았는데 추가한 키들 중 하나의 키만으로도 서명이 가능한 것이 아닌 모든 키의 서명을 받아야 트랜잭션을 발생시킬 수 있다고 써있어서 확인 한번 부탁드립니다.

또, 멀티시그의 weight에 대한 자세히 설명돼있는 문서가 있을까요?

질문이 깔끔하지 않은 것 같아 죄송합니다…

KAS 개발팀에 문의해본 결과, keyA는 Wallet의 계정, key B는 외부 계정이더라도 가능하다고 말씀 주셨습니다. 참고로 keyA의 weight 는 1, keyB도 weight 1로 주시고 threshold 도 1로 주셔야 두 키중 어떤 키를 사용하시더라도 트랜잭션 실행에 성공할 수 있습니다.

안녕하세요, multisig에 대한 부분은 KAS의 기능이라기보다는 Klaytn의 기능이기 때문에, Klaytn Docs에 설명되어 있습니다. 아래 링크 참고 부탁드립니다.

진행해보시고 안되는 부분 있으시면 추가 질문 부탁드리겠습니다.

감사합니다.

1개의 좋아요

kas docs를 보면 모두 똑같은 계정 저장소에 있어야 한다고 적혀있는데 이 말은 kas의 같은 account-pool에 있어야한다는 의미 아닌가요? 실제 KeyB는 kas에 등록하지 않은 caver.keyringContainer.keyring.generate() 으로 발생시킨 것으로 테스트해 보았는데 아래와 같은 에러가 발생했습니다.

ErrorResponse {
_code: 1061010,
_message: “data don’t exist”,
_requestId: ‘14da7e03-363e-4143-a746-c1b1e584d318’
}

정리하면, 테스트 결과 멀티시그계정을 생성하려면 A, B 전부 KAS에 등록된 상태여야 하는데 Kas에 등록하면 해당 프라이빗키는 직접 사용할 수는 없는 상태가 돼버리니 유저가 직접 서명할 수 있게 하려는 의도에 맞지 않게 되는 것 같습니다.

안녕하십니까. KAS 개발팀입니다.

계정 업데이트를 하는 API 가 두가지가 있습니다.

  1. KAS 계정 업데이트
  2. 계정 업데이트 트랜잭션 발생

1번의 경우에는 KAS 내에 있는 계정들만 활용해서 업데이트가 가능하며, 반드시 업데이트하는 계정에 계정 업데이트를 위한 수수료 KLAY 를 보유하고 있어야 합니다.
2번의 경우에는 계정 업데이트 트랜잭션은 Basic, KAS 대납, 사용자 대납 API 가 각각 분리되어 있는데, 이를 활용할 수 있으며, 외부 계정의 공개키도 넣을수 있습니다.

따라서 외부 계정을 포함한 계정업데이트를 하기 위해서는 계정 업데이트 트랜잭션(Basic), 계정 업데이트 트랜잭션(KAS 대납), 계정 업데이트 트랜잭션(사용자 대납) 중에 하나를 사용하실 수 있습니다.

참고로 현재는 클레이튼 1주년 행사(7월31일까지)로 KAS 에서 수수료를 무료로 대납해주고 있기 때문에 KAS 대납 API 를 사용하기를 권장드립니다.

행사가 끝난 이후에는 수수료에 대해서 청구될 수 있으니 이점을 유의해주시면 감사하겠습니다.

2개의 좋아요

답변 감사합니다. 2번 항목에 대한 내용은 문서를 참고해서 테스트해 보겠습니다. 1번 항목에 대한 멀티시그 업그레이드는 해봤자 모든 키가 전부 Kas로 귀속되기 때문에 키를 유저도 관리를 하더라도 트랜잭션을 발생시킬 수 없기 때문에 의미가 없는게 맞을까요?

@ymkim 네, 사용자가 키를 별도 관리하는 상황에서는 1번은 의미가 없다고 볼 수 있습니다.

1개의 좋아요

아하 이제 다 이해되었습니다ㅎㅎ 질문이 길었는데 답변 꾸준히 받아주셔 감사합니다!!