caver-js 사용시 fee delegation 타입의 트랜잭션들은 사이닝 할때 코드에 role based fee delegation 키가 있어야 하는가? account json 파일로 decrypt 하고 in memory wallet 에 add 하여 fee delegation 타입의 트랜잭션을 사이닝 할 수 없는가?
만약 account json 파일에서 fee delegation key를 임포트 하지 못한다면 caver-js v1.5.0 버전을 사용해서
caver-js를 사용할 때에 role based fee delegation 키가 없는 경우, 즉 role에 상관없이 동일한 키를 사용하는 경우 트랜잭션의 발송자(sender)로써 서명할 때에, 그리고 Account update 트랜잭션(TxTypeAccountUpdate, TxTypeFeeDelegatedAccountUpdate, TxTypeFeeDelegatedAccountUpdateWithRatio)에 서명할 때에, 그리고 수수료 대납자(fee payer)로써 서명할 때에 모두 동일한 키를 사용하게 됩니다.
따라서 위에 올려주신 코드에서, key store 파일이 역할 별로 다르게 키를 정의하지 않았다면 decrypt된 1개 혹은 여러 개의 키를 사용하여 fee delegation 트랜잭션에 서명이 가능합니다.
account json파일에서 임포트 한 계정으로 fee payer 로써 서명이 가능합니다
아래에 참고하실 수 있는 예제 코드를 첨부하겠습니다.
최대한 올려주신 코드와 비슷하게 작성했는데, 혹시 이해 안되시는 부분이 있으면 말씀해 주세요 !
참고로 아래의 rawTransaction 은 klay_signTransaction RPC 콜 호출 결과의 raw 필드에 해당되는 값입니다.
const caver = new Caver('https://api.baobab.klaytn.net:8651/')
// Create sender and add to wallet
const sender = caver.klay.accounts.wallet.add('0x{private key}')
// Create fee delegation transaction for getting RLP-encoded string(rawTransaction)
const vt = {
type: 'FEE_DELEGATED_VALUE_TRANSFER',
from: sender.address,
to: '0x{address in hex}',
value: 1,
gas: 50000,
}
// Sender signs to the transaction
const { rawTransaction } = await caver.klay.accounts.signTransaction(vt)
console.log(rawTransaction)
// Decrypt fee payer keystore and add to wallet
const feePayerKeystore = fs.readFileSync('./feePayer.json')
const password = 'test1234!'
const feePayer = caver.klay.accounts.decrypt(feePayerKeystore.toString(), password)
caver.klay.accounts.wallet.add(feePayer)
// Fee payer signs to the transaction as a fee payer.
const signed = await caver.klay.accounts.feePayerSignTransaction(rawTransaction, feePayer.address)
console.log(new Date().toLocaleString('en-US', { timeZone: 'Asia/Seoul' }), `Signed TX : ${JSON.stringify(signed)}\n`)
// Send signed transaction to Klaytn Node
const transactionReceipt = await caver.klay.sendSignedTransaction(signed)
console.log(new Date().toLocaleString('en-US', { timeZone: 'Asia/Seoul' }), `Daemon RESPONSE: ${JSON.stringify(transactionReceipt)}\n`)
네 2번에서 만들어진 keystore.json은 single key로 처음에 만들어집니다. 3번에서 account update를 하고나서 다시 keystore.json을 업데이트 시켜줘야 role based key가 keystore.json에 저장이 됩니다. 자동으로 업데이트 되진 않구요. Keystore.json을 업데이트 하시려면 encrypt함수를 사용하면 됩니다.