Fee_delegated_smart_contract_execution 오류

밑의 sender 코드를 실행시켜, 모든 정보가 각 명령어마다 들어가는 것을 확인하였습니다. 마지막 부분까지 실행된 것 까지 확인하였습니다. 그런데 feepayer로 넘어가는 과정에서 오류가 생긴것 같은데… 무엇이 문제인지 잘 모르겠어서, 질문드립니다!

sender 코드:

sendFeeDelegateTx = async (functionABI, address) => {
  const {
    rawTransaction: senderRawTransaction,
  } = await caver.klay.accounts.signTransaction(
    {
      type: "FEE_DELEGATED_SMART_CONTRACT_EXECUTION",
      from: address,
      to: contractAddress,
      gas: "300000",
      value: caver.utils.toPeb("0", "KLAY"),
      data: functionABI,
    },
    buyerPrivateKey
  );

  client.connect(1337, '127.0.0.1', function() {
    console.log('Connected to fee delegated service');
  });
  client.write(senderRawTransaction);

  client.on("data", function (data) {
    console.log("Received data from server: " + data);
  });

  client.on("close", function () {
    console.log("Connection closed");
  });
};

오류 코드:

connected to fee delegated service
klaytn/blockchain/sender_client_contract.js:117
Received data from client: 0x31f8eb808505d21dba00830493e094a87573559a9e5e4c973307b2b8ffc1018446482d80942666473b61c97c1cdedf42d9a676b35d154a0698b86482b9865b0000000000000000000000002666473b61c97c1cdedf42d9a676b35d154a06980000000000000000000000007b62efe851271ecdbc32376f63e8f0a077a123110000000000000000000000000000000000000000000000000000000000001388f847f8458207f5a03ef969bd495587d32e0cc5c5c2bddca82907f9c8f2e17badb63437a32933d44da07883a470d66bc3789c33520442124be9ec9bd882c7a3c484c71c8bdd4e38965080c4c3018080
klaytn/blockchain/feepayer_server_contract.js:52
Received data from server: This is fee delegating serviceFee payer is 0xec6a7d57e8c269a7b650c7f64e27050c4c79031a
klaytn/blockchain/sender_client_contract.js:122
Error: Returned error: invalid transaction v, r, s values of the sender
    at Object.ErrorResponse (/Users/gnong/Documents/workspace/kidari-project/node_modules/caver-js/packages/caver-core-helpers/src/errors.js:84:16)
    at /Users/gnong/Documents/workspace/kidari-project/node_modules/caver-js/packages/caver-core-requestmanager/src/index.js:155:44
    at XMLHttpRequest.request.onreadystatechange (/Users/gnong/Documents/workspace/kidari-project/node_modules/caver-js/packages/caver-core-requestmanager/caver-providers-http/src/index.js:119:13)
    at XMLHttpRequestEventTarget.dispatchEvent (/Users/gnong/Documents/workspace/kidari-project/node_modules/xhr2-cookies/xml-http-request-event-target.ts:44:13)
    at XMLHttpRequest._setReadyState (/Users/gnong/Documents/workspace/kidari-project/node_modules/xhr2-cookies/xml-http-request.ts:219:8)
    at XMLHttpRequest._onHttpResponseEnd (/Users/gnong/Documents/workspace/kidari-project/node_modules/xhr2-cookies/xml-http-request.ts:345:8)
    at IncomingMessage.<anonymous> (/Users/gnong/Documents/workspace/kidari-project/node_modules/xhr2-cookies/xml-http-request.ts:311:39)
    at IncomingMessage.emit (<node_internals>/events.js:203:15)
    at endReadableNT (<node_internals>/_stream_readable.js:1145:12)
    at process._tickCallback (internal/process/next_tick.js:63:19) {stack: 'Error: Returned error: invalid transaction v,…allback (internal/process/next_tick.js:63:19)', message: 'Returned error: invalid transaction v, r, s values of the sender'}

안녕하세요 먼저 질문을 올려주셔서 감사합니다 :slight_smile:

위에 올려주신 코드에는 수수료 대납자가 어떠한 방식으로 동작하고 있는지 코드가 나와있지 않아 정확하게 말씀을 드릴 수는 없습니다만, 발생한 에러를 봤을 때, 트랜잭션의 sender, 즉 address를 주소로 갖는 계정에서 사용해야 하는 키가buyerPrivateKey가 아닌 것 같습니다.

계정의 accountKey를 확인하실 때에는 caver.klay.getAccountKey 를 사용하시면 됩니다.
keyType이 1인 경우, PrivateKey-PublicKey-Address 강결합인 상태이어야 합니다.
그 이외의 경우, 리턴된 오브젝트의 key에서 사용하고자 하는 buyerPrivateKey에서 파생된 PublicKey가 있는지 확인해야 합니다.
buyerPrivateKey에서 파생된 PublicKey는 privateKeyToPublicKey를 사용할 수 있으며, xyPointFromPublicKey를 사용하여 x, y 포인트를 구할 수 있습니다.

주신 예제를 베이스로 간단하게 예제를 작성하여 동작을 확인했는데, 계정에서 사용해야 하는 private key에 문제 없는 경우 트랜잭션이 정상적으로 전송되는 것을 확인했습니다.
만약 address를 주소로 갖는 계정에서 사용되어야 하는 키가 buyerPrivateKey 가 아닌 경우, 글에 남겨주신 것과 동일한 에러가 발생되는 것을 확인했습니다.

아래 예제를 참고해 주시면 감사하겠습니다.
추가적인 질문이 있으신 경우 편하게 글 남겨주세요.

const acct = caver.klay.accounts.wallet.add('0x{private key}')
const buyerPrivateKey = acct.privateKey
const contractAddress = '0xd4eba39375ac5692a0f4cf9b8f8f105b3052e983'

const sendFeeDelegateTx = async (functionABI, address) => {
    const { rawTransaction: senderRawTransaction } = await caver.klay.accounts.signTransaction(
        {
            type: 'FEE_DELEGATED_SMART_CONTRACT_EXECUTION',
            from: address,
            to: contractAddress,
            gas: '300000',
            value: caver.utils.toPeb('0', 'KLAY'),
            data: functionABI,
        },
        buyerPrivateKey
    )

    const feePayer = caver.klay.accounts.wallet.add('0x{private key}')
    const receipt = await caver.klay.sendTransaction({
        senderRawTransaction,
        feePayer: feePayer.address,
    })
    console.log(receipt)
}

sendFeeDelegateTx(
    '0xa9059cbb0000000000000000000000005b9e34df6b9bf6ced39c02874e041ffd4bef851d0000000000000000000000000000000000000000000000000000000000000001',
    acct.address
)
1 Like

해주신 대로 다시 확인해보니 해당 오류는 수정했습니다!

이를 해결하니, 새로운 오류가 발생하였습니다.

Fail : ErrExecutionReverted - uint(0x09)

별로 문제가 없는듯 한대, 지속적으로 오류가 떠 추가 질문드립니다…
수수료 대납자나 최초 보내는 사람에게 모두 클레이를 주어서 테스트 해보았는데도, 오류가 생겼습니다.
테스트는 바오밥에서 진행하였습니다.

문제 tx: 0x872dcef572071cdefbcd2006baf6b62af5b08efe4b86ca89415c919ae60892ad

안녕하세요, 해당 에러의 경우 스마트 컨트랙트 실행과정에서 revert가 된 것 같습니다.

컨트랙트 실행을 확인 부탁드리겠습니다.

감사합니다.