Object versioning
온체인에 저장된 모든 객체는 ID와 version으로 참조된다. Transaction이 객체를 수정하면 동일한 ID이지만 새 version인 온체인 reference에 새 내용을 기록한다. Store에 여러 번 나타나더라도 트랜잭션에서 사용할 수 있는 것은 객체의 최신 version뿐이다. 특정 version의 객체를 수정할 수 있는 트랜잭션은 하나뿐이므로 선형 history가 보장된다.
(I, v0) => ...
(I, v1) => ... # v0 < v1
(I, v2) => ... # v1 < v2
Version은 엄격히 증가하며 (ID, version) 쌍은 재사용되지 않는다. 따라서 node operators는 store에서 오래된 object version을 prune할 수 있지만, historical request를 처리하거나 다른 node의 catch-up을 돕기 위해 유지할 수도 있다.
Object versioning path
Sui의 object는 fastpath를 통해 또는 consensus를 통해 version이 지정된다. 이 선택은 object ownership 옵션에 영향을 주며 performance trade-off가 있다.
Sui는 versioning algorithm에서 Lamport timestamps를 사용한다. 이는 version이 재사용되지 않도록 보장한다. Transaction은 자신이 건드리는 모든 object의 새 version을 1 + max(version of all input objects)로 설정한다. 예를 들어 version 5의 object O를 version 3의 gas object G로 전송하는 transaction은 둘 다 1 + max(5, 3) = 6으로 업데이트한다.
Fastpath 객체
fastpath objects보다 party objects를 사용하는 것이 권장된다.
Fastpath objects는 address-owned 또는 immutable일 수만 있다. Fastpath를 사용하는 transaction은 consensus를 우회하기 때문에 낮은 latency와 빠른 finality의 이점을 얻는다.
모든 fastpath 트랜잭션은 객체의 현재 version을 입력으로 lock하고, output version을 다음 트랜잭션의 reference로 사용해야 한다. Fastpath 객체가 여러 sender에 의해 자주 사용되면 객체가 epoch 끝까지 equivocate되거나 lock될 위험이 있으므로 offchain access를 신중히 조정해야 한다.
Object의 owner만 객체를 equivocate할 수 있다. 동일한 객체를 사용하는 서로 다른 두 트랜잭션을 실행하려고 하지 않으면 equivocation을 피할 수 있다. Transaction에 대해 network에서 명확한 success 또는 failure를 받지 못했다면 트랜잭션이 처리되었을 수 있다고 가정하고, 해당 트랜잭션의 객체를 다른 트랜잭션에 재사용하지 않는다. 모든 lock은 epoch 끝에서 reset되어 equivocated 객체가 다시 해제된다.
Fastpath transaction input은 특정 ID와 version으로 참조해야 한다. Validator가 특정 version의 address-owned input이 있는 transaction에 서명하면, 해당 version은 그 transaction에 lock된다. Validator는 동일한 input을 요구하는 다른 transaction을 reject한다. Immutable object도 특정 version으로 참조되지만, 내용이 변경되지 않으므로 lock할 필요가 없다. 해당 version은 object가 immutable이 된 시점을 식별한다.
Fastpath는 latency 또는 gas cost에 매우 민감하거나, 복잡한 multi-party 트랜잭션이 필요 없거나, 이미 offchain coordination service에 의존하는 application에 적합하다.