에포크, equivocation, 재구성
Sui에서 epoch은 네트워크가 정의하는 시간 구간이다. 이 시간 동안 Sui validator 집합과 그들의 stakes는 변하지 않는다. Mainnet과 Testnet 모두에서 epoch은 약 24시간이다. Devnet의 epochs는 1시간이다. 이 기간은 validators가 임시적인 validator 변경을 걱정하지 않고 transactions를 효율적으로 처리할 수 있게 한다.
Epoch 값은 모든 트랜잭션의 metadata에 포함된다. transaction은 설정된 epoch 이전에 실행되는 경우에만 유효하다.
equivocation
Sui에서 object versioning은 각 object가 ObjectId가 object의 version을 가리키는 고유한 (SequenceNumber, SequenceNumber) 쌍으로 참조되도록 보장한다. 특정 version에서 object를 수정할 수 있는 transaction은 하나뿐이다. transaction이 object를 수정한 후에는 version이 증가한다. 이후 transactions에서는 최신 version만 사용할 수 있다. Object versioning은 transactions와 epochs 전반에서 objects의 상태를 추적한다.
Equivocation 은 소유 객체 쌍(ObjectId, SequenceNumber)이 여러 비-final 트랜잭션에서 동시에 사용될 때 발생한다. 여러 트랜잭션에서 사용되는 어떤 객체든 올바르게 관리되지 않으면 equivocation의 원천이 될 수 있다.
다음과 같은 경우 equivocation이 발생할 수 있다:
-
user 또는 스마트 계약이 첫 번째 트랜잭션이 final되기 전에 동일한 (
ObjectId,SequenceNumber)를 사용하는 두 개의 트랜잭션을 제출하는 경우. -
smart contract 코드의 의도치 않은 logic traps, 예를 들어 sponsored transactions을 처리할 때.
locked 객체
두 트랜잭션이 모두 final되지 않았더라도 equivocated 트랜잭션을 제출하면 개발자와 사용자 모두에게 다른 문제가 계속 발생한다. 예를 들어 equivocation이 감지되면 관련 객체는 현재 epoch이 끝날 때까지 lock된다. 어느 트랜잭션도 진행할 수 없고 해당 객체는 다른 어떤 트랜잭션에서도 사용할 수 없다. 악의적인 행위자는 중요 객체를 lock하고 의도적으로 앱을 방해하기 위해 equivocated 트랜잭션을 의도적으로 제출할 수 있다.
smart contract에서 객체가 의도치 않게 잠기는 문제가 발생하면 자주 발생하는 오류 해결하기 문서를 참고한다. sui-tool 유틸리티를 설치하고 locked-object 명령을 사용해 특정 RPC 네트워크(--fullnode-rpc-url 값)에서 전달한 자산의 locked 상태를 확인할 수 있다. address를 제공하면 locked-object는 해당 address가 소유한 모든 gas objects가 lock되었는지 확인한다. 특정 object가 lock되었는지 확인하려면 object ID를 전달하라. 명령이 대상으로 삼는 object를 해제하려면 --rescue 플래그를 포함하라. object가 아직 validators의 과반수에 의해 lock되지 않았다면 rescue가 가능하다.