Python (or HTTP RPC) / Fee Delegated Contract Execution 사용 방법

안녕하세요,
파이썬으로 개발하는 개발자입니다.
로컬의 클레이 엔드노드에 HTTP RPC 통해 API를 호출하는 식으로 사용하고 있습니다

Fee Delegated Contract Execution의 구현 방법에 대해서 조언을 구하고 싶습니다.
caver.js/java 에서는 제공되는 feePayerSignTransaction을 그대로 쓰면 됩니다만,
파이썬에서는 어떻게 직접 구현하면 될 지 모르겠습니다

feePayer의 privateKey로 서명을 해야 하는데…
그렇다고 SDK에 feePayer의 privateKey를 포함해서 배포를 하신 것은 아닐거 같구요…
어떤 식으로 접근하면 될 지 조언을 구하고 싶네요
caver 구현 코드를 살펴 보아도 바로 이해하기가 쉽지가 않네요.

미리 감사드립니다~

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

수수료 대납 트랜잭션의 경우, sender의 서명 (signatures) 그리고 수수료 대납자의 서명 (feePayerSignatures)가 모두 필요합니다.

caver-js/java를 사용하여 수수료 대납 트랜잭션을 사용하는 경우 아래의 플로우로 진행되어야 합니다.

  • sender(트랜잭션의 from) 키링 생성 → caver.wallet.add를 사용하여 in-memory wallet에 키링 추가
  • feePayer 키링 생성 → caver.wallet.add를 사용하여 in-memory wallet에 키링 추가
  • Fee Delegated Contract Execution 트랜잭션 생성
  • caver.wallet.sign을 사용하여 sender 서명 (signatures 필드가 채워짐)
  • caver.wallet.signAsFeePayer를 사용하여 feePayer 서명 (feePayerSignatures 필드가 채워짐)
  • caver.rpc.klay.sendRawTransaction을 사용하여 네트워크에 전송

위와 같이 수수료 대납자의 private key는 SDK가 제공하는 것이 아니라, 사용자가 따로 관리를 하는 키입니다.
서명을 하는 방법은 sender가 서명할 때에 사용되는 알고리즘과 동일하나, 다만 RLP를 구할 때 조금 달라집니다.
Klaytn Docs에 보면 Sender가 서명할 때에 어떤 방식으로 RLP를 구하여 서명해야 하는지, 그리고 FeePayer가 서명할 때에 어떤 방식으로 RLP를 구하여 서명해야 하는지 설명되어 있으니 자세한 내용은 문서를 참고해 주시기 바랍니다.

답변 감사드립니다.
생각보다 더 복잡하고… 직접 privateKey를 다루는 코드를 짜야하네요… ㅜㅜ

JSON-RPC API로는 지원이 안되나요?

klay_signTransaction, klay_sendTransaction API를 사용하면, 일반적인 (수수료를 호출한 사람이 모두 지불하는)
Value Transfer / Smart Contract Execution는 쉽게 지원이 됩니다.
즉, 이 경우는 복잡한 RLP 인코딩 등의 과정을 거치지 않아도 됩니다.

그런데, 아래의 API도 있습니다
klay_signTransactionAsFeePayer, klay_sendTransactionAsFeePayer

이 API들을 보면, Fee Delegated 경우에도 쉽게 처리가 가능한건가 하는 희망을 가지게 되는데…
불가능 한 것인가요? ㅜㅜ

예를 들어, TxTypeFeeDelegatedSmartContractExecution 를 보면.
feePayer 만 명시해주면 되는 것 같아 보입니다.

curl -H "Content-Type: application/json" --data '{"jsonrpc": "2.0", "method": "klay_signTransaction", "params": [{"typeInt": 49, "from": "...", "to": "...", "gas": "0x4a380", "gasPrice": "0x5d21dba00", "value": "0x0", "input": "...", "feePayer": "0xcd01b2b44584fb143824c1ea0231bebaea826b9d"}], "id": 25}' http://127.0.0.1:8551

예를 들어,

klaytn 깃허브 소스코드에 보면,
signTransactionAsFeePayer 함수 내에 RLP 인코딩과 해슁 하는 로직이 이미 들어 있는 것 같은데… 맞나요? 맞다면, 이것을 적절히 호출만 해주면 되는 형태가 되면 좋을 것 같습니다.

먼저 현재 Klaytn에서 RLP 인코딩 및 해싱 기능에 대한 API는 제공되고 있지 않습니다.

위에서 말씀해 주신 klay_signTransaction, klay_sendTransaction, klay_signTransactionAsFeePayer, klay_sendTransactionAsFeePayer 모두 EN 노드에 keystore가 있는 경우에만 사용이 가능합니다.
즉 EN 노드(personal rpc가 열려 있어야 함)에 personal_importRawKey로 키를 임포트 하면 위의 API들을 사용할 수 있습니다.
위와 같이 personal rpc를 사용해서 키를 EN노드에 임포트해서 사용하는 경우에는 klay_signTransaction을 사용해서 sender의 서명을 구하고 결과로 받은 것을 잘 파싱하여 트랜잭션에 잘 채워넣은 후 klay_sendTransactionAsFeePayer API를 사용해서 수수료 대납자가 서명하고 전송하도록 하면 됩니다.

위의 방법이 아닌 경우에는 직접 트랜잭션을 해싱하고 서명하는 로직을 직접 개발하셔야 합니다.

1 Like

답변 감사드립니다!
말씀해주신 EndPoint Node에서의 방법대로 수행하면 될 것 같습니다.

한가지 마지막 질문이 있습니다.
‘feePayer’ 필드를 채워주어야 하는데,
현재 클레이튼에서 진행 중인 수수료 대납 이벤트 Account로 셋팅하면 될까요?
맞다면 해당 Account의 주소를 부탁드립니다~

감사합니다

수수료 대납 이벤트의 경우 KAS를 사용하셔야 합니다.
카스에서 수수료 대납 트랜잭션을 사용하는 방법은 KAS Docs를 참고해 주세요.
KAS를 사용하는 경우 위에 답변드린 EN 노드에 키를 임포트하는 방식은 동작하지 않으며, KAS Wallet API를 사용하시면 됩니다.

카스 관련 문의는 이 게시글과는 별개로 따로 글을 작성해서 남겨 주시면 빠른 답변 받으실 수 있습니다. :slight_smile: