Pending 중인 트랜잭션 취소 관련

안녕하세요? 트랜잭션 취소 관련해서 궁금한점 문의 드립니다.

caver.js 를 통해 트잭을 던졌을때, 운영중인 EN에서 계속 pending으로 들어가 있는 경우가 종종 있습니다.
그럴때 https://status.klaytn.com/ 여기서 보면 pending tx 들이 엄청 많더라고요.

그래서 오래 기다리게 되면 (블럭 5개가 지나도 반영이 안된다면) pending 중인 해당 tx 를 취소하고 싶어서 찾아보니

다음과 같이 cancel tx 를 날릴수 있더라고요.

궁금한점은 이렇게 cancel tx 를 날렸을때, pending 중인 tx가 취소되는게 보장이 되나요??

그리고 Nonce 는 txHash만 받게 된다면 알수는 없는데, pending 중인 tx 에 대해서 getTransaction을 하거나 Nonce를 저장하고 있다가 처리해줘야하는지 궁금합니다.

@sebastian

안녕하세요.

1> pending tx 관련
https://status.klaytn.com/ 에서 확인하시는 pending tx 카운트는 pending 트랜잭션들의 수를 나타내는 값이고 5초마다 갱신이 되고 있습니다.
설령 갱신 전과 갱신 후의 값이 같더라도 그 값을 구성하는 트랜잭션들은 다릅니다.

예를 들어 갱신 전과 갱신 후의 pending tx 카운트가 둘 다 3이라고 했을 때, 갱신 전에는 a, b, c 이렇게 세 개의 트랜잭션이 펜딩 중이었다면 갱신 후에는 e, f, g 가 pending 상태인 상황입니다.

같은 트랜잭션이 계속해서 머물러 있는 경우는 거의 없다고 보시면 됩니다.

2> cancel tx로 취소할 때 보장이 되는지 여부
우선 Cancel의 조건에 대해 먼저 이해를 하셔야 하는데요, txList.Add 메서드를 보시면 해당 로직을 알 수 있습니다.

Cancel이 되는 조건은 다음과 같습니다.

  1. Cancel Tx에 기재된 논스와 동일한 논스의 트랜잭션이 이미 풀에 존재하는지 확인
  2. 존재한다면 기존에 풀에 있던 Tx를 드랍하고 Cancel Tx로 대체

운영 중이신 EN에 예를 들어 논스 필드가 5로 설정된 ValueTransfer 트랜잭션을 전송하셨고 네트워크 혼잡 등의 상황으로 EN의 트랜잭션 풀에 내가 전송했던 트랜잭션이 남아 있을 경우, Cancel Tx에 동일한 논스 값으로 전송하시면 Cancel이 정상적으로 됩니다만,

Cancel을 전송하셨는데 그 찰나의 순간에 기 전송하셨던 트랜잭션이 이미 CN까지 도달해서 처리가 됐다거나 하면 원하시는 대로 동작을 안하겠죠.

Nonce를 알아내시는 방법은 말씀하신 것처럼 getTransaction을 통해 알아보시는 방법 또는 getAccount 를 사용하시는 방법이 있습니다.

별도의 RPC 콜이 소요되는 시간을 단축하고 더 빠르게 Cancel이 필요한 경우라면 따로 저장해주어 처리를 해주는 방법도 좋을 거 같습니다.

cc. @Aidan