o1js
Version:
TypeScript framework for zk-SNARKs and zkApps
73 lines (61 loc) • 2.34 kB
text/typescript
import { CircuitString, SmartContract, method, Mina, PrivateKey } from 'o1js';
import * as assert from 'assert/strict';
// circuit which tests a couple of string features
class MyContract extends SmartContract {
async checkString(s: CircuitString) {
let sWithExclamation = s.append(CircuitString.fromString('!'));
sWithExclamation
.equals(CircuitString.fromString('a string!'))
.or(sWithExclamation.equals(CircuitString.fromString('some string!')))
.assertTrue();
}
}
let address = PrivateKey.random().toPublicKey();
console.log('compile...');
await MyContract.compile();
// should work
console.log('prove...');
let tx = await Mina.transaction(() =>
new MyContract(address).checkString(CircuitString.fromString('a string'))
);
await tx.prove();
console.log('test 1 - ok');
// should work
tx = await Mina.transaction(() =>
new MyContract(address).checkString(CircuitString.fromString('some string'))
);
await tx.prove();
console.log('test 2 - ok');
// should fail
let fails = await Mina.transaction(() =>
new MyContract(address).checkString(CircuitString.fromString('different'))
)
.then(() => false)
.catch(() => true);
if (!fails) Error('proof was supposed to fail');
console.log('test 3 - ok');
const str = CircuitString.fromString('Your size');
const not_same_str = CircuitString.fromString('size');
assert.equal(str.equals(not_same_str).toBoolean(), false);
const equal1 = CircuitString.fromString('These strings are equivalent');
const equal2 = CircuitString.fromString('These strings are equivalent');
const circuitString = CircuitString.fromString(
'This string completely encompasses this string'
);
const substring = CircuitString.fromString('this string');
if (!equal1.equals(equal2).toBoolean())
throw Error('Strings are not equivalent 1');
console.log('Equivalent: "', equal1.toString(), '", "', equal2.toString(), '"');
if (!circuitString.substring(35, 46).equals(substring).toBoolean())
throw Error('Strings are not equivalent 2');
console.log(
'Equivalent: "',
circuitString.substring(35, 46).toString(),
'", "',
substring.toString(),
'"'
);
// if (!circuitString.contains(substring).toBoolean())
// throw Error('String does not contain substring');
console.log(circuitString.append(substring).toString());
console.log('Everything looks good!');