Klaytn API Service (KAS) 기반 서버개발(2) - 클레이 전송 및 트랜잭션 확인
♨항상 글 마지막에 질문을 남기는데 혼자서 고민해보고 답하는 시간을 가져봅시다!
항상 저 같은 ㅃㄷㄱㄹ를 위해서 자세하고 쉽게 설명을 하도록 노력하겠습니다.
*욕은 사절 비판은 환영*
* 나와 같은 초보자들은 그냥 순서대로 따라오시면 실습을 진행할 수 있습니다.
* 전체 코드 및 설정은 github에 등록했습니다. 편하게 가서 보고 사용하시면 됩니다.
지금 main으로 되어있으면 코드가 안보입니다. master로 바꿔주세요!!!
*github 주소 : https://github.com/ms3221/Klay-API-Service/tree/master
GitHub - ms3221/Klay-API-Service
Contribute to ms3221/Klay-API-Service development by creating an account on GitHub.
github.com
확인 가능한 klayscope
Klaytnscope
Klaytnscope allows you to find data by monitoring network health and statistics of Klaytn as well as profiling blocks and transactions on Klaytn.
baobab.scope.klaytn.com
사용한 트랙잭션 해쉬 : 0x8d9dea743f20ef89051a918b0a6c292aac6bd1503d29088bedfe4fdb17ce7787
안녕하세요! 그러면 저번 시간에 이어서
클레이를 전송하는 함수의 사용법에 대해서 배워보도록 하겠습니다.
*다르게 보내는 함수도 있습니다. 저는 다만 제 기준에서 사용했던 함수에 대해서 공유하는 것입니다.*
1. 클레이 전송하기
- 내가 가진 클레이를 다른 계정의 주소로 원하는 만큼 보내주는 함수를 작성하자!
- 조건 : 1) 보내려고 하는 계정이 존재하는지 확인을 해주자 (저번 시간에 배운 함수! 모르면 뒤로 가기!)
2) 내가 가진 클레이의 개수가 보내려는 클레이의 개수보다 적으면 안 된다!
- 사용되는 함수 : caver.kaly.getBalance(); caver.utils.fromPev()
코드 ▼
app.get('sendKlay',async (req,res)=>{
let to = req.body.toAddress;
let value = req.body.amount;
let balance;
balance = await caver.klay.getBalance(process.env.ADDRESS);
balance = caver.utils.fromPeb(balance, "KLAY")
//계정이 존재하는지 확인하는거죠!! 만약 있으면 true 없으면 false
let check = await caver.klay.accountCreated(to);
console.log(check);
if(check && balance > value){
const keyring = caver.wallet.keyring.createFromPrivateKey(process.env.PRIVATE_KEY);
const valueTransfer = caver.transaction.valueTransfer.create({
from:keyring.address,
to: '0x06A09448Ce035F05134EFCD61F66a84a2f68066b',
value: caver.utils.toPeb(`${value}`, 'KLAY'),
gas: 30000,
});
const signed = await valueTransfer.sign(keyring)
const receipt = await caver.rpc.klay.sendRawTransaction(signed)
console.log(receipt);
res.send(receipt);
}else{
res.status(400).send('금액이 초과했거나 계정이 없을 수 있어요 확인해주세요!');
}
})
코드를 순차적으로 설명해 보자면
- postman에서 post(http://localhost:8882/sendKlay)를 해주면 index.js에서 req.body.toAddress를 이용하여 value값을 가져올 수가 있다. 그럼 당연히 amount도 똑같겠주? 그래서 to에는 보내려는 주소의 값이 value에는 보내는 Klay값이 담긴다.
- 보내는 주소의 잔액 확인하기
caver.klay.getBalance('주소') : 함수를 사용하면 몇 개의 peb이 있는지 확인 가능 아래 gif참조
caver.utils.fromPeb(peb값, "KLAY") : 기본은 1 klay = 1*10의 18승 peb으로 되어있다. 그래서 원래는 조회하게 되면 peb형태로 받게 되는 utils함수를 사용해서 klay 변환시키자. 위에 코드로 보면 balance에는 peb이 klay형태로 변환되어서 담긴다.
- 보내는 주소의 잔액 확인하기
저번 시간에도 배웠다. caver.klay.accountCreated(주소) : 주소가 존재하는지 안 하는지 확인하는 함수. 존재하면 true 반환
- 위에 작성했던 조건이 if문을 통해서 true이면 코드가 진행되게 만든다.
● check() : 계정이 존재하는지
● && : 위아래 조건이 둘 다 true여야지 코드가 진행이 된다.
● balance > value : 내가 가지고 있는 잔액이 보내려고 하는 잔액보다 많은지
● caver.wallet.kerying.createFromPrivateKey (개인키) : 개인키 문자열 또는 KlaytnWalletKey로부터 SingleKeyring 인스턴스를 생성합니다.
● caver.transaction.valueTransfer.create(option) : ValueTransfer는 KLAY 전송 트랜잭션을 나타냅니다.
● value는 다시 Peb값으로 바꾸어서 전송해주어야 합니다.
● gas : 30000 고정시켜줍니다.
● 다음 sign(keyring)을 통해서 트랜잭션에 서명을 해줍니다.
● caver.rpc.klay.sendRawTransaction(signed) : 서명된 트랜잭션을 블록체인 플랫폼으로 보내준다.
● return 값으로 receipt 즉, 영수증이 나온다 밑에 gif와 이미지를 보고 이해해 보자!
- senderTxHash 가지고 klaytnScope에서 확인하기
* klaytnScope : 클레이튼 네트워크에서는 Klaytnscope을 사용하여 트랜잭션, 블록, 주소를 검색할 수 있습니다.
이더리움은???? -> 이더스캔 즉, 이더스캔과 KlaytnScope역할은 비슷 무리하다고 생각합시다!
● receipt에서 senderTxHash 값을 가지고 온다. 0x8d9dea743f20ef89051a918b0a6c292aac6bd1503d29088bedfe4fdb17ce7787
확인해보고 싶은 분들은 이 값을 가지고 KlaytnScope로 접속해서 위에 해쉬값을 넣어 보면 된다!
https://baobab.scope.klaytn.com/
Klaytnscope
Klaytnscope allows you to find data by monitoring network health and statistics of Klaytn as well as profiling blocks and transactions on Klaytn.
baobab.scope.klaytn.com
● 위에 보게 되면 from -> to를 보면서 계정의 주소가 맞는지 확인해보고, amount를 보고 내가 보내는 Klay양이 맞는지 확인도 해준다. 이 화면까지 나오면 지금 klay를 전송하는 방법을 제대로 실행하고 있는 것이다.
총 정리
목표 : caver.js를 사용해서 klay를 전송해보기. 목표 100% 달성
- keep : caver.js가 제공해주는 함수 연결부터 버전 확인, 블록 넘버 확인, 계정 생성, 잔액 확인, 클레이 전송까지 아주 기초적인 부분을 연결 지어 진행 함으로써 이해가 더 쉽게 된 것 같다.
- problem : caver.js에서도 계정 생성에도 privatekey를 가지고 또는 그냥 이렇게 다양하게 함수가 만들어져 있다. 나는 그 일부분을 가져다가 사용한 것뿐이다. 그리고 아직 이 부분을 이용해서 어떤 서비스를 만들지도 불명확하다.
- try : caver.js 공식문서를 읽어가면서 조금 더 함수의 사용에 대해서 고민해보고 사용해볼 필요가 있다. 그리고 이런 함수를 이용해서 어떤 서비스가 필요할지도 고민해보아야 할 것 같다. 또한 더 나아가서 이제는 스마트 컨트랙을 배포하고 사용해보는 부분을 공부할 예정이다.
추가
이 글을 다 읽은 분이라면 화면을 끄기 전에 어떤 함수를 어떻게 사용했는지 한 번 더 확인하고 정리하고 넘어가면 다음에 다시 볼 때 쉽게 접근할 수 있다고 생각이 든다. 그리고 내가 정리한 부분은 미흡한 부분은 많으니 참고만 하되 정식 doc를 참고하면서 연습하기를 바란다.
또, caver.klay.getBlock(블록넘버)를 사용해서 이블럭에 우리의 트랜잭션이 담겨있는지 확인할 수 있다. 지금까지 과정을 따라오신 분이라면 숙제처럼 한번 찾아보고 구현시켜보면 도움이 될 거라고 생각해서 남긴다.
코드(한번 찾아보고 보기를 바랍니다)
app.get('/getBlock',(req,res)=>{
caver.klay.getBlock(77628578).then(console.log);
})

transactions의 값과 나 또는 당신이 가지고 있는 hash값과 비교해 보자 같으면 우리는 이 블록넘버에 우리의 트랜잭션 기록이 담겨있다는 것을 확인할 수 있을 것이다.