Race condition문제가 발생할수 있나요?

클레이튼을 이용해 블록체인 택시앱을 간단하게 작성해보고 있습니다.

프로그램을 작성하면서 이런 문제가 생길수도 있다고 생각이 들었는데요

예약 구조체{
bool cancelled; // 취소여부
uint start;
}

mapping (address => 예약) reservs;

function cancelReserv(){
assert(예약.start == 0)
cancelled = true;
}

function acceptReserv(){
assert(예약.cancelled == false)
reservs[예약자].start = block.timestamp;
}

손님이 cancelReserv를 통해 취소를 요청하고
기사님이 aceeptReserv를 통해 예약을 수락하는
과정이 동시에 일어났을때, assert가 정확하게 동작할수있을까요??
실제 코드는 assert뒤에 코드한줄말고 여러코드가 더 있기때문에 하나의 함수만 실행됬으면 좋겠는데요…

동시에 눌렀을때 요청의 우선순위 상관없이
단지 하나의 요청이 받아들여져서 반영되는지 궁금해요

시간 T1에 발생한 두 요청이
순서대로(동기적으로) 계약서에 업데이트되는지 궁금합니다

또, 블록 두개가 동시에 생성됬을때 두 블록이 검증받고 등록되는것에 순서가 있는지 궁금합니다
같은 시간 T1에 발생했어도요

글을 최대한 정리해서 써보긴했는데
블록체인관련 지식이 적어서 의미가 제대로 전달됬는지 모르겠습니다

안녕하세요

컨트랙트의 순차적 실행에 대해서는 링크를 참조하시면 될 것 같습니다.

클레이튼에서는 2개 이상의 블록이 동시에 생성되는 경우가 없기 때문에,
“또, 블록 두개가 동시에 생성됬을때 두 블록이 검증받고 등록되는것에 순서가 있는지 궁금합니다
같은 시간 T1에 발생했어도요”
이 부분은 블록이 아니라 트랜잭션을 의미하는 것 같은데요,

간단하게 설명드리면, 모든 트랜잭션은 포함되어있는 블럭번호에 따라, 동일 블록 내에서는 블록에 포함된 순서(≒노드에 도착한 순서)에 따라 순차적으로 실행됩니다.

따라서 race condition 문제에 대해서는 염려하지 않으셔도 될 것 같습니다. :slightly_smiling_face:

1 Like