Class: Confium::TC::Coordinator

Inherits:
Object
  • Object
show all
Defined in:
lib/confium/tc/coordinator.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(quorum_id:) ⇒ Coordinator

Returns a new instance of Coordinator.



23
24
25
26
# File 'lib/confium/tc/coordinator.rb', line 23

def initialize(quorum_id:)
  @quorum_id = quorum_id
  @sessions = {}
end

Instance Attribute Details

#quorum_idObject (readonly)

Returns the value of attribute quorum_id.



21
22
23
# File 'lib/confium/tc/coordinator.rb', line 21

def quorum_id
  @quorum_id
end

#sessionsObject (readonly)

Returns the value of attribute sessions.



21
22
23
# File 'lib/confium/tc/coordinator.rb', line 21

def sessions
  @sessions
end

Instance Method Details

#aggregate(session_id) ⇒ Object



58
59
60
61
62
63
64
# File 'lib/confium/tc/coordinator.rb', line 58

def aggregate(session_id)
  session = @sessions[session_id] or raise "Unknown session: #{session_id}"
  raise "Threshold not met" if session[:shares].length < session[:threshold]
  session[:state] = :completed
  # In real implementation, calls FFI to aggregate shares
  session[:shares].map { |s| s[:bytes] }.join
end

#create_session(message:, threshold:, unlock_window: 14400) ⇒ Object



28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/confium/tc/coordinator.rb', line 28

def create_session(message:, threshold:, unlock_window: 14400)
  session_id = "session-#{@sessions.length + 1}"
  @sessions[session_id] = {
    message: message,
    threshold: threshold,
    unlock_window: unlock_window,
    state: :pending,
    commitments: [],
    shares: [],
  }
  session_id
end

#session_state(session_id) ⇒ Object



41
42
43
# File 'lib/confium/tc/coordinator.rb', line 41

def session_state(session_id)
  @sessions.dig(session_id, :state)
end

#submit_commitment(session_id, signer_id, commitment_bytes) ⇒ Object



45
46
47
48
49
50
51
# File 'lib/confium/tc/coordinator.rb', line 45

def submit_commitment(session_id, signer_id, commitment_bytes)
  session = @sessions[session_id] or raise "Unknown session: #{session_id}"
  session[:commitments] << { signer_id: signer_id, bytes: commitment_bytes }
  if session[:commitments].length >= session[:threshold]
    session[:state] = :commitments_collected
  end
end

#submit_share(session_id, signer_id, share_bytes) ⇒ Object



53
54
55
56
# File 'lib/confium/tc/coordinator.rb', line 53

def submit_share(session_id, signer_id, share_bytes)
  session = @sessions[session_id] or raise "Unknown session: #{session_id}"
  session[:shares] << { signer_id: signer_id, bytes: share_bytes }
end