트랜잭션 확인(성공/실패 등) 관련 질문

안녕하세요? Caver-java 1.6.3 을 이용해서 자체 Contract 를 가지고 작업을 하고 있습니다.

Contract 실행 성공/실패 판단 기준과 에러 케이스에 대한 질문을 드리려고 합니다.

기존 문의글을 찾아보니 TxError 가 없다면 성공이라고 되어있던데, 테스트 중에 보니 저희 EndNode가 이상 동작을 하는 경우에 실제 Transaction이 성공했는데 트랜잭션 확인에서는 오류로 나오는 경우가 있어서 방식을 바꿔서 처리하고 있습니다.

현재 caver ContractMethod 의 send 를 호출할때 NoOpTransactionReceiptProcessor 를 이용해서 Transaction Hash만 가져온 후 해당 Transaction Hash를 이용해서 상태를 조회해서 성공/실패를 판단하는 방식을 사용하고 있습니다.

트랜잭션의 성공 유무의 체크는 TransactionReceiptData 를 이용하고 아래와 같이 진행하고 있습니다.

  1. Status 가 0x01인지 확인
  2. blockNumber 가 정상적으로 등록되어있는지 확인
  3. Logs의 Topic 중에서 등록된 Event(예를 들면 Transfer)를 이용해서 Output 을 파싱해서 값이 정상인지 확인
  4. 현재 Block Number 가 Transaction의 blockNumber 보다 +5가 될때까지 1초 간격으로 1) ~ 3)의 과정을 확인

이때 Status 값이 0x01이었다가 0x09로 상태가 바뀌는 경우도 있는지 궁금합니다.
그렇다면 정확히 어느 시점에서 0x09가 발생하는 것인지요?
ErrExecutionReverted 라는데 어느 시점에서 어떤 이유로 발생하는지 궁금합니다.

그리고 4)번의 과정이 필요한지 아니면 위 1)~3)까지 확인이 되면 다른 것 확인할 필요없이 성공으로 판단해도 되는 것인지 궁금합니다.

이 외에 추가로 혹시 확인해야 하는 것이 있다면 함께 알려주시면 감사하겠습니다.

안녕하세요.

실제 Transaction이 성공했는데 트랜잭션 확인에서는 오류로 나오는 경우가 있어서 방식을 바꿔서 처리하고 있습니다.

실제 Transaction이 성공했다는 말이 전송한 Transaction을 EN에서 받아들였다라고 이해하는게 맞을까요?
EN에 Transaction을 전송한 결과와 전송 된 Transaction을 VM을 통해 실행한 결과는 다른 과정으로 받아들이시는게 맞는 것 같습니다. 결론적으로 아래 두가지의 결과를 모두 확인하셔야 합니다.

  • Transaction 전송에 대한 결과
  • 전송된 Transaction의 실행에 대한 결과

트랜잭션의 성공 유무의 체크는 TransactionReceiptData 를 이용하고 아래와 같이 진행하고 있습니다.

  1. Status 가 0x01인지 확인
  2. blockNumber 가 정상적으로 등록되어있는지 확인
  3. Logs의 Topic 중에서 등록된 Event(예를 들면 Transfer)를 이용해서 Output 을 파싱해서 값이 정상인지 확인
  4. 현재 Block Number 가 Transaction의 blockNumber 보다 +5가 될때까지 1초 간격으로 1) ~ 3)의 과정을 확인

이때 Status 값이 0x01이었다가 0x09로 상태가 바뀌는 경우도 있는지 궁금합니다.
그렇다면 정확히 어느 시점에서 0x09가 발생하는 것인지요?
ErrExecutionReverted 라는데 어느 시점에서 어떤 이유로 발생하는지 궁금합니다.

그리고 4)번의 과정이 필요한지 아니면 위 1)~3)까지 확인이 되면 다른 것 확인할 필요없이 성공으로 판단해도 되는 것인지 궁금합니다.

전송된 Transaction의 실행했을 경우 Transaction receipt이라는 데이터를 통해 트랜잭션의 성공유무를 판단하실 수 있는데요. 작성해주신 것처럼 Transaction receipt의 status의 값을 보고 정상적으로 처리되었는지의 유무를 확인하실 수 있습니다. 해당 Transaction의 Transaction receipt를 얻었고 결과를 확인했을 경우 block number + 5까지 확인하실 필요는 없을 것 같습니다.

ErrExecutionReverted는 스마트컨트랙트에서의 함수 내부에 조건문에 부합하지않을 경우 발생합니다. 아래 링크를 참고해보시면 도움이 되실 것 같습니다.

https://docs.soliditylang.org/en/v0.8.11/control-structures.html?highlight=require#error-handling-assert-require-revert-and-exceptions

감사합니다.

1 Like