Hallo zusammen,
ich arbeite gegenwärtig ich Buch zum Thema Blockchain-Entwicklung durch und bin mittlerweile beim letzten Kapitel angekommen allerdings ist mir hier das ein oder andere nicht ganz verständlich, vielleicht kann mir hier ja wer weiterhelfen.
Im letzten Kapitel geht es darum u.A. Transaktionen zu signieren und anschießend zu verifizieren aber ich tu mich noch etwas schwer das ganze zu verstehen. Ich poste euch unten die entsprechenden Seiten im Buch damit ihr mir besser folgen könnt.
Und zwar ausgangssituation ist folgende: Ich habe einen Block Explorer erstellt über den es möglich ist die Blockchain zu durchsuchen und auch Transaktionen zu versenden. Um das versenden zu ermöglichen muss der User unter Anderem seinen privaten und öffentlichen Schlüssel eingeben. Diese werden dann im Frontend mittels JavaScript benutzt um die Transaktion zu signieren.
Im Backend soll das ganze dann mittels der Methoden „verify()“ verifiziert werden. Im Buch heißt es das Frontend und das Backend müssen die exakt gleiche Repräsentation einer Transaktionen verwenden. Ist damit die JSON Repräsentation gemeint oder der Hash oder beides?
Ebenfalls heißt es dann bei der Methode verify dass die Signatur selbst nur aus den Punkten R und S besteht. Diese „sind im ASN1 Format codiert und müssen aus dem Hex-String der Signatur ermittelt werden. Anschließend kann mit der Library von Bouncy Castle die Transaktion verifiziert werden“. Kann mir bitte wer in eigenen Worten erklären wie ich mit diesen 2 Punkten (und dem Hash der Transaktionen und dem Public Key) die Transaktion verifizieren soll?
Ich habe den gestrigen Tag bereits damit verbracht mich mit elliptischen Kurven auseinanderzusetzen, einige Uni-Vorlesungen dazu angesehen usw. Also mit dem Grundlegenden Prinzip davon bin ich vertraut, auch mit Gruppenoperationen usw. Aber wirklich verstehen tu ich diesen Schritt im Buch trotzdem noch nicht, villeicht kann mit ja wer helfen
//Methoden
public static boolean verify(byte[] hash, byte[] signature, byte[] publicKey) {
boolean result;
try(ASN1InputStream asn1 = new ASN1InputStream(signature)) {
ECDSASigner signer = new ECDSASigner();
signer.init(false, new ECPublicKeyParameters(CURVE.getCurve().decodePoint(publicKey), DOMAIN));
DLSequence seq = (DLSequence) asn1.readObject();
BigInteger r = ((ASN1Integer) seq.getObjectAt(0)).getPositiveValue();
BigInteger s = ((ASN1Integer) seq.getObjectAt(1)).getPositiveValue();
result = signer.verifySignature(hash, r, s);
} catch (Exception e) {
result = false;
}
return result;
}
Buchseiten: