Add decentralized cryptographic identity

This commit is contained in:
Alexander Sellite 2026-07-29 22:18:14 -04:00
parent 0b5b78a553
commit fa996a6735
27 changed files with 1733 additions and 58 deletions

View file

@ -45,6 +45,7 @@ const DIRECT_WORKFLOW_HELP: String = (
var _network_session: NetworkSession
var _saved_servers: SavedServerStore
var _server_trust: ServerTrustStore
var _gameplay_context: bool = false
var _mode: Mode = Mode.DIRECT
var _visible_entries: Array[SavedServerEntry] = []
@ -89,10 +90,12 @@ func setup(
network_session: NetworkSession,
saved_servers: SavedServerStore,
gameplay_context: bool,
server_trust: ServerTrustStore = null,
) -> void:
_network_session = network_session
_saved_servers = saved_servers
_gameplay_context = gameplay_context
_server_trust = server_trust
if not _network_session.state_changed.is_connected(_on_state_changed):
_network_session.state_changed.connect(_on_state_changed)
if not _network_session.status_message_changed.is_connected(
@ -447,6 +450,17 @@ func _format_entry_details(entry: SavedServerEntry) -> String:
if _mode == Mode.SAVED:
parts.append("Name: %s" % entry.display_name)
parts.append("Address: %s" % entry.normalized_endpoint)
if _server_trust != null:
var trust := _server_trust.get_record(entry.get_endpoint())
if trust.is_empty():
parts.append("Host identity: Not verified yet")
else:
parts.append(
"Host identity: %s"
% NetworkIdentityCrypto.format_fingerprint(
str(trust.get("fingerprint", ""))
)
)
if (
not entry.last_observed_server_name.is_empty()
and (

View file

@ -121,6 +121,7 @@ func setup(
fishing_spot: FishingSpotType,
network_session: NetworkSessionType,
saved_servers: SavedServerStoreType,
server_trust: ServerTrustStore,
) -> void:
_player = player
_save_manager = save_manager
@ -128,7 +129,7 @@ func setup(
_fishing_spot = fishing_spot
_network_session = network_session
_saved_servers = saved_servers
_join_game_page.setup(network_session, saved_servers, true)
_join_game_page.setup(network_session, saved_servers, true, server_trust)
if not _fishing_spot.bite_activated.is_connected(_on_bite_activated):
_fishing_spot.bite_activated.connect(_on_bite_activated)

View file

@ -43,6 +43,13 @@ func setup(service: NetworkProfileService) -> void:
_service.conflict_result.connect(_on_conflict_result)
_service.apply_finished.connect(_on_apply_finished)
_load_persisted()
var identity_value := find_child("IdentityFingerprint", true, false) as Label
if identity_value != null:
identity_value.text = "%s • Stored on this device" % (
NetworkIdentityCrypto.format_fingerprint(
_service.get_identity_fingerprint()
)
)
func activate() -> void:
@ -162,6 +169,19 @@ func _build_ui() -> void:
_suggestions.add_theme_constant_override("separation", 8)
layout.add_child(_suggestions)
var identity_label := Label.new()
identity_label.text = "identity"
identity_label.add_theme_color_override("font_color", Color("302b27"))
layout.add_child(identity_label)
var identity_value := Label.new()
identity_value.name = "IdentityFingerprint"
identity_value.text = "Stored on this device"
identity_value.tooltip_text = (
"This identity helps other players recognize you between sessions."
)
identity_value.add_theme_color_override("font_color", Color("665e52"))
layout.add_child(identity_value)
var body := HBoxContainer.new()
body.size_flags_vertical = Control.SIZE_EXPAND_FILL
body.add_theme_constant_override("separation", 18)

View file

@ -231,10 +231,11 @@ func setup(
settings_manager: SettingsManagerType,
network_session: NetworkSessionType,
saved_servers: SavedServerStoreType,
server_trust: ServerTrustStore,
) -> void:
_save_manager = save_manager
_settings_manager = settings_manager
_join_game_page.setup(network_session, saved_servers, false)
_join_game_page.setup(network_session, saved_servers, false, server_trust)
_join_game_page.join_requested.connect(join_game_requested.emit)
_join_game_page.back_requested.connect(_close_join_game)
Input.mouse_mode = Input.MOUSE_MODE_VISIBLE