demo-aa

module
v0.0.0-...-df7cfe4 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 19, 2025 License: GPL-3.0

README

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의 토픽에 메시지가 전송.

  • txrmngroperator는 트랜잭션들을 모아서 서명하고 sendTransaction을 통해 블록체인에 전송하며, DB에 요청 사항을 기록.
  • watchdog은 지속적으로 블록체인을 구독하며 트랜잭션 처리 결과를 DB에 기록. 유저는 userOperation 실행 시 user DB에 트랜잭션이 pending 상태임을 업데이트하며, 이후 조회 시점에 consumerwatchdog을 통해 기록된 트랜잭션 상태를 확인하고 동기화.
  • 조회를 하기 전까지는 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 테스트
  • 테스트 전에 최상단에 URLprivateKeyHex를 알맞게 수정한 후 진행합니다.
cd cmd/client
go run .

정상 실행시 아래와 같이 출력

demo-client 'exit' to quit

type: 'login' or 'join'
  1. join을 입력하여 userid, password로 회원가입
> join
your id: foo
your password: bar
  1. 다시 login을 입력하여 접속
> login
your id: foo
your password: bar
  1. 원하는 동작 선택
type: 'state' or 'faucet' or 'transfer' or 'gamble'
  • state: 현재 내 계정의 상태를 확인합니다.
  • faucet: 토큰을 지급받습니다.
  • transfer: 토큰을 전송합니다.
  • gamble: Gamble 게임을 진행합니다.
  1. 먼저 faucet을 입력한 후 state를 입력하여 accountBalance가 증가했는지 확인합니다.
  2. 토큰이 지급되었다면 gamble을 입력하고, 1을 선택하여 가위바위보 게임을 진행합니다.
    • 1(바위), 2(보), 3(가위) 중 원하는 선택을 합니다.
    • 게임 후 state를 통해 ERC-1155 토큰이 지급되었는지 확인할 수 있습니다.
  3. 가위바위보 보상은 1000번 토큰, 0~9 숫자 맞추기는 2000번 토큰이 지급됩니다.
  4. gamble 입력 후 3(exchange)을 선택하면 ERC-1155 토큰을 ERC-20 토큰으로 교환할 수 있습니다.

감사합니다.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL