KAS API사용과 관련하여 Kaikas, Klip 지갑 연동 관련질문

안녕하세요.

최근 서비스 개발 과정에서 지갑 로그인 및 프로필(offchain) 연동 과정을 구현하는 과정에 궁금증이 생겨 질문드립니다.
KAS API는 klaytn의 엔드포인트 노드 제공과 더불어서 어카운트 관리를 도와주는 역할로 이해하고있는데요
KAS의 엔드포인트 노드를 사용하면서 caver.wallet API를 통해 공개키-비밀키 쌍을 관리하려고 하였는데 구현과정에서 의문점들이 생겨 질문드립니다!

  1. KAS.wallet API는 caver.wallet API를 내부적으로 사용하는 구조가 맞나요?

  2. Klip, Kaikas를 통한 서비스 로그인을 구현하려고하는데요(opensea의 지갑 로그인과 같이 지갑서명을 통한 인증 플로우), KAS를 활용해서 가능한 부분인건가요?

  3. 제가 생각하는 bapp의 지갑연동 플로우는 Klip, Kaikas과 같은 지갑의 서명을 통해 keycontainer(공개키-비밀키쌍)생성(caver keycontainer내에 키정보 생성), 이후에 caver의 sign 등의 keycontainer정보를 참조하는 API들을 활용하여 offchain 연동인데요, KAS를 거치게될경우의 플로우가 어떻게 되는건지 잘 이해가 안가네요.
    KAS내에서 제공하는 서명을 활용할경우 이후에 자체 노드를 운용하게되었을때 KAS내에서 제공하는 기능에 의한 종속성때문에 문제가 될 것 같은데, 맞나요?

  4. KAS에서 제공하는 엔드포인트를 caver-js에 셋업해서 (KAS API통하지않고) 개발 가능한가요?

설 연휴인 관계로 제가 먼저 간단하게 답변드리겠습니다.

  1. KAS wallet API는 KAS EN에서 활성화 시킨 API만 사용하도록 별도로 설계되어있는 것으로 알고있습니다. caver.wallet 을 사용한다기 보다는, ‘https://wallet-api.klaytnapi.com’ 에 접속해서 ‘KAS Reference Documentation’ 에서 제공하는 API를 이용해 통신하는 부분을 모듈로 제공하신다고 보면 될것 같아요.

  2. Kaikas나 Klip같은 지갑을 사용하는 경우는, 자체 RPC를 사용하기때문에 지갑 SDK 또는 API를 통해서 트랜잭션이 가능합니다. 즉, EN없이도 사용자가 트랜잭션을 발생시키는 서비스는 Kaikas 나 Klip만으로도 가능합니다. 다만 이는, 블럭체인에서 정보를 호출할때(call), 접속할 EN이 지갑과 연동되어있기 때문에, 반드시 지갑승인이 필요하기때문에, 지갑연결없이는 정보가 뜨지 않는 웹앱 형태가 된다고 생각하시면 될것같아요. KAS는 이 경우 Backend 에서 블럭체인 정보를 호출해서 지갑연결에 구애받지 않는 실시간 정보 갱신되는 동적 홈페이지 구현하시거나, 또는 주기적으로, 또는 특정 조건 모니터링하면서 트랜잭션 발생시키는 등의 서비스 등을 구현하실때 필요하시다고 생각하시면 될 것 같습니다.

  3. 보통 Kaikas는 Provider를 제공하기 때문에, Caver 최신버젼을 이용하시려는 경우, caver 인스턴스 생성하실때 Kaikas쪽의 provider를 input으로 넣어주시는 것으로 가능합니다. 관련 방법은 kaikas 문서에서 확인하실 수 있습니다. KAS Reference Documentation (klaytnapi.com). KLIP은 이부분이 제한되어있는 것으로 알고 있습니다. 이 부분은 KLIP 담당팀에 문의주셔야 할것 같습니다.

  4. 이 부분은 어떤 provider를 사용하시느냐에 따라서 다르다고 생각합니다. caver-js를 사용하시더라도 json-rpc provider를 사용하시는 경우, 직접 low-level transaction을 이용한 개발이 가능하실 것으로 생각하고, JSON-RPC 호출 - KAS Docs (klaytnapi.com) 문서를 확인하시면 될것 같습니다.

근데 대부분의 low-level의 트랜잭션이 노드 관리상 필요한 기능들이 많아서, 실제 서비스에서 단순하게 발행하신 또는 이미 발행된 외부의 컨트랙트와 상호작용 하는 형태의 기능만 사용하신다면, caver-js나 caver-js-ext-kas나, KAS 사용자 authentication 부분만 제외하고는 사용방법이 동일합니다. 예시를 드리자면,

const Caver = require("caver-js");

const option = {
  headers: [
    {
      name: "Authorization",
      value:
          "Basic " +
          Buffer.from(
              kasCredentials.accessKey + ":" + kasCredentials.secretKey
          ).toString("base64"),
    },
    { name: "x-chain-id", value: kasCredentials.chainId },
  ],
  keepAlive: false,
};

