한 블럭에 여러 트랜잭션 호출 시 에러가 발생되면 어떻게 되는지 궁금합니다

안녕하세요. 한블록에서 여러 트랜잭션을 처리하는 부분에서 궁금한점이 생겨서 문의드립니다.

  • 제품 명 : caver-java
  • 제품 버전 : 1.6.3
  • OS환경 : Linux
  • 내용(문의 유형에 해당하는 항목 작성) :
    • 수수료 절감을 위해 하나의 블록에 여러 트랜잭션을 같이 실행하려고 합니다
      이때 하나의 트랜잭션이 실패하면 다른 트랜잭션이 성공해도 블록전체가 실패하는것으로 알고 있는데 블록전체가 실패가 되는경우 성공한 다른 트랜잭션이 어떻게 되는지 궁금합니다.

Ex)
block Tx : 0x0dd814e99ae8fe924bb9876c1e5be31df57d94aa84363c29f0f139838a244e21 (Cypress)
실패 Tx : 0x0adad213121321adfadf
성공 Tx : 0x123123123123

위와 같은 상황일 때
0x123123123123 트랜잭션도 실패되는건지 궁금합니다.

@ToTheMoon

안녕하세요.

개념 정리
블록은 여러 성공한 트랜잭션들을 포함한 채, 블록체인에 기록할 때 사용하는 자료구조입니다. 따라서 블록이 기록되지 않았는데 (질문자 분의 표현으로는 “실패”) 트랜잭션이 성공할 일은 없습니다. 트랜잭션들이 성공했다는 뜻은 블록체인에 그 내역이 성공적으로 기록되었다는 것을 뜻하니까요.

질문에 대한 답
트랜잭션을 전송하는 from address는 하나로 고정하고 여러 개의 트랜잭션을 만들어서 클레이튼 노드로 전송한 상황을 가정해보겠습니다.
이 때 하나의 트랜잭션이 실패하면 다른 트랜잭션이 실패하는 이유에 대해서도 말씀드리겠습니다.

트랜잭션이 어떤 정보들로 이루어져 있는지를 먼저 파악해보셔야 하는데요,
트랜잭션에는 nonce 라는 필드가 존재합니다.
특정 account로부터 이전에 트랜잭션이 몇개나 발생했는지를 기록하는 용도입니다. 그리고 이 nonce는 오직 하나씩만 증가할 수 있습니다.
예를 들어, 특정 account의 nonce가 5인 상황에서 nonce가 7인 트랜잭션은 성공하지 못합니다.

질문자분께서 여러 트랜잭션을 발생시켰다는 것은 (편의를 위해 나머지 필드들은 생략) 아래와 같이 트랜잭션을 구성하신 뒤 노드로 전송했다는 건데요,
[{from: 발신자 주소, to: 수신자 주소, nonce: 1}, {from: 발신자 주소, to: 수신자 주소, nonce: 2}, {from: 발신자 주소, to: 수신자 주소, nonce: 3}, {from: 발신자 주소, to: 수신자 주소, nonce: 4}, ...]
위와 같은 상황에서 nonce가 1인 트랜잭션이 처리되지 못했다고 가정해보겠습니다. 그러면 계정의 nonce는 정상적으로 증가하지 않은 상황에서 더 높은 nonce의 값들을 가진 트랜잭션들이 들어온다면 이는 받아들여지지 않습니다.

이 부분을 먼저 이해해보시고 어떻게 처리하면 좋을지를 고민해보시면 좋을 거 같습니다.
감사합니다.

1 Like