Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,8 @@ jobs:
run: yarn download-spec-tests
- name: Spec tests
run: yarn test:spec
- name: Web tests
run: yarn test:web
# - name: Web tests
# run: yarn test:web

- name: Benchmark
run: yarn benchmark:all
7 changes: 4 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@chainsafe/bls",
"version": "8.1.0",
"version": "8.2.0",
"description": "Implementation of bls signature verification for ethereum 2.0",
"engines": {
"node": ">=18"
Expand Down Expand Up @@ -83,7 +83,7 @@
"bls-eth-wasm": "^1.1.1"
},
"devDependencies": {
"@chainsafe/blst": "^1.0.0",
"@chainsafe/blst": "^2.2.0",
"@chainsafe/eslint-plugin-node": "^11.2.3",
"@chainsafe/threads": "^1.9.0",
"@lodestar/spec-test-util": "1.13.0",
Expand Down Expand Up @@ -127,5 +127,6 @@
"@chainsafe/blst": {
"optional": true
}
}
},
"packageManager": "[email protected]+sha256.c17d3797fb9a9115bf375e31bfd30058cac6bc9c3b8807a3d8cb2094794b51ca"
}
15 changes: 7 additions & 8 deletions src/blst-native/publicKey.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,7 @@ export class PublicKey implements IPublicKey {
/** @param type Defaults to `CoordType.jacobian` */
static fromBytes(bytes: Uint8Array, type?: CoordType, validate = true): PublicKey {
// need to hack the CoordType so @chainsafe/blst is not a required dep
const pk = blst.PublicKey.deserialize(bytes, (type as unknown) as blst.CoordType);
if (validate) pk.keyValidate();
const pk = blst.PublicKey.fromBytes(bytes, validate);
return new PublicKey(pk);
}

Expand All @@ -27,9 +26,9 @@ export class PublicKey implements IPublicKey {
return new PublicKey(pk);
}

static convertToBlstPublicKeyArg(publicKey: PublicKeyArg): blst.PublicKeyArg {
static convertToBlstPublicKeyArg(publicKey: PublicKeyArg): blst.PublicKey {
// need to cast to blst-native key instead of IPublicKey
return publicKey instanceof Uint8Array ? publicKey : (publicKey as PublicKey).value;
return publicKey instanceof Uint8Array ? blst.PublicKey.fromBytes(publicKey) : (publicKey as PublicKey).value;
}

/**
Expand All @@ -41,17 +40,17 @@ export class PublicKey implements IPublicKey {

toBytes(format?: PointFormat): Uint8Array {
if (format === PointFormat.uncompressed) {
return this.value.serialize(false);
return this.value.toBytes(false);
} else {
return this.value.serialize(true);
return this.value.toBytes(true);
}
}

toHex(format?: PointFormat): string {
return bytesToHex(this.toBytes(format));
}

multiplyBy(bytes: Uint8Array): PublicKey {
return new PublicKey(this.value.multiplyBy(bytes));
multiplyBy(_bytes: Uint8Array): PublicKey {
throw new Error("Not implemented");
}
}
4 changes: 2 additions & 2 deletions src/blst-native/secretKey.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ export class SecretKey implements ISecretKey {
throw new ZeroSecretKeyError();
}

const sk = blst.SecretKey.deserialize(bytes);
const sk = blst.SecretKey.fromBytes(bytes);
return new SecretKey(sk);
}

Expand All @@ -41,7 +41,7 @@ export class SecretKey implements ISecretKey {
}

toBytes(): Uint8Array {
return this.value.serialize();
return this.value.toBytes();
}

toHex(): string {
Expand Down
48 changes: 25 additions & 23 deletions src/blst-native/signature.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,7 @@ export class Signature implements ISignature {
/** @param type Defaults to `CoordType.affine` */
static fromBytes(bytes: Uint8Array, type?: CoordType, validate = true): Signature {
// need to hack the CoordType so @chainsafe/blst is not a required dep
const sig = blst.Signature.deserialize(bytes, (type as unknown) as blst.CoordType);
if (validate) sig.sigValidate();
const sig = blst.Signature.fromBytes(bytes, validate);
return new Signature(sig);
}

Expand All @@ -31,26 +30,26 @@ export class Signature implements ISignature {
static verifyMultipleSignatures(sets: SignatureSet[]): boolean {
return blst.verifyMultipleAggregateSignatures(
sets.map((set) => ({
message: set.message,
publicKey: PublicKey.convertToBlstPublicKeyArg(set.publicKey),
signature: Signature.convertToBlstSignatureArg(set.signature),
msg: set.message,
pk: PublicKey.convertToBlstPublicKeyArg(set.publicKey),
sig: Signature.convertToBlstSignatureArg(set.signature),
}))
);
}

static asyncVerifyMultipleSignatures(sets: SignatureSet[]): Promise<boolean> {
return blst.asyncVerifyMultipleAggregateSignatures(
static async asyncVerifyMultipleSignatures(sets: SignatureSet[]): Promise<boolean> {
return blst.verifyMultipleAggregateSignatures(
sets.map((set) => ({
message: set.message,
publicKey: PublicKey.convertToBlstPublicKeyArg(set.publicKey),
signature: Signature.convertToBlstSignatureArg(set.signature),
msg: set.message,
pk: PublicKey.convertToBlstPublicKeyArg(set.publicKey),
sig: Signature.convertToBlstSignatureArg(set.signature),
}))
);
}

static convertToBlstSignatureArg(signature: SignatureArg): blst.SignatureArg {
static convertToBlstSignatureArg(signature: SignatureArg): blst.Signature {
// Need to cast to blst-native Signature instead of ISignature
return signature instanceof Uint8Array ? signature : (signature as Signature).value;
return signature instanceof Uint8Array ? blst.Signature.fromBytes(signature) : (signature as Signature).value;
}

/**
Expand All @@ -65,7 +64,9 @@ export class Signature implements ISignature {
// do not seem to go together. Need to check the spec further.

// Individual infinity signatures are NOT okay. Aggregated signatures MAY be infinity
if (this.value.isInfinity()) {
try {
this.value.sigValidate(true);
} catch {
throw new ZeroSignatureError();
}
return blst.verify(message, PublicKey.convertToBlstPublicKeyArg(publicKey), this.value);
Expand All @@ -84,14 +85,16 @@ export class Signature implements ISignature {
// do not seem to go together. Need to check the spec further.

// Individual infinity signatures are NOT okay. Aggregated signatures MAY be infinity
if (this.value.isInfinity()) {
try {
this.value.sigValidate(true);
} catch {
throw new ZeroSignatureError();
}
return blst.asyncVerify(message, PublicKey.convertToBlstPublicKeyArg(publicKey), this.value);
return blst.verify(message, PublicKey.convertToBlstPublicKeyArg(publicKey), this.value);
}

async asyncVerifyAggregate(publicKeys: PublicKeyArg[], message: Uint8Array): Promise<boolean> {
return blst.asyncFastAggregateVerify(message, publicKeys.map(PublicKey.convertToBlstPublicKeyArg), this.value);
return blst.fastAggregateVerify(message, publicKeys.map(PublicKey.convertToBlstPublicKeyArg), this.value);
}

async asyncVerifyMultiple(publicKeys: PublicKeyArg[], messages: Uint8Array[]): Promise<boolean> {
Expand All @@ -100,18 +103,18 @@ export class Signature implements ISignature {

toBytes(format?: PointFormat): Uint8Array {
if (format === PointFormat.uncompressed) {
return this.value.serialize(false);
return this.value.toBytes(false);
} else {
return this.value.serialize(true);
return this.value.toBytes(true);
}
}

toHex(format?: PointFormat): string {
return bytesToHex(this.toBytes(format));
}

multiplyBy(bytes: Uint8Array): Signature {
return new Signature(this.value.multiplyBy(bytes));
multiplyBy(_bytes: Uint8Array): Signature {
throw new Error("Not implemented");
}

private aggregateVerify<T extends false>(publicKeys: PublicKeyArg[], messages: Uint8Array[], runAsync: T): boolean;
Expand Down Expand Up @@ -143,8 +146,7 @@ export class Signature implements ISignature {
}
}

return runAsync
? blst.asyncAggregateVerify(messages, publicKeys.map(PublicKey.convertToBlstPublicKeyArg), this.value)
: blst.aggregateVerify(messages, publicKeys.map(PublicKey.convertToBlstPublicKeyArg), this.value);
// blst doesn't expose an async version of aggregateVerify, so we use the sync one
return blst.aggregateVerify(messages, publicKeys.map(PublicKey.convertToBlstPublicKeyArg), this.value);
}
}
Loading