@nori-zk/proof-conversion
Version:
Verifying zkVM proofs inside o1js circuits, to generate Mina compatible proof
95 lines • 4.5 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, Bytes, PublicKey, } from 'o1js';
import { BlobstreamMerkleWitness, BlobstreamProcessor, } from './blobstream_contract.js';
import { BatcherProof } from './batcher.js';
export const adminPrivateKey = PrivateKey.fromBase58('EKFcef5HKXAn7V2rQntLiXtJr15dkxrsrQ1G4pnYemhMEAWYbkZW');
export const adminPublicKey = adminPrivateKey.toPublicKey();
class BatcherProofType extends BatcherProof {
}
export class StateBytes extends Bytes(32) {
}
export class HelloWorldRollup extends SmartContract {
constructor() {
super(...arguments);
this.rollupState = State();
this.blobstreamAddress = State();
this.blobInclusionVkHash = State();
this.batcherVkHash = State();
}
init() {
super.init();
this.rollupState.set(Poseidon.hashPacked(Field, Field.from(0n)));
this.account.delegate.set(adminPublicKey);
}
async setParameters(admin, blobstreamAddress, blobInclusionVkHash, batcherVkHash) {
this.blobstreamAddress.set(blobstreamAddress);
this.blobInclusionVkHash.set(blobInclusionVkHash);
this.batcherVkHash.set(batcherVkHash);
const adminPk = admin.toPublicKey();
this.account.delegate.requireEquals(adminPk);
}
async update(admin, pathInBlobstream, batcherProof) {
const blobstreamAddress = this.blobstreamAddress.get();
this.blobstreamAddress.requireEquals(blobstreamAddress);
const blobstreamContract = new BlobstreamProcessor(this.blobstreamAddress.get());
const blobstreamRoot = blobstreamContract.commitmentsRoot.get();
blobstreamContract.commitmentsRoot.requireEquals(blobstreamRoot);
batcherProof.verify();
pathInBlobstream
.calculateRoot(Poseidon.hash([...batcherProof.publicOutput.dataCommitment.toFields()]))
.assertEquals(blobstreamRoot);
const currentState = this.rollupState.getAndRequireEquals();
currentState.assertEquals(batcherProof.publicOutput.initialStateHash);
this.rollupState.set(batcherProof.publicOutput.currentStateHash);
const blobInclusionVkHash = this.blobInclusionVkHash.get();
this.blobInclusionVkHash.requireEquals(blobInclusionVkHash);
blobInclusionVkHash.assertEquals(batcherProof.publicInput.blobInclusionVkHash);
const batcherVkHash = this.batcherVkHash.get();
this.batcherVkHash.requireEquals(batcherVkHash);
batcherVkHash.assertEquals(batcherProof.publicInput.batcherVkHash);
const adminPk = admin.toPublicKey();
this.account.delegate.requireEquals(adminPk);
}
}
__decorate([
state(Field),
__metadata("design:type", Object)
], HelloWorldRollup.prototype, "rollupState", void 0);
__decorate([
state(PublicKey),
__metadata("design:type", Object)
], HelloWorldRollup.prototype, "blobstreamAddress", void 0);
__decorate([
state(Field),
__metadata("design:type", Object)
], HelloWorldRollup.prototype, "blobInclusionVkHash", void 0);
__decorate([
state(Field),
__metadata("design:type", Object)
], HelloWorldRollup.prototype, "batcherVkHash", void 0);
__decorate([
method,
__metadata("design:type", Function),
__metadata("design:paramtypes", [PrivateKey,
PublicKey,
Field,
Field]),
__metadata("design:returntype", Promise)
], HelloWorldRollup.prototype, "setParameters", null);
__decorate([
method,
__metadata("design:type", Function),
__metadata("design:paramtypes", [PrivateKey,
BlobstreamMerkleWitness,
BatcherProofType]),
__metadata("design:returntype", Promise)
], HelloWorldRollup.prototype, "update", null);
//# sourceMappingURL=rollup.js.map