createWithMultipleKey를 이용한 트랜잭션 발생

안녕하세요.

초보적인 질문을 하나 올립니다.

아래와 같이 테스트 중입니다.

testCreateFeePayerTxFunction() 에서 createWithMultipleKey를 이용해서 트랜잭션을 만들고,

testSignFeePayerFunction()에서 sign을 진행하면

UnhandledPromiseRejectionWarning: Error: Cannot decode to FeeDelegatedValueTransfer.

이와 같이 이 후 진행이 되지 않습니다. 어떤 문제점이 있을까요?ㅠ

async function testCreateFeePayerTxFunction() {
//const sender = caver.wallet.keyring.createFromPrivateKey(‘0x62051429b335dd9e7b5638c63688871daaecb3bb6c65f50ca7af7cb977372918’)
const sender = caver.wallet.keyring.createWithMultipleKey(‘0x5c2aa2530d0fdf9b5c8b9e69eb983b2a20998a10’, [‘0x62051429b335dd9e7b5638c63688871daaecb3bb6c65f50ca7af7cb977372918’, ‘0x2b18e74b871154e7a7071ecf7dd343a2a808d5107e6a83f82b1bc7bbeea98bb1’]);
caver.wallet.add(sender)

const feeDelegatedTx = new caver.transaction.feeDelegatedValueTransferMemo({
    from: sender.address,
    to: '0x51f2b793ec3a21f84d1e3bada5158e69451af80c',
    value: caver.utils.toPeb(1, 'KLAY'),
    gas: 50000,
    input: '0x68656c6c6f',
})

await caver.wallet.sign(sender.address, feeDelegatedTx)

const rlpEncoded = feeDelegatedTx.getRLPEncoding()
console.log(rlpEncoded)

}

testCreateFeePayerTxFunction()

async function testSignFeePayerFunction() {
const feePayer = caver.wallet.keyring.createFromPrivateKey(‘0x2b18e74b871154e7a7071ecf7dd343a2a808d5107e6a83f82b1bc7bbeea98bb1’);
caver.wallet.add(feePayer);

const rlpEncoded = '0x11f8d9038505d21dba0082c3509451f2b793ec3a21f84d1e3bada5158e69451af80c880de0b6b3a7640000945c2aa2530d0fdf9b5c8b9e69eb983b2a20998a108568656c6c6ff88ef8458207f6a03c1e51376bb684d791f8e58626c964861beba573daf29a54fb8683fa0bf85ba5a052df8c90c6e32ffbc8302ba48f9eb4281b0b6090fec6516143c025f8fc157e1cf8458207f6a0844dc73a6f82b04a54135bfe8a0c2a3a53d41ca521e9cbdcd8dbf7e2fffdf8a1a03e77a1de55b075ccffb1d4958279fb45509819c7df6a531083ab8d9001dc19aa80c4c3018080';

const feeDelegateTxFromRLPEncoding = new caver.transaction.feeDelegatedValueTransfer(rlpEncoded);

// Set the fee payer address.
feeDelegateTxFromRLPEncoding.feePayer = feePayer.address;
await caver.wallet.signAsFeePayer(feePayer.address, feeDelegateTxFromRLPEncoding);

console.log(feeDelegateTxFromRLPEncoding.getRLPEncoding());

}

testSignFeePayerFunction()

안녕하세요 질문 주셔서 감사합니다.

코드만 간단하게 확인해 본 결과, 처음에 sender가 서명할 때에는 feeDelegatedValueTransferMemo 를 사용해서 생성했으나, 이후 수수료 대납자가 서명할 때에는 feeDelegatedValueTransfer를 사용하고 있어 문제가 생긴 것 같습니다.

const feeDelegateTxFromRLPEncoding = caver.transaction.decode(rlpEncoded) 이런식으로 decode함수를 사용하여 rlp encoded trasnaction을 디코딩해 트랜잭션을 생성하시면 더 편리하게 사용할 수 있으실 것 같습니다.

