Hero hole cards render face down after ~1h on a table (auth signature never renewed)
Maintainer thường phản hồi trong vòng 1 ngày
@bitcoinbrisbane đang làm issue này rồi.
Từ ngày 2/11/2026.
Đánh giá
Issue này chưa được đánh giá.
Mô tả
Summary
Several nights recently, a seated player was dealt hole cards that rendered face down (card backs) to that player. Everyone else's view looked normal. A browser refresh fixes it immediately. Related symptom previously reported in #409 (closed without an identified root cause).
Likely root cause (inferred from code, ~80% confidence)
The per-player websocket auth is signed once per socket and never renewed. After ~1 hour, the chain rejects it, and the relay silently falls back to the public (fully masked) state.
- UI signs once.
src/context/GameStateContext.tsx(block52/ui main, L302-310): on socket open,createAuthPayload()signspokerchain-query:<unix ts>and sends a singlesubscribe{gameId, playerAddress, timestamp, signature}. Nothing re-signs while the socket stays open. The wake handler (L462-485) returns early for an open, live socket (L473), so a tab becoming visible does not re-sign either. - Relay keeps the first signature forever. block52/pokerchain
pkg/wsserver/server.goL806-810 storesplayerId/timestamp/signatureon the client at subscribe. Every broadcast (sendPersonalizedUpdate, L538+, andauthedStateJSONinoptimistic.goL159-186) reuses them. - Silent masked fallback. On any error from the authenticated
GameState/OptimisticGameStatequery, the relay falls back to the publicGamequery (server.go~L462-473 and L565-568), where all hole cards are masked. No error is sent to the client. - Chain 1h window.
x/poker/keeper/query_game_state.goL47-56 (andquery_optimistic_game_state.goL39) reject a timestamp more than 1 hour from block time.
So ~60 min after the socket opened, every update reaches the hero with their own cards as X, and the seat draws backs. A refresh re-signs, which is why it fixes it.
Possible trigger for it showing up now: #910 (fix for #867) stopped a browser offline blip from tearing down an open socket. Previously those blips likely forced reconnects, and each reconnect quietly re-signed. Sockets now live longer than 1h more often. This is unverified.
How to confirm
- Relay logs for the affected player should show the authenticated query failing with
timestamp must be within 1 hour of block time, followed by the public-query fallback. - Repro: sit at a table for more than 60 min without refreshing. Hole cards should go face down at about the hour mark.
Load impact of the fix
One extra read-only signed query per player every 30-45 min (re-subscribe returns a fresh snapshot). No indexer involvement, negligible device cost.
Proposed fix
- Periodically re-sign and re-send
subscribeon the same socket every 30-45 min. The relay already overwrites stored credentials on a new subscribe. Apply the snapshot as a normal state update, withoutbus.reset(). - Re-sign and re-subscribe when the tab becomes visible again (
visibilitychange). - Debounced safety net: if the hero is seated in a live hand and their own hole cards arrive masked (
X/??), re-subscribe with a fresh signature once, with a debounce to avoid loops. - Follow-up for block52/pokerchain (relay): when a client's authenticated query fails, send an
auth_expiredevent (or keep the last per-player state) instead of silently serving the public masked state, and log it clearly.
Code refs: block52/ui main 12b9a929, block52/pokerchain v0.1.206 da56cd6.
- Ngôn ngữ chính
- TypeScript
- Star
- 2
- Fork
- 5
- Merge trung bình
- 23 giờ 56 phút
- Pull request đã merge (30 ngày)
- 91
Chuẩn bị môi trường
Chúng tôi chưa kiểm tra các tệp thiết lập môi trường của dự án này. Hãy bắt đầu từ README và xem hướng dẫn đóng góp lần đầu của chúng tôi để biết các bước chung.
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của block52/ui
-
guards: accept readonly arrays (and other array-likes) in isEmpty / hasElements / safeLengthĐang mởenhancement tech debt
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 78/100
Maintainer thường phản hồi trong vòng 1 ngày
-
[FEATURE] Implement Interactive Provably Fair Hand Verification Interface – PlayBlind ReferenceCó thể đã có người làm @Dzeezbtc đã nhận hôm nay. Đang mởenhancement feature ready for testing UI Week 3
block52/ui#972 · 1 người được giao ·
Maintainer thường phản hồi trong vòng 1 ngày
-
feat(ui): player language setting and translated player screensCó thể đã có người làm @Dzeezbtc đã nhận 5 ngày trước. Đang mở
Độ khó 5/5 Hơn một tuần Mức phù hợp với người mới 25/100
Maintainer thường phản hồi trong vòng 1 ngày
-
feat(ui): player notes and tags — click a seat to note a player; tag icons (fish, shark, tight, loose…) show by their pillCó thể đã có người làm @Dzeezbtc đã nhận 7 ngày trước. Đang mở
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 35/100
Maintainer thường phản hồi trong vòng 1 ngày
-
architecture refactor tech debt
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 48/100
Maintainer thường phản hồi trong vòng 1 ngày
Issue tương tự
-
code-quality good-first-issue
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 72/100
OpenRailAssociation/netzgrafik-editor-frontend#1481 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
bug implicit-state
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 74/100
-
area:models enhancement
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 76/100
Maintainer thường phản hồi trong vòng 1 ngày
-
bug frontend ui
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 68/100
Maintainer thường phản hồi trong vòng 1 ngày
-
Recording drops clicks on links, filters and checkboxes that share a form with a search fieldCó thể đã có người làm @columbia11 đã nhận hôm nay. Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 75/100
Tencent/BrowserSkill#657 ·
Maintainer thường phản hồi trong vòng 1 ngày