인위적으로 pending상태를 만들고 싶습니다

안녕하세요 몇가지 테스트를 위해 테스트노드를 만들어서
인위적으로 pending 상태를 만들고 싶은데요.

제 생각엔 cn을 죽이면 쉽게 pending상태를 만들 수 있을줄 알았는데 다른 오류를 반환하더라고요.

TxPool 사이즈를 줄이는 방법도 있겠지만 지속적으로 대량의 트랜잭션을 날려줘야해서 테스트가 쉽지 않은 방법일것 같구요.

혹시 어떤 방법으로 pending 상태를 만들 수 있을까요?

감사합니다!

@minsu0806 안녕하세요,

pending 상태라는게 pending transaction을 만들고 싶으신 걸까요?
몇가지 궁금한데요.
pending transaction을 만들려는 목적은 무엇일까요?
cn을 죽이면 local transaction의 경우 journaling되어 local/queue의 tx들이 transactions.rlp파일로 남겨지긴 합니다.
네, txpool이 크면 오히려 pending pool에 tx가 더 많이 담길 것 같은데요. 트랜잭션은 지속적으로 날려야할 것 같구요.
인위적으로 풀에 tx를 넣고 싶다면, 코드를 약간 수정하거나 test를 만들어서 할 수 있을 것 같긴합니다.

감사합니다.

2개의 좋아요

답변 감사드립니다. 제 질문이 좀 엉성 했던것 같습니다.
정확한 의도는 Client 메소드 중의
PendingCallContract 과 CallContract 의 차이가 궁금했습니다.
일반적인 상황에서는 동일한 결과를 리턴 하는 것으로 보이는데 pending tx가 있을 경우 함께 반영되는것으로 이해 하는게 맞는 건지 궁금했습니다. 더불어
PendingCallContract와 CallContract의 성능적으로 차이가 있을 것으로 보이는데 관련해서 참고 할만한 글(포럼에 기 공유된) 이 있을지도 함께 여쭤봅니다… 감사합니다.

@minsu0806 안녕하세요,

해당 method는 블록 parameter의 차이 인데요. PendingCallContract는 pending중인 블록에 대해서 klay_call 함수 호출이고, CallContract의 경우 주어진 blockNumber에 대해서 klay_call함수 호출하는 방식입니다. 즉, CallContractpending parameter를 입력하면 동일하다고 생각하시면 될 것 같습니다.

더불어 pending block이라는 개념은 EN에서는 존재하지 않습니다. 따라서, pending블록에 대한 klay_call요청시 currentblock에 대한 결과값을 반환합니다. 성능적 차이도 존재하지 않습니다.

감사합니다.

2개의 좋아요

도움 주셔서 감사합니다. 덕분에 차이점을 이해 했습니다. 즐거운 하루되세요!!

2개의 좋아요

안녕하세요! 여기에 이어서 질문을 드리는게 주제 상 맞는것 같아서 이어서 문의 드립니다. 제가 아래와 같이 테스트 해보았습니다.

  1. cn 총 2 node 중에서 1 node를 중지 시켜 합의 불가능 상태를 만듦.
  2. A account가 B account에게 ERC20 token을 transfer 함.
  3. 합의 불가능 상태이기 때문에 2의 tx는 tx-pool에 머물고 있음.

이때 전송한ERC20의 balanceOf를 call 했을 때 기대하는 결과

  1. pending call contract, 혹은 klay_call ( blockNumberOrHash를 “pending” ) 할 경우
    → A가B에게 전송한 수량을 차감한 balance

  2. call contract 혹은 klay_call (blockNumberOrHash ,“latest”)
    → 전송 전 A의 ERC20 balance , 아직 블록에 포함되지 않은 tx이기 때문

으로 이해 했는데 실제 테스트 결과 1,2번 동일한 결과 ( 전송 전 A의 ERC20 balance)가 나왔습니다.

혹시 제가 이해를 잘못한건지 아니면 이해한게 맞지만 뭔가 놓친게 있는지 확인차 문의 드립니다.

기초적인 질문에도 친절히 답변주셔서 항상 감사드립니다… !!

즐거운하루되세요

답변주신글을 다시 읽어보았습니다. 질문을 다시 정리 드립니다 ㅠ

더불어 pending block이라는 개념은 EN에서는 존재하지 않습니다. 따라서, pending블록에 대한 klay_call요청시 currentblock에 대한 결과값을 반환합니다. 성능적 차이도 존재하지 않습니다.

이 말씀은 곧 klay_call 시 blockNumberOrHash에 "pending"옵션을 주어도 currentblock(“latest”)에 대한 결과값과 동일하다는 의미 ( 테스트 시나리오 1,2번은 동일하다는 의미)로 이해해도 될까요?
2.
그렇다면 사실상 pendingCallContract 의 기능은 latestCallContract로 보면 될까요?
3.
제가 테스트했던 케이스중 1번처럼 결과를 받는 것은 현재 불가능 한것으로 이해해도 될까요?

@minsu0806 질문주셔서 감사합니다.

혹시, 왜 pending block의 상태를 조회하고 싶은지 알 수 있을까요?

질문에 답변드리자면 우선, txpool에 있는 것과 pending block은 다른개념입니다.
클레이튼은 이더리움 포크로부터 출발했습니다. 최근까지 pending block에 대한 지원을 하진 않았습니다.
v1.7.3이후로 pending block에 대한 다시 지원하고 있고, 관련 PR링크 보내드립니다.

사실상 CN이 아닌 이상 pending block에 대한 조회는 불가능합니다. 어떤 목적으로 해당 테스트를 하고싶으신지 말씀해주시면 더 좋은 답변을 드릴 수 있을 것 같습니다.

현재로서 pending block은 latest block과 같다고 봐도 무방합니다.

  1. 네, 동일합니다.
  2. 네, 맞습니다.
  3. 네, 불가능합니다.

특정 트랜잭션을 다시 실행하고 싶으시다면 traceTransaction / tractBlock과 같은 API사용을 권장드립니다.
여러가지 tracer를 끼워서 다양한 결과들을 보실 수 있습니다. 관련된 내용은 다음링크를 참조해주세요.

1개의 좋아요

친절한 설명 감사드립니다 . pending block상태를 조회 하고 싶은 이유는
여러 이슈로 인하여 (네트워크가 healthy하지 않은 상황, 과도한 tx전송 등) 으로 인해 tx 결과 응답이 지연될 경우 사용자에게 정보제공을 하고 싶어서 입니다. (특정 컨트랙트의 함수를 latest call 한 값과 pending call한 값을 둘다 제공하고 참고 데이터로 활용하는등)

@minsu0806 안녕하세요,

  1. txpool에 tx가 남아있는지 확인하는 방법
  2. 해당 tx receipt을 조회해보는 방법

등으로 확인은 해볼 수 있을 것 같습니다.

말씀하신대로 처리되지 않은 tx를 미리 처리해보는 방안은 다음 문서를 참조해보시길 바랍니다.

감사합니다.

1개의 좋아요