o1js
Version:
TypeScript framework for zk-SNARKs and zkApps
79 lines (68 loc) • 1.99 kB
text/typescript
import { Bool, Bytes, Crypto, Hash, ZkProgram, createEcdsa, createForeignCurve } from 'o1js';
export { Bytes32, Ecdsa, Secp256k1, ecdsa, ecdsaEthers, keccakAndEcdsa };
class Secp256k1 extends createForeignCurve(Crypto.CurveParams.Secp256k1) {}
class Scalar extends Secp256k1.Scalar {}
class Ecdsa extends createEcdsa(Secp256k1) {}
class Bytes32 extends Bytes(32) {}
const keccakAndEcdsa = ZkProgram({
name: 'ecdsa',
publicInput: Bytes32,
publicOutput: Bool,
methods: {
verifyEcdsa: {
privateInputs: [Ecdsa, Secp256k1],
async method(message: Bytes32, signature: Ecdsa, publicKey: Secp256k1) {
return {
publicOutput: signature.verify(message, publicKey),
};
},
},
},
});
const ecdsa = ZkProgram({
name: 'ecdsa-only',
publicInput: Scalar,
publicOutput: Bool,
methods: {
verifySignedHash: {
privateInputs: [Ecdsa, Secp256k1],
async method(message: Scalar, signature: Ecdsa, publicKey: Secp256k1) {
return {
publicOutput: signature.verifySignedHash(message, publicKey),
};
},
},
},
});
const ecdsaEthers = ZkProgram({
name: 'ecdsa-ethers',
publicInput: Bytes32,
publicOutput: Bool,
methods: {
verifyEthers: {
privateInputs: [Ecdsa, Secp256k1],
async method(message: Bytes32, signature: Ecdsa, publicKey: Secp256k1) {
return { publicOutput: signature.verifyEthers(message, publicKey) };
},
},
},
});
/**
* We can also use a different hash function with ECDSA, like SHA-256.
*/
const sha256AndEcdsa = ZkProgram({
name: 'ecdsa-sha256',
publicInput: Bytes32,
publicOutput: Bool,
methods: {
verifyEcdsa: {
privateInputs: [Ecdsa, Secp256k1],
async method(message: Bytes32, signature: Ecdsa, publicKey: Secp256k1) {
let messageHash = Hash.SHA2_256.hash(message);
return {
publicOutput: signature.verifySignedHash(messageHash, publicKey),
};
},
},
},
});