동일한 블록 내에서, 서로 다른 트랜잭션들 간의 충돌

안녕하세요,

일반적인 데이터베이스는 서로 다른 트랜잭션들이 동일한 데이터를 읽거나 수정하여, database에 inconsistency가 생기면 충돌이 발생한 트랜잭션 들의 일부를 Abort 시켜서 해결합니다.

제가 블록체인 내용을 잘 모르지만, a block 내에는 a set of transactions 이 들어 있는데요.
같은 블록에서 Submit 된 트랜잭션들 중 A transaction과 B transaction이 서로 동일한 데이터 (예를 들어, 동일한 Contract 내의 특정 데이터)를 수정하는 연산을 할 경우에,
A와 B 중 어느 것이 성공하는지 궁금합니다

일반적인 블록체인 관련 질문이긴 한데…
클레이만의 특별한 충돌 해결 알고리즘이 있는지도 궁금합니다~

감사합니다

안녕하세요, 클레이튼 포럼에 질문을 올려주셔서 감사드립니다.

A 트랜잭션과 B 트랜잭션이 동일하다는 측면이 여러가지가 있을 수 있을 것 같습니다.

  1. sender의 nonce가 같은 경우, 트랜잭션 풀에 두 트랜잭션이 공존할 수 없습니다. block을 생성할 때 트랜잭션 풀에서 트랜잭션을 꺼내서 block에 추가하게 되는데, 이 때 둘 중 하나만 블록에 쓰일 수 있겠죠.
  2. 만약 input data가 동일한 부분일 경우에는 먼저 실행되는 트랜잭션이 우선순위를 갖습니다. block 내 트랜잭션은 순차적으로 하나씩 실행됩니다. (병렬 실행아님.)
  3. 다른 부분이 동일한 경우에도 순차 실행에 문제가 없다면 둘 모두 실행될 수 있습니다.

일반적인 데이터베이스에서도 병렬처리가 될 경우가 문제가 되는 경우일텐데, 그런 경우가 없이 트랜잭션 하나씩 실행하고 하나씩 commit한다고 생각하시면 되겠습니다.

감사합니다.

1 Like

nonce 관련해서 더 궁금하시면 'nonce 그게 뭔데?'를 추천드립니다. :slight_smile:

1 Like

답변 감사합니다.

  1. nonce 내용은 잘 몰랐는데, 알려주셔서 감사합니다. 같은 nonce 중에, 하나는 반드시 처리가 되겠지요?
  2. ‘block 내 트랜잭션은 순차적으로 하나씩 실행됩니다’ 라고 하셨는데,
    그렇다면, 그 처리 순서는 '트랜잭션 풀’에서 꺼내서 block에 추가 되는 순서라고 보면 되겠네요.
    이더리움의 경우, 수수료등을 고려해서 트랜잭션 풀에 있는 트랜잭션 중 어떤 것을 먼저 뽑을지 정하는 것으로 알고 있습니다.
    클레이튼은 그러한 로직이 전혀 없는지요?
    제가 알기로는 고정된 Gas Price 로 인해, 이더리움과 같은 가스 전쟁은 없는 것으로 알고 있습니다.

혹시, '트랜잭션 풀’에서 트랜잭션을 하나씩 뽑아서 블록에 추가하는 로직이 있는 github의 클레이튼 오픈 소스의 코드 파일을 reference 해주실 수 있을까요?
거기까지 알아야 하나 싶긴한데, 갑자기 궁금해지네요 ㅎㅎ;;

감사합니다~~

감사합니다. 이런 영상이 있었네요 한 번 보겠습니다~~

  1. 네 block을 proposing할 수 있는 CN까지 트랜잭션이 전달되었다면 하나는 처리됩니다.
  2. 블록을 proposing할 때 transaction을 정렬하는 기준이 gas price와 계정별 nonce입니다. tx pool에서 지정된 gas price가 아니면 tx를 받지 않기 때문에, gas price에 대한 정렬은 없다고 생각하시면 됩니다.

클레이튼에서 트랜잭션을 정렬하고 뽑아 블록을 생성하는 부분은 아래 코드를 참고하시면 됩니다.

감사합니다.

1 Like

자세한 설명 감사합니다 ^^
해당 코드 살펴보겠습니다