Actions
이슈 #438
진행중
JL
HP
[Go backport] Legacy wallet_address 컬럼 제거 — Phase 5 (final cleanup)
이슈 #438:
[Go backport] Legacy wallet_address 컬럼 제거 — Phase 5 (final cleanup)
시작일:
2026/05/15
완료일:
2026/05/15 (약 6달 지연)
진척도:
0%
추정시간:
설명
배경¶
Phase 1–4 를 통해 인증/AGX/Admin UI/Friends 가 전부 user_id 기반으로 전환되었으나, 다음 그룹들은 아직 wallet_address 컬럼을 소유권 키로 여전히 사용 또는 유지하고 있다:
-
nodes.owner_wallet_address이 backward-compat 컬럼 로 남아있다 (Phase 1에서 nullable + Phase 2에서 권한 판단 제외했으나 SELECT/INSERT 에서 여전히 채움) -
virtual_node_assignments/virtual_node_credits/virtual_node_packages은 여전히wallet_address을 주 식별 키로 사용 — 현재 WalletService.ClaimVirtualNodes 가 PrimaryWalletForUser 로 우회해서 동작 - proto NodeInfo / VipNodeInfo / ClaimedWalletAddress 의 월렶에 너폄들은 wallet_address 응답 필드
Phase 5는 이 legacy 컬럼/필드를 제거하고 user_id 기반 파이프라인을 완결한다.
작업 범위¶
DB 스키마 v15 (clean rewrite)¶
-
ALTER TABLE nodes DROP COLUMN owner_wallet_address(필요에 따라 CASCADE) -
virtual_node_assignments재설계:wallet_address컬럼 제거,user_id UUID NOT NULL추가 + 인덱스 -
virtual_node_credits재설계: 동일 (user_id UUID NOT NULL) -
virtual_node_packages:claimed_wallet_address제거,claimed_user_id UUID추가 + 인덱스 -
virtual_node_claim_events:wallet_address→user_id - clean rewrite: 세 테이블 TRUNCATE
Store¶
-
store/nodes.go:Node.OwnerWalletAddress제거, nodeColumns 조정.GetNodesByWallet/GetClientNodesByWallet/CountDeviceNodesByWallet제거 또는 user_id 기반으로 이름 변경.RegisterNodeForUser(node_id, name, walletAddr, userID, ...)의 walletAddr 인자 제거 -
store/virtual_node.go:VirtualNodeAssignment.WalletAddress→UserID. 모든 helper 이름 일괄 교체:ListActiveAssignmentsByUser,SumVirtualAgxByUser,SumVirtualAgxTodayByUser,GetCreditsByUser,ListVirtualCreditDayBucketsByUserAllTime등 -
store/virtual_node_claims.go:ClaimVirtualNodePackage(userID, claimCode),ClaimedUserID *string,claimed_user_id컬럼 사용 -
store/edge_node.go:EnsureEdgeNode(...)에서 owner_wallet_address INSERT 제거
Proto¶
-
NodeInfo.owner_wallet_address제거 안함 (owner_user_id추가 — 응답에 노출). 다만 기존 wallet 필드는 그대로 두고 빈 값으로 대체 또는 제거 결정 필요. 이번에는 제거 + owner_user_id 필드 추가 로 결정 -
VipNodeInfo.owner_wallet_address동일 적용 -
ClaimVirtualNodesRequest은 이미 wallet_address 없음.ClaimVirtualNodesResponse는 그대로.
Handler¶
-
handler/wallet.go::ClaimVirtualNodes:resolvePrimaryWallet경로 제거,db.ClaimVirtualNodePackage(userID, claimCode)로 직접 동작 -
handler/wallet.go::GetNodes/wallet_vip.go::GetNodesDetail: wallets 대신 user_id 로 직접ListActiveAssignmentsByUser(userID) -
handler/wallet.go::GetEarningsToday: virtual AGX 집계도SumVirtualAgxByUser(userID) -
handler/node.go::nodeToProto:OwnerWalletAddress제거,OwnerUserId추가 - Admin api (
/admin/api/virtual-node-packages/...): claimed_user_id 으로 응답 포맷 조정 - engine / scheduler 의 wallet 기반 reward 경로:
CreditWalletForReward(wallet,...)는 Phase 2 에서 이미 wallet→user_id 자동 매핑, 그대로 유지 (래거시 node 호환)
Tests¶
- 각 wallet 기반 고정 테스트(virtual_credit_overlap_test, virtual_node_claims_test, admin_cleanup_test, wallet_today_test, wallet_vip_test, wallet_virtual_nodes_test 등)를 user_id 인자로 재작성
마이그레이션 전략¶
Clean rewrite. dev/qa DB reset 필요. 운영(prod)은 next 브랜치에만 적용.
DoD¶
-
make build,make test통과 -
DB 에서
wallet_address컬럼이 소유권/identity 키로 사용되는 테이블:wallets(해당 wallet 그 자체 명세),job_receipts(경이 계정 metadata),aggregated_earnings(metadata) 만 남음 - virtual_node_* 이 완전히 user_id 키로 동작
- ClaimVirtualNodes 가 caller user_id 로 직접 동작 (wallet 등록 없이도 클레임 가능)
- NodeInfo.owner_wallet_address 일괄 제거, owner_user_id 필드 응답
관련 이슈¶
- 이전 phase: #434(Phase 1, 해결), #435(Phase 2, 해결), #436(Phase 3, 해결), #437(Phase 4, 해결)
- DB 스키마 변경 — #254 refs 동반
Actions