본문으로 건너뛰기

Ethereum에서 Sui로

이전에 Ethereum Virtual Machine(EVM)으로 작업해 본 적이 있다면 Sui에서 개발할 때 가장 큰 차이점은 프로그래밍 언어이다. Sui는 Move를 사용하고 EVM은 Solidity를 사용한다.

주제SolidityMove
Account vs object-centric models일반적으로 mapping을 사용해 contract 안에 작성하는 커스텀 소유권 로직이다. Ethereum 코인만 전역 API를 가진 일급 시민이다. 모든 소유권 API는 contract별로 다르다.객체 소유권은 Sui에 내재되어 있으며, 객체는 일급 시민이고 Sui에서 소유되는 모든 것을 포괄한다.
Data storage데이터는 스마트 계약에 저장된다.데이터는 Move 객체에 저장된다.
Inheritance다형성을 포함한 다중 상속을 지원한다.인터페이스와 다형성이 없다. 그러나 Move에는 Type<T>와 같은 제네릭이 있다.
Dynamic dispatch허용된다허용되지 않는다
Asset/Token accessibility스마트 계약에 묶인다.누구나 공유 객체에 접근할 수 있다. 소유 객체는 객체 소유자만 접근할 수 있다.
Access controlOwnableAccessControl contract를 통한 identity/role 기반 접근 제어이다.주로 소유 객체를 통한 capability based access control이다. Identity/role 기반 접근 제어도 가능하다.
Contract upgradesProxy contract가 사용자 트랜잭션을 전달한다.새 contract는 이전 contract와 layout-compatible해야 한다. 공유 객체의 버전 관리도 고려해야 한다.
Development environmentHardhat, FoundryMove VSCode extension.
Mutate contract state컴파일 시 ABI 인터페이스로 트랜잭션을 전송한다.런타임 프로그래머블 트랜잭션 블록 (PTB) 구성으로 트랜잭션을 전송한다.

객체 모델

객체는 Move에서 데이터를 저장하며, Move의 모든 것은 객체이다. 여기에는 스마트 계약(Move 패키지), 온체인 주소, 코인, NFT가 포함된다.

단순하게는 객체를 자산 또는 NFT로 볼 수 있다. 객체에는 소유권이 있다.

소유권

객체 소유권에는 몇 가지 세부 차이가 있지만 핵심 유형은 다음과 같다:

  • 주소 소유 객체: 이 객체는 하나의 주소가 소유한다. 스마트 계약과 상호작용하지 않고도 이 객체를 전송하거나 받을 수 있다. 예를 들어 통화, NFT, 특정 함수 접근을 제한하는 토큰이 있다.
  • 공유 객체: 누구나 사용할 수 있는 공개 접근 객체이다. 이 객체에 저장된 데이터를 변경하려면 일반적으로 스마트 계약에서 규칙을 정의해야 한다.

Sui의 모든 소유권 유형은 객체 소유권 유형을 참조하라.

접근 제어

Identity 또는 role 기반 접근 제어는 Solidity의 OpenZeppelin OwnableAccessControl contract를 통해 널리 사용된다.

객체 소유권은 Sui에 내재되어 있으므로 contract function에 대한 접근은 일반적으로 capability object로 제한된다.

이 객체를 사용자에게 발급하면 특정 함수를 호출할 권한이 부여된다. 사용자가 함수가 기대하는 객체를 소유하지 않으면 함수 호출은 실패한다.

주소 기반 검사를 구현할 수도 있다. 그러나 더 나은 보안을 위해 가능한 한 capability object를 사용하는 것이 권장된다.

자세한 내용은 The Move Book을 참조한다.

이 예시에서는 함수 호출 시 AdminCap 객체를 제시해야만 새 사용자를 생성할 수 있다.

/// Grants the owner the right to create new users in the system.
public struct AdminCap {}

/// Creates a new user in the system. Requires the `AdminCap` capability to be
/// passed as the first argument.
public fun new(_: &AdminCap, ctx: &mut TxContext): User {
User { id: object::new(ctx) }
}

객체 변경

Solidity에서는 Mapping과 같은 데이터 구조를 contract에 정의하고 저장한다. 데이터를 변경하려면 서명자가 데이터를 소유하는지와 관계없이 트랜잭션에 서명해야 한다.

Move에서는 데이터를 변경하는 로직이 contract에 정의되지만 데이터는 Move 객체에 저장된다.

데이터를 변경하려면 객체 소유자가 PTB를 사용해 contract function을 호출해야 한다. 프로토콜 수준에서 소유권을 검사하므로 서명자가 참조된 객체에 접근할 수 없으면 트랜잭션은 실패한다.

프로그래머블 트랜잭션 블록

Solidity에서 여러 contract 호출의 결과를 연결하거나 서로 다른 contract를 가로질러 호출을 연결하려면 다른 함수 호출을 조합하는 함수를 스마트 계약에 두어야 한다. 원자성 보장을 갖는 함수 호출 체이닝은 클라이언트 측에서 사용할 수 없다.

