4조
프로젝트 개요
기술개발 과제
국문 : 이더리움 스마트 컨트랙트 개발 툴킷
영문 : ethereum smart contract development toolkit
과제 팀명
4조
지도교수
김성환 교수님
개발기간
2019년 3월 ~ 2019년 6월 (총 4개월)
구성원 소개
서울시립대학교 조경학과 2013875019 이상엽(팀장)
서울시립대학교 조경학과 2013875008 김현진
서울시립대학교 컴퓨터과학부 2014920012 노일호
서울시립대학교 컴퓨터과학부 2014920059 최치원
서론
개발 과제의 개요
개발 과제 요약
◇ 배포된 스마트 컨트랙트의 변수들의 인덱스와 값을 찾아 보여주는 모듈인 Show-State 모듈 구현 - 스마트 컨트랙트 변수들의 선언 순서에 따른 index 배정 규칙에 대해 연구한다. - 스마트 컨트랙트 변수들이 이더리움 storage에 저장되는 물리적 위치에 대해 연구한다. - Solidity 컴파일러인 sol c를 활용해 Solidity코드의 AST를 추출한 후 AST로부터 각 변수들의 index 위치를 계산한다.
◇ 솔리디티 스마트 컨트랙트를 위한 디버깅 툴 개발 - 이더리움 솔리디티 스마트 컨트랙트 변수의 index를 구하는 라이브러리 개발을 수행한다. - Indexing 기능을 활용해 이더리움 스마트 컨트랙트의 변수를 추적하는 debugging tool 개발함으로서 더 나은 스마트 컨트랙트 디버깅 환 경을 제공한다. - 제작한 디버거를 오픈소스 스마트 컨트랙트 개발 프레임웍인 vvsip에 integration함으로서 사용성을 높힌다.
◇ VVISP프로그램에 CI/CD툴 추가 - 보안 분석을 담당하는 Mythril패키지를 통합할 수 있도록 한다. - 코드 테스트, 코드 커버리지, 보안 분석, 배포 절차 자동화 시스템을 구축할 수 있도록 한다.
개발 과제의 배경
기존에는 이더리움 스마트 컨트랙트 변수에 대해서, 변수가 저장되는 스토리지 위치인 index를 구하는 라이브러리가 존재하지 않았다. 또한 기존의 솔리디티 스마트 컨트랙트 디버거들은 OP코드 단위로만 실행이 가능한 등 사용성이 떨어졌다. 이를 해결 하기 위해 이더 리움 솔리디티 스마트 컨트랙트 변수의 index를 구하는 라이브러리를 개발하고, 이를 활용해 스마트 컨트랙트 디버거를 개발한다. 이를 통해 더 나은 스마트 컨트랙트 디버깅 환경을 제공하고, 보다 쉽고 편리하게 DApp을 만들 수 있는 환경을 제공한다. 이러한 기능들을 VVISP에 통합한 후 CI/CD 기능도 제공할 수 있도록 하여 기존의 Truffle이나 Remix보다 개발자들이 사용하기 쉽고 편리한 프로그램을 만들 수 있도록 한다.
개발 과제의 목표 및 내용
◇ 배포된 스마트 컨트랙트의 Indexing - solidity 컴파일러인 solc를 통해 나오는 중간 산출물인 ast를 파싱함으로써 변수들의 이름과 타입을 획득 - 위에서 획득한 타입에 따른 인덱싱 배정 규칙에 따라 인덱스 계산
◇ 이더리움 스마트 컨트랙트 debugging tool 개발 - 개발한 Indexing 라이브러리를 활용해 이더리움 스마트 컨트랙트의 변수를 추적가능한 디버거를 개 발한다. - 개발한 디버거를 최종적으로 VVISP에 Integration할 수 있도록 한다.
◇ VVISP에 CI/CD 기능 추가 - CI/CD 기능 추가를 통해 개발한 코드의 검증, 빌드, 배포를 자동화 함으로써 스마트 컨트랙트 개발시간을 단축할 수 있도록 한다.
관련 기술의 현황
관련 기술의 현황 및 분석(State of art)
- 전 세계적인 기술현황
◇ 블록체인 ‘블록'이라고 하는 소규모 데이터들이, P2P 방식을 기반으로 생성된 체인 형태의 연결고리 기반 분산 데이터 저장환경에 저장되어, 누구라도 임의로 수정할 수 없고 누구나 변경의 결과를 열람할 수 있는 분산 컴퓨팅 기술 기반의 데이터 대변 방지 기술. 스마트 컨트랙트 블록체인 기반으로 금융거래, 부동산 계약, 공증 등 다양한 형태의 계약을 체결하고 이행하는 것. 이더리움 블록체인 기술을 기반으로 스마트 컨트랙트 기능을 구현하기 위한 분산 컴퓨팅 플랫폼. 솔리디티 다양한 블록체인 플랫폼의 스마트 컨트랙트 작성 및 구현에 사용되는 계약 지향 프로그래밍 언어.
◇ CI/CD 애플리케이션 개발 단계를 자동화하여, 애플리케이션을 보다 짧은 주기로 고객에게 제공하는 방법. 애플리케이션의 통합 및 테스트 단계에서부터, 제공 및 배포에 이르는 애플리케이션의 라이프사이클 전체에 걸쳐 지속적인 자동화와 지속적인 모니터링 제공.
◇ Dapp 개발 프로세스 관리 지원 스마트 컨트랙트 디버그 패키지 로컬 EVM 환경에서 트랜잭션 단위 디버깅 제공. 스마트 컨트랙트 커버리지 패키지 테스트 수행시, 코드 자체가 얼마나 실행되었는지를 확인. 스마트 컨트랙트 보안 분석 패키지 스마트 컨트랙트 배포 이전 단계에서 외부 위험 요소 제거.
- 특허조사 및 특허 전략 분석
◇ 특허조사 스마트 컨트랙트 개발 툴들에서 smartContract를 디버깅하는 방법 스마트 컨트랙트의 소스코드와 op코드가 맵핑되는 방법 블록체인 SDK에서 CI/CD 기능을 제공하는 방법 배포된 스마트 컨트랙트에 있는 변수들에 대해 변수들의 스토리지 인덱싱을 확인하는 방법
◇ 특허전략 국제 특허 출원 시, 국내출원 > PCT (12개월 내) > 미국출원 (30개월 내) 순으로 출원 (PCT 경로) 단 국내출원비용이 수백만 원에 달하는 현실 고려, 서비스 출원 후 1년 이내 출원 결정 미국 시장 진입 시, 가출원을 통해 특허 대비 비용을 절약 가능
- 기술 로드맵
스마트 컨트랙트에 대한 이해를 위한 선행적인 학습 및 실습 기존의 truffle이 가지고 있는 solidity컴파일, 배포 및 debug 등의 방식에 대한 파악 및 이해, Remix 조사를 통한 개발 툴들의 전반적인 장 점과 단점 파악 위에서 마련한 이론을 바탕으로 한 실전 적용 – VVISP을 보완할 수 있는 모듈 제작 구현된 기능들을 VVISP에 통합시켜 DApp에 대한 이해가 부족한 사용자들도 쉽게 쓸 수 있도록 프로그램 보완
시장상황에 대한 분석
- 경쟁제품 조사 비교
◇ Truffle - Ethereum의 스마트 컨트랙트 개발, 테스팅, 배포 프레임 워크 - 테스트 배포시 테스트 로컬 이더리움 블록체인 제공 어플리케이션인 Ganache를 사용 - Pros
- 로컬 블록체인 및 메인넷에 배포 가능
- 소스코드와 op코드가 맵핑되는 디버그 명령어 제공
- Cons
- 코드 커버리지나 빌드 및 배포 자동화와 같은 CI/CD 기능이 제공되지 않음
- 배포된 스마트 컨트랙트 변수의 스토리지 인덱스 확인 불가능
◇ Remix - Ethereum의 스마트 컨트랙트 개발을 위한 브라우저 기반의 IDE - 브라우저 상에서 작성한 스마트 콘트랙트의 디버깅 가능 - Pros
- 로컬 JavascriptVM 및 메인넷에 배포 가능
- Cons
- 디버깅을 op코드 단위로만 수행가능
- 코드 커버리지나 빌드 및 배포 자동화와 같은 CI/CD 기능이 제공되지 않음
- 배포된 스마트 컨트랙트 변수의 스토리지 인덱스 확인 불가능
◇ VVISP - Ethereum의 스마트 컨트랙트 개발을 위한 CLI 도구 및 프레임워크 - Pros
- 로컬 블록체인 및 메인넷에 배포 가능
- 빌드 및 배포 자동화 기능이 제공
- 서비스라는 단위로 여러개의 컨트랙트를 동시 배포 가능
- Cons
- 디버깅 명령어가 존재하지 않음
- 코드 커버리지 및 코드 보안성 검증 절차가 없어 완벽한 CI/CD 기능이 제공되지 않음
- 배포된 스마트 컨트랙트 변수의 스토리지 인덱스 확인 불가능*마케팅 전략 제시
개발과제의 기대효과
기술적 기대효과
◇ Solidity로 작성된 Ethereum 스마트 컨트랙트에 있는 변수들의 index를 구함으로써 변수들의 상태를 보일 수 있게 한다. - 기존의 스마트 컨트랙트 개발 프로그램 에서는 스마트 컨트랙트의 state 변수 스토리지의 index를 구할 수 있는 기능이 전무했다. 정적인 변수들 은 변수 선언 순서에 따라 index가 배정되지만 동적 인 변수들은 그렇지 않기 때문에 추적하는 것이 쉽지 않기 때문이다. index를 구하고 state를 보 일 수 있는 기능이 구현된다면 작성한 스마트 컨트랙트에 대한 분석이 훨씬 용이해질 것이다.
◇ 기존의 VVISP에서 제공하지 않던 debugging tool을 제공함으로써 작성된 스마트 컨트랙트에 대한 논리적인 오류 검출 가능
◇ CI/CD기능 제공을 통해 지속적인 서비스 제공과 지속적인 배포 가능
◇ 블록체인을 잘 모르는 개발자들도 기존의 웹 / 앱 개발 방식을 유지한 채 높은 수준의 DApp를 만들 수 있도록 기능 제공 - 기존의 VVISP은 단순한 설정 파일 형태로 배포 대상을 간단하게 정의하고 코드 작성없이 배포 순 서도 알아서 고려할 수 있도록 편의성을 제공하 였다. 이와 더불어 show state, debug, CI/CD기능 을 함께 제공한다면 편리한 배포 뿐만아니라 오류검출, 지속적인 유지 보수에도 도움을 주어 VVISP으로 하여금 개발자에게 편의성을 주는 통합적인 개발툴 로써의 의미를 가질 수 있게 할 것이 다.
경제적, 사회적 기대 및 파급효과
◇ 편리한 UX로 인해 대중이 거부감 없이 블록체인을 사용할 수 있게 하여 DApp의 활성화 기반 마련
◇ 세계경제포럼은 블록체인 플랫폼이 2025년 세계 GDP의 10%를 차지할 것으로 예상, 가트너는 블록체인을 통한 경제적 부가가치가 2017년 40억 달러에서 2030년 3.1조 달러까지 성장할 것으로 전망. 한국과학기술정보연구원(KISTI)가 Markets and Markets 및 코인저널 자료를 종합 분석하여 전망한 국내 블록체인 시장규모는 2016년 201억원에서 2022년 3562억원으로 성장할 것으로 보임. 이외에 세계 금융기업과 it기업들이 빠른 속도로 블록체인 시장을 형성하고 있는 지금 더 쉽고 실용적으로 블록체인 플랫폼을 활용할 수 있게하는 미들웨어의 발전이 동반됐을 때 급속한 경제적 성장을 이루어낼 것으로 예상
기술개발 일정 및 추진체계
개발 일정
시스템 개발 계획 수립 : 3~4월 시스템 요구사항 분석 : 4월 상세 설계 팀원 전체 : 4월~5월 구현 및 테스트 팀원 전체 : 5월~6월
구성원 및 추진체계
◇ 요구분석 및 기초 설계까지는 모든 팀원이 함께 진행한다. ◇ 각 팀원 별 담당 업무
노일호
스마트 컨트랙트 코드 실행가능한 local evm 구축 이더리움 스마트 컨트랙트 debugging 기능 개발 오픈소스를 활용하여 vvisp의 CI/CD 기능 추가
최치원
solc 컴파일러 및 EVM 가상머신의 동작에 대한 연구 이더리움 스마트 컨트랙트 debugging 기능 개발
김현진
스마트 컨트랙트 변수들의 선언 순서에 따른 index 배정 규칙 연구 배포된 스마트 컨트랙트의 변수들의 인덱스와 값을 찾는 기능의 모듈인 show-state 구현 오픈소스를 활용하여 vvisp의 CI/CD 기능 추가
이상엽
스마트 컨트랙트 변수들이 이더리움 storage에 저장되는 물리적 위치에 대한 연구 배포된 스마트 컨트랙트의 변수들의 인덱스와 값을 찾는 기능의 모듈인 show-state 구현
설계
설계사양
제품의 요구사항
1. 사용자가 작성한 Solidity 소스코드 변수들의 Index를 계산 및 시각화
2. 이더리움 블록체인 상에 배포된 Solidity 소스코드 변수들의 Index를 계산 및 시각화
3. 사용자가 작성한 Solidity 소스코드를 컴파일 및 로컬 EVM 상에서 실행
4. 사용자가 작성한 Solidity 소스코드에 대한 Breaking Point 기능
5. 사용자가 작성한 Solidity 소스코드에 대한 Step Into 기능
6. 사용자가 작성한 Solidity 소스코드 변수들의 값을 동적으로 추적하는 기능
7. 사용자가 작성한 Solidity 소스코드의 Security Analysis
8. 사용자가 작성한 Solidity 소스코드의 Code Coverage
9. 사용자가 작성한 Solidity 소스코드의 컴파일 및 배포 자동화
10. VVISP과의 integration
설계 사양
◇ 기능
- 기업에서 요구하는 모든 기능을 적절히 갖추어야 한다.
- CI/CD 기능
- 코드 커버리지를 담당하는 sol-coverage 패키지를 통합해야 한다.
- 보안 분석을 담당하는 Mythril 패키지를 통합해야 한다.
- 코드 테스트, 코드 커버리지, 보안 분석, 배포 절차 자동화 시스템을 구축해야 한다.
- show-state 기능
- 상태 변수들의 순서를 바탕으로 스토리지 인덱스를 계산해야 한다.
- 계산된 스토리지 인덱스를 바탕으로 스토리지 값을 가져와야 한다.
- truffle-debugger를 통합해야 한다.
◇ 성능
- 사용 가능한 정도의 레이턴시를 제공해야 한다.
- 불필요한 리소스 사용을 최소화해야 한다.
◇ 편의성
- 사용자 친화적인 인터페이스를 제공해야 한다.
- 쉬운 입력, 보기좋은 출력.
◇안정성
- 버그 발생이 없음을 보장해야 한다.
- 결과물의 무결성이 보장되어야 한다.
- 기존의 기능들과 배타적인 통합이 이루어져야 한다.
- 플랫폼에 의존적이지 않은 시스템을 구축해야 한다.
◇지속성
- 기업의 지속적인 유지보수가 용이해야 한다.
- 일관된 코딩 컨벤션, 커밋 컨벤션을 유지해야 한다.
- 패키지, 모듈의 구조화가 적절히 이루어져야 한다.
개념설계안
가. 시스템 기능
◇ 배포된 스마트 컨트랙트의 인덱싱
- 배포된 스마트 컨트랙트의 변수들의 인덱스와 값을 찾아주는 기능
- 작성한 소스코드 뿐만아니라 이더리움 메인넷에 배포된 스마트컨트랙트 또한 분석 가능
- 코드 분석 및 디버깅 등에 활용
◇ Debug
- vvisp에 스마트 컨트랙트 Debug 기능을 추가.
- 기존 개발도구들의 디버거에는 존재하지 않는 특정 변수의 스토리지 인덱스와 값을 보여주는 기능을 추가
◇ CI/CD
- CI/CD 기능 추가를 통해 개발한 코드의 검증, 빌드, 배포를 자동화 함으로서 스마트 컨트랙트 개발시간을 단축
- Build - Test - Security Analysis - Code Coverage의 절차를 파이프라이닝해 검증, 빌드, 배포 를 자동화
◇ 각 모듈들은 vvisp의 명령어 형태로 동작
- vvisp show-state
- vvisp debug
- vvisp CI/CD
나. 시스템 구조
1. Show-State Module
- 솔리디티 컴파일러인 solc를 통해 나오는 중간 산출물인 ast를 파싱해 변수들의 이름과 타입을 획 득한다.
그 이후 타입에 따른 솔리디티 스토리지 인덱스 배정 규칙에 따라 변수들의 인덱스를 계산한다.
- solc
- 솔리디티 컴파일러이며, 결과물인 output객체에 ast 및 opcode를 포함한다.
2. Debug Module
- Truffle의 디버그 모듈을 vvisp에 Integration함으로서, Debug 기능을 구현한다.
이때 Show-state module을 활용해,
Truffle 디버거에는 존재하지 않는 특정 변수의 스토리지 인덱스와 값을 보여주는 기능을 추가한다.
- 실행 로직
1) solidity 소스코드를 compile한다.
2) local evm에 배포 및 실행시킨다.
3) 실행한 특정 Tx에 대해서 디버깅을 수행한다.
3. CI/CD Module
- CI/CD 기능 추가를 통해 개발한 코드의 검증, 빌드, 배포를 자동화 함으로서 스마트 컨트랙트 개 발시간을 단축한다.
- Build - Test - Security Analysis - Code Coverage의 절차를 파이프라이닝해 검증, 빌드, 배포를 자동화한다.
- Security Analysis에는 Mythrill을 Code Coverage에는 Sol-Coverage를 활용한다.
이론적 계산 및 시뮬레이션
Solidity 변수 스토리지 인덱스 배정 규칙
1. 정적 크기 변수
- 매핑 변수와 동적 크기 배열을 제외한 모든 변수는 정적 크기 변수에 속한다.
- 변수가 선언된 순서대로 인덱스가 0부터 차례로 배정된다.
- 스토리지 한 슬롯의 크기인 32바이트보다 크기가 작은 변수들에 대해, 패킹 규칙에 따라 한 슬롯 안에 패킹될 수 있다.
- 패킹 규칙
1. 첫번째 요소는 낮은 위치에 정렬된다.
2. 기초 자료형은 필요한 바이트만큼만 공간을 차지한다.
3. 슬롯에 남은 공간보다 저장하려는 변수의 크기가 크면, 다음 슬롯에 저장된다.
4. 구조체와 정적 크기 배열은 항상 새 슬롯에서 시작하고, 슬롯 전체를 점유한다.
5. 구조체와 정적 크기 배열 내부의 요소들은 위의 규칙에 따라 패킹될 수 있다.
2. 동적 크기 변수
- 동적 크기 변수는 매핑 변수와 동적 크기 배열로 나뉜다.
- 동적 크기 변수의 베이스 슬롯은 정적 크기 변수와 마찬가지로 배정되며, 한 슬롯을 전부 차 지한다.
-매핑 변수의 베이스 슬롯에는 항상 0이 저장되며, 각각의 키에 대해 인덱스
keccak256(concatenation(key, indexOfBaseSlot))의 위치에 밸류를 저장한다.
- 동적 크기 배열의 베이스 슬롯에는 현재 배열의 길이가 저장되며, 실제 데이터는 인덱스
keccak256(indexOfBaseSlot)로부터 차례로 저장된다.
- 특수한 동적 크기 배열인 bytes와 string 변수는 크기에 따라 다르게 동작한다.
1. 크기가 31바이트 이하일 때, 데이터를 베이스 슬롯의 높은 위치부터 차례로 저장하고 가장 낮은 위치의 바이트에 현재
배열의 길이 * 2를 저장한다.
2. 크기가 32바이트 이상일 때, 베이스 슬롯에는 현재 배열의 길이 * 2 + 1을 저장하고 실제 데이터는 인덱스
keccak256(indexOfBaseSlot)로부터 차례로 저장된다. (저장된 길 이를 제외하고 일반 동적 크기 배열과 동일)
상세설계 내용
가. 시스템 구조
◇ 시스템 구조
- show-state
- solc-js을 통해 획득한 ast를 활용
- Ethereum Mainnet, Local Blockchain에 배포된 스마트 컨트랙트에 대해서 명령 수행
- debug
- truffle-debugger를 활용
- Local Blockchain에 배포된 스마트 컨트랙트에 대해서 명령 수행
- CI/CD
- compile - code coverage - security analysis - deploy과정을 자동화
- code coverage에는 sol-coverage 활용
- security analysis에는 mythrill 활용
- Local Blockchain에 배포된 스마트 컨트랙트에 대해서 명령 수행
◇ 시스템 요구사항
- 컨트랙트 커버리지 테스트를 위한 sol-coverage 패키지 요구
- 컨트랙트 보안 분석을 위한 Mythril 패키지 요구
- 솔리디티 디버깅을 위한 truffle-debugger 패키지 요구
- 추상 구문 트리 생성을 위한 solc-js 패키지 요구
- 스토리지로부터 값을 읽어오기 위한 web3.js 패키지 요구
- 패키지간 의존성 명세의 철저한 감사 요구
나. 모듈별 상세
1. Show-State Module
◇ 배포된 스마트 컨트랙트의 변수들의 인덱스와 값을 찾는 기능의 모듈
◇ 로직
- 솔리디티 컴파일러인 solc를 통해 ast를 획득한다.
- 구조체 정의를 먼저 확인한다.
- 변수 타입을 확인한다.
- 변수 타입에 따라 솔리디티 스토리지 인덱스 배정 규칙에 따라 변수들의 인덱스를 계산한뒤,
Hashtable 형태로 저장한다.
- 저장한 HashTable을 출력한다.
2. Debug Module
◇ 스마트 컨트랙트 Debugging 모듈
◇ 기능 및 구조
- breakpoint, stepin, stepover, watch 등의 기능은 Truffle Debugger를 활용한다.
- 현재 소스코드의 Storage 인덱스 정보를 보여주는 show-state 기능은 Show State Module을 사용한다.
3. CI/CD Module
◇ CI/CD 기능 추가를 통해 개발한 코드의 검증, 빌드, 배포 자동화 기능의 모듈
◇ Build - Security Analysis - Code Coverage의 절차를 파이프라이닝
◇ 로직
- solc를 사용해 compile한다.
- sol coverage를 활용해 code coverage를 수행한다.
- mythrill을 활용해 security analysis를 수행한다.
- 로컬 EVM에 deploy한다.
결과 및 평가
완료 작품의 소개
프로토타입 사진 혹은 작동 장면
◇ vvisp show- state
- show-state 모듈은 앞서 설명한 것과 같이 솔리디티 컴파일러인 solc를 통해 나오는 중간 산출물인 ast를 파싱해 변수들의 이름과 타
입을 획득한 후 변수들의 state를 계산하고 파악한후 사용자에게 보여주는 모듈이다.
◇ vvisp debug
- vvisp debug는 말 그대로 스마트 컨트랙트에 대한 디버그를 실행하는 명령어이며 오픈소스인
truffle debugger를 활용하여 vvisp프로그램 안에서 디버깅을 할 수 있도록 한 모듈이다.
◇ vvisp coverage
- 스마트 컨트랙트에 대한 커버리지를 측정하고자 할 때 사용하는 module
오픈소스인 Istanbul과 이를 이용한 sol-coverage를 활용하여 기능을 구현하였으며
이 역시 명령어를 입력하면 해당 스마트 컨트랙트에 대한 커버리지가 측정된다.
◇ vvisp analyze
- 오픈소스인 mythx를 활용하여 스마트 컨트랙트에 대한 보안감사를 수행할 수 있도록
한 모듈이다. 아래의 결과를 통해 위의 coverage를 한 소스코드와 동일한 소스코드에
대해 취약점이 분석되는 모습을 볼 수 있다.
완료작품의 평가
향후계획
가. 어려웠던 내용들
◇ 솔리디티 컴파일러인 solc를 통해 ast를 획득한 후 분석하는 과정
◇ storage에 있는 동적 변수를 Indexing하는 것
◇ 오픈소스인 Truffle Debugger나 Mythril을 분석하는 과정
◇ 구현한 모듈들을 VVISP에 통합
◇ Debugging에서 Breaking Point를 지정할 수 있는 기능을 넣는 것
나. 차후 구현할 내용
◇ curses를 이용한 인터페이스 개선 및 gui 환경 구축
◇ 버전관리서비스 지원