const caver = new Caver(
    new Caver.providers.HttpProvider(
        `https://node-api.klaytnapi.com/v1/klaytn`,
        option
    )
);

이런형태로 KAS EN에 접속가능하십니다.
도움되셨길 바랍니다. 혹시 제가 설명드린 부분이 부족하면 추가질문 주시면 개발팀에서 답변드릴수있게 요청드리겠습니다. 감사합니다.

4개의 좋아요

자세한 답변 감사합니다!

한가지 궁금한점이 있어 추가로 질문 남깁니다!

klip, kaikas와 같은 지갑 어플리케이션을 통해 관리되는 account는 트랜잭션 서명을 하고 난 후에는 caver의 keyring 객체가 주입된다. 라고 이해하고 있는데요,
(const senderKeyring = caver.wallet.keyring.create(senderAddress, senderPrivateKey) 를 수행한것과 같이이 동작)

KAS를 통해 로그인을 수행했을때 또한 동일한 동작을 보장받을 수 있는걸까요?

(제가 이해하는 내부 동작방식은 다음과같습니다.)

  1. caver 내부에서 관리하는 keyring container의 인증정보를 set
    => kaikas, klip의 경우 지갑앱을 통한 요청 승인 / KAS의 경우 API 호출을 통해서 keyring container 정보 생성(?)

  2. 이후에 caver에서 사용하는 api들 (caver.contract 등…)에서 keyring container 내부 정보를 사용해 호출

일단 3번에 제가 드린 링크가 잘못올라갔네요. 다음을 확인해주시면 될것같아요, Kaikas에서 최신버젼의 caver를 활용하는 방법입니다.

Caver Methods - Kaikas Docs

새로 주신 질문에 대해서는, 해당 작업을 수행하실때는 Kaikas에서 자체로 RPC에 transaction을 보내는 경우가 되어서 별도의 EN을 이용하실 필요가 없습니다. 따라서 KAS를 이용하실 필요가 없습니다.

1번 답변에서 설명드렸다싶이 KAS를 이용한 객체는 별도로 생성해서 다음과 같은 경우에 사용가능하실 것으로 생각됩니다.

  1. 지갑 사용자가 지갑을 연결하기 전에 front-end 에서 블럭체인의 정보를 보여줘야하는 경우
  2. 서비스와 연관되어 back-end 에서 관리자 account를 이용해 transaction을 수행해야되는경우

따라서 Front-end에서는 그냥 Kaikas나 KLIP에서 제공하는 API를 그대로 사용하시고,
Backend에서 DB를 운영하시면서 원하시는 Blockchain정보를 저장해서 front에 뿌려주시거나.
주기적으로 event 에 반응해서 transaction 실행하는 부분을 KAS로 구현하시는 형태로 진행하시는게 효율적일 것 같습니다.

답변 되셨으면 좋겠네요!

2개의 좋아요

빠른 답변 감사합니다.

질문 내용이 조금은 미흡했던것 같네요!

제가 생각하는 플로우를 예를들어서 궁금증을 말씀드리면,

  1. FE에서는 Kaikas, Klip 두가지 지갑 연동을 지원함
  2. Kaikas의 경우 private key 정보를 가져올수있어서 caver내에서 keyring 을 생성하여 요청 가능하므로 EN을 KAS쪽으로 설정하고(처음 답변해주신 것과 같이 provider 설정하여) caver-js에서 지원가능한 API들 수행함
  3. Klip의 경우 custodial wallet이므로 private key를 가져오지못함. 이경우 caver의 keyring 생성이 불가능한것인지 궁금.
  • 그렇다면 특정 caver-js API를 사용할 수 없는것인지?
  • 인증만 Klip으로 하고, 다른 트랜잭션은 특정 EN(KAS제공EN 혹은 직접 운용하는EN 등…)으로 지정하여 개발 불가한지?
  • 그렇다면 Klip, Kaikas 등등… 다양한 지갑을 지원하는 서비스들은 구현할때 특정 컨트랙 실행 과 같은 하나의 기능 개발에 있어서도 클립 API, KAS API 등 연동된 지갑의 특성에 따라 다르게 구현되어야 하는지?

입니다!

KLIP의 경우 지갑object에서 provider를 추출할수 없는 구조이기 때문에, caver와 호환은 불가능합니다.
제가 과거에 KLIP 개발팀에게 드렸던 아래 답변을 확인하시면 될 것 같습니다.

다양한 지갑을 지원하는 서비스들을 구현할때는, 연동된 지갑의 특성에 따라 다르게 구현이 필요하다고 생각됩니다. 일반적으로 다른 디파이 서비스들 소스를 확인해보면 각 기능마다 조건부로 지갑에 따라 다르게 실행하는 부분들이 많이 보이더라고요. KLIP 에 관한 부분은 해당 개발팀 분께서 구체적으로 답변 가능해주실지 아래 cc 해드리겠습니다.

cc: @_albert

감사합니다.

2개의 좋아요