loopchain SCORE development
주의 : 이슬라이드의내용은통보없이달라질수있으니참고바랍니다.
1. Dapp 이란무엇인가?
1.1 Dapp이란? 1. Dapp이란 무엇인가 Decentralized Application ü Dapp은 Decentralized Application의 약자로 블록체인 기술을 활용한 탈중앙화된 어플리케이션. ü 코드가 탈중앙화된 peer-to-peer network 위에서 작동하고, 데이터 호출 및 등록을 블록체인 데이터베이스로 사용하는 애플리케이션. ü 이더리움 블록체인에 Dapp이 저장되며, EVM이 Dapp을 실행시키고, 처리 결과들을 블록체인에 기록. ü 누구나 실행 가능하며, 셧다운이 없고, 접속제한도 없음.
1. Dapp 이란무엇인가 Web 브라우저 HTML/CSS/Javascript Apache/Nginx Webserver Server Code Java, Python, Ruby DB Cache
1. Dapp 이란무엇인가 Dapp 브라우저 Dapp 브라우저 HTML/CSS/Javascript Web3js Apache/Nginx Webserver HTML/CSS/Javascript Web3js Apache/Nginx Webserver EVM EVM Blockchain (account data, contract code) Blockchain (account data, contract code) Ethereum Dapp Instance 1 Ethereum Dapp Instance 2
1. Dapp 이란무엇인가 프로토콜 (Protocol) 이란? ü ü 블록체인에서프로토콜의의미 ü ü
1. Dapp 이란무엇인가 Technology Blockchain Protocol Ethereum EOS Loopchain Qtum Coin ETH EOS ICON (loopchain based coin) QTM Dapp Cryptokitties Mithril (Plactal) Bluewhale Mediblock
2. 해커톤에서 Dapp 개발노하우
2.1 아이디어빌드하기
2. Dapp 개발노하우 ü ü ü
2. Dapp 개발노하우 ü ü
2. Dapp 개발노하우 ü ü
2. Dapp 개발노하우 확장성은아래요소들을포괄한다 1) 데이터처리속도 ( 프로세싱, processing speed) 2) 데이터검증속도 ( 검증, validation speed) 3) 데이터전파속도 ( 네트워크, network relay speed) 4) 늘어나는데이터크기 ( 저장공간, storage) 5) 합의구조에참여하는노드갯수 ( 검증인수, the number of validators) 6) 활용및응용프로그램의다양성 ( 어플리케이션, scalability on codes and applications) 7) 온체인 / 오프체인거버넌스 (on-chain/off-chain governance)
2. Dapp 개발노하우 ü ü
2..1 Dapp 개발노하우 ü ü
2. Dapp 개발노하우 ü ü ü
2. Dapp 개발노하우 구분 Public Blockchain Private Blockchain 네트워크참여자불특정다수신원이판명된참여자 거래생성및검증불특정다수신원이판명된참여자 프라이버시개방서비스채널암호화 처리속도 7~15 TPS 1,000 TPS 이상 블록확정시간 15 초이상 1 초미만 예시 비트코인, 이더리움등 loopchain, Hyperledger, R3 등
21 3. SCORE 개발
22 SCORE 란?
Smart Contract On Reliable Environment üloopchain 안에서 Python 을이용한 Smart contract üethereum 과달리 VM 위가아닌실제장비위에서돌아가는 Smart contract ü 각 Peer 에서독립적으로실행되며 Block 이확정되는시점에서실행 üblock 별로실행하며, 블록체인으로구성하는 Business logic 을구현한다. 23
SCORE container RESTful/JSON RPC 2.0 package.json SCORE code (*.py) Client Peer 하나의별도로분리된 Git project 입니다.
1. 블록체인에거래생성 7. 거래결과에대한조회요청 2. 블록생성및동기화 loopchain peer 4. 신규블록에포함된거래처리를위한 SCORE 호출 5. 로컬저장소에저장된 SCORE 코드호출 SCORE Container SCORE Block Storage 3. 블록저장소에블록저장 8. SCORE 의 query 함수를호출하여스토리지에저장된결과를반환 SCORE local repository SCORE Storage 6. SCORE의 invoke 함수호출하여거래실행하고결과를스토리지에저장 0. 거래에대한 SCORE 등록 ( 버전별 ) SCORE Store 5-1. 로컬저장소에저장된 SCORE 가없거나신규버전이면 SCORE Store 에서업데이트
ü 랜덤값에의존하는비지니스모델 :SCORE 안에서랜덤값을생성하거나, 실행하는모델은불가하나, 블록의해쉬혹은트랜잭션을이용한랜덤값이용은가능합니다. ü 외부의데이터에의존성이있는비즈니스모델 :SCORE 안에서다른사이트를호출하거나, 외부의데이터를요구하는모델은아직불가능하나향후고려되고있습니다. ü 시간에따라행동하는혹은실행시각에따라내용이바뀌는모델 : 현재시각 ( 실행시각 ) 은사용불가능하며, 블록의시각혹은트랜잭션시각으로대체는가능합니다. ü 부동소수점처리불가 : CPU 에따라부동소수점표현방식이달라질수있으므로모든연산은정수단위에서처리해야합니다. ü 내부변수재사용금지 : 특정한변수를 Cache 해놨다가사용하는일은없어야합니다. 26
27
übears : SCORE development utility for loopchain enterprise üscore 코드의틀을작성 üscore code 올려보기 ü 실제 SCORE 에 Request 던지기 üpostman 같은 HTTP clien 로해보기 ü 작업환경 ümacos ülinux ( Ubuntu, CentOS) üwindows 에서는동작시문제가생길수있습니다. ücygwin 위에서돌리면문제해결가능
ü 미리설치하기 üpython 3.6 이상 üvirtualenv 16.0 이상 üpip 10.1 이상 üdocker V18.03 이상 üdocker image ü 이번해커톤을위해특별히 docker image 를공개드립니다. ü 외부에유출하시면안됩니다. üpackage ü 별도의 wheel package 를 naver cafe 를통해제공할예정입니다. ü 외부에유출하시면안됩니다.
üwheel package: http://bit.ly/loopbears ü설치하기 $ pip install bears-0.0.1-py2.py3-none-any.whl
üwheel package: http://bit.ly/loopbears ü설치하기 $ pip install bears-0.0.1-py2.py3-none-any.whl
üdocker images: http://bit.ly/loopchaindockerimage ü 설치하기 $ docker load < loopchain_fluentd_rc1.19.2.tar.gz $ docker load < loopchain_peer_rc1.19.2.tar.gz $ docker load < loopchain_rs_rc1.19.2.tar.gz $ docker images
$ bears help $ bears usage: bears [-h] [--version] [command [command...]] ========================================================== bears: SCORE development tool for loopchain enterprise ( v.0.0.1 ) ========================================================= positional arguments: command init <project> run <project> stop optional arguments: -h, --help show this help message and exit --version show program's version number and exit
$ bears init <project> ü<project> folder 가만들어진다. ü 관련된 Source code 들이만들어진다. $ bears init hello hello is created!! $ cd hello $ ls hello.py package.json scorecode.py scoretool.py
$ bears run <project> ü<project> 를포함해서 docker container 들을이용해서 loopchain 을올립니다. $ bears run hello 6923e371f23ae3dc5458cc42e818c37510f9f0235fd3eb7de94021fca630cae6 b8b74b753269788a2d572a4b3ea0da36c531109f28a2b4788266098bacaff596 '2018-05-24 05:23:50,763 1 140285103589184 [PEER_ID] DEBUG Popen(['git', 'version'], cwd=/, universal_newlines=false, shell=none)' '2018-05-24 05:23:50,769 1 140285103589184 [PEER_ID] DEBUG Popen(['git', 'version'], cwd=/, universal_newlines=false, shell=none)' ===================================================================== ===================================================================== ===================================================================== WARNING!!! This file will be removed later. When you launch peer, you should launch peer in the following format:./loopchain.py peer [-d] [-p PORT] [-o CONFIGURE_FILE_PATH] ===================================================================== ===================================================================== ===================================================================== try load configure from json file (/conf/peer_conf.json) '2018-05-24 05:23:51,300 1 140285103589184 [PEER_ID] DEBUG It's working on docker. Trying to find private IP if it is in EC2...
üinvoke ü Block 인증이마쳐지고저장될때불리는요청 üquery ü SCORE 의결과를조회하는요청
Invoke 검증되고합의된 Trasaction 을가지고실제계약업무를실행하는작업 내부에여러실제작업들에대한함수들이있고이것을 JSON-RPC 방식으로호출한다. Python 으로작성되어서거의대부분의일들을할수있다. 작업된결과는 SCORE DB 에저장한다. NoSQL 방식으로 Key-Value 로저장. Query SCORE DB 에저장된결과를읽어오는작업 내부에여러실제작업들에대한함수들이있고이것을 JSON-RPC 방식으로호출한다. Python 으로작성되어서거의대부분의일들을할수있다.
1. 블록체인에거래생성 7. 거래결과에대한조회요청 2. 블록생성및동기화 loopchain peer 4. 신규블록에포함된거래처리를위한 SCORE 호출 5. 로컬저장소에저장된 SCORE 코드호출 SCORE Container SCORE Block Storage 3. 블록저장소에블록저장 8. SCORE 의 query 함수를호출하여스토리지에저장된결과를반환 SCORE local repository SCORE Storage 6. SCORE의 invoke 함수호출하여거래실행하고결과를스토리지에저장 0. 거래에대한 SCORE 등록 ( 버전별 ) SCORE Store 5-1. 로컬저장소에저장된 SCORE 가없거나신규버전이면 SCORE Store 에서업데이트
ü<project>.py ü SCORE code: 주요 interface üpackage.json ü SCORE package 의 meta 정보를관리 üscorecode.py ü 실제우리가작성할 Business logic 들이있는 code üscoretool.py ü 각종 SCORE 개발에필요한 utility 들
üuri : :9000/api/v1/transactions üheader : application/json ürequest 형식 { "jsonrpc":"2.0", "id": ~~, <== must be number "method":..", "params": { } } üresponse 형식 { "response_code": "0 <== 'Success' is 0. 'Exception' is 9000. "tx_hash": "~~~", "more_info": "" }
üuri : :9000 /api/v1/transactions/result?{tx_hash} üheader : application/json üresponse 형식 { "response_code": "0", <== 'Success' is 0. 'Exception' is 9000. "response": { "code": 0, "jsonrpc": "2.0" } }
üuri : 9000:/api/v1/query üheader : application/json ürequest 형식 { "jsonrpc":"2.0", "id": ~~, <== Must be string in Query. "method":..", "params": { } } üresponse 형식 { 'code' : integer value. <== 'Success' is 0. 'Exception' is 9000. 'result : }
{ "id":"theloop-scoreexam", "version":"0.1.0", "auth":{ "name":"theloop Dev Team", "email":"dev@theloop.co.kr", "org":"theloop inc" }, "dependencies":{}, "description":"score example", "repository":{}, "homepage":"http://www.theloop.co.kr", "function":{ "invoke":[ { "method":"foo1", "params": { "param1":"string", "param2":"string", "param3":"string" }, "description":"" }... ], "query":[ { "method":"foo2", "params": ["param"], "description":"" } ] }, "main": "score_code" } PackageID: [Company name]-[package] 를추천 invoke: Tx 를만들때, invoke() 시실행하게될함수들에대해정의하는부분 query: Tx 에 query() 시쓸함수들에대해정의하는부분 읽어들일 Python code 이름
{ "id":"theloop-scoreexam", "version":"0.1.0", "auth":{ "name":"theloop Dev Team", "email":"dev@theloop.co.kr", "org":"theloop inc" }, "dependencies":{}, "description":"score example", "repository":{}, "homepage":"http://www.theloop.co.kr", "function":{ "invoke":[ { "method":"foo1", "params": { "param1":"string", "param2":"string", "param3":"string" }, "description":"" }... scorecode.py 안의 SCOREBusiness class 의 member 함수이름 ], "query":[ { "method":"foo2", "params": ["param"], "description":"" } ] }, "main": "score_code" }
üscorebusinesslogic : 실제 Business logic 을구현해넣는 class ü 여러개의 SCORE DB (No SQL) 을설정할수있다. üscorehelperdatabase 를이용. ümember 함수에넣고 package.json 에함수의형태를기록하면사용가능
üscore 내부에서이용하는 DB ü NoSQL ü Key, Value 모두 byte array 로저장해야된다. ü 처음시작할때, 고유한 DB 이름을이용해야한다. ü 기능 ü put(key, value) : 쓰기 ü get_in_invoke(key): Invoke 할때, 읽어오기 ü get_in_query(key): Query 할때, 읽어오기 ü delete(key): 데이타삭제하기 ü 주의 ü get_in_invoke(key) 를 Query 할때쓰거나 get_in_query(key) 를 Invoke 할때쓰면오류가생길수있다. Ex) Byte array: 바로디스크에쓸수있는형식 >>> b'\xcf\x84o\xcf\x81\xce\xbdo\xcf\x8 2'.decode('utf-16') ' 콯캁 ' >>> b'\xcf\x84o\xcf\x81\xce\xbdo\xcf\x8 2'.decode('utf-8') 'τoρνoς'