Move에서는 PTB가 이 문제를 해결한다. PTB는 빌더가 런타임에 원자성 보장을 유지하면서 contract 호출을 연결할 수 있게 한다. Sui PTB에는 최대 1,024개의 서로 다른 contract 호출 또는 다른 액션을 포함할 수 있다. PTB는 사실상 간단하면서도 표현력이 높고 강력하며 안전한 제한된 스크립팅 언어를 제공한다.

Sui의 빌더는 PTB를 활용해 다른 방식으로는 다루기 어려운 경험을 제공한다. 좋은 예는 최적의 가격으로 여러 DeFi 프로토콜에 걸쳐 토큰 스왑을 라우팅하는 DeFi aggregator이다. Sui에서 aggregator는 표시된 가격으로 트랜잭션이 실행되거나 완전히 revert된다는 보장을 가진 단일 PTB를 사용한다. PTB는 가장 강력한 Sui 기능 중 하나이다. 경험상 Sui에서 가장 성공적인 빌더는 이 기능을 단순한 트랜잭션 배치 수단으로 취급하지 않고, 초기에 자주 활용하는 빌더이다.

PTB에 관한 자세한 내용은 프로그래머블 트랜잭션 블록 (PTB)를 참조한다.

추가 비교

주제SuiEthereum
Digital signature algorithmEd25519, secp256k1, secp256r1secp256k1
Consensus mechanismDPoSPoS
VM and its languagesMoveVM, Move LangEVM, Solidity, Vyper
Chain data structureDAG블록
Common standards (coin, token, NFT, and so on)Currency Standard, Closed-Loop TokenERC-20, ERC-721, ERC-1155
Coin names, name of the smallest unitSUI, MISTETH, Wei
Available frameworks for developmentSui CLIFoundry, Hardhat
L1/L2L2가 없으며 빠른 L1에 의존한다많은 L2가 있다
Governance온체인 거버넌스EIP + Node Operator consensus
Bridges지원된다지원된다
Network security (stake required for control)전체 stake의 66%전체 stake의 51%
Smart contract auditing더 적은 감사가 필요하며 언어가 일부 역할을 수행한다(객체 모델).Solidity는 더 적은 보호를 제공하므로 더 많은 감사를 요구한다.
Private transactions설계상 공개이다.설계상 공개이며 L2와 서드파티가 private transaction을 지원한다.
TVL~1 billion~46 billion
Implementation languages for clientsRust, TypeScript많다
Eventingsender, 객체 ID, type, timestamp로 인덱싱된다.topic으로 인덱싱된다.
Indexing상위 수준 트랜잭션 데이터 + 객체, 코인 등.상위 수준 트랜잭션 데이터.
Oracles서드파티서드파티
Network upgrade strategy프로토콜 플래그와 framework 업그레이드를 validator가 투표한 뒤 활성화한다.EIP + hardforking이며 온체인 메커니즘이 없다.
IDEVSCode많다
Transaction lifecycle클라이언트에서 validator로 두 번 왕복해 transaction certificate(실행 보장)를 생성하고 공유 객체의 순서를 보장하기 위해 한 번 더 왕복한다. 지연 시간이 매우 낮다.트랜잭션이 네트워크에 전파되고 검증되어 mempool에 추가되며 validator가 mempool에서 트랜잭션을 선택한다. 임의의 validator가 블록을 제안하고 다른 validator가 블록에 yes 또는 no로 투표한다. 충분한 수의 블록이 지난 뒤 트랜잭션은 final로 간주된다. 확정성을 위해 블록 높이 요구 사항이 있어 지연 시간이 높다.
Parallel execution vs Ethereum serial execution, fast path병렬 실행할 수 있는 트랜잭션은 병렬로 실행된다.모든 트랜잭션이 순차적으로 실행된다.
Storage fees, storage rebates, storage accounts to pay for fees over time낮고 객체를 파기하면 rebate가 있다.높고 rebate가 없다.
Contract immutabilityupgrade capability를 사용해 native mutable 및 immutable 지원을 제공한다.native가 아니며 배포된 Solidity 코드를 감사해야 한다. 일부 operation code로 식별할 수 있다.
Contract upgradingnative이며 upgrade capability가 중개한다.call을 위임하는 proxy pattern으로 달성한다. Upgrade는 call이 향하는 위치를 바꾼다.
ComposabilityPTB를 사용해 하나의 트랜잭션 안에서 임의의 수의 함수를 호출한다. 한 contract 호출의 출력을 받아 다른 호출의 입력으로 넘겨 조합한다. 원자적 실행을 보장한다.각 호출은 개별적으로 처리되고 체인에서 직렬화되어야 하는 별도의 트랜잭션이다. 실행을 보장하려면 신중한 게시가 필요하다. 원자적이지 않다.
Token royalties체인에 의해 강제된다.마켓플레이스만 강제할 수 있다.