Class: KairosMcp::KairosChain::Chain
- Inherits:
-
Object
- Object
- KairosMcp::KairosChain::Chain
- Defined in:
- lib/kairos_mcp/kairos_chain/chain.rb
Instance Attribute Summary collapse
-
#chain ⇒ Object
readonly
Returns the value of attribute chain.
Instance Method Summary collapse
- #add_block(data) ⇒ Object
-
#initialize(chain_file: nil, storage_backend: nil) ⇒ Chain
constructor
Initialize the chain.
- #latest_block ⇒ Object
- #save_chain ⇒ Object
-
#storage_type ⇒ Symbol
Get the storage backend type.
- #valid? ⇒ Boolean
Constructor Details
#initialize(chain_file: nil, storage_backend: nil) ⇒ Chain
Initialize the chain
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
#chain ⇒ Object (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_block ⇒ Object
23 24 25 |
# File 'lib/kairos_mcp/kairos_chain/chain.rb', line 23 def latest_block @chain.last end |
#save_chain ⇒ Object
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_type ⇒ Symbol
Get the storage backend type
79 80 81 |
# File 'lib/kairos_mcp/kairos_chain/chain.rb', line 79 def storage_type @storage_backend.backend_type end |
#valid? ⇒ 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 |