Actualizaci贸n de Safe Network Dev 馃嚜馃嚫 13 octubre 2022

Esta es una traducci贸n autom谩tica. El original en ingl茅s est谩 aqu铆: Update 13 October, 2022

Hemos estado hablando durante un tiempo sobre el proceso refactorizado para elegir nuevos ancianos de secci贸n y administrar divisiones. Esta semana, @anselme profundiza en el pensamiento detr谩s del enfoque de cinturones y aparatos ortop茅dicos para esto.

Progreso general

@Chriso est谩 refactorizando los procesos para firmar fragmentos y registros y probar el almacenamiento y el doble gasto de DBC.

@roland est谩 trabajando en pruebas para sn_sdkg AE y la funcionalidad de membres铆a que se describe a continuaci贸n.

Mostafa ha estado investigando mecanismos de consenso descentralizados y est谩 revisando nuestra configuraci贸n actual.
@davidrusu est谩 reelaborando el proceso de uni贸n para incluir una actualizaci贸n del conocimiento de la red antes de unirse.

Y @anselme y @dirvine est谩n refactorizando el proceso de autoridad como se describe la semana pasada.

@bzee, @bochaco y @joshuef est谩n trabajando para depurar la estabilidad de nivel inferior. Hemos visto una combinaci贸n de manejo lento de mensajes y errores en la administraci贸n de conexiones que causan problemas en ocasiones. As铆 que estamos tomando una inmersi贸n profunda aqu铆. Hemos hecho algunos progresos, simplificando la forma en que se manejan los mensajes y nos mantenemos en este frente, ya que parece que ser谩 una refactorizaci贸n bastante prometedora, tanto en t茅rminos de simplicidad del c贸digo como de estabilidad.

Todo sobre sn_sdkg


DKG con sn_sdkg

  • Basado en la generaci贸n de claves de poanetwork en hbbft
  • Elimina temporizadores
  • Presenta chismes
  • Adopta DKG concurrente
  • Una carrera entre DKGs a Handover

Acabamos de integrar sn_sdkg (generaci贸n de claves distribuidas sincr贸nicas de Safe Network), reemplazando la versi贸n anterior donde vimos fallas y tiempos de espera cuando las redes eran lentas. La causa ra铆z es probablemente que estamos usando temporizadores. Este nuevo proceso DKG no utiliza temporizadores, de hecho, no queremos ning煤n temporizador en Safe, en ning煤n lugar, en absoluto.

DKG no est谩 activo, es solo algo que los nodos hacen en segundo plano cuando reciben mensajes del sistema y pueden ejecutar varias sesiones al mismo tiempo.

Adem谩s de usar anti-entrop铆a (AE), sn_sdkg tambi茅n introduce chismes, para asegurarse de que los nodos reciban los mensajes que puedan faltar, para que todos sean eventualmente consistentes.

Recorr谩moslo.


Los ancianos env铆an DkgStart

  • divisi贸n de secci贸n
  • entrega de secci贸n

El primer paso en el proceso es que los ancianos env铆en un mensaje DkgStart. Esto sucede cuando surge una de dos situaciones. La primera es cuando llega un nodo a una secci贸n que es m谩s antigua que uno o m谩s de los antiguos actuales. En este caso, tenemos que traspasar: se promueve el nuevo nodo y se transmite el conocimiento de la secci贸n. El segundo escenario es cuando la secci贸n se vuelve demasiado grande y se divide.


pub struct DkgSessionId {
    /// Prefijo de la sesi贸n para la que somos candidatos mayores
    prefijo pub: prefijo,
    /// Otros ancianos en esta sesi贸n de dkg
    Ancianos del pub: BTreeMap<XorName, SocketAddr>,
    /// La longitud de la rama principal de la cadena de secci贸n.
    pub section_chain_len: u64,
    /// Los miembros de arranque para la siguiente instancia de Membres铆a.
    pub bootstrap_members: BTreeSet<NodeState>,
    /// La generaci贸n de miembros en la que se cre贸 una instancia de SAP
    pubmembership_gen: Generaci贸n,
}

