Klaytn 101 #2 Blockchain Application(BApp) 동작원리와 구성요소 이해하기
1. BApp 개요: BApp의 동작원리와 BApp을 구성하는 요소들에 대해 설명
2. Count BApp: Klaytn Docs에 소개된 Count BApp 튜토리얼을 step-by-step으로 따라가며, web 기반 BApp 구현방법에 대해 설명
* 54 페이지 두번째 줄의 함수명 callPlus은 callMius로 변경해 주세요.
7. Blockchain Application (BApp)
● 블록체인 어플리케이션(BApp)은 블록체인을 사용하는 어플리케이션
○ 기존의 기술로 풀기 어려운 문제들을 블록체인의 특성을 활용하여 풀어내는 것이 목적
● 불변성과 투명성이 대표적인 블록체인의 특성
○ 한번 기록된 정보는 변경할 수 없으며
○ 정해진 규칙(e.g., 블록체인 프로토콜, 컨트랙트에 구현된 로직)에 따라 상태를 변경
○ 기록의 내역이 블록에 공개되어 있으므로 누구든지 정보의 진실여부를 확인 가능
7
8. BApp의 동작원리
● 쓰기 (Write)
○ 블록체인에 데이터를 쓰는 모든 행위는 트랜잭션(TX)으로 표현
○ e.g., 어카운트 간 KLAY의 전송
○ e.g., 스마트 컨트랙트 배포
○ e.g., 스마트 컨트랙트의 상태를 변경하는 함수를 호출
● 읽기 (Read)
○ 누구든지 블록 정보를 가지고 있다면 쓰여진 데이터를 확인 가능
○ e.g., TX 확인
○ e.g., 스마트 컨트랙트 상태 확인
8
10. BApp 개발 형태
1. Fully decentralized
○ 사용자(클라이언트)가 직접 블록체인과 통신
2. Semi-decentralized with (centralized) proxy
○ 클라이언트가 블록체인과 통신하기 위해 중개 서버와 통신
○ 블록체인 기반으로 만들어진 서비스가 있고 그 서비스를 사용자들이 사용하는 형태
○ 클라이언트 ⇔ 중개서버 ⇔ 블록체인
10
11. BApp 개발 형태: Fully Decentralized
● 장점:
○ 높은 투명성, 신뢰형성에 필요한 추가 비용 없음
○ 사용자의 익명성 보장 가능
○ (설치형 BApp의 경우) 관리 비용 낮음
● 단점:
○ 사용자 책임 증가, 어려운 UX
○ 로직 변경 어려움
○ 사용자가 블록체인에 상시 접속할 필요 및 블록을 복제할 필요 있음
11
12. BApp 개발 형태: Semi-Decentralized with Proxy
● 장점:
○ (기존의 서비스들과 동일한) 높은 수준의 UX
○ 사용자가 블록체인과 직접 통신할 필요 없음
○ 로직 변경 비교적 쉬움
● 단점:
○ 신뢰비용 발생
○ 일부 중앙화 ⇒ 서비스가 Single Point of Failure (SPoF)가 됨
○ 관리 비용 높음
12
14. BApp 개발 구분
● 프론트엔드(Frontend)
○ 사용자가 직접 사용하는 프로그램 (e.g., mobile app, web page/app)
○ 키관리, TX 생성, 서명, 전송 등을 프론트엔드에서 처리
● 백엔드(Backend)
○ 사용자에 눈에 보이지 않는 상시 동작하는 서비스
○ 프론트엔드가 사용자 요청을 전달하면 백엔드가 처리하는 구조
○ 블록체인 동기화 등 컴퓨팅 리소스가 많이 필요한 일을 처리하는데 적합
○ 블록체인 동기화, 블록 파싱(parsing), TX 전달, 가스비 대납 등을 백엔드에서 처리
14
15. 개발 형태 별 BApp 개발 조합
● Fully decentralized = Frontend + Blockchain
○ e.g., Web/Android/Windows + Klaytn
● Semi-decentralized = Frontend + Backend + Blockchain
○ e.g., Web + Java Server on AWS + Klaytn
○ e.g., Android + Node.js Server on Azure + Klaytn
15
16. 프론트엔드 개발
● BApp이 실행되는 환경에 따라 개발방법이 달라짐
○ 실행환경: Web, Mobile (Android, iOS), Native (Windows, Linux, macOS)
○ 어느 환경에서 개발하느냐에 따라 개발 언어와 UI/UX 디자인, 사용 SDK가 달라짐
○ Klaytn은 Javascript, Java (Android, Native) SDK를 제공
● 프론트엔드 개발에 영향을 끼치는 실행환경 중 하나가 지갑
○ 지갑의 존재유무, 지갑의 선택에 따라 개발방법이 변경될 수 있음
○ 특정 지갑을 사용할 경우 해당 지갑이 제공하는 라이브러리를 사용
16
17. 지갑 (Wallet)
● TX를 서명하려면 키가 필요
○ 키 → 어카운트; 서로 다른 키는 다른 어카운트에 매핑
○ 하나의 어카운트로 여러 BApp을 사용하려는 사용자의 니즈가 존재
● 지갑 = 키를 관리하는 프로그램
○ 키를 보관하고 BApp이 요청할 때마다 보관 중인 키로 TX를 서명
○ 여러 유형의 지갑이 존재
○ e.g., 브라우저 플러그인, Dapp 브라우저 내장 지갑, 클라우드 지갑, 디바이스 지갑
17
18. 지갑을 고려한 BApp 개발
● 어떤 지갑을 사용하느냐에 따라 사용자 환경이 변화
○ 어떤 형태로 BApp을 만들 것인지? 웹앱? 모바일 웹? 모바일 네이티브? 데스크탑?
○ BApp에 지갑을 내장할 것인지 아니면 외부 지갑을 사용할 것인지
○ 외부 지갑을 쓸 경우 개발하려는 BApp 형태와 맞는 지갑이 어떤 것인지?
○ e.g., 웹앱의 경우 Metamask를 사용 가능 (Ethereum)
○ e.g., 모바일 웹 또는 모바일 네이티브의 경우 삼성 블록체인 키스토어를 사용 가능 (Klaytn)
BApp의 목적 및 타겟 사용자를 분석하여 어느 형태로 키를 관리할지 결정
18
19. 백엔드
● 블록체인 프로토콜 이외의 정보를 관리할 경우 필요
○ UX 향상 및 서비스 구현을 위해 TX 외 다른 정보가 필요할 경우 백엔드를 운영
● 서비스 제공자가 실행환경을 결정
○ 개발방법 선택이 비교적 자유로운편이나 대부분의 경우 플랫폼 SDK 존재유무에 따라 방향을 결정
19
21. Count BApp
블록체인에 숫자를 기록하는 BApp
● Count BApp 사용자는 다음을 할 수 있어야 합니다.
○ 가장 마지막 블록 높이를 확인
○ 블록체인에 기록된 숫자를 확인
○ 자신의 어카운트 비밀키를 입력하여 어카운트 주소를 확인
○ (자신의 어카운트 비밀키를 사용하여) 숫자를 1 더할 수 있음
○ (자신의 어카운트 비밀키를 사용하여) 숫자를 1 뺄 수 있음
22. Count BApp 화면구성예시
Private Key Enter user key here Set
Address 0xADDRESS_OF_THE_PROVIDED_KEY
Block# #########
#########Count
+
-
Last
Participant
0xADDRESS_OF_THE_LAST_PARTICIPANT
Result https://baobab.scope.klaytn.com/tx/...
23. Count 스마트 컨트랙트 (Count.sol)
pragma solidity ^0.5.6;
contract Count {
uint public count = 0;
address public lastParticipant;
function plus() public {
count++;
lastParticipant = msg.sender;
}
function minus() public {
count--;
lastParticipant = msg.sender;
}
}
24. Count 스마트 컨트랙트 with Comments
pragma solidity ^0.5.6;
contract Count {
uint public count = 0;
address public lastParticipant;
function plus() public {
count++;
lastParticipant = msg.sender;
}
function minus() public {
count--;
lastParticipant = msg.sender;
}
}
숫자를 기록하는 상태를 만듭니다.
마지막에 숫자를 변경한 사람의 주소를
기록하는 상태를 만듭니다.
숫자를 1 증가시키고 변경한 사람의
주소를 기록합니다.
숫자를 1 감소시키고 변경한 사람의
주소를 기록합니다.
25. Count BApp 실행예시
count.sol @ 0xCONTRACT
---
plus()
minus()
---
uint count
address lastParticipant
User A @ 0xADDR1
User B @ 0xADDR2
User C @ 0xADDR2
0xADDR1 → plus() // count = 1
0xADDR2 → count() → 1
0xADDR3 → minus() // count = 0
0xADDR1 → plus() // count = 1
0xADDR1 → count() → 1
26. 개발 스택
다음 소프트웨어 및 라이브러리를 사용하여 Count BApp을 개발합니다
항목 선택
개발 언어 Javascript
소프트웨어 플랫폼 Node.js
사용자 인터페이스 React*
Klaytn SDK caver-js
27. 개발 순서
1. Baobab에서 어카운트 만들기
2. KLAY Faucet에서 테스트 KLAY 받기
3. IDE로 Count.sol 작성, 배포, 테스트 실행하기
4. caver-js + React로 프론트엔드 만들기
28. 1. Baobab 어카운트 생성
● Klaytn Wallet을 사용 -
baobab.wallet.klaytn.com
50. 4-4. Count 1/7
// import statements and ABI
class Count extends React.Component {
constructor() {
super();
// assume .env file contains REACT_APP_CONTRACT_ADDRESS variable
this.countContract = process.env.REACT_APP_CONTRACT_ADDRESS && ABI &&
new caver.klay.Contract(ABI, process.env.REACT_APP_CONTRACT_ADDRESS);
this.state = { count: '', lastParticipant: '', privateKey: '' };
this.wallet = caver.klay.accounts.wallet;
}
// more on next slide
}
export default Count
51. 4-4. Count 2/7
class Count extends React.Component {
// exposed function allowing anyone with the right reference can call this function
setPrivateKey(key) {
this.wallet.clear();
if (key) {
this.wallet.add(key);
}
this.setState({
privateKey: key
});
}
// more on next slide
}
export default Count
52. 4-4. Count 3/7
class Count extends React.Component {
getCount = async () => {
const count = await this.countContract.methods.count().call();
const lastParticipant = await this.countContract.methods.lastParticipant().call();
this.setState({
count,
lastParticipant,
});
}
// more on next slide
}
export default Count