You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
- Refactored the user facing surface of self-healing-open and local sealing. The whole feature is now `sealing-recovery` with `self-healing-open` now referred to as the `recovery-decision-protocol`. (#7679)
15
+
- Local sealing is enabled by setting the `sealing-recovery` config field (for both the sealing node, and the unsealing recovery node)
16
+
- The local sealing identity is under `sealing-recovery.location.name`
17
+
- The recovery-decision-protocol is configured via `sealing-recovery.recovery_decision_protocol`
Copy file name to clipboardExpand all lines: doc/audit/builtin_maps.rst
+35-30Lines changed: 35 additions & 30 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -581,64 +581,69 @@ While the contents themselves are encrypted, the table is public so as to be acc
581
581
:project: CCF
582
582
:members:
583
583
584
+
``sealing_recovery_names``
585
+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
586
+
587
+
Mapping from sealing recovery names to node IDs for nodes that support local sealing. This table is used alongside ``nodes.sealed_recovery_keys`` to fetch the sealed recovery key when a node is recovering.
588
+
589
+
**Key** Sealing recovery name of the node, represented as a string.
590
+
591
+
**Value** Node ID: SHA-256 digest of the node public key, represented as a hex-encoded string.
592
+
584
593
``last_recovery_type``
585
594
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
586
595
**Value** The mechanism by which the ledger secret was recovered.
587
596
588
597
.. doxygenenum:: ccf::RecoveryType
589
598
:project: CCF
590
599
591
-
``self_healing_open.nodes``
592
-
~~~~~~~~~~~~~~~~~~~~~~~~~~~
600
+
``recovery_decision_protocol.nodes``
601
+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
593
602
594
-
**Key** Intrinsic node ID: A string which is unique to a particular node role within a cluster.
603
+
**Key** Location name: A string which is unique to the location of a particular node within a network.
**Value** The TxID of the last recovered signed transaction known by the source node.
612
617
613
-
``self_healing_open.chosen_node``
614
-
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
618
+
``recovery_decision_protocol.chosen_node``
619
+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
615
620
616
-
**Value** The intrinsic node ID of the chosen node. This will either be the node this node voted for, or the node that is has received an `IAmOpen` message from.
621
+
**Value** The location name of the chosen node. This will either be the node this node voted for, or the node that it has received an `IAmOpen` message from.
617
622
618
-
``self_healing_open.votes``
619
-
~~~~~~~~~~~~~~~~~~~~~~~~~~~
623
+
``recovery_decision_protocol.votes``
624
+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
620
625
621
-
**Key** Intrinsic node ID of the node which has voted for this node to be opened.
626
+
**Key** Location name of the node which has voted for this node to be opened.
622
627
623
-
``self_healing_open.sm_state``
624
-
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
628
+
``recovery_decision_protocol.sm_state``
629
+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
625
630
626
-
**Value** State machine state of the self-healing open protocol.
631
+
**Value** State machine state of the recovery decision protocol.
**Value** Timeout state machine state of the self-healing open protocol. Ticks based on `failover_timeout` and advances `self_healing_open.sm_state` if it falls behind.
639
+
**Value** Timeout state machine state of the recovery decision protocol. Ticks based on `failover_timeout` and advances `recovery_decision_protocol.sm_state` if it falls behind.
635
640
636
-
See :cpp:enum:`ccf::self_healing_open::StateMachine` above.
641
+
See :cpp:enum:`ccf::recovery_decision_protocol::StateMachine` above.
637
642
638
-
``self_healing_open.open_kind``
639
-
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
643
+
``recovery_decision_protocol.open_kind``
644
+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
640
645
641
646
**Value** The kind of recovery that was performed, either `Quorum`-based which guarantees that there is at most one recovered service using this path, or `Failover`-based which could allow multiple services to recover.
Copy file name to clipboardExpand all lines: doc/host_config_schema/cchost_config.json
+53-53Lines changed: 53 additions & 53 deletions
Original file line number
Diff line number
Diff line change
@@ -356,55 +356,6 @@
356
356
"previous_service_identity_file": {
357
357
"type": "string",
358
358
"description": "Path to the previous service certificate (PEM) file"
359
-
},
360
-
"previous_local_sealing_identity": {
361
-
"type": ["string", "null"],
362
-
"description": "The identity of the previous node which sealed the ledger secrets. Required if local sealing is enabled"
363
-
},
364
-
"self_healing_open": {
365
-
"type": "object",
366
-
"properties": {
367
-
"identity": {
368
-
"type": "object",
369
-
"properties": {
370
-
"intrinsic_id": {
371
-
"type": "string",
372
-
"description": "Intrinsic identifier of this node, used to identify it in the self-healing-open protocol"
373
-
},
374
-
"published_address": {
375
-
"type": "string",
376
-
"description": "Published address (host:port) of this node, used to identify it in the self-healing-open protocol"
377
-
}
378
-
}
379
-
},
380
-
"cluster_identities": {
381
-
"type": "array",
382
-
"items": {
383
-
"type": "object",
384
-
"properties": {
385
-
"intrinsic_id": {
386
-
"type": "string",
387
-
"description": "Intrinsic identifier of the node, used to identify it in the self-healing-open protocol"
388
-
},
389
-
"published_address": {
390
-
"type": "string",
391
-
"description": "Published address (host:port) of the node, used for communication during the self-healing-open protocol"
392
-
}
393
-
}
394
-
},
395
-
"description": "List of identities for all nodes in the cluster"
396
-
},
397
-
"retry_timeout": {
398
-
"type": "string",
399
-
"default": "100ms",
400
-
"description": "Interval (time string) at which the node re-sends self-healing-open messages. This should be significantly less than 'failover_timeout'"
401
-
},
402
-
"failover_timeout": {
403
-
"type": "string",
404
-
"default": "2000ms",
405
-
"description": "Interval (time string) after which the node forcibly advances to the next phase of the self-healing-open protocol"
"description": "Enable sealing of ledger secrets using platform derived key capabilities (e.g. AMD SEV-SNP derived keys). This allows the node to unilaterally recover its ledger secrets on restart without needing to reconstruct them from recovery shares."
664
+
"sealing_recovery": {
665
+
"type": "object",
666
+
"description": "Optional. Controls the behaviour of sealing-based recovery. If set, enables sealing of ledger secrets using platform derived key capabilities (e.g. AMD SEV-SNP derived keys). This allows a future recovering node to unilaterally recover its ledger secrets on restart without needing to reconstruct them from recovery shares.",
667
+
"properties": {
668
+
"location": {
669
+
"type": "object",
670
+
"properties": {
671
+
"name": {
672
+
"type": "string"
673
+
},
674
+
"address": {
675
+
"type": "string"
676
+
}
677
+
},
678
+
"required": ["name", "address"],
679
+
"additionalProperties": false
680
+
},
681
+
"recovery_decision_protocol": {
682
+
"type": "object",
683
+
"properties": {
684
+
"expected_locations": {
685
+
"type": "array",
686
+
"description": "List of locations that the recovery_decision_protocol expects to be part of the previous network.",
687
+
"items": {
688
+
"type": "object",
689
+
"properties": {
690
+
"name": {
691
+
"type": "string"
692
+
},
693
+
"address": {
694
+
"type": "string"
695
+
}
696
+
},
697
+
"required": ["name", "address"],
698
+
"additionalProperties": false
699
+
}
700
+
},
701
+
"message_retry_timeout": {
702
+
"type": "string",
703
+
"default": "100ms"
704
+
},
705
+
"failover_timeout": {
706
+
"type": "string",
707
+
"default": "2000ms",
708
+
"description": "Timeout duration before failover forcibly advances the recovery_decision_protocol, allowing recovery to proceed even in the presence of unresponsive nodes. Set to 0 to disable failover."
0 commit comments