KAS를 이용하여 Klaytn 지갑 기능 개발하기 #1

Tech at Klaytn
Klaytn
Published in
12 min readFeb 19, 2021

전체 포스팅 목록은 여기에서 확인하세요.

KAS 소개

KAS(Klaytn API Service)는 Klaytn의 기능을 API 서비스로 제공해주는 클라우드 플랫폼으로, Klaytn을 이용하는 사용자가 애플리케이션을 더 쉽고 빠르게 개발할 수 있도록 도와줄 수 있습니다.

현재 KAS에서는 Wallet API, Token History API, Anchor API, Node API, KIP-7 API, KIP-17 API, KIP-37 등을 제공합니다. 이 글에서는 KAS에서 제공하는 다양한 API 서비스를 통해서 Klaytn을 이용하는 블록체인 애플리케이션을 보다 쉽게 개발하는 방법을 소개합니다.

최근 블록체인 지갑을 통한 앱 사용자 확보 및 연계 서비스에 대한 관심이 매우 높아지고 있는데요, KAS를 이용해서 Klaytn 기반의 지갑 서비스 기능을 개발하는 법에 대해 알아보겠습니다.

Klaytn 지갑 기능 설계

사용 시나리오 분석

Klaytn을 사용한 지갑 개발에 앞서, 사용자 관점에서 요구되는 기능으로는 어떤 것들이 있는지 분석해보도록 하겠습니다. 대부분의 암호화폐 기반이 그렇듯, 사용자 관점에서 가장 관심있을 만한 것은 토큰 관리 기능이겠죠?

1편에서는 KAS를 이용하여 Klaytn 계정을 생성하고 Klaytn의 메인 토큰, KLAY 활용 방법에 대해 소개합니다. Klaytn 기반의 서비스는 사용자 관점에서 크게 계정 관리KLAY 관리라는 두 가지 기능으로 나눌 수 있습니다. 아래 그림에서 조금 더 상세하게 살펴보면, 계정 관리에는 계정 생성, 조회, 삭제 등의 기능이 있고, KLAY 관리 측면에서는 KLAY 거래와 거래내역 조회가 있습니다.

Deployment Architecture

앞서 Klaytn 블록체인 기반의 지갑을 만들기 위해 필요한 기본 기능 두 가지를 소개드렸는데요. 이를 실제로 구성하려면 크게 사용자 UI를 제공하는 애플리케이션(Wallet App)과, KAS 서비스와 통신하는 지갑 백엔드 서버(Wallet Server)가 필요합니다. 지갑 백엔드 서버는 사용자를 관리하거나 독자적인 기능을 제공하기 위해서 데이터베이스를 갖추게 될 것입니다.

위에서 정의한 사용자 시나리오를 만족하기 위해서는 현재 KAS에서 제공하는 서비스 중 Wallet API, Node API, TokenHistory API를 이용하여야 합니다. 아래의 그림은 지갑 서비스와 KAS 서비스 간의 연결성 관점에서 본 추상적 아키텍처입니다.

KAS 개발환경 구축

KAS를 이용한 개발을 준비하기 위해서는 먼저 KAS 문서를 참고해 KAS Console 회원 가입을 진행합니다. 다음으로 서비스 API를 사용하기 위한 자격 증명을 발급받아야 합니다. 자격 증명 발급은 KAS Console > Security > Credential에서 가능한데, 발급받은 Access Key와 Secret Key를 잊지 않도록 기록해두어야 합니다.

Klaytn 지갑 기능 개발

이 단락에서는 사용자의 Klaytn 계정 관리, KLAY 거래, KLAY 거래 내역 조회라는 3개의 기능을 개발하는 방법에 대해서 알아보겠습니다.

본 튜토리얼은 KAS SDK를 사용하는 환경 기준으로 설명합니다. 만약 KAS SDK가 제공하지 않는 개발 언어를 사용하는 경우 KAS 문서를 참고하세요.

Klaytn 지갑 기능을 개발하기 위해서 전체 기능의 도식도를 살펴보면, 아래와 같이 Wallet, Node, Token History 서비스를 사용함을 알 수 있습니다.

Klaytn 계정 관리

지갑 서비스를 만들려면 먼저 개인 키와 공개 키로 구성되는 사용자의 Klaytn 계정을 생성해야 합니다. 만약 사용자 다수의 개인 키를 관리하다가 내부 또는 외부 요인으로 키가 유출되는 사고가 발생하면 어떻게 될까요? 지갑 서비스를 사용하는 모든 사용자의 자산이 위협받게 됩니다. 그래서 KAS는 Klaytn 서비스를 개발하고자 하는 많은 개발자와 사용자의 키를 안전하게 보관할 수 있도록 Wallet 서비스를 제공하고 있습니다.

Wallet 서비스는 Hardware Security Module(HSM)이라는 안전한 보안 장비를 기반으로 키를 관리합니다. HSM은 내부자가 키를 알 수 없는 것은 물론이고, 설령 사용자의 키가 노출되더라도 암호학적으로 키를 알 수 없도록 설계되어 있습니다. 그러니 안심하고 KAS Wallet 서비스를 이용할 수 있습니다.

지갑 서비스를 개발하기 위해서는 사용자와 KAS에서 제공하는 Klaytn 계정이 어떻게 연결되는지 생각해볼 필요가 있습니다. 지갑 서비스를 사용하는 사용자의 입장에서 볼 때 Klaytn의 계정 주소는 복잡해서 외우기는 물론 사용하기도 힘듭니다. 그래서 Klaytn의 계정을 사용자가 읽을 수 있는 형태의 사용자 ID로 연결시키는 작업이 필요합니다. 바로 아래의 그림 처럼요.

