이번 블로깅에서는 클레이튼 네트워크와 연동하는 몇 가지 API 를 express 서버에 개발해 보겠다.
이전 블로깅 마지막에서 바오밥 테스트넷의 최근 블록주소값을 추출해 보았다.
app.get('/lastBlockNumber', async (req, res) => {
try {
const blockNumber = await caver.rpc.klay.getBlockNumber()
res.send(`최근 블록값: ${blockNumber}`);
} catch(err) {
throw err;
}
});
caver.rpc.klay.getBlockNumber() 라는 함수를 실행하면 최근 블록주소값이 추출된다는 것을 유추할 수 있다.
아 참, 그 결과값이 16진수이므로 아래와 같이 res.send 부문을 수정하자.
res.send(`최근 블록값: ${parseInt(blockNumber,16)}`);
이처럼 KAS SDK 를 활용하면 다양한 정보를 클레이튼 네트워크에서 얻을 수 있고, 능동적인 활동(코인을 보낸다거나, 스마트 컨트랙트를 등재한다거나) 도 가능하다.
이를 RESTful 서버로 만들어두고, 사용자 인터페이스를 만들면 결국 이더스캔과 같은 클레이스캔이 되는 것이다.
다만 이번 블로깅에서 사용자 단은 생략하도록 하겠다. 시간이 되면 react 를 활용한 유저 인터페이스를 추가로 블로깅하겠다ㅠㅠ
오케이~~ 몇 가지 기능을 지금부터 만들어 보자~~!!
// 지갑 주소 생성
app.get('/newAccount', async (req, res) => {
try {
const result = await caver.kas.wallet.createAccount();
res.send(result);
} catch(err) {
throw err;
}
});
caver.kas.wallet.createAccount 함수를 이용하면 새로운 지갑 주소를 발급 받을 수 있다.
클레이튼 지갑 주소(EOA) 를 인자로 넣어 계정 정보를 확인해보자.
이는 web3.js 에서 getBalance() 와 비슷하다고 할 수 있다.
caver.rpc.klay.getAccount() 를 활용하면 되는데, 이 함수의 특이한 점은 블록 번호를 인자로 받는다는 점이다. 만약 블록 번호를 생략하면 latest 블록 주소를 default 로 갖는다.
그런데 블록 번호를 왜 인자로 받는지 이해가 되지 않는다. 최신(latest block) 에서의 계정 정보가 아닌 과거 정보도 알 수 있도록 해주는 것이 아닌가 싶다.
다음 코드를 index.js 에 추가하자.
app.get('/account', async (req, res) => {
if(req.query.target) {
const targetAccount = req.query.target;
try {
const result = await caver.rpc.klay.getAccount(targetAccount);
res.send(result);
} catch(err) {
throw err;
}
} else {
res.send(`지갑 주소 정보가 올바르지 않습니다`);
}
});
동작은 다음과 같다.
위처럼 /account?target={지갑주소} 로 GET 요청을 하면 다음과 같은 정보를 얻을 수 있는데, 지갑주소의 잔액이 16진수로 출력되는 것을 확인할 수 있다.
좀 더 결과를 깔끔하게 가꾸기 위해 getBalance() 를 작성하자.
"accType": 1,
"account": {
"nonce": 12,
"balance": "0x79425a26dc17fc00",
"humanReadable": false,
"key": {
"keyType": 1,
"key": {
}
}
}
코드는 다음과 같다. 위의 지갑 정보 함수와 거의 동일하다.
app.get('/getBalance', async (req, res) => {
if(req.query.target) {
const targetAccount = req.query.target;
try {
const result = await caver.rpc.klay.getAccount(targetAccount);
const balance = parseInt(result.account.balance,16)*(0.1e-17);
res.send(balance + ' KLAY');
} catch(err) {
throw err;
}
} else {
res.send(`지갑 주소 정보가 올바르지 않습니다`);
}
});
내 카이카스 지갑주소로 테스트하면 아래와 같이 결과가 나온다.
이는 실제 카이카스에서 본 잔액과 동일함을 알 수 있다.
KAS token API 를 사용하면 아래 기능을 모두 사용할 수 있다. 즉, 특정 계정의 트랜잭션 리스트 및 각 트랜잭션 혹은 컨트랙트 정보를 조회할 수 있다. NFT 도 컨트랙트고, 소유권을 변동한 것도 트랜잭션이니 NFT 정보를 모두 조회할 수 있다는 것은 당연한 말이 되는 것이다.
클레이튼에서 토큰 송/수신 기록을 조회하기 위해서는 KAS 에 Preset 을 등록해야 한다.
Preset이란 KAS에서 1개 이상의 토큰 송/수신 기록을 조회하기 위해 필요한 정보다.
KAS 콘솔에서 Preset을 등록하면 KAS는 Preset에 속한 여러 토큰의 송/수신 기록을 계속 모니터링하며, 송/수신 기록을 조회할 때 한번에 불러올 수 있도록 한다.
예를 들어 내 지갑주소의 트랜잭션 내역을 조회하고 싶으면, 반대로 얘기하면 내 지갑주소를 KAS 콘솔 상의 preset 에 반드시 등록해놓아야 한다.
web3.js 를 공부할 때 살펴봤듯이, 한 계정의 트랜잭션 내역을 뽑는 것은 쉬운 일이 아니다. 왜냐하면 모든 블록을 깐 후 각 블록에 포함된 트랜잭션들의 to, from 을 모두 조회해야 하기 때문이다.
KAS 에서는 preset 을 활용하여 이를 대신해 준다고 할 수 있겠다. 참고로 Preset에는 지갑주소(EOA), FT 컨트랙트 주소, NFT 컨트랙트 주소를 등록할 수 있다.
이 과정은 차후 블로깅에서 도전해 보겠다. 흑흑ㅠㅠㅠ
마지막으로 NFT (KIP-17) 스마트 컨트랙트를 클레이튼 네트워크 상에 배포하는 API 를 짜보겠다. 코드를 다음과 같이 index.js 에 추가한다.
// NFT (KIP-17 스마트 컨트랙트 배포)
app.get('/newContractNFT', async (req, res) => {
if(req.query) {
const name = req.query.name;
const symbol = req.query.symbol;
console.log(`${name} ${symbol}`)
try {
const result = await caver.kas.kip17.deploy(name, symbol, 'my-first-kip17asd');
res.send(result);
} catch(err) {
console.log(err);
throw err;
}
} else {
res.send(`지갑 주소 정보가 올바르지 않습니다`);
}
});
이 코드는 Name 와 Symbol 인자를 받아서, KIP-17 규칙에 맞게 NFT 스마트 컨트랙트를 배포할 수 있는 코드이다.
Name (name): 컨트랙트의 이름. KIP-17 표준에서 요구하는 name으로 사용
Symbol(symbol): 컨트랙트의 심볼. KIP-17 표준에서 요구하는 symbol로 사용. 일반적으로 알파벳 대문자 3~4개로 구성되나 제약은 없음
그런데, 테스트 시에는 해당 API 가 잘 동작하였으나, 현재는 내 KAS 권한으로는 막힌 것 같다. 아무래도 사용에 제약이 있는 것 같다.
아래는 테스트 시 성공한 return 의 예시이다.
지금까지 KAS API 를 이용하여 클레이튼 네트워크와 통신할 수 있는 간단한 서버를 개발해 보았다.
많이 부족하지만 시작이 반이라는 생각으로 다양한 기능을 계속 개발하도록 하겠다.
추천 받은 회고 방법론을 통해 지금까지 한 내용을 정리해 보겠다.
회고 방법론 : KPT (KEEP, PROBLEM, TRY)
솔직히 이 '클레이 지갑' 블로깅은 상당히 실망스럽다.
그럼에도 불구하고 긍정적인(Keep) 부문을 한번 찾아보자.ㅠㅠ
블로깅을 쓰기에 아주아주 충분한 시간이 주어졌으나 개인적으로 여행도 가고, 빈둥빈둥 거리다 결국 몇시간 만에 블로깅을 하게 되었다. 그렇게 만든 것치곤 기능은 동작하기에 잘 해냈다고 생각한다.
오픈소스 시대에서 다른 사람이 만든 API 를 잘 적용하고, 이해하는 능력은 중요하다고 생각한다. 그러한 부문에서 나에게 조금의 점수는 주고 싶다.
블로깅 주제를 선정하는 데 있어 solidity 개발 부문을 하나도 정하지 않은 것이 큰 문제다. 스마트 컨트랙트 개발에 대한 충분한 이해가 있지 못하다보니 자신감도 떨어져 그렇게 된 것 같다.
그리고 이 블로깅의 코드는 단점 투성이다. 평소에 예외처리에 대한 습관을 잘 들이려고 항상 노력하는데, 이 코드는 그렇지 못하다.
시간이 없더라도, 시간이 2배 3배 걸리더라도 프로그램이 절대 에러가 발생하지 않도록 예외처리에 집착하려는 태도가 필요하다.
사실 처음에 이 블로깅을 써야겠다고 다짐한 이유는 '이더스캔' 을 react 기반으로 지난 주에 잘 만든 적이 있기 때문이다. 해당 애플리케이션은 server & client 를 모두 개발했는데, 구조가 복잡하다보니 이 블로깅에서는 활용하지 못한 점은 다소 아쉽다.
그래서 이 블로깅에서 도출한 결과물을 server 측에 적용하여 '진짜 클레이 스캔' 을 만들어 블로깅해 볼 계획이다.
또한 수업에서 배운 스마트 컨트랙트 개발 내용들을 모두 블로깅하겠다.
공부를 하다보면 '시간이 없는데 블로깅할 시간이 어딨냐? 차라리 조금이라도 더 공부하지' 라는 선입견이 있었는데, 이번에 블로깅을 하면서 알게 되었다.
블로깅은 내 생각을 일목요연하게 해준다. 그리고 블로깅은 장기적으로 훨씬 도움이 되고 '시간이 절약' 된다.
고 노무현 대통령은 글을 쓰거나 말을 하다보면 생각을 정리할 뿐만 아니라 새로운 생각이 솟아난다고 하였다.
마찬가지로 나는 블로깅을 하면서 그래봐야 겠다.
읽어주셔서 감사합니다.