Luniverse 사용법 교육자료 2019.03 presented by Lambda256
INDEX Luniverse Overview (Key Terms) How to Use Luniverse 2
INDEX Luniverse Overview (Key Terms) How to Use Luniverse 3
Luniverse Overview(Key Terms) Luniverse Blockchain Cloud Service Luniverse Network(=Luniverse Main Chain) Side Chain / Side Bridge Main Token(MT) / Side Token(ST) Main Admin(MA) / Side Admin(SA) Validator PKMS ( Private Key Management System ) EOA (External Owned Account) : REOA(Remote EOA), LEOA(Local EOA) 4
Luniverse Overview(주요 기능) 기본 기능 루니버스 사이드체인 루니버스 토큰 서비스 핵심 서비스 루니버스 솔리디티 IDE 루니버스 보안 루니버스 운영 및 모니터링 툴 사용자 관리 서비스 월렛 브리지 어카운트 브리지 PKMS 5
INDEX Luniverse Overview (Key Terms) How to Use Luniverse 6
목표 : Luniverse DApp 만들기 7
유기견보호소 동작구조 서울시(MA) Side Token Transfer (Adopt Token ) MT : SPT (ST) = 1 : 1 MT : ADT (ST) = 1 : 10 Side Token Transfer (Support Token) Support(SPT) Reward(ADT) 마포구 보호소 (MapoGuAccount) Adopt(ADT) setowner Copyright 2018. Lambda256. All rights reserved End User (UserA) 8
유기견보호소 아키텍쳐 Local EOA Sign Support Reward Support Token Adopt Token Luniverse DApp Config Luniverse Transaction API Adopt Transaction Server Homeles sdogs Contract PKMS (REOA Sign) getowner setowner 9
Lab 0. 사전 준비 10
사전 환경 준비 실습을 원활히 진행하기 위해서 다음 환경을 준비해야 합니다. 1. 루니버스 CBT 교육용 파일 받기 2. Node.js 설치 3. curl ( 혹은 Postman / SoapUI ) 설치 4. Metamask 설치 5. Atom 설치 11
Luniverse Demo DApp 압축 풀기 1. 2. 소스 파일을 로컬로 다운로드합니다. ( https://s3.ap-northeast-2.amazonaws.com/luniverse/cbt-demo/luniverse-cbt.zip ) 윈도우즈 사용자 : %USERPROFILE%\temp Mac 사용자 : ~/temp 소스 파일의 압축을 풉니다. Mac 사용자 $ mkdir ~/temp $ cd ~/temp $ tar zxvf ~/Downloads/luniverse-cbt.tar.gz $ ls luniverse-cbt contracts demo-homeless-dogs luniverse-atom-plugin Windows 사용자 1. 2. 다운로드 받은 파일의 압축을 풉니다. luniverse-cbt 를 %USERPROFILE%\temp 아래로 복사합니다. 12
Node 설치하기 1. node 명령어를 실행해서 node.js 가 설치되어 있는지 확인합니다. node 가 설치되지 않은 경우 Command not found 같은 오류가 발생합니다. $ node -v node: command not found 2. Node 가 설치되지 않은 경우 https://nodejs.org/en/ 에서 10.15.2 LTS 버전을 다운받아 설치합니다. 3. Node 설치가 완료되면 node.js 가 정상 설치되었는지 확인합니다. $ node -v v10.15.2 13
static-server 모듈 설치하기 1. Demo App 을 설치한 디렉토리로 이동합니다. Mac 사용자 $ cd ~/temp/luniverse-cbt/demo-homeless-dogs $ pwd Windows 사용자 cmd> cd %USERPROFILE%\temp\luniverse-cbt\demo-homeless-dogs cmd> pwd 2. npm 으로 static-server 모듈을 설치합니다. ( 윈도우즈 / Mac 공통 ) $ npm install -g static-server 3. static-server 설치 확인하기 $ static-server 14
Luniverse Demo App 실행하기 1. demo-homeless-dogs 의 src 디렉토리로 이동합니다. Mac 사용자 $ cd ~/temp/luniverse-cbt/demo-homeless-dogs/src Windows 사용자 cmd> cd %USERPROFILE%\temp\luniverse-cbt\demo-homeless-dogs\src 2. static-server 를 실행합니다. $ static-server * Static server successfully started. * Serving files at: http://localhost:9080 * Press Ctrl+C to shutdown. 3. 브라우저에서 http://localhost:9080 에 접속해서 Luniverse Demo App 이 브라우저에 나타나는지 확인합니다. 15
루니버스 DApp 설정 파일 var Config = { 파일 위치: luniverse-cbt/demo-homeless-dogs/src/js/config.js chainid: '1550810241284903144', // 1. Chain Id mt: { symbol: 'F862', }, // 2. Main Token st: { support: { symbol: 'SPT2', }, // 3. Support Side Token adopt: { symbol: 'ADT',}, // 4. Adopt Side Token }, walletaddress: { pd: '', // 5. Remote EOA for PD user: '', // 6. Remote EOA for User }, dapp: { // 7. API Key apikey: 'JCJCAZT6Jwg1uptbaFkyKFvJYc855WnMs6S9dVbDFd29KsgnfmFrva4kEowuse5R' }, txactionname: { // 8. Transactions for DApp setowner: 'setowner', // 9. Transaction for Custom Smart Contract getowner: 'getowner', // 10. Transaction for Custom Smart Contract support: 'Support', // 10. Support Transaction for Support Token adopt: 'Adopt', // 11. Adopt Transaction for Adopt Token reward: 'Reward', // 12. Reward Transaction for Adopt Token }, username: 'dino', }; 16
Metamask 설치하기 1. 2. 3. 4. https://metamask.io/ 에 접속한다. GET CHROME EXTENSION 을 클릭하여 Chrome Extension 설치 화면으로 이동한다. Chrome 에 설치를 클릭하여 Metamask Chrome Extension 을 설치한다. Chrome 브라우저 우측 상단에 메타마스크 아이콘( )이 표시되는지 확인한다. 17
Atom 설치하기 1. https://atom.io/ 에 접속해서 Atom 을 다운받는다. 2. Atom 을 설치한다. 3. Atom 을 실행한다. 18
How to Use Luniverse Lab01. 루니버스 회원 가입하기 Lab02. 루니버스 DApp 만들기 Lab03. SPT 사이드 토큰 발행하기 Lab04. Support 트랜잭션 만들기 Lab05. ADT 사이드 토큰 발행하기 Lab06. Reward 트랜잭션 만들기 Lab07. Adopt 트랜잭션 만들기 Lab08. DApp 사용하기 - 후원하기 Lab09. 루니버스 Atom 플러그인 설치하기 Lab10. 루니버스 Atom 플러그인 사용 Lab11. 메타마스크 연동하기 19
Lab 01. 루니버스 회원 가입하기 20
1) 회원가입 1) https://beta.luniverse.io 로 접속한다. 2) 로그인 화면에서 Create Account 클릭한다. 21
1) 회원가입 루니버스에 회원가입 한다. - 이메일 : 이메일로 인증 코드가 발급되기 때문에 자신이 소유한 이메일을 입력한다. - 사용자 계정 : 사용할 사용자 계정을 입력한다. - 암호 : 암호는 8자 이상이어야 하며, 영문, 숫자, 특수문자를 하나 이상 포함해야 합니다. - 정보를 모두 입력한 후에 Next 버튼을 클릭합니다. 22
회원가입 입력한 이메일 주소로 전송된 인증번호를 입력한다. 23
로그인 1) 회원가입시 사용한 이메일과 비밀번호를 이용해 로그인한다. 24
로그인 - Wallet 발급 루니버스에서 사용할 Wallet Address 를 발급받아야 한다. 아래와 같은 상황에서 발급된 Wallet Address 의 Private Key로 트랜잭션에 서명을 해야 한다. 메인 토큰 발행 / 메인토큰 전송 사이드 토큰 발행 / 사이드 토큰 전송 사용자 정의 컨트랙트 배포 주의) 입력한 Passphrase 를 분실하면 Keystore 파일을 이용할 수 없다. 따라서, Keystore 파일을 이용해서 트랜잭션에 서명하려면 Passphrase 를 분실하지 말아야 한다. 25
로그인 - Wallet 발급 발급받은 Wallet Address 의 Private Key 를 암호화하여 Keystore 파일로 다운받을 수 있다. 트랜잭션에 사인할 때는 발급받은 Wallet Address 의 Private Key 를 직접 이용하거나, Keystore 파일을 이용할 수 있다. Keystore 파일을 분실하거나 Passphrase 를 분실한 경우 Keystore 파일을 이용해서 트랜잭션에 서명할 수 없으므로, Keystore 파일과 Passphrase 를 안전하게 보관해야 한다. 26
로그인 - Wallet 발급 발급받은 Wallet Address 의 Private Key 로 트랜잭션에 직접 서명할 수 있다. Private Key 를 분실한 경우 Private Key 로 트랜잭션에 서명할 수 없기 때문에 Private Key 를 안전한 곳에 보관해야 한다. 27
로그인 - Wallet 발급 Print Wallet 을 클릭하면 Wallet Address 와 Private Key 를 QR코드로 인쇄할 수 있다. 인쇄된 QR 코드가 유출되면 Wallet Address 가 소유한 자산을 분실할 수 있기 때문에 반드시 안전한 곳에 보관해야 한다. 28
Home 화면 Home 화면은 Chain Tab 과 Chain Dashboard 로 구성됩니다. Chain Tab - Chain Tab 에는 사용자가 사용할 수 있는 Chain 의 이름이 탭으로 표시됩니다. Chain Dashboard - Chain Dashboard 에는 Chain Tab 에서 선택된 Chain 에 대한 정보가 표시됩니다. 29
Home 화면 Chain Dashboard 는 Chain Card, Main Token Card, DApp Card 목록, Side Token Card 목록으로 구성됩니다. Chain Dashboard Chain Card MainToken Card DApp Card 목록 Side Token Card 목록 30
Notification Message 확인하기 사용자에게 Notification 이 필요한 경우, 루니버스는 콘솔화면 오른쪽 하단에 Notification Message 창을 표시합니다. - Notification Message 에 있는 "Maintoken 수신 확인하기" 링크를 클릭해서 Main Token Request 화면으로 이동합니다. Notification Message 31
Main Token Request Main Token Request 화면으로 이동하면 Free Trial Chain 의 메인 토큰이 1000개 지급되었다는 것을 확인할 수 있습니다. Request Main Token 버튼을 클릭하여 1000 토큰을 추가로 요청한다. 32
My Wallet My Wallet 화면에서 Main Token 보유 수량을 확인할 수 있습니다. 1. 오른쪽 상단 사용자 이름을 클릭한다. 2. My Wallet 을 클릭하여 My Wallet 화면으로 이동한다. 33
Main Token Request Main Token 이 필요한 경우 Request Main Token 버튼을 클릭해서 Main Token 을 추가적으로 요청할 수 있습니다. 34
Lab 02. Luniverse DApp 만들기 35
Luniverse DApp REST API web3.js REST API Luniverse REST API Luniverse REST Server REST Server SmartContract REST Server web3.js SmartContract Database Database 36
Luniverse DApp 기존 Application(Mobile, Web, Desktop)에 블록체인에 데이터를 기록하고, 블록체인에 기록된 데이터를 조회하는 기능을 추가한 Application 을 DApp(Decentralized App)이라고 합니다. 이더리움의 경우 web3.js 를 이용해야 DApp 을 개발할 수 있습니다. Luniverse 가 제공하는 Transaction API 서비스만을 이용하면 기존 Application 을 손쉽게 DApp 으로 전환할 수 있습니다. 각 블록체인에서 제공하는 전용 API 를 이용해야 하지만, Luniverse Transaction API 를 이용하면 블록체인별로 API 를 따로 학습하지 않아도 됩니다. 37
Step1. Luniverse DApp 만들기 Home 화면으로 이동하여 Create DApp 을 클릭한다. 38
Step 1. Luniverse DApp 만들기 HomelessDogs DApp 을 생성한다. - DApp Name : HomelessDogs 앞에 회사이름을 붙인다. DApp Name 은 같은 체인에서는 중복될 수 없다. - ex) LuniverseHomelessDogs Create 버튼을 클릭하여 DApp 을 생성한다. 39
Step 2. DApp API Key 생성하기 DApp 에서 사이드체인에 트랜잭션을 요청하려면 API Key 를 생성해야 한다. API Key 를 생성하는 과정은 다음과 같다. 1. Home 화면에서 정의한 DApp 을 클릭한다. 2. 화면 왼쪽에서 API Key 메뉴를 클릭한다. 3. Generate 를 클릭해서 API Key 를 생성한다. 40
Step 3. DApp 설정 파일 변경하기 var Config = { 파일 위치: luniverse-cbt/demo-homeless-dogs/src/js/config.js chainid: '1550810241284903144', // 1. Chain Id mt: { symbol: 'F862', }, // 2. Main Token st: { support: { symbol: 'SPT2', }, // 3. Support Side Token adopt: { symbol: 'ADT',}, // 4. Adopt Side Token }, walletaddress: { 생성된 API Key 를 복사해서 apikey 로 설정한다. pd: '', // 5. Remote EOA for PD user: '', // 6. Remote EOA for User }, dapp: { // 7. API Key apikey: 'JCJCAZT6Jwg1uptbaFkyKFvJYc855WnMs6S9dVbDFd29KsgnfmFrva4kEowuse5R' }, txactionname: { // 8. Transaxctions for DApp setowner: 'setowner', // 9. Transaction for Custom Smart Contract getowner: 'getowner', // 10. Transaction for Custom Smart Contract support: 'Support', // 10. Support Transaction for Support Token adopt: 'Adopt', // 11. Adopt Transaction for Adopt Token reward: 'Reward', // 12. Reward Transaction for Adopt Token }, username: 'dino', }; 41
Lab 03. SPT 사이드 토큰 발행하기 42
Create Side Chain Node 2 Node 1 Node 3 Side Chain Node 6 Node 4 Node 5 43
Create Side Token 44
Step 1. Side Token 발행화면 이동 루니버스 콘솔의 홈 화면에서 아래쪽으로 스크롤한다. Side Token 옆에 + 아이콘을 클릭하면, Create ERC20 Side Token 버튼이 표시된다. Create ERC20 Side Token 토큰을 클릭해서 Side Token 발행 화면으로 이동한다. 45
Step 2. Side Token 발행하기 Side Token 정보를 입력합니다. - Token Name : Support Token XX - Token Symbol : SPTXX - Token Symbol Image : 색 선택 - Conversion Rate : 1MT:10 ST - Initial Supply : 10000 - Decimals : 18 입력이 완료되면 Create 버튼을 클릭해서 사이드 토큰을 만듭니다. 46
Step 3. 트랜잭션 서명 Side Token 을 발행하려면 트랜잭션에 서명이 필요합니다. - 회원가입시에 발급한 Private Key 나 Keystore 파일을 이용해서 트랜잭션에 서명할 수 있습니다. 트랜잭션에 서명한 후 Confirm 을 클릭하면 사이드 토큰 발행이 시작됩니다. 47
Step 4. Side Token 발행 과정 확인 48
Step 5. Side Token 발행 정보 확인 발행이 완료된 Side Token 카드를 클릭해서 Side Token 이 정상적으로 발행되었는지 확인합니다. 49
Main Token Side Token 50
Step 6. DApp 설정 파일 변경하기 var Config = { 파일 위치: luniverse-cbt/demo-homeless-dogs/src/js/config.js chainid: '1550810241284903144', // 1. Chain Id mt: { symbol: 'F862', }, // 2. Main Token st: { support: { symbol: 'SPTXX', }, // 3. Support Side Token Sidechain 의 Maintoken 심벌을 설정한다. adopt: { symbol: 'ADT',}, // 4. Adopt Side Token }, walletaddress: { 자신이 생성한 SPTXX 토큰 심벌을 설정한다. pd: '', // 5. Remote EOA for PD user: '', // 6. Remote EOA for User }, dapp: { // 7. API Key apikey: 'JCJCAZT6Jwg1uptbaFkyKFvJYc855WnMs6S9dVbDFd29KsgnfmFrva4kEowuse5R' }, txactionname: { // 8. Transaxctions for DApp setowner: 'setowner', // 9. Transaction for Custom Smart Contract getowner: 'getowner', // 10. Transaction for Custom Smart Contract support: 'Support', // 10. Support Transaction for Support Token adopt: 'Adopt', // 11. Adopt Transaction for Adopt Token reward: 'Reward', // 12. Reward Transaction for Adopt Token }, username: 'dino', }; 51
Lab 04. Support 트랜잭션 만들기 52
유기견보호소 동작구조 서울시(MA) Side Token Transfer (Adopt Token ) MT : SPT (ST) = 1 : 1 MT : ADT (ST) = 1 : 10 Side Token Transfer (Support Token) Support(SPT) Reward(ADT) 마포구 보호소 (MapoGuAccount) Adopt(ADT) setowner Copyright 2018. Lambda256. All rights reserved End User (UserA) 53
Step 1. MapoGu Account 생성 MapoGu 보호소용 Remote EOA 를 생성한다. 1. DApp 을 클릭해서 DApp 설정 화면으로 이동한다. 2. EOA List 를 클릭한다. 3. New EOA 를 클릭한다. 4. MapoGuAccount 용 Account 를 생성한다. 54
Step 2. User Account 생성 위와 동일한 과정으로 User A Account 를 생성한다. UserA 55
Step 3. Support 트랜잭션 정의 사용자가 MapoGuAccount 계정으로 토큰을 송금하는 트랜잭션을 정의합니다. - 수신 계정은 항상 MapoGuAccount 입니다. HomelessDog DApp 으로 이동해서 Side Token 을 이용하는 트랜잭션을 정의한다. 1. Token/Contract : 위에서 정의한 Side Token 을 선택한다. 2. Function : Free Simple Transfer 3. Action Name : Support 4. Sender : 지정하지 않는다. 5. Receiver : 방금 생성한 MapoGuAccount 를 선택한다. Create 버튼을 입력하여 트랜잭션을 정의한다. 56
Step 4. 트랜잭션 실행하기 DApp 의 Transaction List 에서 Support 트랜잭션의 API 를 확인하고, curl 명령어를 복사해서 실행한다. ( curl 명령어가 없는 경우, PostMan 이나 SoapUI 와 같은 HTTP Request 를 사용할 수 있는 도구를 사용해도 된다. ) 1. DApp 에서 Transaction List 를 클릭한다. 2. Support Transaction 의 API 부분을 클릭한다. 3. curl 요청을 텍스트 편집기로 복사한다. 57
Step 5. 트랜잭션 실행하기 아래와 같이 텍스트 편집기에서 curl 요청을 변경하고, 터미널에서 curl 명령어를 실행한다. 1. 2. 3. 4. transaction name : Support apikey : yensnemvrubmvclv6hstz3d96n1y71ru6hstxftwbz7zti421gtgu3kgjrcw5t5d from : REOA List 에서 발급한 UserA 의 REOA valueamount : 1000000000000000000 를 입력한다. ( 0이 18개임 ) $ curl -X POST 'https://cbt-api.luniverse.io/tx/v1.0/transactions/support' \ > --header 'Authorization: Bearer yensnemvrubmvclv6hstz3d96n1y71ru6hstxftwbz7zti421gtgu3kgjrcw5t5d' \ > --header 'Content-Type: application/json' \ > --data '{ > "from": "0xa99fbcf012a5af442da0be3ab81b1bbace0f960d ", > "inputs": { > "valueamount": "1000000000000000000" > } > }' {"result":false,"code":"permission_denied","message":"access denied, make sure remote ip (123.123.123.123) is registered on ip whitelist."} 58
Step 6. IP Whitelist 설정하기 트랜잭션을 실행했을 때, Access Denied 가 발생하는 이유는 트랜잭션을 요청한 서버의 IP 가 DApp 의 IP Whitelist 에 등록되지 않았기 때문이다. 루니버스는 등록된 서버에서만 해당 DApp 의 트랜잭션을 요청할 수 있습니다. DApp 에 등록되지 않은 IP 에서 요청한 트랜잭션은 처리하지 않는다. 트랜잭션 실행시 오류 메시지로 출력된 IP 를 IP Whitelist 에 등록한다. 59
Step 7. 트랜잭션 재실행 Step5 에서 오류가 발생했던 트랜잭션을 재실행한다. 이번에는 트랜잭션 요청 결과값으로 txhash 값이 전달됩니다. txhash 값이 전달되었다는 것은 블록체인에 트랜잭션이 요청되었다는 것을 뜻한다. $ curl -X POST 'https://cbt-api.luniverse.io/tx/v1.0/transactions/support' \ > --header 'Authorization: Bearer yensnemvrubmvclv6hstz3d96n1y71ru6hstxftwbz7zti421gtgu3kgjrcw5t5d' \ > --header 'Content-Type: application/json' \ > --data '{ > "from": "0xa99fbcf012a5af442da0be3ab81b1bbace0f960d ", > "inputs": { > "valueamount": "1000000000000000000" > } > }' {"result":true,"data":{"txid":"1551658962992906321","txhash":"0xa9b7f0da9bab50492d5f57958a43c76cd946daa9cb78fa02bd04190a7548d41 a","reqts":1551658962917}} 60
Step 8. 트랜잭션 확인 DApp 의 Transaction History 로 이동해서 해당 Transaction 의 상태를 확인한다. - Transaction History 를 확인하면 토큰 전송 트랜잭션이 실패했다는 것을 알 수 있다. - Transaction 이 실패한 이유는 토큰을 전송하는 UserA 가 SPT 토큰을 가지고 있지 않기 때문이다. 61
Step 9. 잔고 확인하기 방금 발행한 REOA 들의 토큰 잔고를 확인해 보자. 잔고를 확인하려면 아래와 같이 요청한다. - REOA 주소 : UserA 의 REOA ( 0xa99fbcf012a5af442da0be3ab81b1bbace0f960d ) - Main Token Symbol 이름 : F053 - Side Token Symbol 이름 : SPT - API Key : yensnemvrubmvclv6hstz3d96n1y71ru6hstxftwbz7zti421gtgu3kgjrcw5t5d curl --GET 'https://cbt-api.luniverse.io/tx/v1.0/wallets/0xa99fbcf012a5af442da0be3ab81b1bbace0f960d/f053/sptxx/balance' \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer yensnemvrubmvclv6hstz3d96n1y71ru6hstxftwbz7zti421gtgu3kgjrcw5t5d' {"result":true,"data":{"balance":"0"}} 62
Step 10. User REOA 설정 var Config = { 파일 위치: luniverse-cbt/demo-homeless-dogs/src/js/config.js chainid: '1550810241284903144', // 1. Chain Id mt: { symbol: 'F862', }, // 2. Main Token st: { support: { symbol: 'SPT2', }, // 3. Support Side Token adopt: { symbol: 'ADT',}, // 4. Adopt Side Token }, walletaddress: { UserA 의 REOA 설정 pd: '', // 5. Remote EOA for PD user: '0xa99fbcf012a5af442da0be3ab81b1bbace0f960d', // 6. Remote EOA for User }, dapp: { // 7. API Key apikey: 'JCJCAZT6Jwg1uptbaFkyKFvJYc855WnMs6S9dVbDFd29KsgnfmFrva4kEowuse5R' }, txactionname: { // 8. Transaxctions for DApp setowner: 'setowner', // 9. Transaction for Custom Smart Contract getowner: 'getowner', // 10. Transaction for Custom Smart Contract support: 'Support', // 10. Support Transaction for Support Token adopt: 'Adopt', // 11. Adopt Transaction for Adopt Token reward: 'Reward', // 12. Reward Transaction for Adopt Token }, username: 'dino', }; 63
Step 11. DApp 에서 잔고확인하기 서울유기견보호소 Demo App 에서 My Page 를 버튼을 클릭하여 사용자가 보유한 SPT, ADT 잔액을 확인한다. - 현재는 토큰 보유량이 모두 0이기 때문에 0으로 표시된다. 64
Step 12. Side Token 전송 후 잔액확인 1. UserA 의 REOA 를 복사한다. 2. 발급한 Side Token 으로 이동한다. 3. Side Token Transfer 메뉴를 클릭한다. 4. Side Token Transfer 버튼을 클릭한다. 5. UserA 의 REAO 로 1000 토큰을 전송한다. 6. 토큰 전송 상태가 Transferred 가 될 때까지 기다린다. 7. 유기견 보호소에서 My Page 를 리로드해서 SPT 잔고가 1000인지 확인한다. ( Mac 사용자 : Command + R, 윈도우즈 사용자: Ctrl + R ) 65
Lab 05. ADT 사이드 토큰 발행하기 66
ADT Side Token 발행 Adopt 용 사이토큰을 발행한다. ADT 사이드 토큰 발행 과정은 SPT 사이드 토큰 발행 과정과 동일하다. - Token Name : AdoptTokenXX - Token Symbol: ADTXX - Conversion Rate: 1MT : 10ST - Initial Supply: 10000 - Decimals : 18 67
Step 1. Side Token 발행화면 이동 루니버스 콘솔의 홈 화면에서 아래쪽으로 스크롤한다. Side Token 옆에 + 아이콘을 클릭하면, Create ERC20 Side Token 버튼이 표시된다. Create ERC20 Side Token 토큰을 클릭해서 Side Token 발행 화면으로 이동한다. 68
Step 2. Side Token 발행하기 Side Token 정보를 입력합니다. - Token Name : AdoptTokenXX - Token Symbol: ADTXX - Conversion Rate: 1MT : 10ST - Initial Supply: 10000 - Decimals : 18 입력이 완료되면 Create 버튼을 클릭해서 사이드 토큰을 만듭니다. 69
Step 3. 트랜잭션 서명 Side Token 을 발행하려면 트랜잭션에 서명이 필요합니다. - 회원가입시에 발급한 Private Key 나 Keystore 파일을 이용해서 트랜잭션에 서명할 수 있습니다. 트랜잭션에 서명한 후 Confirm 을 클릭하면 사이드 토큰 발행이 시작됩니다. 70
Step 4. DApp 설정 파일 변경하기 var Config = { 파일 위치: luniverse-cbt/demo-homeless-dogs/src/js/config.js chainid: '1550810241284903144', // 1. Chain Id mt: { symbol: 'F862', }, // 2. Main Token st: { support: { symbol: 'SPT2', }, // 3. Support Side Token 생성한 ADT 토큰 심벌을 설정한다. adopt: { symbol: 'ADT',}, // 4. Adopt Side Token }, walletaddress: { pd: '', // 5. Remote EOA for PD user: '', // 6. Remote EOA for User }, dapp: { // 7. API Key apikey: 'JCJCAZT6Jwg1uptbaFkyKFvJYc855WnMs6S9dVbDFd29KsgnfmFrva4kEowuse5R' }, txactionname: { // 8. Transaxctions for DApp setowner: 'setowner', // 9. Transaction for Custom Smart Contract getowner: 'getowner', // 10. Transaction for Custom Smart Contract support: 'Support', // 10. Support Transaction for Support Token adopt: 'Adopt', // 11. Adopt Transaction for Adopt Token reward: 'Reward', // 12. Reward Transaction for Adopt Token }, username: 'dino', }; 71
Lab 06. Reward 트랜잭션 만들기 72
유기견보호소 동작구조 서울시(MA) Side Token Transfer (Adopt Token ) MT : SPT (ST) = 1 : 1 MT : ADT (ST) = 1 : 10 Side Token Transfer (Support Token) Support(SPT) Reward(ADT) 마포구 보호소 (MapoGuAccount) Adopt(ADT) setowner Copyright 2018. Lambda256. All rights reserved End User (UserAccount) 73
Step 1. Reward 트랜잭션 정의 MapoGuAccount 계정이 사용자 계정으로 토큰을 송금하는 트랜잭션을 정의합니다. - 송신자 계정은 항상 MapoGuAccount 입니다. HomelessDog DApp 으로 이동해서 Side Token 을 이용하는 트랜잭션을 정의한다. 1. Token/Contract : ADT 사이드토큰을 선택한다. 2. Function : Free Simple Transfer 3. Action Name : Reward 4. Sender : MapoGuAccount 5. Receiver : 지정하지 않는다. Create 버튼을 입력하여 트랜잭션을 정의한다. 74
Step 2. 트랜잭션 실행하기 DApp 의 Transaction List 에서 Reward 트랜잭션의 API 를 확인하고, curl 명령어를 복사해서 실행한다. ( curl 명령어가 없는 경우, PostMan 이나 SoapUI 와 같은 HTTP Request 를 사용할 수 있는 도구를 사용해도 된다. ) 1. Reward Transaction 의 API 부분을 클릭한다. 2. curl 요청을 텍스트 편집기로 복사한다. 75
Step 3. 트랜잭션 실행하기 아래와 같이 텍스트 편집기에서 curl 요청을 변경하고, 터미널에서 curl 명령어를 실행한다. 1. 2. 3. 4. transaction name : Reward apikey : yensnemvrubmvclv6hstz3d96n1y71ru6hstxftwbz7zti421gtgu3kgjrcw5t5d receiveraddress : REOA List 에서 발급한 UserA 의 REOA valueamount : 1000000000000000000 를 입력한다. ( 0이 18개임 ) curl -X POST 'https://cbt-api.luniverse.io/tx/v1.0/transactions/reward' \ --header 'Authorization: Bearer yensnemvrubmvclv6hstz3d96n1y71ru6hstxftwbz7zti421gtgu3kgjrcw5t5d' \ --header 'Content-Type: application/json' \ --data '{ "inputs": { "receiveraddress": "0xa99fbcf012a5af442da0be3ab81b1bbace0f960d", "valueamount": "1000000000000000000" } }' {"result":true,"data":{"txid":"1551688927811805781","txhash":"0x79d87c7a7c3dab926b3c5f8d2ab31cfa199c66eaf0a1f9bdf0839fb890f64402"," reqts":1551688927189}} 76
Step 4. 트랜잭션 확인 DApp 의 Transaction History 로 이동해서 해당 Transaction 의 상태를 확인한다. - Transaction History 를 확인하면 토큰 전송 트랜잭션이 실패했다는 것을 알 수 있다. - Transaction 이 실패한 이유는 토큰을 전송하는 MapoGuAccount 가 ADT 토큰을 가지고 있지 않기 때문이다. 77
Step 5. Side Token 전송 후 잔액확인 1. MapoGuAccount 의 REOA 를 복사한다. 2. ADT Side Token 으로 이동한다. 3. Side Token Transfer 메뉴를 클릭한다. 4. Side Token Transfer 버튼을 클릭한다. 5. MapoGuAccount 의 REOA 로 5000 토큰을 전송한다. 6. 토큰 전송 상태가 Transferred 가 될 때까지 기다린다. 78
Step 6. ADT 토큰 잔액 확인 방금 발행한 REOA 들의 토큰 잔고를 확인해 보자. 잔고를 확인하려면 아래와 같이 요청한다. - REOA 주소 : MapoGuAccount 의 EROA 주소 - Main Token Symbol 이름 : F053 - Side Token Symbol 이름 : ADT - API Key : yensnemvrubmvclv6hstz3d96n1y71ru6hstxftwbz7zti421gtgu3kgjrcw5t5d curl --GET 'https://cbt-api.luniverse.io/tx/v1.0/wallets/0x8d85196810fd3c2a4d4044e7c1cc49256c00981c/f053/apt/balance' \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer yensnemvrubmvclv6hstz3d96n1y71ru6hstxftwbz7zti421gtgu3kgjrcw5t5d' {"result":true,"data":{"balance":"10000000000000000000000"}} 79
Step 7. 트랜잭션 실행하기 Step 3 의 트랜잭션을 재실행하고 Transaction History 에서 트랜잭션이 성공되는지 확인한다. curl -X POST 'https://cbt-api.luniverse.io/tx/v1.0/transactions/reward' \ --header 'Authorization: Bearer yensnemvrubmvclv6hstz3d96n1y71ru6hstxftwbz7zti421gtgu3kgjrcw5t5d' \ --header 'Content-Type: application/json' \ --data '{ "inputs": { "receiveraddress": "0xa99fbcf012a5af442da0be3ab81b1bbace0f960d", "valueamount": "1000000000000000000" } }' {"result":true,"data":{"txid":"1551688927811805781","txhash":"0x79d87c7a7c3dab926b3c5f8d2ab31cfa199c66eaf0a1f9bdf0839fb890f64402"," reqts":1551688927189}} 80
Step 8. DApp 에서 잔고확인하기 서울유기견보호소 Demo App 에서 My Page 를 버튼을 클릭하여 사용자가 보유한 ADT 잔액을 확인한다. ( 페이지를 리로드한다. ) - MapoGuAccount 에서 1 토큰을 전송했기 때문에 화면에 1 토큰이 표시되어야 한다. 81
Lab 07. Adopt 트랜잭션 만들기 82
Step 1. Adopt 트랜잭션 정의 사용자계정이 MapoGuAccount 로 ADT 토큰을 송금하는 트랜잭션을 정의합니다. - 수신자 계정은 항상 MapoGuAccount 입니다. HomelessDog DApp 으로 이동해서 Side Token 을 이용하는 트랜잭션을 정의한다. 1. Token/Contract : ADT 사이드토큰을 선택한다. 2. Function : Free Simple Transfer 3. Action Name : Adopt 4. Sender : 지정하지 않는다. 5. Receiver : MapoGuAccount Create 버튼을 입력하여 트랜잭션을 정의한다. 83
Step 2. 트랜잭션 실행하기 DApp 의 Transaction List 에서 Adopt 트랜잭션의 API 를 확인하고, curl 명령어를 복사해서 실행한다. ( curl 명령어가 없는 경우, PostMan 이나 SoapUI 와 같은 HTTP Request 를 사용할 수 있는 도구를 사용해도 된다. ) 1. Adopt Transaction 의 API 부분을 클릭한다. 2. curl 요청을 텍스트 편집기로 복사한다. 84
Step 3. 트랜잭션 실행하기 아래와 같이 텍스트 편집기에서 curl 요청을 변경하고, 터미널에서 curl 명령어를 실행한다. 1. 2. 3. 4. transaction name : Adopt apikey : yensnemvrubmvclv6hstz3d96n1y71ru6hstxftwbz7zti421gtgu3kgjrcw5t5d from : REOA List 에서 발급한 UserA 의 REOA valueamount : 1000000000000000000 를 입력한다. ( 0이 18개임 ) curl -X POST 'https://cbt-api.luniverse.io/tx/v1.0/transactions/adopt' \ --header 'Authorization: Bearer yensnemvrubmvclv6hstz3d96n1y71ru6hstxftwbz7zti421gtgu3kgjrcw5t5d' \ --header 'Content-Type: application/json' \ --data '{ "from": "0xa99fbcf012a5af442da0be3ab81b1bbace0f960d", "inputs": { "valueamount": "1000000000000000000" } }' {"result":true,"data":{"txid":"1551688927811805781","txhash":"0x79d87c7a7c3dab926b3c5f8d2ab31cfa199c66eaf0a1f9bdf0839fb890f64402"," reqts":1551688927189}} 85
Step 4. 트랜잭션 확인 DApp 의 Transaction History 로 이동해서 해당 Transaction 의 상태를 확인한다. - Transaction History 를 확인하면 토큰 전송 트랜잭션이 성공한 것을 알 수 있다. - 서울 유기견 보호소 My Page 를 리로드해서 잔고가 0이 되었는지 확인한다. 86
Lab 08. DApp 사용하기 - 후원하기 87
유기견보호소 동작구조 서울시(MA) Side Token Transfer (Adopt Token ) MT : SPT (ST) = 1 : 1 MT : ADT (ST) = 1 : 10 Side Token Transfer (Support Token) Support(SPT) Reward(ADT) 마포구 보호소 (MapoGuAccount) Adopt(ADT) setowner Copyright 2018. Lambda256. All rights reserved End User (UserA) 88
Step 1. 후원하기 서울 유기견보호서 Home Page 로 이동한다. - 마포구 보호소를 클릭한다. - 후원하기 버튼을 클릭하여 20SPT 를 마포구 보호소에 후원한다. 89
Step 2. 후원 결과 확인하기 서울 유기견보호소 My Page 로 이동해서 사용자의 토큰 잔고를 확인한다. - SPT 잔고가 1000 에서 980 으로 감소했는지 확인한다. - ADT 잔고가 0에서 200으로 증가했는지 확인한다. 90
Lab 09. 루니버스 Atom Plugin 설치 91
Step 1. Atom Shell Command 설치 터미널에서 apm 명령어를 입력한다. $ apm -v -bash: apm: command not found Atom 의 Install Shell Command 를 선택해서 Shell Command 를 설치한다. apm 명령어를 다시 입력하여 apm 이 정상 설치되었는지 확인한다. $ apm -v apm 1.19.0 npm 3.10.10 node 6.9.5 x64 atom 1.27.2 python 2.7.15 git 2.19.0 92
Step 2. Luniverse Atom Plugin 전달받은 luniverse-atom-plugin.zip 파일 압축을 풉니다. - 윈도우즈 사용자 : %USERPROFILE%\temp - 맥 사용자 : ~/temp Luniverse Atom Plugin 디렉토리로 이동한다. - 윈도우즈 사용자 : cd %USERPROFILE%\temp\luniverse-atom-plugin - 맥 사용자 : ~/temp/luniverse-atom-plugin 93
Step 3. npm Install npm install 을 실행하여 필요한 node 모듈을 설치한다. $ npm install... 94
Step 4. apm link apm link 를 이용해서 Luniverse Atom Plugin 을 Atom 에 설정한다. $ apm link... 95
Step 5. Plugin Load 1. 2. Command + Shift + P 를 입력한다. 입력 창에서 window: reload 를 입력하고 Enter 를 클릭한다. 96
Step 6. Plugin 설치 확인 1. 2. 3. 4. Atom 환경 설정 창을 연다. ( Command + Comm 를 입력 Packages 를 클릭한다. Installed Packages 에 Luniverse 를 입력한다. luniverse-atom-plugin 이 나타나는지 확인한다. 97
Step 7. Plugin 설치 확인 1. 2. 3. Luniverse Access Token 아래에 있는 Access Token 발행 링크를 클릭한다. Luniverse 계정으로 로그인한다. Access Token 을 복사해서 입력한다. 98
Step 8. Access Token 발급 1. 2. Luniverse 계정으로 로그인한다. Access Token 을 복사한다. 99
Step 9. Access Token 복사 1. 복사한 Access Token 을 Atom Plugin 에 붙여 넣는다. 100
Lab 10. 루니버스 Atom Plugin 사용 101
Step 1. Solidity 파일 작성 1. Solditity 로 스마트 컨트랙트를 작성한다. 102
Step 2. Security Assessment 1. 2. 3. 4. 5. 오른쪽 마우스 버튼을 클릭하여 Context Menu 를 띄운다. Create Audit 메뉴를 클릭한다. Audit 을 요청하면 Luniverse Atom Plugin 은 Solidity 코드에 대한 Security Assessment 를 Luniverse 에 요청한다. Security Assessment 가 완료되면 오른쪽에 Security Assessment 결과 요약본이 표시된다. Detail Report 를 클릭하면 Luniverse Console 로 이동하여 상세 보고서를 조회할 수 있다. 103
Step 3. Smart Contract 배포 1. 2. Solidity 파일에서 오른쪽 버튼을 클릭하여 Context Menu 를 띄운다. Compile Contract Code 를 클릭한다. Compile Contract Code 를 클릭하면 Luniverse Atom Plugin 은 Solidity Code 를 컴파일한 후에 배포할 스마트 컨트랙트를 보여준다. 104
Step 4. Smart Contract 배포 루니버스에서 컴파일에 성공하면, Atom Plugin 은 컨트랙트 배포를 위한 창을 출력한다. 컨트랙트 생성 창에서 컨트랙트 배포 정보를 입력하고 Apply 버튼을 클릭하여 컨트랙트 배포를 요청한다. 1. 2. 3. 4. 5. Name, Description 을 입력한다. Chain Select 에서 컨트랙트를 배포할 체인을 선택한다. Atom Plugin 은 계정에서 사용할 수 있는 체인 목록을 보여준다. 배포할 컨트랙트를 선택한다. ( Solidity 파일에 여러 컨트랙트가 있는 경우, 모든 컨트랙트가 목록에 나타난다. ) 배포할 컨트랙트의 생성자 패러미터를 입력한다. Apply 버튼을 클릭하여 컨트랙트 배포를 요청한다. 105
Step 5. Smart Contract 배포 루니버스에서 솔리디티 코드 컴파일이 완료되면 Contract Deploy 요청이 완료되었습니다. 라는 메시지가 출력된다. Details 버튼을 클릭하면 Luniverse Console 의 스마트 컨트랙트 배포 창으로 이동한다. 106
Step 6. Smart Contract 배포 루니버스 Atom Plugin 에서 컨트랙트 배포를 요청하면, 블록체인에 배포 되지 않고 배포 준비 상태가 된다. 배포 준비 상태인 컨트랙트들은 컨트랙트 목록에서 확인할 수 있다. Ready to Deploy 버튼을 클릭해서 컨트랙트 배포 화면으로 이동한다. 107
Step 7. Smart Contract 배포 컨트랙트 배포 트랜잭션에 Private Key 로 사인해서 컨트랙트를 배포한다. 1. 2. 3. 컨트랙트 배포 정보를 확인란다. Create 버튼을 클릭한다. 트랜잭션 서명창이 뜨면, Private Key 나 Keystore 파일을 이용해서 컨트랙트 배포 트랜잭션에 사인한다. 108
Step 8. Smart Contract 배포 확인 배포 요청이 완료되면, 컨트랙트 목록 화면에서 배포 요청된 컨트랙트의 배포 상황을 확인할 수 있다. - 배포상태가 Deployed 로 바뀌면 배포된 Contract Address 를 확인할 수 있다. 109
Step 9. HomelessDogs 배포 Atom PlugIn 에서 HomelssDogs 용 Solidity 를 작성하고 배포한다. pragma solidity ^0.4.18; contract HomelessDogs { string [8] owner; function setowner(uint _index, string _name) public { owner[_index] = _name; } function getowner(uint _index) public view returns (string) { return owner[_index]; } } 110
Step 10. getowner 트랜잭션 정의 HomelessDogs 컨트랙트의 함수를 트랜잭션으로 정의한다. 1. 2. 3. 4. Token/Contract 에서 HomelessDogs 컨트랙트를 선택한다. Function 에서 getowner 를 선택한다. Action Name 에 getowner 를 입력한다. Create 버튼을 클릭하여 getowner 트랜잭션을 정의한다. 111
Step 11. setowner 트랜잭션 정의 HomelessDogs 컨트랙트의 함수를 트랜잭션으로 정의한다. 1. 2. 3. 4. Token/Contract 에서 HomelessDogs 컨트랙트를 선택한다. Function 에서 setowner 를 선택한다. Action Name 에 setowner 를 입력한다. Create 버튼을 클릭하여 setowner 트랜잭션을 정의한다. 112
Step 12. 입양하기 서울 유기견보호소 Home 에서 마포구 보호소로 이동한다. - 입양하기를 클릭하여 강아지를 입양한다. - 페이지를 리로드하여 강아지가 입양되었는지 확인한다. 113
Lab 11. 메타마스크 연동하기 114
Step 1. 사이드체인 접속정보 확인 1. Chain 탭에서 Free Trial 체인을 클릭한다. 2. Chain Overview 에서 Validator 1 을 클릭한다. 3. RPC HTTP Endpoint 를 복사한다. 115
Step 2. 메타마스크 오픈 1. Chrome 에서 메타마스크 Icon 을 클릭한다. 2. 메타마스크에서 네트워크(왼쪽 빨간색 부분)를 클릭한다. 116
Step 3. 사용자 정의 RPC Net Network 에 복사한 RPC HTTP Endpoint 를 붙이고, 네트워크 목록에서 사용자 정의 RPC 를 선택한다. 저장을 클릭한다. ( 붙여넣을 때, http 앞쪽에 공백문자를 지워야 저장된다. ) NickName : Luniverse 117
Step 4. User 를 LEOA 로 변경 var Config = { 파일 위치: luniverse-cbt/demo-homeless-dogs/src/js/config.js chainid: '1550810241284903144', // 1. Chain Id mt: { symbol: 'F862', }, // 2. Main Token st: { support: { symbol: 'SPT2', }, // 3. Support Side Token adopt: { symbol: 'ADT',}, // 4. Adopt Side Token }, 메타마스크의 EOA 를 복사한다. walletaddress: { pd: '', // 5. Remote EOA for PD user: '0xab9ccabe5075273d0d422236176ffb28a15c470f', // 6. Local EOA for User }, dapp: { // 7. API Key apikey: 'JCJCAZT6Jwg1uptbaFkyKFvJYc855WnMs6S9dVbDFd29KsgnfmFrva4kEowuse5R' }, txactionname: { // 8. Transaxctions for DApp setowner: 'setowner', // 9. Transaction for Custom Smart Contract getowner: 'getowner', // 10. Transaction for Custom Smart Contract support: 'Support', // 10. Support Transaction for Support Token adopt: 'Adopt', // 11. Adopt Transaction for Adopt Token reward: 'Reward', // 12. Reward Transaction for Adopt Token }, username: 'dino', }; 118
Step 5. LEOA 잔고 확인하기 1. 유기견 보호소 페이지를 Reload 한다. 2. 유기견 보호소 My Page 로 이동하여 잔고를 확인한다. 3. 루니버스 콘솔에서 메타마스크 LEOA 로 1000 SPT 토큰을 전송한다. 4. 유기견 보호소 My Page 에서 잔고를 확인한다. ( SPT : 1000, ADT : 0) 119
Step 6. Support 실행 1. 마포구 보호소 페이지로 이동한다. 2. 후원하기를 클릭한 후 20SPT 후원을 클릭한다. 3. 메타마스크 서명창이 뜨면 트랜잭션을 확인한다. 4. Gas FEE 의 Edit 을 클릭해서 가스 설정 화면을 띄운다. 5. a. 가스가격을 1(GWei) 로 설정한다. b. 가스한도를 2,000,000 으로 설정한다. c. 저장을 클릭하여 서명 확인으로 이동한다. 트랜잭션 서명 창에서 승인" 버튼을 클릭하여 트랜잭션을 실행한다. 120
Step 7. 트랜잭션 확인하기 트랜잭션이 처리되면 루니버스 사이드체인 블록익스플로어러에서 트랜잭션을 확인한다. 1. 메타마스크를 클릭한다. 2. 히스토리에서 트랜잭션을 클릭한다. 3. 세부사항에서 Copy Transaction ID 버튼을 클릭한다. 4. 사이드 체인의 블록 익스플로러로 이동한다. 5. 복사한 트랜잭션을 붙여넣고 검색하여 트랜잭션을 확인한다. 121
Q&A 122
Thanks 123