Slide 1

Slide 1 text

Upgradeable Smart Contract Framework & Developer Tools Jason Kim | [email protected]

Slide 2

Slide 2 text

Speaker Jason Kim 김종호 [email protected] HAECHI LABS CEO 서울대 블록체인 학회 디사이퍼 부회장 서울대 전기공학부 졸업 (전) Awair Software Engineer (전) VCNC(Between) Software Engineer 2

Slide 3

Slide 3 text

Contents 왜 업그레이드 가능한 스마트 컨트랙트가 필요한가 1. 업그레이드 가능한 스마트 컨트랙트 패턴들 비교 분석 2. 무중단 서비스를 위한 업그레이드 가능한 스마트 컨트랙트 프레임워크 3. vvisp을 이용해 업그레이드 가능한 스마트 컨트랙트 만들기 4. 3

Slide 4

Slide 4 text

왜 업그레이드 가능한 스마트 컨트랙트가 필요한가? 1.

Slide 5

Slide 5 text

기존 IT 서비스의 발전 사례 1. 왜 업그레이드 가능한 스마트 컨트랙트가 필요한가? 이미지 출처: https://www.webdesignmuseum.org 모든 서비스들은 지속적인 업데이트를 통해 성장합니다. 페이스북도 10년 넘게 수천번의 업데이트를 통해 발전했습니다. 2004년 2016년

Slide 6

Slide 6 text

