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 충돌은 안나서 일단 그냥 진행 .. ㅠ
반응형