Cuando hay un evento DkgStart, los ancianos generan informaci贸n en una estructura llamada DkgSessionId (el formato se llama 鈥榮truct鈥 en Rust). Firman esta estructura con su clave compartida BLS y la intercambian con los otros ancianos. Cada DkgSessionId proporciona informaci贸n b谩sica sobre el estado actual de las cosas y es exclusivo de una ronda DKG.

El prefijo es el prefijo de la secci贸n actual. En el caso de una entrega no cambia. En el caso de una divisi贸n, s铆, y agregamos un uno o un cero a nuestro prefijo actual dependiendo de si estamos en el lado 0 o 1 de la divisi贸n.

El campo 鈥榓ncianos鈥 contiene todos los nuevos ancianos candidatos para esta sesi贸n de DKG, nodos con una edad de nodo igual o mayor que la de un anciano actual.

section_chain_length (por cambiar de nombre) es la distancia desde la clave de secci贸n actual hasta G茅nesis. Podemos pensar en ello como la 鈥済eneraci贸n de la secci贸n鈥.

membership_gen tambi茅n muestra la generaci贸n de miembros. Es diferente a la generaci贸n de secciones. Cada secci贸n tiene muchas generaciones de miembros y la longitud de la cadena no cambia.

bootstrap_members son los ancianos actuales en la secci贸n.

Una vez que los nodos reciben DkgSessionIds de todos los ancianos actuales, pueden iniciar una sesi贸n DKG.

隆Vamos!


Pasos Dkg

diagrama de flujo LR;
A[DkgStart] --> B[Clave ef铆mera]

Todos los ancianos actuales y candidatos reciben un mensaje DkgStart dirigido a ellos y en el que se incluyen como ancianos en la estructura DkgSessionId.

Luego, cada uno de estos nodos genera una clave BLS 煤nica y ef铆mera que solo se usa para esta ronda DKG. Esta clave ef铆mera est谩 firmada con su clave ed25519, que sirve como su identidad, para que los otros nodos puedan verificar si es v谩lida.


Pasos Dkg

diagrama de flujo LR;
A[DkgStart] --> B[Clave ef铆mera] --> C[Votaci贸n]

Luego viene la etapa de votaci贸n en la que cada nodo puede generar sus propias claves para votar. Usamos un proceso tomado de Poanetwork de generaci贸n de claves en hbbft, lo que garantiza que cada nodo solo pueda generar su propia clave y no use informaci贸n de otros nodos para generar una clave separada para la ronda DKG.

Los nodos est谩n votando sobre cu谩les de los candidatos y ancianos existentes deber铆an ser ahora los ancianos de secci贸n.


Pasos Dkg

diagrama de flujo LR;
A[DkgStart] --> B[Clave ef铆mera] --> C[Votaci贸n] --> D{Generaci贸n de clave}

Una vez que finaliza la votaci贸n, el candidato genera una nueva clave que env铆a a los ancianos actuales para demostrar que es elegible para convertirse en un anciano (porque una gran mayor铆a de nodos lo han firmado con la clave reci茅n acu帽ada). Entonces DKG es una especie de prueba para un buen candidato. Si no terminan DKG, no son lo suficientemente buenos.


Concurrencia

diagrama de flujo LR;
A[DkgStart1] --> B[Clave ef铆mera] --> C[Votaci贸n] --> D{Generaci贸n de clave1}
diagrama de flujo LR;
A[DkgStart2] --> B[Clave ef铆mera] --> C[Votaci贸n] --> D{Generaci贸n de clave2}

Se pueden realizar varias sesiones de DKG a la vez. Cada vez que hay un nuevo miembro en la secci贸n, es posible que (si el nuevo nodo es m谩s antiguo que cualquiera de los antiguos actuales) tengamos una nueva sesi贸n de DKG, por lo que si mientras una sesi贸n est谩 en curso se une un nuevo nodo, puede comenzar otra sesi贸n de DKG. Algunos terminar谩n, otros simplemente expirar谩n y fallar谩n. Es una carrera, y elegimos el primero que termina. M谩s tarde, si resulta que hay un nodo m谩s antiguo que no es un mayor, el proceso comienza de nuevo.


