Categorygithub.com/go-chujang/demo-aa
module
0.0.0-20250119142344-df7cfe49d516
Repository: https://github.com/go-chujang/demo-aa.git
Documentation: pkg.go.dev

# 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 토큰으로 교환할 수 있습니다.

감사합니다.

# Packages

No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author