비지니스 로직 수정 및 추가 불가 1. 왜 업그레이드 가능한 스마트 컨트랙트가 필요한가? - 이더리움의 대표적인 DApp - 2017년 11월 런칭 이후 선풍적인 인기를 끌며 일일 거래금액 30억 이상 달성 - 이더리움 네트워크가 이러한 과부하를 버티지 못하고 사용성을 해치며 급격히 인기가 하락 - 만약 게임이 업그레이드 가능했다면? 크립토키티 서비스 추이 (출처: https://dappradar.com/) 크립토키티 CryptoKitties

Slide 7

Slide 7 text

배포 후에 취약점 수정 불가 1. 왜 업그레이드 가능한 스마트 컨트랙트가 필요한가? Smart Mesh 해킹 [해킹 방식] 해커가 Integer Overflow 를 이용해 토큰을 무단 복제후 판매 Parity 재단 Multisig Wallet 동결 [해킹 방식] 스마트 컨트랙트를 self-destruct 하여 출금 함수를 실행 불가하도록 공격 THE DAO 해킹사건 [해킹 방식] 스마트 컨트랙트 External call의 Re-entrancy 공격을 이용 $ 300,000,000 스마트 컨트랙트는 가치를 지닌 암호화폐를 매개하기에, 사소한 버그라고 할지라도 이것이 심각한 해킹 피해를 발생시킵니다 15% (전체 ETH양 대비) 전세계 거래소 ERC20 거래 일시 중지 이미지 출처: Coindesk

Slide 8

Slide 8 text

새로운 컨트랙트 재배포를 통한 업그레이드 1. 왜 업그레이드 가능한 스마트 컨트랙트가 필요한가? KittyBreedingV1.sol address: “0x12345…” KittyBreedingV2.sol address: “0x45678…” 재배포된 Contract 기존 Contract 02. 주소 변경 03. 여러개의 스마트 컨트랙트 재배포 01. 데이터 마이그레이션

Slide 9

Slide 9 text

재배포를 통한 업그레이드의 문제점 2. 업그레이드 지원을 위해 필요한 조건들 0xee91... 0xaa90… 0xcc21... 여러 개의 스마트 컨트랙트를 모두 재배포 하기에 복잡함 주소가 변경되어 유저들에게 혼란을 야기함 데이터 마이그레이션시에 가스 비용과 시간이 많이 들고 실수할 가능성이 존재 02. 01. 03. 서비스가 중단 될 수 있음

Slide 10

Slide 10 text

업그레이드 가능한 스마트 컨트랙트 패턴들 비교 분석 2.

Slide 11

Slide 11 text

데이터와 로직의 분리 패턴 2-1.

Slide 12

Slide 12 text

데이터와 로직의 분리 패턴 (1) 2. 업그레이드 가능한 스마트 컨트랙트 패턴들 비교 분석 Business Logic Contract (0xabc..) Method Call EOA Eternal Storage Contract (0xsdf..) Method Call 비지니스 로직과 데이터 저장 컨트랙트를 분리해서 작성합니다. 모든 데이터는 Eternal Storage Contract에 저장됩니다.

Slide 13

Slide 13 text

데이터와 로직의 분리 패턴 (2) 2. 업그레이드 가능한 스마트 컨트랙트 패턴들 비교 분석 Business Logic V1 Contract (0xabc..) Method Call EOA Eternal Storage Contract (0xsdf..) Method Call Eternal Storage Solidity Code

Slide 14

Slide 14 text

데이터와 로직의 분리 패턴 (3) 2. 업그레이드 가능한 스마트 컨트랙트 패턴들 비교 분석 Business Logic V1 Contract (0xabc..) Method Call EOA Eternal Storage Contract (0xsdf..) Method Call Business Logic Solidity Code

Slide 15

Slide 15 text

데이터와 로직의 분리 패턴 (4) 2. 업그레이드 가능한 스마트 컨트랙트 패턴들 비교 분석 Business Logic V1 Contract (0xabc..) Method Call EOA Eternal Storage Contract (0xsdf..) Business Logic V2 Contract (0xdef..) Method Call Method Call Method Call NEW

Slide 16

Slide 16 text

데이터와 로직의 분리 패턴 (5) 2. 업그레이드 가능한 스마트 컨트랙트 패턴들 비교 분석 장점 • 데이터 마이그레이션이 필요없다. 고정된 주소의 컨트랙트에 데이터가 저장된다. 단점 • 데이터 컨트랙트와 통신하기 위해서 추가적인 코드 작성이 필요하다. • 컨트랙트의 주소가 변경된다. • 테스트 코드의 작성이 복잡하다.

Slide 17

Slide 17 text

프록시 패턴 2-2.

Slide 18

Slide 18 text

프록시 패턴 (1) 2. 업그레이드 가능한 스마트 컨트랙트 패턴들 비교 분석 Proxy Contract (0xabc..) DelegateCall EOA Business Logic Contract (0xsdf..) Method Call “Business Logic Contract”에 데이터와 비지니스 로직 코드를 함께 작성합니다. Proxy 컨트랙트가 DelegateCall로 비지니스 로직 컨트랙트를 호출합니다.

Slide 19

Slide 19 text

프록시 패턴 (2) 2. 업그레이드 가능한 스마트 컨트랙트 패턴들 비교 분석 “타겟 컨트랙트” 코드가 “호출 컨트랙트”의 컨텍스트에서 실행될 수 있는 호출 방식 컨트랙트가 런타임에 다른 주소의 코드를 동적으로 실행시킬 수 있음 Call Call DelegateCall Call msg.sender = 컨트랙트의 주소 msg.value = 컨트랙트가 전달하는 이더리움의 양 msg.sender = 지갑의 주소 msg.value = 지갑이 전달하는 이더리움의 양 호출 컨트랙트 타겟 컨트랙트 타겟 컨트랙트 호출 컨트랙트 Context Context Delegate Call Call DelegateCall

Slide 20

Slide 20 text

프록시 패턴 (3) 2. 업그레이드 가능한 스마트 컨트랙트 패턴들 비교 분석 Call A Contract B Contract 호출 컨트랙트 타겟 컨트랙트 타겟 컨트랙트가 아닌 호출 컨트랙트의 Storage 에 데이터가 저장된다. Delegate Call 을 통한 Storage 변화 DelegateCall A Storage 에 데이터 저장 A Contract 는 B Contract 의 변수 정보가 없지만 데이터를 저장할 수 있다!

Slide 21

Slide 21 text

프록시 패턴 (4) 2. 업그레이드 가능한 스마트 컨트랙트 패턴들 비교 분석 동일한 Entry Point 상속 Call 0xabc.. Loans Contract V1 (0x123..) Loans Contract V2 (0x234..) EOA Business Logic Smart contracts Loans Contract V1 Spec Data Structure ❏ Loans Hash ❏ Loans Amount ❏ Loans Rates ❏ Loans Type Code Functions ❏ addBasicInformation Loans Contract V2 Spec Data Structure ❏ Loans Hash ❏ Loans Amount ❏ Loans Rates ❏ Loans Type Code ❏ Loans Documentation Functions ❏ addBasicInformation ❏ addLoanDocumentaion Proxy Contract (0xabc..) • Version Info NEW

Slide 22

Slide 22 text

프록시 패턴 (5) 2. 업그레이드 가능한 스마트 컨트랙트 패턴들 비교 분석 장점 • 데이터 마이그레이션이 필요없다. 고정된 주소의 컨트랙트에 데이터가 저장된다. • 컨트랙트의 주소가 변경되지 않는다. • 업그레이드를 지원하려고 기존 컨트랙트의 코드를 고치지 않아도 된다. 단점 • 새로운 버전의 컨트랙트가 과거 버전의 컨트랙트를 상속받음으로써 오는 제약 조건들이 존재한다.

Slide 23

Slide 23 text

3. 무중단 서비스를 위한 업그레이드 가능한 스마트 컨트랙트 프레임워크

Slide 24

Slide 24 text

Registry 3. 무중단 서비스를 위한 업그레이드 가능한 스마트 컨트랙트 프레임워크 • Version Info ContractB_v1 ContractB_v2 • Version Info ContractA_v1 ContractA_v2 컨트랙트 B 업그레이드 호출 컨트랙트 A 업그레이드 호출 ContractA Version 1 ContractB Version 1 여러 컨트랙트를 업그레이드 해야하는 상황 (문제점) 각 컨트랙트마다 업그레이드 트랜잭션을 따로 호출해야함 총 2개의 트랜잭션

Slide 25

Slide 25 text

Registry 3. 무중단 서비스를 위한 업그레이드 가능한 스마트 컨트랙트 프레임워크 • Version Info ContractB_v1 ContractB_v2 • Version Info ContractA_v1 ContractA_v2 컨트랙트 B 업그레이드 호출 ContractA Version 2 ContractB Version 1 여러 컨트랙트를 업그레이드 해야하는 상황 (문제점) 컨트랙트 A 업그레이드 트랜잭션이 먼저 성공 총 2개의 트랜잭션 컨트랙트 A 업그레이드 완료

Slide 26

Slide 26 text

Registry 3. 무중단 서비스를 위한 업그레이드 가능한 스마트 컨트랙트 프레임워크 • Version Info ContractB_v1 ContractB_v2 ContractA Version 2 ContractB Version 1 여러 컨트랙트를 업그레이드 해야하는 상황 (문제점) 업그레이드가 Atomic 하게 이루어지지 않으면 문제 발생 가능 트랜잭션 ContractA_v2 에서 ContractB_v2 함수 호출 • Version Info ContractA_v1 ContractA_v2

Slide 27

Slide 27 text

Registry 3. 무중단 서비스를 위한 업그레이드 가능한 스마트 컨트랙트 프레임워크 여러 스마트 컨트랙트를 Atomic 하게 업그레이드 Registry Contract 도입을 통해 다수의 Proxy Contract 관리 Registry Contract • Version Info • proxies[] • upgradeToAndCalls • Version Info ContractB_v1 ContractB_v2 • Version Info ContractA_v1 ContractA_v2

Slide 28

Slide 28 text

Registry 3. 무중단 서비스를 위한 업그레이드 가능한 스마트 컨트랙트 프레임워크 여러 스마트 컨트랙트를 Atomic 하게 업그레이드 Internal Transaction은 여러 트랜잭션으로 블록에 담기는 것이 아니라, 하나의 트랜잭션으로 처리됨 • Version Info ContractB_v1 ContractB_v2 • Version Info ContractA_v1 ContractA_v2 Internal Transactions Registry.sol

Slide 29

Slide 29 text

Upgradeable Smart Contract Framework Architecture 3. 무중단 서비스를 위한 업그레이드 가능한 스마트 컨트랙트 프레임워크 Call 0xabc.. Proxy Contract (0xabc..) V1 Contract (0x123..) • Version Info V2 Contract (0x234..) EOA Registry Contract Update Version Business Logic Smart contracts Upgradeable Smart Contract Library Redirect (DelegateCall) • Manage Dapp Contracts

Slide 30

Slide 30 text

vvisp을 이용해 업그레이드 가능한 스마트 컨트랙트 만들기 4.

Slide 31

Slide 31 text

vvisp이란 4. vvisp를 이용한 업그레이드 가능한 스마트 컨트랙트 만들기 https://github.com/HAECHI-LABS/vvisp

Slide 32

Slide 32 text

코드 템플릿 생성 4. vvisp를 이용한 업그레이드 가능한 스마트 컨트랙트 만들기 $ mkdir vvisp-sample $ cd vvisp-sample $ vvisp init https://github.com/HAECHI-LABS/vvisp-sample

Slide 33

Slide 33 text

스마트 컨트랙트 작성 4. vvisp를 이용한 업그레이드 가능한 스마트 컨트랙트 만들기 출처: https://gist.github.com/JhChoy/b414605a2ee05f8d71bc8473b24fcfea

Slide 34

Slide 34 text

“service.vvisp.json” 배포 파일 작성 4. vvisp를 이용한 업그레이드 가능한 스마트 컨트랙트 만들기 “service.vvisp.json” 작성 - serviceName: 현재 서비스의 이름 - variables: Haechi 주인의 address를 상수로 사용 - contracts/Haechi - path: HaechiV1.sol 사용 - upgradeable: 업그레이드 가능 - initialize: 초기화를 위해 initialize 함수에 Gym의 주소를 전달 - contracts/Gym - path: HaechiGym.sol 사용 - upgradeable: 업그레이드 가능 - initialize: 초기화를 위해 initialize 함수에 Haechi의 주소를 전달

Slide 35

Slide 35 text

“.env” 작성 4. vvisp를 이용한 업그레이드 가능한 스마트 컨트랙트 만들기 “.env” 작성 - NETWORK: 사용할 네트워크 명, local 사용 - PORT: local 포트 번호 - INFURA_API_KEY: infura 사용 시 필요한 api 키 - MNEMONIC: 니모닉 시드 값 - PRIV_INDEX: 니모닉으로부터 생성되는 비밀키의 index - GAS_PRICE: gas rate 설정

Slide 36

Slide 36 text

스마트 컨트랙트 배포 - 서비스 첫 배포 4. vvisp를 이용한 업그레이드 가능한 스마트 컨트랙트 만들기 $ vvisp deploy-service

Slide 37

Slide 37 text

스마트 컨트랙트 배포 결과 - “state.vvisp.json” 생성 4. vvisp를 이용한 업그레이드 가능한 스마트 컨트랙트 만들기 배포 결과물 “state.vvisp.json” 생성 - contracts/Haechi, contracts/Gym - upgradeable: 업그레이드 가능 - address: Business 컨트랙트 주소 - fileName: 배포된 컨트랙트의 실제 파일(컨트랙트) 명 - proxy: Proxy 컨트랙트 주소 - serviceName: 현재 서비스의 이름 - registry: Registry 컨트랙트의 주소 state.vvisp.json

Slide 38

Slide 38 text

스마트 컨트랙트 업그레이드 코드 작성 4. vvisp를 이용한 업그레이드 가능한 스마트 컨트랙트 만들기 HaechiV2.sol 작성

Slide 39

Slide 39 text

새롭게 작성한 업그레이드 코드 배포 4. vvisp를 이용한 업그레이드 가능한 스마트 컨트랙트 만들기 service.vvisp.json 변경

Slide 40

Slide 40 text

스마트 컨트랙트 배포 - 업그레이드 4. vvisp를 이용한 업그레이드 가능한 스마트 컨트랙트 만들기 $ vvisp deploy-service

Slide 41

Slide 41 text

업그레이드 배포 결과 4. vvisp를 이용한 업그레이드 가능한 스마트 컨트랙트 만들기 업그레이드 후 state.vvisp.json 업그레이드 전 state.vvisp.json

Slide 42

Slide 42 text

Vvisp Architecture Summary vvisp-CLI(Command Line Interface) vvisp Upgradable Smart Contract Library Token Contract Business Logic A Business Logic C Business Logic B Smart Contract Layer Platform Based on EVM Blockchain deploy, upgrade, test, versioning Service Frontend Smart Contract function call Developers vvisp Smart Contract Interface Library

Slide 43

Slide 43 text

Thank You! Jason Kim | [email protected]