수수료 대납 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 Like

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