Merge pull request #4674 from ethereum/circom_version_update

Circom version update
pull/4678/head
David Disu 8 months ago committed by GitHub
commit a7369679ac
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 21
      apps/circuit-compiler/src/app/components/configurations.tsx
  2. 25
      apps/circuit-compiler/src/app/services/circomPluginClient.ts
  3. 4
      apps/remix-ide-e2e/src/tests/circom.test.ts
  4. 2
      package.json
  5. 5
      yarn.lock

@ -42,6 +42,27 @@ export function Configurations ({primeValue, setPrimeValue, versionValue}: Confi
<option value="vesta">vesta</option> <option value="vesta">vesta</option>
</> </>
</RenderIf> </RenderIf>
<RenderIf condition={versionValue === '2.1.7'}>
<>
<option value="bn128">bn128</option>
<option value="bls12381">bls12381</option>
<option value="goldilocks">goldilocks</option>
<option value="grumpkin">grumpkin</option>
<option value="pallas">pallas</option>
<option value="vesta">vesta</option>
</>
</RenderIf>
<RenderIf condition={versionValue === '2.1.8'}>
<>
<option value="bn128">bn128</option>
<option value="bls12381">bls12381</option>
<option value="goldilocks">goldilocks</option>
<option value="grumpkin">grumpkin</option>
<option value="pallas">pallas</option>
<option value="vesta">vesta</option>
<option value="secq256r1">secq256r1</option>
</>
</RenderIf>
</select> </select>
</div> </div>
</CustomTooltip> </CustomTooltip>

@ -2,7 +2,9 @@ import { PluginClient } from '@remixproject/plugin'
import { createClient } from '@remixproject/plugin-webview' import { createClient } from '@remixproject/plugin-webview'
import EventManager from 'events' import EventManager from 'events'
import pathModule from 'path' import pathModule from 'path'
import { compiler_list } from 'circom_wasm' import { compiler_list, parse, compile, generate_r1cs, generate_witness } from 'circom_wasm'
import * as compilerV218 from 'circom_wasm/v2.1.8'
import * as compilerV217 from 'circom_wasm/v2.1.7'
import * as compilerV216 from 'circom_wasm/v2.1.6' import * as compilerV216 from 'circom_wasm/v2.1.6'
import * as compilerV215 from 'circom_wasm/v2.1.5' import * as compilerV215 from 'circom_wasm/v2.1.5'
import { extractNameFromKey, extractParentFromKey } from '@remix-ui/helper' import { extractNameFromKey, extractParentFromKey } from '@remix-ui/helper'
@ -11,13 +13,13 @@ import { CompilationConfig, CompilerReport, PrimeValue, ResolverOutput } from '.
export class CircomPluginClient extends PluginClient { export class CircomPluginClient extends PluginClient {
public internalEvents: EventManager public internalEvents: EventManager
private _compilationConfig: CompilationConfig = { private _compilationConfig: CompilationConfig = {
version: "2.1.6", version: "2.1.8",
prime: "bn128" prime: "bn128"
} }
private lastCompiledCircuitPath: string = '' private lastCompiledCircuitPath: string = ''
private lastParsedFiles: Record<string, string> = {} private lastParsedFiles: Record<string, string> = {}
private lastCompiledFile: string = '' private lastCompiledFile: string = ''
private compiler: typeof compilerV215 | typeof compilerV216 = compilerV216 private compiler: typeof compilerV215 & typeof compilerV216 & typeof compilerV217 & typeof compilerV218
constructor() { constructor() {
super() super()
@ -40,11 +42,16 @@ export class CircomPluginClient extends PluginClient {
this._compilationConfig.version = version this._compilationConfig.version = version
if (version === '2.1.5') this.compiler = compilerV215 if (version === '2.1.5') this.compiler = compilerV215
else if (version === '2.1.6') this.compiler = compilerV216 else if (version === '2.1.6') this.compiler = compilerV216
else if (version === '2.1.7') this.compiler = compilerV217
else if (version === '2.1.8') this.compiler = compilerV218
else this.compiler = null
} }
set compilerPrime (prime: PrimeValue) { set compilerPrime (prime: PrimeValue) {
if ((prime !== "bn128") && (prime !== "bls12381") && (prime !== "goldilocks") && (this._compilationConfig.version === '2.1.5')) throw new Error('Invalid prime value') if ((prime !== "bn128") && (prime !== "bls12381") && (prime !== "goldilocks") && (this._compilationConfig.version === '2.1.5')) throw new Error('Invalid prime value')
if ((prime !== "bn128") && (prime !== "bls12381") && (prime !== "goldilocks") && (prime !== "grumpkin") && (prime !== "pallas") && (prime !== "vesta") && (this._compilationConfig.version === '2.1.6')) throw new Error('Invalid prime value') if ((prime !== "bn128") && (prime !== "bls12381") && (prime !== "goldilocks") && (prime !== "grumpkin") && (prime !== "pallas") && (prime !== "vesta") && (this._compilationConfig.version === '2.1.6')) throw new Error('Invalid prime value')
if ((prime !== "bn128") && (prime !== "bls12381") && (prime !== "goldilocks") && (prime !== "grumpkin") && (prime !== "pallas") && (prime !== "vesta") && (this._compilationConfig.version === '2.1.7')) throw new Error('Invalid prime value')
if ((prime !== "bn128") && (prime !== "bls12381") && (prime !== "goldilocks") && (prime !== "grumpkin") && (prime !== "pallas") && (prime !== "vesta") && (prime !== "secq256r1") && (this._compilationConfig.version === '2.1.8')) throw new Error('Invalid prime value')
this._compilationConfig.prime = prime this._compilationConfig.prime = prime
} }
@ -54,7 +61,7 @@ export class CircomPluginClient extends PluginClient {
fileContent = await this.call('fileManager', 'readFile', path) fileContent = await this.call('fileManager', 'readFile', path)
} }
this.lastParsedFiles = await this.resolveDependencies(path, fileContent) this.lastParsedFiles = await this.resolveDependencies(path, fileContent)
const parsedOutput = this.compiler.parse(path, this.lastParsedFiles) const parsedOutput = this.compiler ? this.compiler.parse(path, this.lastParsedFiles) : parse(path, this.lastParsedFiles)
try { try {
const result: CompilerReport[] = JSON.parse(parsedOutput.report()) const result: CompilerReport[] = JSON.parse(parsedOutput.report())
@ -145,7 +152,7 @@ export class CircomPluginClient extends PluginClient {
this.compilerVersion = version this.compilerVersion = version
this.compilerPrime = prime this.compilerPrime = prime
} }
const circuitApi = this.compiler.compile(path, this.lastParsedFiles, { prime: this._compilationConfig.prime }) const circuitApi = this.compiler ? this.compiler.compile(path, this.lastParsedFiles, { prime: this._compilationConfig.prime }) : compile(path, this.lastParsedFiles, { prime: this._compilationConfig.prime })
const circuitProgram = circuitApi.program() const circuitProgram = circuitApi.program()
if (circuitProgram.length < 1) { if (circuitProgram.length < 1) {
@ -175,7 +182,7 @@ export class CircomPluginClient extends PluginClient {
log && this.call('terminal', 'log', { type: 'log', value: log }) log && this.call('terminal', 'log', { type: 'log', value: log })
}) })
// @ts-ignore // @ts-ignore
this.call('terminal', 'log', { type: 'typewritersuccess', value: 'Everything went okay, circom safe' }) this.call('terminal', 'log', { type: 'typewritersuccess', value: 'Everything went okay' })
} }
} }
@ -203,7 +210,7 @@ export class CircomPluginClient extends PluginClient {
this.compilerVersion = version this.compilerVersion = version
this.compilerPrime = prime this.compilerPrime = prime
} }
const r1csApi = this.compiler.generate_r1cs(path, this.lastParsedFiles, { prime: this._compilationConfig.prime }) const r1csApi = this.compiler ? this.compiler.generate_r1cs(path, this.lastParsedFiles, { prime: this._compilationConfig.prime }) : generate_r1cs(path, this.lastParsedFiles, { prime: this._compilationConfig.prime })
const r1csProgram = r1csApi.program() const r1csProgram = r1csApi.program()
if (r1csProgram.length < 1) { if (r1csProgram.length < 1) {
@ -222,7 +229,7 @@ export class CircomPluginClient extends PluginClient {
log && this.call('terminal', 'log', { type: 'log', value: log }) log && this.call('terminal', 'log', { type: 'log', value: log })
}) })
// @ts-ignore // @ts-ignore
this.call('terminal', 'log', { type: 'typewritersuccess', value: 'Everything went okay, circom safe' }) this.call('terminal', 'log', { type: 'typewritersuccess', value: 'Everything went okay' })
} }
} }
@ -234,7 +241,7 @@ export class CircomPluginClient extends PluginClient {
// @ts-ignore // @ts-ignore
const buffer: any = await this.call('fileManager', 'readFile', wasmPath, { encoding: null }) const buffer: any = await this.call('fileManager', 'readFile', wasmPath, { encoding: null })
const dataRead = new Uint8Array(buffer) const dataRead = new Uint8Array(buffer)
const witness = await this.compiler.generate_witness(dataRead, input) const witness = this.compiler ? await this.compiler.generate_witness(dataRead, input) : await generate_witness(dataRead, input)
// @ts-ignore // @ts-ignore
await this.call('fileManager', 'writeFile', wasmPath.replace('.wasm', '.wtn'), witness, true) await this.call('fileManager', 'writeFile', wasmPath.replace('.wasm', '.wtn'), witness, true)
this.internalEvents.emit('circuit_computing_witness_done') this.internalEvents.emit('circuit_computing_witness_done')

@ -111,7 +111,7 @@ module.exports = {
.waitForElementPresent('[data-id="circuit_feedback"]') .waitForElementPresent('[data-id="circuit_feedback"]')
.waitForElementVisible('[data-id="circuit_feedback"]') .waitForElementVisible('[data-id="circuit_feedback"]')
.assert.hasClass('[data-id="circuit_feedback"]', 'alert-warning') .assert.hasClass('[data-id="circuit_feedback"]', 'alert-warning')
.waitForElementContainsText('[data-id="circuit_feedback"]', 'File circuits/simple.circom does not include pragma version. Assuming pragma version (2, 1, 6)') .waitForElementContainsText('[data-id="circuit_feedback"]', 'File circuits/simple.circom does not include pragma version. Assuming pragma version (2, 1, 8)')
}, },
'Should hide/show warnings for compiled circuit #group4': function (browser: NightwatchBrowser) { 'Should hide/show warnings for compiled circuit #group4': function (browser: NightwatchBrowser) {
browser browser
@ -119,7 +119,7 @@ module.exports = {
.waitForElementNotPresent('[data-id="circuit_feedback"]') .waitForElementNotPresent('[data-id="circuit_feedback"]')
.click('[data-id="hide_circuit_warnings_checkbox_input"]') .click('[data-id="hide_circuit_warnings_checkbox_input"]')
.waitForElementVisible('[data-id="circuit_feedback"]') .waitForElementVisible('[data-id="circuit_feedback"]')
.waitForElementContainsText('[data-id="circuit_feedback"]', 'File circuits/simple.circom does not include pragma version. Assuming pragma version (2, 1, 6)') .waitForElementContainsText('[data-id="circuit_feedback"]', 'File circuits/simple.circom does not include pragma version. Assuming pragma version (2, 1, 8)')
}, },
'Should display error for invalid circuit #group4': function (browser: NightwatchBrowser) { 'Should display error for invalid circuit #group4': function (browser: NightwatchBrowser) {
browser browser

@ -167,7 +167,7 @@
"brace": "^0.8.0", "brace": "^0.8.0",
"change-case": "^4.1.1", "change-case": "^4.1.1",
"chokidar": "^2.1.8", "chokidar": "^2.1.8",
"circom_wasm": "^0.2.1", "circom_wasm": "https://github.com/remix-project-org/circom_wasm.git",
"color-support": "^1.1.3", "color-support": "^1.1.3",
"commander": "^9.4.1", "commander": "^9.4.1",
"core-js": "^3.6.5", "core-js": "^3.6.5",

@ -10544,10 +10544,9 @@ circom_runtime@0.1.22:
dependencies: dependencies:
ffjavascript "0.2.57" ffjavascript "0.2.57"
circom_wasm@^0.2.1: "circom_wasm@https://github.com/remix-project-org/circom_wasm.git":
version "0.2.1" version "0.2.1"
resolved "https://registry.yarnpkg.com/circom_wasm/-/circom_wasm-0.2.1.tgz#11eeceb497c03461676b3bc21d7d71ac3310dd58" resolved "https://github.com/remix-project-org/circom_wasm.git#f96a79cc231dfb5ae506a7f71bb628159c0b27c0"
integrity sha512-57Xhg3nUcQX+aMr+sH8XyxklpPgAWohjGkaEbiJDv3UiUveFAB2pOFOOE4whoMm7mjxKbO4n4mVs1oC031ApQQ==
circular-json@^0.3.0: circular-json@^0.3.0:
version "0.3.3" version "0.3.3"

Loading…
Cancel
Save