demo-aa
가위-바위-보
와 0~9 숫자 맞추기
게임을 즐길 수 있습니다.
유저는 Account Abstraction 계정과 ERC20 토큰을 수수료로 지급하며, ERC-1155 기반의 게임을 할 수 있습니다.
게임을 이겨 ERC-1155 토큰을 얻고 다시 ERC20 토큰으로 교환이 가능합니다.
기술 스택
다음과 같은 기술 스택을 사용하여 단일 WSL2 ubuntu 20.04.6 에 microK8s로 배포
go (version 1.23 이상)
fiber 프레임워크 사용
account abstraction
eth-infinitism contracts 사용 (GPL-3.0 license)
microK8s
ganache
mongoDB
kafka
grafana, loki, promtail
stdout으로 출력되는 로그를 수집하고 시각화
애플리케이션
cmd
디렉토리 6가지 애플리케이션.
setup
: 컨트랙트 세트를 배포하고 MongoDB에 저장. Kafka 토픽을 생성. (초기 설정 시 1회 실행)
watchdog
: 컨트랙트 세트의 이벤트 로그를 감시하여 이벤트 로그와 트랜잭션을 DB에 저장합니다.
txrmngr
: 유저 생성과 Faucet 트랜잭션을 서명하고 전송하는 Consumer입니다.
operator
: UserOperation 트랜잭션을 서명하고 전송하는 Consumer입니다.
service
: 유저에게 API를 제공하며, Kafka 토픽에 메시지를 생산(Produce)합니다.
client
: 유저가 사용하는 클라이언트 애플리케이션입니다.
시퀀스 다이어그램
유저가 client
를 통해 userOperation
을 전송하면, service
API를 통해 Kafka의 토픽에 메시지가 전송.
txrmngr
와 operator
는 트랜잭션들을 모아서 서명하고 sendTransaction
을 통해 블록체인에 전송하며, DB에 요청 사항을 기록.
watchdog
은 지속적으로 블록체인을 구독하며 트랜잭션 처리 결과를 DB에 기록. 유저는 userOperation
실행 시 user
DB에 트랜잭션이 pending
상태임을 업데이트하며, 이후 조회 시점에 consumer
와 watchdog
을 통해 기록된 트랜잭션 상태를 확인하고 동기화.
- 조회를 하기 전까지는
pending
상태이며, 이 상태에서는 유저가 다음 userOperation
을 전송할 수 없음. 조회 이후부터 유저의 상태는 동기화.
sequenceDiagram
participant client
participant service-api
participant kafka
participant txrmngr
participant operator
participant blockchain(ganache)
participant watchdog
participant mongoDB
client->>service-api: userOperation 요청
service-api->>kafka: 메시지 전송
par 트랜잭션 처리
kafka->>txrmngr: 메시지 수신 (유저 생성/Faucet)
txrmngr->>blockchain(ganache): 트랜잭션 서명 및 전송
txrmngr->>mongoDB: Raw data 저장
kafka->>operator: 메시지 수신 (userOperation)
operator->>blockchain(ganache): 트랜잭션 서명 및 전송
operator->>mongoDB: Raw data 저장
end
watchdog->>blockchain(ganache): 블록체인 이벤트 구독
watchdog->>mongoDB: 트랜잭션 결과 저장
Note over client: 상태는 여전히 Pending
client->>service-api: 상태 조회 요청
service-api->>mongoDB: 트랜잭션 상태 조회
mongoDB-->>service-api: 트랜잭션 결과 반환
service-api-->>client: 상태 동기화 완료
실행 방법
Docker 설치
참고: Docker 설치 문서
MicroK8s 설치
참고: MicroK8s 설치 문서 & MicroK8s registry
sudo swapoff -a
sudo snap install microk8s --classic
sudo snap alias microk8s.kubectl kubectl
sudo microk8s start
microk8s enable dns hostpath-storage rbac metrics-server ingress registry
Docker 이미지 빌드 및 registry에 푸시
./build.sh
스택 및 애플리케이션 배포
./deploy.sh
kubectl edit daemonset nginx-ingress-microk8s-controller -n ingress
spec.template.spec.containers.args.ports
에 다음을 추가.
...
- containerPort: 8000
hostPort: 8000
name: mongo
protocol: TCP
- containerPort: 8100
hostPort: 8100
name: ganache
protocol: TCP
- containerPort: 8101
hostPort: 8101
name: ganache2
protocol: TCP
- containerPort: 8200
hostPort: 8200
name: kafka
protocol: TCP
...
로그 수집 (옵션)
로그 수집을 원할 경우 다음을 실행합니다:
./deploy_loki.sh
Client 테스트
- 테스트 전에 최상단에
URL
과 privateKeyHex
를 알맞게 수정한 후 진행합니다.
cd cmd/client
go run .
정상 실행시 아래와 같이 출력
demo-client 'exit' to quit
type: 'login' or 'join'
join
을 입력하여 userid
, password
로 회원가입
> join
your id: foo
your password: bar
- 다시
login
을 입력하여 접속
> login
your id: foo
your password: bar
- 원하는 동작 선택
type: 'state' or 'faucet' or 'transfer' or 'gamble'
state
: 현재 내 계정의 상태를 확인합니다.
faucet
: 토큰을 지급받습니다.
transfer
: 토큰을 전송합니다.
gamble
: Gamble 게임을 진행합니다.
- 먼저
faucet
을 입력한 후 state
를 입력하여 accountBalance
가 증가했는지 확인합니다.
- 토큰이 지급되었다면
gamble
을 입력하고, 1
을 선택하여 가위바위보 게임을 진행합니다.
1
(바위), 2
(보), 3
(가위) 중 원하는 선택을 합니다.
- 게임 후
state
를 통해 ERC-1155 토큰이 지급되었는지 확인할 수 있습니다.
- 가위바위보 보상은
1000
번 토큰, 0~9 숫자 맞추기는 2000
번 토큰이 지급됩니다.
gamble
입력 후 3
(exchange)을 선택하면 ERC-1155 토큰을 ERC-20 토큰으로 교환할 수 있습니다.
감사합니다.