추가적으로 궁금한 사항 있으시면 말씀해 주세요 :slight_smile:

답변 감사합니다.

feeDelegatedValueTransferMemo 를 사용하니 정상적으로 진행이 되었습니다!

위에 말씀하신 const feeDelegateTxFromRLPEncoding = caver.transaction.decode(rlpEncoded) 방식을 사용하면

UnhandledPromiseRejectionWarning: TypeError: caver.transaction.decode is not a constructor

타입에러가 발생을 합니다 ㅠ

그리고 생성한 rlpEncdoe로 트랜잭션을 보내면 문제가 생기는데 코드를 한번 확인 해주실수 있을까요?

async function testRawTransactionFunction() {
const rlpEncoded = ‘0x11f90131038505d21dba0082c3509451f2b793ec3a21f84d1e3bada5158e69451af80c880de0b6b3a7640000945c2aa2530d0fdf9b5c8b9e69eb983b2a20998a108568656c6c6ff88ef8458207f6a03c1e51376bb684d791f8e58626c964861beba573daf29a54fb8683fa0bf85ba5a052df8c90c6e32ffbc8302ba48f9eb4281b0b6090fec6516143c025f8fc157e1cf8458207f6a0844dc73a6f82b04a54135bfe8a0c2a3a53d41ca521e9cbdcd8dbf7e2fffdf8a1a03e77a1de55b075ccffb1d4958279fb45509819c7df6a531083ab8d9001dc19aa94c691b774ddca393209b7f461bcadb23951a97415f847f8458207f5a0ac8ef3cbad0e79c380dd20c94de1f260edefdc161fd6fddb510a8209d8dbc40ea041a74491d4fcc21e9d519705297c14afe94646e072938bcdd491a8507531d495’;
const receipt = await caver.rpc.klay.sendRawTransaction(rlpEncoded);
console.log(receipt);
}

caver.transaction.decode는 생성자가 아니므로 new 키워드를 사용하시면 안됩니다. 그냥 해당 함수 호출만 해주시면 알아서 디코드해서 트랜잭션을 리턴하게 되므로 함수 호출만 해주시면 됩니다. 자세한 사용 방법은 여기를 참고하세요.

그리고 rlp encoded transaction string으로 트랜잭션을 전송했을 떄에 에러가 생기는 것은, 어떤 에러인지; 또 네트워크는 어디인지가 명확하지 않아 판단하기 어렵습니다.

답변 감사합니다!

rlp encoded transaction string 트랜잭션전송 정보는

UnhandledPromiseRejectionWarning: Error: Returned error: invalid transaction v, r, s values of the sender
이런 에러가 발생하고
네트워크는 baobab 에서 진행하고 있습니다!

해당 에러는 서명이 invalid하다는 의미로, sender의 서명을 만들 때 잘못된 키가 사용된 경우입니다.

from으로 지정된 0x5c2aa2530d0fdf9b5c8b9e69eb983b2a20998a10 계정의 키는 업데이트 된 적이 없어 보입니다. caver.rpc.klay.getAccountKey를 사용하여 조회한 결과 { keyType: 1, key: {} }로 AccountKeyLegacy이며 이는 privateKey -> publicKey -> address 이 결합 관계가 그대로 유지되고 있다는 것을 의미합니다.

하지만 위에 적어주신 예제에 보면 여러 개의 키를 사용하고 있는 것으로 보이는데, 만약 계정에서 여러 개의 키를 사용하려면 계정에서 사용하는 키를 업데이트 하는 과정을 거쳐야 합니다.
계정의 키를 업데이트 하는 방법은 Klaytn Docs - Getting Started를 참고해 주세요.

만약 업데이트 하지 않고 사용하려는 경우 address에 매핑되는 private key로 서명해야 합니다.

Klaytn acount와 Klaytn account의 accountKey에 대한 자세한 내용은 Klaytn Overview - Accounts를 참고해 주세요.