수수료 대납 fee payer로 rolebase keyring으로 서명하니 에러가 발생합니다. 도와주십시오

안녕하세요?
수수료 대납 (fee delegation) 테스트를 하는 중에 질문이 생겨 이렇게 글 올립니다.

caver.wallet.keyring.generate() 을 이용하여 legacy keyring을 생성한 후 수수료 대납 테스트는 정상적으로 대납이 이루어지는 것을 확인했습니다.

그런데 수수료 대납 계정을 rolebased keyring으로 생성하여 수행하니 아래와 같은 에러가 발생합니다.

Error: Returned error: invalid fee payer
at Object.ErrorResponse (/home/hlibmaster/klaytn/works/ex-caverjs/node_modules/caver-js/packages/caver-core-helpers/src/errors.js:87:16)
at /home/hlibmaster/klaytn/works/ex-caverjs/node_modules/caver-js/packages/caver-core-requestmanager/src/index.js:155:44
at XMLHttpRequest.request.onreadystatechange (/home/hlibmaster/klaytn/works/ex-caverjs/node_modules/caver-js/packages/caver-core-requestmanager/caver-providers-http/src/index.js:119:13)
at XMLHttpRequestEventTarget.dispatchEvent (/home/hlibmaster/klaytn/works/ex-caverjs/node_modules/xhr2-cookies/dist/xml-http-request-event-target.js:34:22)
at XMLHttpRequest._setReadyState (/home/hlibmaster/klaytn/works/ex-caverjs/node_modules/xhr2-cookies/dist/xml-http-request.js:208:14)
at XMLHttpRequest._onHttpResponseEnd (/home/hlibmaster/klaytn/works/ex-caverjs/node_modules/xhr2-cookies/dist/xml-http-request.js:318:14)
at IncomingMessage. (/home/hlibmaster/klaytn/works/ex-caverjs/node_modules/xhr2-cookies/dist/xml-http-request.js:289:61)
at IncomingMessage.emit (events.js:388:22)
at endReadableNT (internal/streams/readable.js:1336:12)
at processTicksAndRejections (internal/process/task_queues.js:82:21)

아래는 소스 코드 원문입니다.


let RunProcTest = async function() {
    try {
        let keystoreFrom = require('./keystores/feeDelegate01.json');
        let keyringFrom  = await caver.wallet.keyring.decrypt(keystoreFrom, "password");
        await caver.wallet.add(keyringFrom)
        let nonce = toHex(await caver.rpc.klay.getTransactionCount(keyringFrom.address));
        let rawTx = {
            from: keyringFrom.address,
            to: "0x7b3f9ff0f4215c41b3e4a49510b540e80d0c790b",
            value: "1000000000000000000",
            gas: ESTIMATEGAS_VALUETRANSFER,
            nonce: nonce++};
        let tx = caver.transaction.feeDelegatedValueTransfer.create(rawTx);
        let signed = await caver.wallet.sign(keyringFrom.address, tx);
        console.log('>>>>>> 1st signed data')
        console.log(signed)
        let rlpEncoded = signed.getRLPEncoding();
        console.log('>>>>>> rlpEncoding string')
        console.log(rlpEncoded)
        //let keystoreSigner = require('./keystores/ksRoleBase.json');
        let keystoreSigner = require('./keystores/feeDelegate02.json');
        let keyringSigner  = await importKeyring(keystoreSigner, "password");
        await caver.wallet.add(keyringSigner);
        let feeDelegationTx = await caver.transaction.feeDelegatedValueTransfer.create(rlpEncoded);
        console.log('>>>>>> fee delegation tx')
        console.log(feeDelegationTx)
        feeDelegationTx.feePayer = keyringSigner.address;
        let signedfeeDelegationTx = await caver.wallet.signAsFeePayer(keyringSigner.address, feeDelegationTx);
        console.log('>>>>>> 2nd signed data')
        console.log(signedfeeDelegationTx)
        await caver.rpc.klay.sendRawTransaction(signedfeeDelegationTx)
        .on('transactionHash', async function(txHash) {
            console.log(`Transfer TX:['${colors.green(txHash)}'] Created!`);
        })
        .on('receipt', async function(receipt) {
            console.log(`Transfer TX:['${colors.green(receipt.transactionHash)}'] Done! BlockNumber:[${colors.green(parseInt(receipt.blockNumber))}]`);
        });
    } catch(error) {
        console.log(colors.red(error));
        process.exit(1);
    }
}
RunProcTest();

도움 주시면 감사하겠습니다.

Klaytn에서 keyringSigner.address의 accountKey가 업데이트가 된 것이 맞나요?
caver.rpc.klay.getAccountKey로 확인해 보시기 바랍니다

rolebase keyring을 caver.rpc.klay.getAccountKey()를 통해 출력한 결과를 아래에 공유드립니다.


