¿Cómo podemos verificar las firmas agregadas de BGLS en Solidity?

BGLS [1] es un esquema de firma agregada de Boneh et al., que permite la agregación de firmas en n mensajes diferentes de n firmantes diferentes. Lo que quiero lograr es verificar tales firmas en un contrato inteligente.

La verificación de una sola firma (una firma BLS) se realiza mediante la verificación de la igualdad e(g1, σ) == e(v, h), donde:

  • e : G1 x G2 -> GT es un emparejamiento/mapeo bilineal
  • g1 es un generador de G1
  • σ es la firma
  • v es la clave pública del firmante
  • h es el hash del mensaje firmado

Usando el nuevo contrato precompilado bn256Pairingintroducido en Bizancio (y también bn256Addy bn256ScalarMul), podemos verificar la igualdad y verificar la firma.

Problema:
ahora, para verificar una firma agregada, necesitamos calcular:
e(g1, σ) == product of e(vi, hi) for all signers i
donde vi y hi son la clave pública y el mensaje cifrado del firmante i.

Esto parece ser más difícil ya que debemos calcular los emparejamientos y multiplicarlos antes de verificar la igualdad. Sin embargo, el contrato precompilado solo permite verificar la igualdad. Además, encontré una implementación en GitHub (Project-Arda/bgls-on-evm [2]), pero solo parece capaz de verificar firmas individuales.

Pregunta:
¿Alguien tiene alguna sugerencia sobre cómo verificar esta firma agregada en Solidity?

Nota: BGLS originalmente no es compatible con los emparejamientos de tipo 3 que son compatibles con Ethereum, pero el esquema se puede modificar según lo sugerido por Chatterjee et al. [3].

Referencias:

Actualización (8 de julio de 2018):

Un ejemplo de cómo verifico las firmas BLS y BGLS en Solidity se encuentra en https://gist.github.com/BjornvdLaan/ca6dd4e3993e1ef392f363ec27fe74c4

Respuestas (1)

Creo que esto es en realidad solo un problema de notación. En el documento original, los grupos se escriben de forma multiplicativa, mientras que los grupos en los documentos de Ethereum se escriben de forma aditiva.

En particular,

e(g1, σ) = e(g1, x1*h1+x2*h2+...) = x1*e(g1,h1) + x2*e(g1,h2)+...+xn*e(g1,hn)

Luego puede hacer la verificación simplemente usando la verificación de emparejamiento n-ario

e(-g1, σ, v1, h1, v2, h2, ..., vn, hn)
Hola Tjaden, gracias por tu respuesta! Intentaré esto en los próximos días y aceptaré su respuesta o regresaré con comentarios.
Probé su solución para 2 y 3 firmantes, y está funcionando. ¡Muchas gracias!
@Saffie, ¿sabe cómo verificar el BLS en etherum si el emparejamiento se basa en logarítmico discreto como se describe en el documento original de BLS de la siguiente manera?Let PG be a pairing group generator that on input $1^k$ outputs descriptions of multiplicative groups $G_1$ and $G_T$ of prime order $p$ where $|p| =k$. Let and let $g \in G_1^{*}$ and $G_{1}^{*}=G_{1} \backslash\{1\}$ .The generated groups are such that there exists an admissible bilinear map $e : G_1 × G_1 → G_T$, meaning that (1) for all $a, b ∈ Z_p$ it holds that $e(g^a,g^b )=e(g,g)^{ab}$ (2) $e(g,g)≠1$
El documento original ofrece una construcción que funciona en cualquier grupo gap-DH con una función de emparejamiento. Ethereum solo admite los grupos bn256, por lo que no se preocupe por el generador de grupos de emparejamiento, solo hay un grupo de emparejamiento que puede usar
Exactamente lo que comenta @TjadenHess. Utilicé específicamente una versión editada del esquema BLS que admite el emparejamiento que admite Ethereum. También puede revisar mis comentarios y hallazgos en mi artículo: researchgate.net/publication/…
@TjadenHess ¿Podría sugerir una respuesta a esta pregunta: ethereum.stackexchange.com/questions/71750/…