Class: KairosMcp::KairosChain::Chain

Inherits:
Object
  • Object
show all
Defined in:
lib/kairos_mcp/kairos_chain/chain.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(chain_file: nil, storage_backend: nil) ⇒ Chain

Initialize the chain

Parameters:

  • chain_file (String) (defaults to: nil)

    Path to blockchain file (for backward compatibility)

  • storage_backend (Storage::Backend, nil) (defaults to: nil)

    Storage backend to use



16
17
18
19
20
21
# File 'lib/kairos_mcp/kairos_chain/chain.rb', line 16

def initialize(chain_file: nil, storage_backend: nil)
  chain_file ||= KairosMcp.blockchain_path
  @chain_file = chain_file
  @storage_backend = storage_backend || default_storage_backend
  @chain = load_chain || [Block.genesis]
end

Instance Attribute Details

#chainObject (readonly)

Returns the value of attribute chain.



10
11
12
# File 'lib/kairos_mcp/kairos_chain/chain.rb', line 10

def chain
  @chain
end

Instance Method Details

#add_block(data) ⇒ Object



27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/kairos_mcp/kairos_chain/chain.rb', line 27

def add_block(data)
  # Ensure data is array of strings (serialize if needed)
  normalized_data = data.map { |d| d.is_a?(String) ? d : d.to_json }

  # 1. Create Merkle Root from data
  merkle_tree = MerkleTree.new(normalized_data)
  merkle_root = merkle_tree.root

  # 2. Create new block
  new_block = Block.new(
    index: latest_block.index + 1,
    timestamp: Time.now.utc,
    data: normalized_data,
    previous_hash: latest_block.hash,
    merkle_root: merkle_root
  )

  # 3. Add to chain
  @chain << new_block
  
  # 4. Persist
  save_chain
  
  new_block
end

#latest_blockObject



23
24
25
# File 'lib/kairos_mcp/kairos_chain/chain.rb', line 23

def latest_block
  @chain.last
end

#save_chainObject



73
74
75
# File 'lib/kairos_mcp/kairos_chain/chain.rb', line 73

def save_chain
  @storage_backend.save_all_blocks(@chain.map(&:to_h))
end

#storage_typeSymbol

Get the storage backend type

Returns:

  • (Symbol)

    :file or :sqlite



79
80
81
# File 'lib/kairos_mcp/kairos_chain/chain.rb', line 79

def storage_type
  @storage_backend.backend_type
end

#valid?Boolean

Returns:

  • (Boolean)


53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'lib/kairos_mcp/kairos_chain/chain.rb', line 53

def valid?
  @chain.each_with_index do |block, i|
    next if i == 0 # Skip genesis block

    previous_block = @chain[i - 1]

    # 1. Check previous_hash reference
    return false if block.previous_hash != previous_block.hash

    # 2. Check block hash integrity
    return false if block.hash != block.calculate_hash
    
    # 3. Check Merkle Root integrity
    calculated_merkle_root = MerkleTree.new(block.data).root
    return false if block.merkle_root != calculated_merkle_root
  end

  true
end