@nori-zk/ethprocessor
Version:
zkApp for verifying SP1 Helios Nori proof and storing latest execution state root on Mina
79 lines • 3.53 kB
JavaScript
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
import { Field, PrivateKey, SmartContract, State, method, state, Poseidon, UInt64, PublicKey, Permissions, } from 'o1js';
import { EthProof, Bytes32 } from './EthVerifier.js';
import 'dotenv/config';
let ADMIN_PRIVATE_KEY = process.env.ADMIN_PRIVATE_KEY;
if (!ADMIN_PRIVATE_KEY) {
console.log('ADMIN_PRIVATE_KEY not set, using random key');
ADMIN_PRIVATE_KEY = PrivateKey.random().toBase58();
}
export const adminPrivateKey = PrivateKey.fromBase58(ADMIN_PRIVATE_KEY);
export const adminPublicKey = adminPrivateKey.toPublicKey();
export class EthProofType extends EthProof {
}
export class EthProcessor extends SmartContract {
constructor() {
super(...arguments);
this.verifiedStateRoot = State(); // todo make PackedString
this.latestHead = State();
this.admin = State();
}
// @state(Field) latestHeliusStoreInputHash = State<Field>(); //todo
// events = { 'executionStateRoot-set': Bytes32.provable };//todo change type, if events even possible
init() {
super.init();
this.admin.set(adminPublicKey);
this.latestHead.set(UInt64.from(0));
this.verifiedStateRoot.set(Field(1));
this.account.permissions.set({
...Permissions.default(),
});
}
//TODO deploy (for redeployments) ?
// async deploy(args: DeployArgs) {
// super.deploy(args);
// this.verifiedStateRoot.set(Field(2));
// }
// @method async init() {
// this.account.provedState.getAndRequireEquals();
// this.account.provedState.get().assertFalse();
// super.init();
// }
async update(ethProof) {
const currentHead = this.latestHead.getAndRequireEquals();
const proofHead = ethProof.publicInput.newHead;
const executionStateRoot = ethProof.publicInput.executionStateRoot;
proofHead.assertGreaterThan(currentHead, 'Proof head must be greater than current head');
ethProof.verify();
this.latestHead.set(proofHead);
this.verifiedStateRoot.set(Poseidon.hashPacked(Bytes32.provable, executionStateRoot));
// this.emitEvent('executionStateRoot-set', executionStateRoot);
}
}
__decorate([
state(Field),
__metadata("design:type", Object)
], EthProcessor.prototype, "verifiedStateRoot", void 0);
__decorate([
state(UInt64),
__metadata("design:type", Object)
], EthProcessor.prototype, "latestHead", void 0);
__decorate([
state(PublicKey),
__metadata("design:type", Object)
], EthProcessor.prototype, "admin", void 0);
__decorate([
method,
__metadata("design:type", Function),
__metadata("design:paramtypes", [EthProofType]),
__metadata("design:returntype", Promise)
], EthProcessor.prototype, "update", null);
//# sourceMappingURL=EthProcessor.js.map