BlockChain/Klaytn

Klaytn - Caver.js 대납계정(feePlayer) 연결

Lalabla 2022. 11. 11. 14:47
반응형

Caver.js를 사용하여 발행된 컨트랙트에 대납계정을 연결하는 방법을 알아보자. 

 

1. 먼저 대납계정의 공개키와 개인키를 caver.wallet.add 함수를 사용하여 등록해준다. 

const Caver = require('caver-js')

const feePayerKeyring = caver.wallet.keyring.create(process.env.K_FEE_ADDRESS, process.env.K_FEE_PRIVATE_KEY)
caver.wallet.add(feePayerKeyring)

 

 

2. new caver.contract 를 사용하여 컨트랙트를 연결해준다. abi와 컨트랙트 주소가 필요하다.

const erc20_rw = new caver.contract(erc20_abi,process.env.K_ERC20_CONTRECT_ADDRESS);

 

 

3. sign 함수로 트랜잭션에 서명한다.

let executionTx = await erc20_rw.sign({
    from:erc20DeployerKeyring.address,
    feeDelegation: true,
    gas: 1000000,
    }, '컨트랙트함수명', 인자1, 인자2, 인자3...)

 

from : 보내는 사람의 주소

feeDelegation : 수수료 대납 여부 

gas : 가스비

 

그리고 나머지는 설명한대로 실행할 컨트랙트 함수의 이름과 해당 함수에 들어가야 할 인자들을 넣어주면 된다. 

 

 

4. 만든 트랜잭션에 feePlayer(수수료 대납계정)으로  다시 서명한다.

await caver.wallet.signAsFeePayer(feePayerKeyring.address, executionTx)

  

5. sendRawTransaction함수를 사용하여 서명한 트랜잭션을 클레이튼 서버로 요청한다. 

caver.rpc.klay.sendRawTransaction(executionTx)
.on('transactionHash', txHash=>{
    resolve(txHash);
})
.on('error', async (err)=>{
    reject(err);
})

await 를 걸고 .on에 receipt까지 붙이면 완료된 경우까지 반환받을 수 있다. 자세한 내용은 공식문서에서 확인 할 수 있다.

 

프로젝트를 진행하면서 3개의 컨트랙트를 하나의 계정으로 사용하다보니, 빠르게 블록체인서버로 데이터를 보내는 경우에 동일한 Nonce의 트랜잭션이 자꾸 올라가버려서 에러가 나는 경우가 있어서 처리하는데 애먹었다..

 

해결은.. 각 컨트랙트마다 다르게 계정을 부여해버리니 Nonce 충돌은 안나서 일단 그냥 진행 .. ㅠ 

반응형