본문 바로가기
포트폴리오/Project_1

Web3.js 서버프로젝트를 KAS기반 클레이튼 서버로 개발

by StelthPark 2021. 12. 12.

1. 개발 내용

 

 

1. Web3.js과 비슷한 Caver를 사용하여 KAS기반 클레이튼 서버 개발

2. /createaccount를 통해 새로운 주소와 PrivateKey를 만들어 낼 수 있다.

3. /getbalance를 통해 body로 전송받은 address를 입력하여 잔고를 확인 할 수 있다.

4. /transfer를 통해 body로 전송받은 toAddress와 amount로 토큰을 전송 할 수 있다.

5. /deploy를 통해 json객체타입으로 전송받은 abi와 bytecode로 스마트컨트랙트를 배포 할 수 있다.

 

작성 전 선언조건

const express = require('express');
const app = express();
const port = 8080;

app.use(express.json());
app.use(express.urlencoded({extended:false}));

app.listen(port, () => {
console.log('Listening...');
});

express와 port 사용을 선언한다. 해당선언으로 http://localhost:8080/으로 접속할 수 있다.

 

const Caver = require("caver-js");
const caver = new Caver('https://api.baobab.klaytn.net:8651');

KAS에는 Web3.js처럼 사용되는 Caver가 있다. web3.js 또는 web3j를 사용하여 Klaytn에 직접 요청을 보낼 수는 없다는 점에 유의한다. caver-java의 구문은 web3.js 및 web3j와 매우 유사하다.

 

require('dotenv').config();

환경변수를 사용하기 위해 선언하며 PRIVATE_KEY와 from으로써의 주소를 저장하여 사용한다. 

.env파일을 생성하여 내부에서 변수를 선언하여 사용 할 수 있다.

 

 

주소 생성

app.get('/createaccount', async(req,res)=>{
const account = await caver.klay.accounts.create();
const create = await caver.klay.accounts.wallet.add(account);
const newAccount = {
accountAddress: create.address,
accountPrivateKey: create.privateKey
}
res.json(newAccount);
})

http://localhost:8080/createaccount에서 함수가 실행된다. create메소드에 의해 고유한 account가 만들어지고 account를 wallet.add 인자로 넣어 지갑에 추가시킨다. 

 

createaccount

 

 

잔고 확인

app.get('/getbalance', async(req,res)=>{
const balance = await caver.klay.getBalance(req.body.address)
const convert = caver.utils.convertFromPeb(balance,'KLAY')
res.json(`잔고는 : ${convert}`);
})

http://localhost:8080/getbalance에서 함수가 실행되며 body로 address를 받아 getBalance인자로 넣어 잔고를 가져오게 된다. 가져온 잔고는 convertFromPeb를 통해 실제 지갑에서 보이는 수치로 변환시켜준다.

 

getbalance

 

 

토큰 전송

app.get('/transfer', async(req,res)=>{

const to = req.body.toAddress
const amount = req.body.amount;

let balance = await caver.klay.getBalance(process.env.FROM_ADDRESS)
balance = caver.utils.convertFromPeb(balance,'KLAY')

if(balance > amount){
const keyring = caver.wallet.keyring.createFromPrivateKey(process.env.PRIVATE_KEY);
const valueTransfer = caver.transaction.valueTransfer.create({
from:keyring.address,
to: to,
value: caver.utils.convertToPeb(`${amount}`, '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('transfer fail')
}
})

http://localhost:8080/transfer에서 함수가 실행되며  body로 toAddress인 송금받을사람, amount인 송금할 양을 받는다. getBalance로 환경변수에 저장된 FROM_ADDRESS인 송금자의 잔고를 입력받고 if문을 통해 보낼양보다 잔고가 많은지 검사한다.

 

createFromPrivateKey에 FROM_ADDRESS의 PRIVATE_KEY를 넣어 keyring을 만들고 valueTransfer.create로 송금자,송금받을사람,송금양(다시 전송 단위로 변환),gas등을 입력받아 valueTransfer로 만든다. 이후 keyring을 사용해 서명한뒤 전송하게 된다.

 

transfer

 

 

스마트컨트랙트 배포

app.post('/deploy', async(req,res)=>{
const account = caver.klay.accounts.wallet.add(process.env.PRIVATE_KEY)

const ABI = req.body.abi
const Bytecode = req.body.bytecode;

await caver.klay.sendTransaction({
type: 'SMART_CONTRACT_DEPLOY',
from :account.address,
data:
caver.klay.abi.encodeContractDeploy(ABI,Bytecode, 1, 2),
gas: '300000',
value: 0,
})
.on('transactionHash', function(hash){
console.log('트랜잭션 해시',hash)
})
.on('receipt', function(receipt){
console.log(receipt)
res.json('컨트랙트 배포 성공')
})
.on('error', console.error);
})

http://localhost:8080/deploy에서 함수가 실행되며 wallet.add에 PRIVATE_KEY를 넣어 account를 만들어둔다. ABI와 BYTECODE는 body에서 abi와bytecode로 JSON객체로 입력받는다

 

JSON 객체로 전송

sendTransaction에 인자로 객체안에 type, from, data, gas, value를 명시하게 되는데

data는 abi.encodeContractDeploy 라는 생성자의 인자를 포함한 스마트컨트랙트 바이트코드를 인코딩하여 보내준다.

이후 정상적으로 배포되면 트랜잭션해시와 배포 결과가 나타나게 된다.

 

deploy

 

2. 개발 회고

 

Keep: github에 올릴때나 from주소로써의 PRIVATE_KEY를 관리하기 위해 dotenv를 사용하여 환경변수로 값을 담았다.

변수할당을 최소화하고 코드를 최적화하기위해 노력하였다.

 

Problem: /createaccount로 생성한 주소에 어떤 트랙잭션도 발생하지않았다면 생성한 주소가 존재하는지에 대한 검사또한 계속 false로 나오게 된다. 결국에는 /transfer에서 전송하기 전에 보낼양보다 잔고가 더많은지 검사하는 결과와 동시에 송금받을 주소가 존재하는지에 대한 검사에서 false가 나와 전송못하게 될것이다.

 

Try: /createaccount로 생성한 주소에 어떤 트랙잰션이 발생하지않아도 주소가 존재하는지 검사하는 메소드인 accountCreated를 정상적으로 true될 수 있도록 연구해보자

 

 

3. 코드 및 주소

 

Github : https://github.com/Parkstelth/caver-KAS-klaytnServer

 

GitHub - Parkstelth/caver-KAS-klaytnServer

Contribute to Parkstelth/caver-KAS-klaytnServer development by creating an account on GitHub.

github.com

 

 

댓글