[마소콘2018] 업그레이드 가능한 스마트 컨트랙트 프레임워크 - 김종호

[마소콘2018] 업그레이드 가능한 스마트 컨트랙트 프레임워크 - 김종호

2018년 12월 15일 마이크로소프트웨어 콘퍼런스, 마소콘 2018
업그레이드 가능한 스마트 컨트랙트 프레임워크 - 김종호

Eb60cd4c3c1eb8825a689fb3c4bee81e?s=128

MICROSOFTWARE

December 17, 2018
Tweet

Transcript

  1. Upgradeable Smart Contract Framework & Developer Tools Jason Kim |

    jasonkim@haechi.io
  2. Speaker Jason Kim 김종호 jasonkim@haechi.io HAECHI LABS CEO 서울대 블록체인

    학회 디사이퍼 부회장 서울대 전기공학부 졸업 (전) Awair Software Engineer (전) VCNC(Between) Software Engineer 2
  3. Contents 왜 업그레이드 가능한 스마트 컨트랙트가 필요한가 1. 업그레이드 가능한

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

  5. 기존 IT 서비스의 발전 사례 1. 왜 업그레이드 가능한 스마트

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

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

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

    컨트랙트가 필요한가? KittyBreedingV1.sol address: “0x12345…” KittyBreedingV2.sol address: “0x45678…” 재배포된 Contract 기존 Contract 02. 주소 변경 03. 여러개의 스마트 컨트랙트 재배포 01. 데이터 마이그레이션
  9. 재배포를 통한 업그레이드의 문제점 2. 업그레이드 지원을 위해 필요한 조건들

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

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

  12. 데이터와 로직의 분리 패턴 (1) 2. 업그레이드 가능한 스마트 컨트랙트

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

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

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

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

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

  18. 프록시 패턴 (1) 2. 업그레이드 가능한 스마트 컨트랙트 패턴들 비교

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

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

    분석 Call A Contract B Contract 호출 컨트랙트 타겟 컨트랙트 타겟 컨트랙트가 아닌 호출 컨트랙트의 Storage 에 데이터가 저장된다. Delegate Call 을 통한 Storage 변화 DelegateCall A Storage 에 데이터 저장 A Contract 는 B Contract 의 변수 정보가 없지만 데이터를 저장할 수 있다!
  21. 프록시 패턴 (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..) <Proxy> </Proxy> • Version Info NEW
  22. 프록시 패턴 (5) 2. 업그레이드 가능한 스마트 컨트랙트 패턴들 비교

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

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

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

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

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

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

    여러 스마트 컨트랙트를 Atomic 하게 업그레이드 Internal Transaction은 여러 트랜잭션으로 블록에 담기는 것이 아니라, 하나의 트랜잭션으로 처리됨 <Proxy> </Proxy> • Version Info ContractB_v1 ContractB_v2 <Proxy> </Proxy> • Version Info ContractA_v1 ContractA_v2 Internal Transactions Registry.sol
  29. Upgradeable Smart Contract Framework Architecture 3. 무중단 서비스를 위한 업그레이드

    가능한 스마트 컨트랙트 프레임워크 Call 0xabc.. Proxy Contract (0xabc..) V1 Contract (0x123..) <Proxy> </Proxy> • Version Info V2 Contract (0x234..) EOA Registry Contract <Registry> </Registry> Update Version Business Logic Smart contracts Upgradeable Smart Contract Library Redirect (DelegateCall) • Manage Dapp Contracts
  30. vvisp을 이용해 업그레이드 가능한 스마트 컨트랙트 만들기 4.

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

  32. 코드 템플릿 생성 4. vvisp를 이용한 업그레이드 가능한 스마트 컨트랙트

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

    만들기 출처: https://gist.github.com/JhChoy/b414605a2ee05f8d71bc8473b24fcfea
  34. “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의 주소를 전달
  35. “.env” 작성 4. vvisp를 이용한 업그레이드 가능한 스마트 컨트랙트 만들기

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

    업그레이드 가능한 스마트 컨트랙트 만들기 $ vvisp deploy-service
  37. 스마트 컨트랙트 배포 결과 - “state.vvisp.json” 생성 4. vvisp를 이용한

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

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

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

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

    만들기 업그레이드 후 state.vvisp.json 업그레이드 전 state.vvisp.json
  42. 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
  43. Thank You! Jason Kim | jasonkim@haechi.io