Wie können wir BGLS-Aggregatsignaturen in Solidity verifizieren?

BGLS [1] ist ein aggregiertes Signaturschema von Boneh et al., das die Aggregation von Signaturen auf n verschiedenen Nachrichten von n verschiedenen Unterzeichnern ermöglicht. Was ich erreichen möchte, ist, solche Signaturen in einem Smart Contract zu verifizieren.

Die Überprüfung einer einzelnen Signatur (einer BLS-Signatur) erfolgt durch Überprüfung der Gleichheit e(g1, σ) == e(v, h), wobei:

  • e : G1 x G2 -> GT ist eine bilineare Paarung/Abbildung
  • g1 ist ein Generator von G1
  • σ ist die Signatur
  • v ist der öffentliche Schlüssel des Unterzeichners
  • h ist der Hash der signierten Nachricht

Mit dem neuen vorkompilierten Vertrag bn256Pairing, der in Byzanz (und auch bn256Addund bn256ScalarMul) eingeführt wurde, können wir die Gleichheit überprüfen und die Signatur verifizieren.

Problem:
Um nun eine aggregierte Signatur zu verifizieren, müssen wir Folgendes berechnen:
e(g1, σ) == product of e(vi, hi) for all signers i
wobei vi und hi der öffentliche Schlüssel und die gehashte Nachricht des Unterzeichners i sind.

Dies scheint schwieriger zu sein, da wir die Paarungen tatsächlich berechnen und multiplizieren müssen, bevor wir die Gleichheit überprüfen. Der vorgefertigte Vertrag lässt jedoch nur eine Gleichheitsprüfung zu. Außerdem habe ich auf GitHub (Project-Arda/bgls-on-evm [2]) eine Implementierung gefunden, die aber anscheinend nur einzelne Signaturen verifizieren kann.

Frage:
Hat jemand einen Vorschlag, wie man diese aggregierte Signatur in Solidity verifizieren kann?

Hinweis: BGLS ist ursprünglich nicht mit den von Ethereum unterstützten Typ-3-Paarungen kompatibel, aber das Schema kann wie von Chatterjee et al. [3].

Verweise:

Aktualisierung (8. Juli 2018):

Ein Beispiel dafür, wie ich BLS- und BGLS-Signaturen in Solidity verifiziere, finden Sie unter https://gist.github.com/BjornvdLaan/ca6dd4e3993e1ef392f363ec27fe74c4

Antworten (1)

Ich denke, das ist eigentlich nur ein Notationsproblem. In der Originalarbeit sind die Gruppen multiplikativ geschrieben, während die Gruppen in den Ethereum-Dokumenten additiv geschrieben sind.

Insbesondere,

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

Dann können Sie die Überprüfung einfach durchführen, indem Sie die n-fache Paarungsprüfung verwenden

e(-g1, σ, v1, h1, v2, h2, ..., vn, hn)
Hallo Tjaden, danke für deine Antwort! Ich werde dies in den kommenden Tagen versuchen und entweder Ihre Antwort akzeptieren oder mit Kommentaren zurückkommen.
Ich habe Ihre Lösung für 2 und 3 Unterzeichner getestet und sie funktioniert. Danke vielmals!
@Saffie, wissen Sie, wie Sie das BLS in Etherum überprüfen können, wenn die Paarung auf diskreter Logarithmik basiert, wie im Originalpapier von BLS wie folgt beschriebenLet 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$
Das Originalpapier gibt eine Konstruktion an, die in jeder Gap-DH-Gruppe mit einer Paarungsfunktion funktioniert. Ethereum unterstützt nur die bn256-Gruppen, sodass Sie sich keine Gedanken über den Kopplungsgruppengenerator machen müssen, es gibt nur eine Kopplungsgruppe, die Sie verwenden können
Genau das, was @TjadenHess kommentiert. Ich habe speziell eine bearbeitete Version des BLS-Schemas verwendet, das die von Ethereum unterstützte Kopplung unterstützt. Sie können meine Kommentare und Ergebnisse auch in meinem Artikel einsehen: researchgate.net/publication/…
@TjadenHess Könnten Sie bitte eine Antwort auf diese Frage vorschlagen: ethereum.stackexchange.com/questions/71750/…