{
    "keyType": 5,
    "key": [
        {
            "keyType": 4,
            "key": {
                "threshold": 1,
                "keys": [
                    {
                        "weight": 1,
                        "key": {
                            "x": "0xb094085e96024980e35d4fa5a74f017e37c5357ffeb398288dc862a1ba6bcefc",
                            "y": "0x5029b9fde477ec4d7957ec80fd593da1e8ddad4f2b5b4d5b96fe78f4a3970bb7"
                        }
                    },
                    {
                        "weight": 1,
                        "key": {
                            "x": "0xc5a37d8511e751ad5c643eae5b0c91c4937b2f59f92ef426460b454fa9f6a5a9",
                            "y": "0x3b55d0319182354b302c85a8928c9d9621aa28058ff2342c6bc9862a4531b940"
                        }
                    },
                    {
                        "weight": 1,
                        "key": {
                            "x": "0x129dd87e16597505f322212aeba150822148ec369e9bb69c3f6ee5146598e53b",
                            "y": "0xca4220ef9193c18f70cc2f4a7dd8086b7b1d7ac93b53fca8f32b4470f324619"
                        }
                    }
                ]
            }
        },
        {
            "keyType": 4,
            "key": {
                "threshold": 1,
                "keys": [
                    {
                        "weight": 1,
                        "key": {
                            "x": "0xe383055adc0b110b7062cfaffa466f678d74ee88fc7126c313c2a1e67af6c44d",
                            "y": "0x7d99c1de342c6a3c70a476c1ef6ec08dca8e738bc1dc3a6e1ae8efc35fea70c7"
                        }
                    },
                    {
                        "weight": 1,
                        "key": {
                            "x": "0xfdf99f304dce181c52b9af08389f874ca00e2652441732c75ec8c9fdd2a793c8",
                            "y": "0xc20c37c38bd2eabca43f92e8b5f1061be8fa2e0eb7598f7cd5f71068cd9d370d"
                        }
                    },
                    {
                        "weight": 1,
                        "key": {
                            "x": "0x6fe67198b0f52f5ea5627f061ff02c7be7dcf4ae3c2302ad610b679bd21258f1",
                            "y": "0x23ef36bb2aee1dfa2d3a76a64e80b6a641852b90034f863f0f9e2a7602be5730"
                        }
                    }
                ]
            }
        },
        {
            "keyType": 4,
            "key": {
                "threshold": 1,
                "keys": [
                    {
                        "weight": 1,
                        "key": {
                            "x": "0x4e0650632854a636ca35d149b988577795ed12d1d86b0fcfa201da93013bd876",
                            "y": "0x653067283a5609975e96822f0cf0cf7e7b1d03535f9d5a812341ad82d6f26da5"
                        }
                    },
                    {
                        "weight": 1,
                        "key": {
                            "x": "0xb1052f8cd2382be422f8b7c630e8a600b4fac5459c99041eeaa82e673cb6e819",
                            "y": "0x9100263bbb13f8caf539952c5dac22b6b0694bd8e56f8fb2fcd88f95a95275a1"
                        }
                    },
                    {
                        "weight": 1,
                        "key": {
                            "x": "0x9d1aafa29817fbc1d977743c06982be45c2b12fe5c563d61c31c2aacb80b8892",
                            "y": "0xb9cf655b2973e676696dfb6788d645479bd542653f97f2a6ab8e879e09f251fc"
                        }
                    }
                ]
            }
        }
    ]
}

감사합니다.

caver.wallet.signAsFeePayer로 서명한 뒤에 트랜잭션의 feePayerSignatures에 있는 서명이 정상적으로 잘 들어갔는지 확인이 필요한데요, caver-js v1.6.3-rc.4 버전을 사용하신다면 caver.validator.validateFeePayer(signedfeeDelegationTx) 이렇게 한 번 해보시겠어요?

현재는 caver-js v1.6.3-rc.3으로 확인중에 있었는데 rc.4로 업데이트 해서 바로 확인해보겠읍니다.
감사합니다.

signAsFeePayer 이후 아래 코드를 출력해보았습니다.
let validateRet = await caver.validator.validateFeePayer(signedfeeDelegationTx)
console.log(validateRet)

결과가 false로 나옵니다.

그럼 Klaytn에 업데이트가 되었지만 해당 키가 ‘./keystores/feeDelegate02.json’ 에 저장되어 있는 키랑 다르다는 것입니다.
업데이트된 private keys를 저장하는 키스토어를 사용해야 합니다.

1개의 좋아요

account update 이후 업데이트된 keyring을 keystore file로 저장하는 과정에서 코드상의 실수가 있었습니다. update 전의 keyring 정보가 저장되고 있었네요.
수정 후 정상적으로 동작함을 확인하였습니다.
감사합니다!