Resuelto por traspaso

diagrama de estado-v2
Dkg1 --> Entrega
Entrega --> Ganador: Dkg1
Dkg2 --> Entrega
Dkg3 --> Entrega

Si hay empate, solo queremos un ganador, es decir, un nuevo anciano. El traspaso es un proceso que utiliza el consenso para decidir cu谩l debe ganar.


AE activo

diagrama de estado-v2
DkgStart --> Clave ef铆mera
EphemeralKey --> EphemeralKey: Incluye DkgStart AE
Clave ef铆mera --> Votaci贸n
Votaci贸n --> Votaci贸n:Incluye EphemeralKeys AE
Votaci贸n --> Terminaci贸n

En estas etapas mencionadas anteriormente, recibir un mensaje DkgStart, crear una clave ef铆mera y votar, debemos compensar los problemas de red y los nodos lentos. Por ejemplo, necesitamos las llaves de todos para empezar a votar, si no nos quedamos atascados. Por lo tanto, incluimos AE en cada mensaje relacionado con la clave para proporcionar informaci贸n de que podr铆a faltar un nodo. AE es una forma ligera y eficiente de asegurarse de que todos los nodos est茅n al d铆a.


enum SystemMsg {

    DkgStart(DkgSessionId),

    DkgEphemeralPubKey {
        /// El identificador de la sesi贸n DKG para la que es este mensaje.
        sesi贸n_id: DkgSessionId,
        /// Autorizaci贸n de secci贸n para el mensaje de inicio de DKG
        section_auth: Prueba de autoridad<Prueba de autenticaci贸n de secci贸n>,
        /// La clave bls ef铆mera elegida por el candidato
        pub_clave: BlsPublicKey,
        /// La firma ed25519 del candidato
        firma: Firma,
    },

    DkgVotes {
        /// El identificador de la sesi贸n DKG para la que es este mensaje.
        sesi贸n_id: DkgSessionId,
        /// Las claves p煤blicas bls ef铆meras utilizadas para esta ronda Dkg
        pub_keys: BTreeMap<XorName, (BlsPublicKey, Firma)>,
        /// El mensaje DKG.
        votos: Vec<DkgSignedVote>,
    },

    DkgAE(DkgSessionId),

    ...
}


En el c贸digo, un mensaje del sistema, que es el tipo de mensaje que se usa para los procesos que pueden cambiar la estructura de la red, se parece al anterior. Esto encapsula todos los procesos de los que hemos hablado.


Resiliencia

  • AE activo
  • Votaci贸n AE
  • Chisme
    • al esperar votos
    • al recibir votos desactualizados

Para concluir, tenemos m煤ltiples mecanismos de resiliencia al manejar traspasos y divisiones.

AE activo significa que a los nodos se les env铆a informaci贸n del paso anterior en caso de que se lo hayan perdido.

Tambi茅n tenemos chismes como respaldo. Si est谩s en una sesi贸n de DKG, est谩s listo para recibir claves ef铆meras o votos de alguien. Si no aparecen, env铆as tu conocimiento actual a los dem谩s con la esperanza de que te actualicen. Adem谩s, si recibe AE desactualizados de alguien, puede actualizarlos.

As铆 que el chisme tiene dos prop贸sitos. Para asegurarnos de que estamos actualizados para poder avanzar, y para actualizar a otros, para que podamos llegar a la terminaci贸n.

Junto con AE y permitiendo la competencia entre los procesos DKG, esto proporciona un proceso mucho m谩s s贸lido para promover nuevos ancianos y manejar divisiones. Durante las divisiones, tenemos dos DKG en lugar de uno.


Enlaces 煤tiles

No dude en responder a continuaci贸n con enlaces a las traducciones de esta actualizaci贸n para desarrolladores y los moderadores las agregar谩n aqu铆.

Como proyecto de c贸digo abierto, siempre estamos buscando retroalimentaci贸n, comentarios y contribuciones de la comunidad, as铆 que no sea t铆mido, 煤nase y creemos la red segura juntos.