Entity Relationship Diagram(ERD)에서 계정(Account)은 KAS Wallet 서비스를 통해서 조회할 수 있는 정보이며, 지갑 서비스에서는 이러한 사용자 정보를 관리해야 합니다. 따라서 지갑 서비스 사용자가 회원 가입할 때 연동되는 KAS Wallet 계정을 생성하여 아래의 코드와 같이 연결할 수 있습니다.

// controllers/user.jsUser = require('../models/user');const CaverExtKAS = require('caver-js-ext-kas');
const caver = new CaverExtKAS();
caver.initKASAPI(
1001,
accessKey,
secretKey,
);
exports.signup = async (req, res) => {
var user = new user();
user.name = req.body.name;
user.phoneNumber = req.body.phone;
user.password = req.body.password;
// KAS: Create a Klaytn account.
const result = await caver.kas.wallet.createAccount();
user.address = result.address;
user.save(function (err) {
if (err) res.json(err);
res.json(user);
});
};

KLAY 거래

앞서 우리는 지갑 서비스에 필요한 Wallet 서비스 계정 연결을 진행해보았습니다. 이제는 사용자 A가 사용자 B에게 KLAY를 전송하는 과정을 살펴보겠습니다.

지갑 서비스에서 사용자 A가 사용자 B의 ID만 알 뿐, Klaytn 계정 같은 복잡한 주소는 모른다고 가정해봅시다. 지갑 서비스는 사용자 ID를 받아서 연결된 Klaytn 계정으로 변환한 후에 Wallet 서비스를 통해서 KLAY를 전송할 수 있습니다. 아래 코드에서 자세히 살펴보세요.

// controllers/token.js
User = require('../models/user');
const CaverExtKAS = require(‘caver-js-ext-kas’);
const caver = new CaverExtKAS();
const accessKey = '';
const secretKey = '';
caver.initKASAPI(1001, accessKey, secretKey);exports.transfer = async (req, res) => {
// NOTE: authenticate requester.
const value = req.body.value;
const fromUser = await User.findOne({ name: req.body.fromUser });
const toUser = await User.findOne({ name: req.body.toUser });
// NOTE: you need to handle errors // KAS: invoke a value transfer transaction
const tx = {
from: fromUser.address,
to: toUser.address,
value: value,
submit: true,
};
const result = await caver.kas.wallet.requestValueTransfer(tx);
res.json(result);
};

계정 조회

두 사용자 간의 거래가 정상적으로 이루어졌는지 확인하려면 Klaytn 계정의 밸런스를 조회해야 합니다. KAS의 Node 서비스로 조회 기능을 이용할 수 있습니다. KAS의 Node 서비스는 Klaytn 노드가 제공하는 기능을 KAS에서 제공하는 기능으로, KEN을 직접 운영하는 것에 비해서 높은 안전성을 제공할 수 있도록 구성되어 있습니다. 따라서 원활한 서비스 운영을 위해 KAS의 Node 서비스를 이용하도록 권장합니다. 아래 코드에서 지금껏 설명한 계정의 잔액 조회 방법을 확인할 수 있습니다.

// controller/user.js
// ... omitted ...
exports.get = async (req, res) => {
const user = await User.findOne({ name: req.params.name });
const balance = await caver.rpc.klay.getBalance(user.address); res.json({
...user._doc,
balance,
});
};

KLAY 거래 내역 조회

KLAY 거래 내역을 조회하기 위해서는 KAS의 Token History 서비스를 이용해야 합니다. Token History 서비스는 Klaytn에 존재하는 KLAY, FT, NFT 등 다양한 토큰의 송수신 내역 조회 API를 제공합니다. 토큰 히스토리가 제공하는 송수신 내역은 Klaytn의 트랜잭션 내역을 기반이기 때문에계정 주소의 송수신 내역보다는 사용자 친화적인 관점에서 사용자 이름을 기반으로 한 송수신 내역을 보여줄 필요가 있습니다. 그러려면 아래와 같은 코드처럼, KAS의 Token History 서비스를 이용해 송수신한 거래내역을 지갑 서비스에서 관리하는 사용자 이름으로 변환해주는 과정이 필요합니다.

// controllers/token.js
// ... omitted ...
exports.history = async (req, res) => {
const user = await User.fineOne({ name: req.params.name });
const result = await caver.kas.tokenHistory.getransferHistoryByAccount(
user.address,
);
Promise.all(
result.items.map(async (el) => {
console.log(el);
const peb = cv.utils.hexToNumberString(el.value);
const fee = cv.utils.hexToNumberString(el.fee);
const ef = cv.utils.toChecksumAddress(el.from);
let from =
user.address == ef ? user : await User.findOne({ address: ef});
from = from ? from.name : ef;
const et = cv.utils.toChecksumAddress(el.to);
let to =
user.address == et ? user : await User.findOne({ address: et});
to = to ? to.name : et;
console.log(from, to);
return {
from,
to,
fee: cv.utils.fromPeb(fee, 'KLAY'),
value: cv.utils.fromPeb(peb, 'KLAY'),
};
});
).then((data) => res.json(data));
};

결론

#1에서는 Klaytn 지갑이 제공하는 다양한 기능 중에서 KAS API를 활용한 Klaytn 지갑 기능 개발 방법을 알아보았습니다.

#2에서는 Klaytn의 KIP-17이라는 표준을 사용하여 생성한 토큰 관리 기능을 살펴보도록 하겠습니다.

References

KAS Wallet API Reference: https://refs.klaytnapi.com/ko/wallet/latest
KAS Token History API Reference: https://refs.klaytnapi.com/ko/th/latest
KAS Node API Reference: https://refs.klaytnapi.com/ko/node/latest
KAS Docs: https://docs.klaytnapi.com/

--

--