@devtion/actions 0.0.0-5d170d3 → 0.0.0-7cfaa5d
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.mjs +68 -93
- package/dist/index.node.js +67 -92
- package/dist/types/src/helpers/constants.d.ts +6 -0
- package/dist/types/src/helpers/constants.d.ts.map +1 -1
- package/dist/types/src/helpers/security.d.ts +2 -2
- package/dist/types/src/helpers/security.d.ts.map +1 -1
- package/dist/types/src/helpers/utils.d.ts.map +1 -1
- package/dist/types/src/helpers/vm.d.ts.map +1 -1
- package/dist/types/src/types/index.d.ts.map +1 -1
- package/package.json +2 -6
- package/src/helpers/constants.ts +7 -1
- package/src/helpers/functions.ts +1 -1
- package/src/helpers/security.ts +28 -50
- package/src/helpers/services.ts +1 -1
- package/src/helpers/utils.ts +77 -83
- package/src/helpers/vm.ts +9 -3
- package/src/index.ts +2 -2
- package/src/types/index.ts +9 -5
package/dist/index.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @module @
|
|
3
|
-
* @version 1.0.
|
|
2
|
+
* @module @devtion/actions
|
|
3
|
+
* @version 1.0.8
|
|
4
4
|
* @file A set of actions and helpers for CLI commands
|
|
5
5
|
* @copyright Ethereum Foundation 2022
|
|
6
6
|
* @license MIT
|
|
@@ -17,8 +17,7 @@ import crypto from 'crypto';
|
|
|
17
17
|
import blake from 'blakejs';
|
|
18
18
|
import { utils } from 'ffjavascript';
|
|
19
19
|
import winston from 'winston';
|
|
20
|
-
import {
|
|
21
|
-
import { pipeline, Readable } from 'stream';
|
|
20
|
+
import { pipeline } from 'stream';
|
|
22
21
|
import { promisify } from 'util';
|
|
23
22
|
import { initializeApp } from 'firebase/app';
|
|
24
23
|
import { signInWithCredential, initializeAuth, getAuth } from 'firebase/auth';
|
|
@@ -244,6 +243,12 @@ const commonTerms = {
|
|
|
244
243
|
verificationStartedAt: "verificationStartedAt"
|
|
245
244
|
}
|
|
246
245
|
},
|
|
246
|
+
avatars: {
|
|
247
|
+
name: "avatars",
|
|
248
|
+
fields: {
|
|
249
|
+
avatarUrl: "avatarUrl"
|
|
250
|
+
}
|
|
251
|
+
},
|
|
247
252
|
ceremonies: {
|
|
248
253
|
name: "ceremonies",
|
|
249
254
|
fields: {
|
|
@@ -334,7 +339,7 @@ const commonTerms = {
|
|
|
334
339
|
finalizeCircuit: "finalizeCircuit",
|
|
335
340
|
finalizeCeremony: "finalizeCeremony",
|
|
336
341
|
downloadCircuitArtifacts: "downloadCircuitArtifacts",
|
|
337
|
-
transferObject: "transferObject"
|
|
342
|
+
transferObject: "transferObject"
|
|
338
343
|
}
|
|
339
344
|
};
|
|
340
345
|
|
|
@@ -1052,7 +1057,8 @@ const parseCeremonyFile = async (path, cleanup = false) => {
|
|
|
1052
1057
|
// read the data
|
|
1053
1058
|
const data = JSON.parse(fs.readFileSync(path).toString());
|
|
1054
1059
|
// verify that the data is correct
|
|
1055
|
-
if (data[
|
|
1060
|
+
if (data["timeoutMechanismType"] !== "DYNAMIC" /* CeremonyTimeoutType.DYNAMIC */ &&
|
|
1061
|
+
data["timeoutMechanismType"] !== "FIXED" /* CeremonyTimeoutType.FIXED */)
|
|
1056
1062
|
throw new Error("Invalid timeout type. Please choose between DYNAMIC and FIXED.");
|
|
1057
1063
|
// validate that we have at least 1 circuit input data
|
|
1058
1064
|
if (!data.circuits || data.circuits.length === 0)
|
|
@@ -1085,42 +1091,26 @@ const parseCeremonyFile = async (path, cleanup = false) => {
|
|
|
1085
1091
|
circuitArtifacts.push({
|
|
1086
1092
|
artifacts: artifacts
|
|
1087
1093
|
});
|
|
1088
|
-
const r1csPath = artifacts.r1csStoragePath;
|
|
1089
|
-
const wasmPath = artifacts.wasmStoragePath;
|
|
1090
1094
|
// where we storing the r1cs downloaded
|
|
1091
1095
|
const localR1csPath = `./${circuitData.name}.r1cs`;
|
|
1092
|
-
//
|
|
1093
|
-
|
|
1094
|
-
// just the correct region
|
|
1095
|
-
const s3 = new S3Client({ region: artifacts.region });
|
|
1096
|
-
try {
|
|
1097
|
-
await s3.send(new HeadObjectCommand({
|
|
1098
|
-
Bucket: artifacts.bucket,
|
|
1099
|
-
Key: r1csPath
|
|
1100
|
-
}));
|
|
1101
|
-
}
|
|
1102
|
-
catch (error) {
|
|
1103
|
-
throw new Error(`The r1cs file (${r1csPath}) seems to not exist. Please ensure this is correct and that the object is publicly available.`);
|
|
1104
|
-
}
|
|
1105
|
-
try {
|
|
1106
|
-
await s3.send(new HeadObjectCommand({
|
|
1107
|
-
Bucket: artifacts.bucket,
|
|
1108
|
-
Key: wasmPath
|
|
1109
|
-
}));
|
|
1110
|
-
}
|
|
1111
|
-
catch (error) {
|
|
1112
|
-
throw new Error(`The wasm file (${wasmPath}) seems to not exist. Please ensure this is correct and that the object is publicly available.`);
|
|
1113
|
-
}
|
|
1096
|
+
// where we storing the wasm downloaded
|
|
1097
|
+
const localWasmPath = `./${circuitData.name}.wasm`;
|
|
1114
1098
|
// download the r1cs to extract the metadata
|
|
1115
|
-
const command = new GetObjectCommand({ Bucket: artifacts.bucket, Key: artifacts.r1csStoragePath });
|
|
1116
|
-
const response = await s3.send(command);
|
|
1117
1099
|
const streamPipeline = promisify(pipeline);
|
|
1118
|
-
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
|
|
1100
|
+
// Make the call.
|
|
1101
|
+
const responseR1CS = await fetch(artifacts.r1csStoragePath);
|
|
1102
|
+
// Handle errors.
|
|
1103
|
+
if (!responseR1CS.ok && responseR1CS.status !== 200)
|
|
1104
|
+
throw new Error(`There was an error while trying to download the r1cs file for circuit ${circuitData.name}. Please check that the file has the correct permissions (public) set.`);
|
|
1105
|
+
await streamPipeline(responseR1CS.body, createWriteStream(localR1csPath));
|
|
1106
|
+
// Write the file locally
|
|
1122
1107
|
// extract the metadata from the r1cs
|
|
1123
1108
|
const metadata = getR1CSInfo(localR1csPath);
|
|
1109
|
+
// download wasm too to ensure it's available
|
|
1110
|
+
const responseWASM = await fetch(artifacts.wasmStoragePath);
|
|
1111
|
+
if (!responseWASM.ok && responseWASM.status !== 200)
|
|
1112
|
+
throw new Error(`There was an error while trying to download the WASM file for circuit ${circuitData.name}. Please check that the file has the correct permissions (public) set.`);
|
|
1113
|
+
await streamPipeline(responseWASM.body, createWriteStream(localWasmPath));
|
|
1124
1114
|
// validate that the circuit hash and template links are valid
|
|
1125
1115
|
const template = circuitData.template;
|
|
1126
1116
|
const URLMatch = template.source.match(urlPattern);
|
|
@@ -1138,7 +1128,7 @@ const parseCeremonyFile = async (path, cleanup = false) => {
|
|
|
1138
1128
|
const wasmCompleteFilename = `${circuitData.name}.wasm`;
|
|
1139
1129
|
const smallestPowersOfTauCompleteFilenameForCircuit = `${potFilenameTemplate}${doubleDigitsPowers}.ptau`;
|
|
1140
1130
|
const firstZkeyCompleteFilename = `${circuitPrefix}_${genesisZkeyIndex}.zkey`;
|
|
1141
|
-
// storage paths
|
|
1131
|
+
// storage paths
|
|
1142
1132
|
const r1csStorageFilePath = getR1csStorageFilePath(circuitPrefix, r1csCompleteFilename);
|
|
1143
1133
|
const wasmStorageFilePath = getWasmStorageFilePath(circuitPrefix, wasmCompleteFilename);
|
|
1144
1134
|
const potStorageFilePath = getPotStorageFilePath(smallestPowersOfTauCompleteFilenameForCircuit);
|
|
@@ -1154,7 +1144,7 @@ const parseCeremonyFile = async (path, cleanup = false) => {
|
|
|
1154
1144
|
initialZkeyStoragePath: zkeyStorageFilePath,
|
|
1155
1145
|
r1csBlake2bHash: r1csBlake2bHash
|
|
1156
1146
|
};
|
|
1157
|
-
// validate that the compiler hash is a valid hash
|
|
1147
|
+
// validate that the compiler hash is a valid hash
|
|
1158
1148
|
const compiler = circuitData.compiler;
|
|
1159
1149
|
const compilerHashMatch = compiler.commitHash.match(commitHashPattern);
|
|
1160
1150
|
if (!compilerHashMatch || compilerHashMatch.length === 0 || compilerHashMatch.length > 1)
|
|
@@ -1189,7 +1179,7 @@ const parseCeremonyFile = async (path, cleanup = false) => {
|
|
|
1189
1179
|
contributionComputation: 0,
|
|
1190
1180
|
fullContribution: 0,
|
|
1191
1181
|
verifyCloudFunction: 0
|
|
1192
|
-
}
|
|
1182
|
+
}
|
|
1193
1183
|
};
|
|
1194
1184
|
}
|
|
1195
1185
|
if (data.timeoutMechanismType === "FIXED" /* CeremonyTimeoutType.FIXED */) {
|
|
@@ -1212,13 +1202,14 @@ const parseCeremonyFile = async (path, cleanup = false) => {
|
|
|
1212
1202
|
contributionComputation: 0,
|
|
1213
1203
|
fullContribution: 0,
|
|
1214
1204
|
verifyCloudFunction: 0
|
|
1215
|
-
}
|
|
1205
|
+
}
|
|
1216
1206
|
};
|
|
1217
1207
|
}
|
|
1218
1208
|
circuits.push(circuit);
|
|
1219
|
-
// remove the local r1cs
|
|
1209
|
+
// remove the local r1cs and wasm downloads (if used for verifying the config only vs setup)
|
|
1220
1210
|
if (cleanup)
|
|
1221
1211
|
fs.unlinkSync(localR1csPath);
|
|
1212
|
+
fs.unlinkSync(localWasmPath);
|
|
1222
1213
|
}
|
|
1223
1214
|
const setupData = {
|
|
1224
1215
|
ceremonyInputData: {
|
|
@@ -1372,7 +1363,9 @@ const getContributionsValidityForContributor = async (firestoreDatabase, circuit
|
|
|
1372
1363
|
* @param isFinalizing <boolean> - true when the coordinator is finalizing the ceremony, otherwise false.
|
|
1373
1364
|
* @returns <string> - the public attestation preamble.
|
|
1374
1365
|
*/
|
|
1375
|
-
const getPublicAttestationPreambleForContributor = (contributorIdentifier, ceremonyName, isFinalizing) => `Hey, I'm ${contributorIdentifier} and I have ${isFinalizing ? "finalized" : "contributed to"} the ${ceremonyName}
|
|
1366
|
+
const getPublicAttestationPreambleForContributor = (contributorIdentifier, ceremonyName, isFinalizing) => `Hey, I'm ${contributorIdentifier} and I have ${isFinalizing ? "finalized" : "contributed to"} the ${ceremonyName}${ceremonyName.toLowerCase().includes("trusted setup") || ceremonyName.toLowerCase().includes("ceremony")
|
|
1367
|
+
? "."
|
|
1368
|
+
: " MPC Phase2 Trusted Setup ceremony."}\nThe following are my contribution signatures:`;
|
|
1376
1369
|
/**
|
|
1377
1370
|
* Check and prepare public attestation for the contributor made only of its valid contributions.
|
|
1378
1371
|
* @param firestoreDatabase <Firestore> - the Firestore service instance associated to the current Firebase application.
|
|
@@ -1828,7 +1821,7 @@ const getFirestoreDatabase = (app) => getFirestore(app);
|
|
|
1828
1821
|
* @param app <FirebaseApp> - the Firebase application.
|
|
1829
1822
|
* @returns <Functions> - the Cloud Functions associated to the application.
|
|
1830
1823
|
*/
|
|
1831
|
-
const getFirebaseFunctions = (app) => getFunctions(app,
|
|
1824
|
+
const getFirebaseFunctions = (app) => getFunctions(app, "europe-west1");
|
|
1832
1825
|
/**
|
|
1833
1826
|
* Retrieve the configuration variables for the AWS services (S3, EC2).
|
|
1834
1827
|
* @returns <AWSVariables> - the values of the AWS services configuration variables.
|
|
@@ -2079,55 +2072,27 @@ const verifyCeremony = async (functions, firestore, ceremonyPrefix, outputDirect
|
|
|
2079
2072
|
};
|
|
2080
2073
|
|
|
2081
2074
|
/**
|
|
2082
|
-
* This function
|
|
2083
|
-
* @param user
|
|
2084
|
-
* @returns
|
|
2075
|
+
* This function queries the GitHub API to fetch users statistics
|
|
2076
|
+
* @param user {string} the user uid
|
|
2077
|
+
* @returns {any} the stats from the GitHub API
|
|
2085
2078
|
*/
|
|
2086
|
-
const
|
|
2087
|
-
const response = await fetch(`https://api.github.com/user/${user}
|
|
2079
|
+
const getGitHubStats = async (user) => {
|
|
2080
|
+
const response = await fetch(`https://api.github.com/user/${user}`, {
|
|
2088
2081
|
method: "GET",
|
|
2089
2082
|
headers: {
|
|
2090
2083
|
Authorization: `token ${process.env.GITHUB_ACCESS_TOKEN}`
|
|
2091
2084
|
}
|
|
2092
2085
|
});
|
|
2093
2086
|
if (response.status !== 200)
|
|
2094
|
-
throw new Error("It was not possible to retrieve the
|
|
2087
|
+
throw new Error("It was not possible to retrieve the user's statistic. Please try again.");
|
|
2095
2088
|
const jsonData = await response.json();
|
|
2096
|
-
|
|
2097
|
-
|
|
2098
|
-
|
|
2099
|
-
|
|
2100
|
-
|
|
2101
|
-
|
|
2102
|
-
|
|
2103
|
-
const getNumberOfFollowersGitHub = async (user) => {
|
|
2104
|
-
const response = await fetch(`https://api.github.com/user/${user}/followers`, {
|
|
2105
|
-
method: "GET",
|
|
2106
|
-
headers: {
|
|
2107
|
-
Authorization: `token ${process.env.GITHUB_ACCESS_TOKEN}`
|
|
2108
|
-
}
|
|
2109
|
-
});
|
|
2110
|
-
if (response.status !== 200)
|
|
2111
|
-
throw new Error("It was not possible to retrieve the number of followers. Please try again.");
|
|
2112
|
-
const jsonData = await response.json();
|
|
2113
|
-
return jsonData.length;
|
|
2114
|
-
};
|
|
2115
|
-
/**
|
|
2116
|
-
* This function will return the number of following of a user
|
|
2117
|
-
* @param user <string> The username of the user
|
|
2118
|
-
* @returns <number> The number of following users
|
|
2119
|
-
*/
|
|
2120
|
-
const getNumberOfFollowingGitHub = async (user) => {
|
|
2121
|
-
const response = await fetch(`https://api.github.com/user/${user}/following`, {
|
|
2122
|
-
method: "GET",
|
|
2123
|
-
headers: {
|
|
2124
|
-
Authorization: `token ${process.env.GITHUB_ACCESS_TOKEN}`
|
|
2125
|
-
}
|
|
2126
|
-
});
|
|
2127
|
-
if (response.status !== 200)
|
|
2128
|
-
throw new Error("It was not possible to retrieve the number of following. Please try again.");
|
|
2129
|
-
const jsonData = await response.json();
|
|
2130
|
-
return jsonData.length;
|
|
2089
|
+
const data = {
|
|
2090
|
+
following: jsonData.following,
|
|
2091
|
+
followers: jsonData.followers,
|
|
2092
|
+
publicRepos: jsonData.public_repos,
|
|
2093
|
+
avatarUrl: jsonData.avatar_url
|
|
2094
|
+
};
|
|
2095
|
+
return data;
|
|
2131
2096
|
};
|
|
2132
2097
|
/**
|
|
2133
2098
|
* This function will check if the user is reputable enough to be able to use the app
|
|
@@ -2135,19 +2100,23 @@ const getNumberOfFollowingGitHub = async (user) => {
|
|
|
2135
2100
|
* @param minimumAmountOfFollowing <number> The minimum amount of following the user should have
|
|
2136
2101
|
* @param minimumAmountOfFollowers <number> The minimum amount of followers the user should have
|
|
2137
2102
|
* @param minimumAmountOfPublicRepos <number> The minimum amount of public repos the user should have
|
|
2138
|
-
* @returns <
|
|
2103
|
+
* @returns <any> Return the avatar URL of the user if the user is reputable, false otherwise
|
|
2139
2104
|
*/
|
|
2140
2105
|
const githubReputation = async (userLogin, minimumAmountOfFollowing, minimumAmountOfFollowers, minimumAmountOfPublicRepos) => {
|
|
2141
2106
|
if (!process.env.GITHUB_ACCESS_TOKEN)
|
|
2142
2107
|
throw new Error("The GitHub access token is missing. Please insert a valid token to be used for anti-sybil checks on user registation, and then try again.");
|
|
2143
|
-
const following = await
|
|
2144
|
-
const repos = await getNumberOfPublicReposGitHub(userLogin);
|
|
2145
|
-
const followers = await getNumberOfFollowersGitHub(userLogin);
|
|
2108
|
+
const { following, followers, publicRepos, avatarUrl } = await getGitHubStats(userLogin);
|
|
2146
2109
|
if (following < minimumAmountOfFollowing ||
|
|
2147
|
-
|
|
2110
|
+
publicRepos < minimumAmountOfPublicRepos ||
|
|
2148
2111
|
followers < minimumAmountOfFollowers)
|
|
2149
|
-
return
|
|
2150
|
-
|
|
2112
|
+
return {
|
|
2113
|
+
reputable: false,
|
|
2114
|
+
avatarUrl: ""
|
|
2115
|
+
};
|
|
2116
|
+
return {
|
|
2117
|
+
reputable: true,
|
|
2118
|
+
avatarUrl: avatarUrl
|
|
2119
|
+
};
|
|
2151
2120
|
};
|
|
2152
2121
|
|
|
2153
2122
|
/**
|
|
@@ -2355,8 +2324,13 @@ const vmDependenciesAndCacheArtifactsCommand = (zKeyPath, potPath, snsTopic, reg
|
|
|
2355
2324
|
// eslint-disable-next-line no-template-curly-in-string
|
|
2356
2325
|
"touch ${MARKER_FILE}",
|
|
2357
2326
|
"sudo yum update -y",
|
|
2358
|
-
"curl -
|
|
2359
|
-
"
|
|
2327
|
+
"curl -O https://nodejs.org/dist/v16.13.0/node-v16.13.0-linux-x64.tar.xz",
|
|
2328
|
+
"tar -xf node-v16.13.0-linux-x64.tar.xz",
|
|
2329
|
+
"mv node-v16.13.0-linux-x64 nodejs",
|
|
2330
|
+
"sudo mv nodejs /opt/",
|
|
2331
|
+
"echo 'export NODEJS_HOME=/opt/nodejs' >> /etc/profile",
|
|
2332
|
+
"echo 'export PATH=$NODEJS_HOME/bin:$PATH' >> /etc/profile",
|
|
2333
|
+
"source /etc/profile",
|
|
2360
2334
|
"npm install -g snarkjs",
|
|
2361
2335
|
`aws s3 cp s3://${zKeyPath} /var/tmp/genesisZkey.zkey`,
|
|
2362
2336
|
`aws s3 cp s3://${potPath} /var/tmp/pot.ptau`,
|
|
@@ -2375,6 +2349,7 @@ const vmDependenciesAndCacheArtifactsCommand = (zKeyPath, potPath, snsTopic, reg
|
|
|
2375
2349
|
* @returns Array<string> - the list of commands for contribution verification.
|
|
2376
2350
|
*/
|
|
2377
2351
|
const vmContributionVerificationCommand = (bucketName, lastZkeyStoragePath, verificationTranscriptStoragePathAndFilename) => [
|
|
2352
|
+
`source /etc/profile`,
|
|
2378
2353
|
`aws s3 cp s3://${bucketName}/${lastZkeyStoragePath} /var/tmp/lastZKey.zkey > /var/tmp/log.txt`,
|
|
2379
2354
|
`snarkjs zkvi /var/tmp/genesisZkey.zkey /var/tmp/pot.ptau /var/tmp/lastZKey.zkey > /var/tmp/verification_transcript.log`,
|
|
2380
2355
|
`aws s3 cp /var/tmp/verification_transcript.log s3://${bucketName}/${verificationTranscriptStoragePathAndFilename} &>/dev/null`,
|
package/dist/index.node.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @module @
|
|
3
|
-
* @version 1.0.
|
|
2
|
+
* @module @devtion/actions
|
|
3
|
+
* @version 1.0.8
|
|
4
4
|
* @file A set of actions and helpers for CLI commands
|
|
5
5
|
* @copyright Ethereum Foundation 2022
|
|
6
6
|
* @license MIT
|
|
@@ -19,7 +19,6 @@ var crypto = require('crypto');
|
|
|
19
19
|
var blake = require('blakejs');
|
|
20
20
|
var ffjavascript = require('ffjavascript');
|
|
21
21
|
var winston = require('winston');
|
|
22
|
-
var clientS3 = require('@aws-sdk/client-s3');
|
|
23
22
|
var stream = require('stream');
|
|
24
23
|
var util = require('util');
|
|
25
24
|
var app = require('firebase/app');
|
|
@@ -246,6 +245,12 @@ const commonTerms = {
|
|
|
246
245
|
verificationStartedAt: "verificationStartedAt"
|
|
247
246
|
}
|
|
248
247
|
},
|
|
248
|
+
avatars: {
|
|
249
|
+
name: "avatars",
|
|
250
|
+
fields: {
|
|
251
|
+
avatarUrl: "avatarUrl"
|
|
252
|
+
}
|
|
253
|
+
},
|
|
249
254
|
ceremonies: {
|
|
250
255
|
name: "ceremonies",
|
|
251
256
|
fields: {
|
|
@@ -336,7 +341,7 @@ const commonTerms = {
|
|
|
336
341
|
finalizeCircuit: "finalizeCircuit",
|
|
337
342
|
finalizeCeremony: "finalizeCeremony",
|
|
338
343
|
downloadCircuitArtifacts: "downloadCircuitArtifacts",
|
|
339
|
-
transferObject: "transferObject"
|
|
344
|
+
transferObject: "transferObject"
|
|
340
345
|
}
|
|
341
346
|
};
|
|
342
347
|
|
|
@@ -1054,7 +1059,8 @@ const parseCeremonyFile = async (path, cleanup = false) => {
|
|
|
1054
1059
|
// read the data
|
|
1055
1060
|
const data = JSON.parse(fs.readFileSync(path).toString());
|
|
1056
1061
|
// verify that the data is correct
|
|
1057
|
-
if (data[
|
|
1062
|
+
if (data["timeoutMechanismType"] !== "DYNAMIC" /* CeremonyTimeoutType.DYNAMIC */ &&
|
|
1063
|
+
data["timeoutMechanismType"] !== "FIXED" /* CeremonyTimeoutType.FIXED */)
|
|
1058
1064
|
throw new Error("Invalid timeout type. Please choose between DYNAMIC and FIXED.");
|
|
1059
1065
|
// validate that we have at least 1 circuit input data
|
|
1060
1066
|
if (!data.circuits || data.circuits.length === 0)
|
|
@@ -1087,42 +1093,26 @@ const parseCeremonyFile = async (path, cleanup = false) => {
|
|
|
1087
1093
|
circuitArtifacts.push({
|
|
1088
1094
|
artifacts: artifacts
|
|
1089
1095
|
});
|
|
1090
|
-
const r1csPath = artifacts.r1csStoragePath;
|
|
1091
|
-
const wasmPath = artifacts.wasmStoragePath;
|
|
1092
1096
|
// where we storing the r1cs downloaded
|
|
1093
1097
|
const localR1csPath = `./${circuitData.name}.r1cs`;
|
|
1094
|
-
//
|
|
1095
|
-
|
|
1096
|
-
// just the correct region
|
|
1097
|
-
const s3 = new clientS3.S3Client({ region: artifacts.region });
|
|
1098
|
-
try {
|
|
1099
|
-
await s3.send(new clientS3.HeadObjectCommand({
|
|
1100
|
-
Bucket: artifacts.bucket,
|
|
1101
|
-
Key: r1csPath
|
|
1102
|
-
}));
|
|
1103
|
-
}
|
|
1104
|
-
catch (error) {
|
|
1105
|
-
throw new Error(`The r1cs file (${r1csPath}) seems to not exist. Please ensure this is correct and that the object is publicly available.`);
|
|
1106
|
-
}
|
|
1107
|
-
try {
|
|
1108
|
-
await s3.send(new clientS3.HeadObjectCommand({
|
|
1109
|
-
Bucket: artifacts.bucket,
|
|
1110
|
-
Key: wasmPath
|
|
1111
|
-
}));
|
|
1112
|
-
}
|
|
1113
|
-
catch (error) {
|
|
1114
|
-
throw new Error(`The wasm file (${wasmPath}) seems to not exist. Please ensure this is correct and that the object is publicly available.`);
|
|
1115
|
-
}
|
|
1098
|
+
// where we storing the wasm downloaded
|
|
1099
|
+
const localWasmPath = `./${circuitData.name}.wasm`;
|
|
1116
1100
|
// download the r1cs to extract the metadata
|
|
1117
|
-
const command = new clientS3.GetObjectCommand({ Bucket: artifacts.bucket, Key: artifacts.r1csStoragePath });
|
|
1118
|
-
const response = await s3.send(command);
|
|
1119
1101
|
const streamPipeline = util.promisify(stream.pipeline);
|
|
1120
|
-
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
|
|
1102
|
+
// Make the call.
|
|
1103
|
+
const responseR1CS = await fetch(artifacts.r1csStoragePath);
|
|
1104
|
+
// Handle errors.
|
|
1105
|
+
if (!responseR1CS.ok && responseR1CS.status !== 200)
|
|
1106
|
+
throw new Error(`There was an error while trying to download the r1cs file for circuit ${circuitData.name}. Please check that the file has the correct permissions (public) set.`);
|
|
1107
|
+
await streamPipeline(responseR1CS.body, fs.createWriteStream(localR1csPath));
|
|
1108
|
+
// Write the file locally
|
|
1124
1109
|
// extract the metadata from the r1cs
|
|
1125
1110
|
const metadata = getR1CSInfo(localR1csPath);
|
|
1111
|
+
// download wasm too to ensure it's available
|
|
1112
|
+
const responseWASM = await fetch(artifacts.wasmStoragePath);
|
|
1113
|
+
if (!responseWASM.ok && responseWASM.status !== 200)
|
|
1114
|
+
throw new Error(`There was an error while trying to download the WASM file for circuit ${circuitData.name}. Please check that the file has the correct permissions (public) set.`);
|
|
1115
|
+
await streamPipeline(responseWASM.body, fs.createWriteStream(localWasmPath));
|
|
1126
1116
|
// validate that the circuit hash and template links are valid
|
|
1127
1117
|
const template = circuitData.template;
|
|
1128
1118
|
const URLMatch = template.source.match(urlPattern);
|
|
@@ -1140,7 +1130,7 @@ const parseCeremonyFile = async (path, cleanup = false) => {
|
|
|
1140
1130
|
const wasmCompleteFilename = `${circuitData.name}.wasm`;
|
|
1141
1131
|
const smallestPowersOfTauCompleteFilenameForCircuit = `${potFilenameTemplate}${doubleDigitsPowers}.ptau`;
|
|
1142
1132
|
const firstZkeyCompleteFilename = `${circuitPrefix}_${genesisZkeyIndex}.zkey`;
|
|
1143
|
-
// storage paths
|
|
1133
|
+
// storage paths
|
|
1144
1134
|
const r1csStorageFilePath = getR1csStorageFilePath(circuitPrefix, r1csCompleteFilename);
|
|
1145
1135
|
const wasmStorageFilePath = getWasmStorageFilePath(circuitPrefix, wasmCompleteFilename);
|
|
1146
1136
|
const potStorageFilePath = getPotStorageFilePath(smallestPowersOfTauCompleteFilenameForCircuit);
|
|
@@ -1156,7 +1146,7 @@ const parseCeremonyFile = async (path, cleanup = false) => {
|
|
|
1156
1146
|
initialZkeyStoragePath: zkeyStorageFilePath,
|
|
1157
1147
|
r1csBlake2bHash: r1csBlake2bHash
|
|
1158
1148
|
};
|
|
1159
|
-
// validate that the compiler hash is a valid hash
|
|
1149
|
+
// validate that the compiler hash is a valid hash
|
|
1160
1150
|
const compiler = circuitData.compiler;
|
|
1161
1151
|
const compilerHashMatch = compiler.commitHash.match(commitHashPattern);
|
|
1162
1152
|
if (!compilerHashMatch || compilerHashMatch.length === 0 || compilerHashMatch.length > 1)
|
|
@@ -1191,7 +1181,7 @@ const parseCeremonyFile = async (path, cleanup = false) => {
|
|
|
1191
1181
|
contributionComputation: 0,
|
|
1192
1182
|
fullContribution: 0,
|
|
1193
1183
|
verifyCloudFunction: 0
|
|
1194
|
-
}
|
|
1184
|
+
}
|
|
1195
1185
|
};
|
|
1196
1186
|
}
|
|
1197
1187
|
if (data.timeoutMechanismType === "FIXED" /* CeremonyTimeoutType.FIXED */) {
|
|
@@ -1214,13 +1204,14 @@ const parseCeremonyFile = async (path, cleanup = false) => {
|
|
|
1214
1204
|
contributionComputation: 0,
|
|
1215
1205
|
fullContribution: 0,
|
|
1216
1206
|
verifyCloudFunction: 0
|
|
1217
|
-
}
|
|
1207
|
+
}
|
|
1218
1208
|
};
|
|
1219
1209
|
}
|
|
1220
1210
|
circuits.push(circuit);
|
|
1221
|
-
// remove the local r1cs
|
|
1211
|
+
// remove the local r1cs and wasm downloads (if used for verifying the config only vs setup)
|
|
1222
1212
|
if (cleanup)
|
|
1223
1213
|
fs.unlinkSync(localR1csPath);
|
|
1214
|
+
fs.unlinkSync(localWasmPath);
|
|
1224
1215
|
}
|
|
1225
1216
|
const setupData = {
|
|
1226
1217
|
ceremonyInputData: {
|
|
@@ -1374,7 +1365,9 @@ const getContributionsValidityForContributor = async (firestoreDatabase, circuit
|
|
|
1374
1365
|
* @param isFinalizing <boolean> - true when the coordinator is finalizing the ceremony, otherwise false.
|
|
1375
1366
|
* @returns <string> - the public attestation preamble.
|
|
1376
1367
|
*/
|
|
1377
|
-
const getPublicAttestationPreambleForContributor = (contributorIdentifier, ceremonyName, isFinalizing) => `Hey, I'm ${contributorIdentifier} and I have ${isFinalizing ? "finalized" : "contributed to"} the ${ceremonyName}
|
|
1368
|
+
const getPublicAttestationPreambleForContributor = (contributorIdentifier, ceremonyName, isFinalizing) => `Hey, I'm ${contributorIdentifier} and I have ${isFinalizing ? "finalized" : "contributed to"} the ${ceremonyName}${ceremonyName.toLowerCase().includes("trusted setup") || ceremonyName.toLowerCase().includes("ceremony")
|
|
1369
|
+
? "."
|
|
1370
|
+
: " MPC Phase2 Trusted Setup ceremony."}\nThe following are my contribution signatures:`;
|
|
1378
1371
|
/**
|
|
1379
1372
|
* Check and prepare public attestation for the contributor made only of its valid contributions.
|
|
1380
1373
|
* @param firestoreDatabase <Firestore> - the Firestore service instance associated to the current Firebase application.
|
|
@@ -1830,7 +1823,7 @@ const getFirestoreDatabase = (app) => firestore.getFirestore(app);
|
|
|
1830
1823
|
* @param app <FirebaseApp> - the Firebase application.
|
|
1831
1824
|
* @returns <Functions> - the Cloud Functions associated to the application.
|
|
1832
1825
|
*/
|
|
1833
|
-
const getFirebaseFunctions = (app) => functions.getFunctions(app,
|
|
1826
|
+
const getFirebaseFunctions = (app) => functions.getFunctions(app, "europe-west1");
|
|
1834
1827
|
/**
|
|
1835
1828
|
* Retrieve the configuration variables for the AWS services (S3, EC2).
|
|
1836
1829
|
* @returns <AWSVariables> - the values of the AWS services configuration variables.
|
|
@@ -2081,55 +2074,27 @@ const verifyCeremony = async (functions, firestore$1, ceremonyPrefix, outputDire
|
|
|
2081
2074
|
};
|
|
2082
2075
|
|
|
2083
2076
|
/**
|
|
2084
|
-
* This function
|
|
2085
|
-
* @param user
|
|
2086
|
-
* @returns
|
|
2077
|
+
* This function queries the GitHub API to fetch users statistics
|
|
2078
|
+
* @param user {string} the user uid
|
|
2079
|
+
* @returns {any} the stats from the GitHub API
|
|
2087
2080
|
*/
|
|
2088
|
-
const
|
|
2089
|
-
const response = await fetch(`https://api.github.com/user/${user}
|
|
2081
|
+
const getGitHubStats = async (user) => {
|
|
2082
|
+
const response = await fetch(`https://api.github.com/user/${user}`, {
|
|
2090
2083
|
method: "GET",
|
|
2091
2084
|
headers: {
|
|
2092
2085
|
Authorization: `token ${process.env.GITHUB_ACCESS_TOKEN}`
|
|
2093
2086
|
}
|
|
2094
2087
|
});
|
|
2095
2088
|
if (response.status !== 200)
|
|
2096
|
-
throw new Error("It was not possible to retrieve the
|
|
2089
|
+
throw new Error("It was not possible to retrieve the user's statistic. Please try again.");
|
|
2097
2090
|
const jsonData = await response.json();
|
|
2098
|
-
|
|
2099
|
-
|
|
2100
|
-
|
|
2101
|
-
|
|
2102
|
-
|
|
2103
|
-
|
|
2104
|
-
|
|
2105
|
-
const getNumberOfFollowersGitHub = async (user) => {
|
|
2106
|
-
const response = await fetch(`https://api.github.com/user/${user}/followers`, {
|
|
2107
|
-
method: "GET",
|
|
2108
|
-
headers: {
|
|
2109
|
-
Authorization: `token ${process.env.GITHUB_ACCESS_TOKEN}`
|
|
2110
|
-
}
|
|
2111
|
-
});
|
|
2112
|
-
if (response.status !== 200)
|
|
2113
|
-
throw new Error("It was not possible to retrieve the number of followers. Please try again.");
|
|
2114
|
-
const jsonData = await response.json();
|
|
2115
|
-
return jsonData.length;
|
|
2116
|
-
};
|
|
2117
|
-
/**
|
|
2118
|
-
* This function will return the number of following of a user
|
|
2119
|
-
* @param user <string> The username of the user
|
|
2120
|
-
* @returns <number> The number of following users
|
|
2121
|
-
*/
|
|
2122
|
-
const getNumberOfFollowingGitHub = async (user) => {
|
|
2123
|
-
const response = await fetch(`https://api.github.com/user/${user}/following`, {
|
|
2124
|
-
method: "GET",
|
|
2125
|
-
headers: {
|
|
2126
|
-
Authorization: `token ${process.env.GITHUB_ACCESS_TOKEN}`
|
|
2127
|
-
}
|
|
2128
|
-
});
|
|
2129
|
-
if (response.status !== 200)
|
|
2130
|
-
throw new Error("It was not possible to retrieve the number of following. Please try again.");
|
|
2131
|
-
const jsonData = await response.json();
|
|
2132
|
-
return jsonData.length;
|
|
2091
|
+
const data = {
|
|
2092
|
+
following: jsonData.following,
|
|
2093
|
+
followers: jsonData.followers,
|
|
2094
|
+
publicRepos: jsonData.public_repos,
|
|
2095
|
+
avatarUrl: jsonData.avatar_url
|
|
2096
|
+
};
|
|
2097
|
+
return data;
|
|
2133
2098
|
};
|
|
2134
2099
|
/**
|
|
2135
2100
|
* This function will check if the user is reputable enough to be able to use the app
|
|
@@ -2137,19 +2102,23 @@ const getNumberOfFollowingGitHub = async (user) => {
|
|
|
2137
2102
|
* @param minimumAmountOfFollowing <number> The minimum amount of following the user should have
|
|
2138
2103
|
* @param minimumAmountOfFollowers <number> The minimum amount of followers the user should have
|
|
2139
2104
|
* @param minimumAmountOfPublicRepos <number> The minimum amount of public repos the user should have
|
|
2140
|
-
* @returns <
|
|
2105
|
+
* @returns <any> Return the avatar URL of the user if the user is reputable, false otherwise
|
|
2141
2106
|
*/
|
|
2142
2107
|
const githubReputation = async (userLogin, minimumAmountOfFollowing, minimumAmountOfFollowers, minimumAmountOfPublicRepos) => {
|
|
2143
2108
|
if (!process.env.GITHUB_ACCESS_TOKEN)
|
|
2144
2109
|
throw new Error("The GitHub access token is missing. Please insert a valid token to be used for anti-sybil checks on user registation, and then try again.");
|
|
2145
|
-
const following = await
|
|
2146
|
-
const repos = await getNumberOfPublicReposGitHub(userLogin);
|
|
2147
|
-
const followers = await getNumberOfFollowersGitHub(userLogin);
|
|
2110
|
+
const { following, followers, publicRepos, avatarUrl } = await getGitHubStats(userLogin);
|
|
2148
2111
|
if (following < minimumAmountOfFollowing ||
|
|
2149
|
-
|
|
2112
|
+
publicRepos < minimumAmountOfPublicRepos ||
|
|
2150
2113
|
followers < minimumAmountOfFollowers)
|
|
2151
|
-
return
|
|
2152
|
-
|
|
2114
|
+
return {
|
|
2115
|
+
reputable: false,
|
|
2116
|
+
avatarUrl: ""
|
|
2117
|
+
};
|
|
2118
|
+
return {
|
|
2119
|
+
reputable: true,
|
|
2120
|
+
avatarUrl: avatarUrl
|
|
2121
|
+
};
|
|
2153
2122
|
};
|
|
2154
2123
|
|
|
2155
2124
|
/**
|
|
@@ -2357,8 +2326,13 @@ const vmDependenciesAndCacheArtifactsCommand = (zKeyPath, potPath, snsTopic, reg
|
|
|
2357
2326
|
// eslint-disable-next-line no-template-curly-in-string
|
|
2358
2327
|
"touch ${MARKER_FILE}",
|
|
2359
2328
|
"sudo yum update -y",
|
|
2360
|
-
"curl -
|
|
2361
|
-
"
|
|
2329
|
+
"curl -O https://nodejs.org/dist/v16.13.0/node-v16.13.0-linux-x64.tar.xz",
|
|
2330
|
+
"tar -xf node-v16.13.0-linux-x64.tar.xz",
|
|
2331
|
+
"mv node-v16.13.0-linux-x64 nodejs",
|
|
2332
|
+
"sudo mv nodejs /opt/",
|
|
2333
|
+
"echo 'export NODEJS_HOME=/opt/nodejs' >> /etc/profile",
|
|
2334
|
+
"echo 'export PATH=$NODEJS_HOME/bin:$PATH' >> /etc/profile",
|
|
2335
|
+
"source /etc/profile",
|
|
2362
2336
|
"npm install -g snarkjs",
|
|
2363
2337
|
`aws s3 cp s3://${zKeyPath} /var/tmp/genesisZkey.zkey`,
|
|
2364
2338
|
`aws s3 cp s3://${potPath} /var/tmp/pot.ptau`,
|
|
@@ -2377,6 +2351,7 @@ const vmDependenciesAndCacheArtifactsCommand = (zKeyPath, potPath, snsTopic, reg
|
|
|
2377
2351
|
* @returns Array<string> - the list of commands for contribution verification.
|
|
2378
2352
|
*/
|
|
2379
2353
|
const vmContributionVerificationCommand = (bucketName, lastZkeyStoragePath, verificationTranscriptStoragePathAndFilename) => [
|
|
2354
|
+
`source /etc/profile`,
|
|
2380
2355
|
`aws s3 cp s3://${bucketName}/${lastZkeyStoragePath} /var/tmp/lastZKey.zkey > /var/tmp/log.txt`,
|
|
2381
2356
|
`snarkjs zkvi /var/tmp/genesisZkey.zkey /var/tmp/pot.ptau /var/tmp/lastZKey.zkey > /var/tmp/verification_transcript.log`,
|
|
2382
2357
|
`aws s3 cp /var/tmp/verification_transcript.log s3://${bucketName}/${verificationTranscriptStoragePathAndFilename} &>/dev/null`,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../../src/helpers/constants.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,sBAAsB,+CAA+C,CAAA;AAElF,eAAO,MAAM,mBAAmB,6BAA6B,CAAA;AAE7D,eAAO,MAAM,gBAAgB,UAAU,CAAA;AAEvC,eAAO,MAAM,gBAAgB,KAAK,CAAA;AAElC,eAAO,MAAM,eAAe,UAAU,CAAA;AAEtC,eAAO,MAAM,sBAAsB,UAAU,CAAA;AAE7C,eAAO,MAAM,sBAAsB,SAAS,CAAA;AAE5C,eAAO,MAAM,4BAA4B,aAAa,CAAA;AAEtD,eAAO,MAAM,cAAc,sBAAsB,CAAA;AAEjD,eAAO,MAAM,yBAAyB,iBAAiB,CAAA;AAEvD;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2ChC,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,gBAAgB;;;GA6G5B,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,WAAW
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../../src/helpers/constants.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,sBAAsB,+CAA+C,CAAA;AAElF,eAAO,MAAM,mBAAmB,6BAA6B,CAAA;AAE7D,eAAO,MAAM,gBAAgB,UAAU,CAAA;AAEvC,eAAO,MAAM,gBAAgB,KAAK,CAAA;AAElC,eAAO,MAAM,eAAe,UAAU,CAAA;AAEtC,eAAO,MAAM,sBAAsB,UAAU,CAAA;AAE7C,eAAO,MAAM,sBAAsB,SAAS,CAAA;AAE5C,eAAO,MAAM,4BAA4B,aAAa,CAAA;AAEtD,eAAO,MAAM,cAAc,sBAAsB,CAAA;AAEjD,eAAO,MAAM,yBAAyB,iBAAiB,CAAA;AAEvD;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2ChC,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,gBAAgB;;;GA6G5B,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6HvB,CAAA"}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* @param minimumAmountOfFollowing <number> The minimum amount of following the user should have
|
|
5
5
|
* @param minimumAmountOfFollowers <number> The minimum amount of followers the user should have
|
|
6
6
|
* @param minimumAmountOfPublicRepos <number> The minimum amount of public repos the user should have
|
|
7
|
-
* @returns <
|
|
7
|
+
* @returns <any> Return the avatar URL of the user if the user is reputable, false otherwise
|
|
8
8
|
*/
|
|
9
|
-
export declare const githubReputation: (userLogin: string, minimumAmountOfFollowing: number, minimumAmountOfFollowers: number, minimumAmountOfPublicRepos: number) => Promise<
|
|
9
|
+
export declare const githubReputation: (userLogin: string, minimumAmountOfFollowing: number, minimumAmountOfFollowers: number, minimumAmountOfPublicRepos: number) => Promise<any>;
|
|
10
10
|
//# sourceMappingURL=security.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../../../../src/helpers/security.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../../../../src/helpers/security.ts"],"names":[],"mappings":"AA4BA;;;;;;;GAOG;AACH,eAAO,MAAM,gBAAgB,cACd,MAAM,4BACS,MAAM,4BACN,MAAM,8BACJ,MAAM,KACnC,QAAQ,GAAG,CAsBb,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../src/helpers/utils.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAC9C,OAAW,EAAE,YAAY,
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../src/helpers/utils.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAC9C,OAAW,EAAE,YAAY,EAAqB,MAAM,IAAI,CAAA;AAExD,OAAO,OAAO,EAAE,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAEzC,OAAO,EACH,eAAe,EACf,YAAY,EAGZ,oBAAoB,EACpB,oBAAoB,EACpB,iBAAiB,EAGpB,MAAM,gBAAgB,CAAA;AAmBvB;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB,SAAgB,MAAM,YAAW,OAAO,KAAW,QAAQ,iBAAiB,CA4NzG,CAAA;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,+BAA+B,iBAAkB,MAAM,UAAU,MAAM,KAAG,MAgBtF,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,oCAAoC,gBAAiB,MAAM,WAAW,MAAM,WAUxF,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,eAAe,aAAc,MAAM,KAAG,MASlD,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,wBAAyB,MAAM,KAAG,MACH,CAAA;AAElE;;;;;;;GAOG;AACH,eAAO,MAAM,aAAa,QAAS,MAAM,KAAG,MAEsC,CAAA;AAElF;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,cAAsE,CAAA;AAEtG;;;;;;;GAOG;AACH,eAAO,MAAM,4BAA4B,aAC3B,MAAM,oBAAoB,CAAC,oBACnB,MAAM,KACzB,oBAYF,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,cAAe,MAAM,WAAW,OAAO,KAAG,MAC1B,CAAA;AAEjD;;;;;;;;GAQG;AACH,eAAO,MAAM,sCAAsC,sBAC5B,SAAS,YAClB,MAAM,oBAAoB,CAAC,cACzB,MAAM,iBACH,MAAM,gBACP,OAAO,KACtB,QAAQ,MAAM,oBAAoB,CAAC,CAmCrC,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,0CAA0C,0BAC5B,MAAM,gBACf,MAAM,gBACN,OAAO,WAM4B,CAAA;AAErD;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,qCAAqC,sBAC3B,SAAS,YAClB,MAAM,oBAAoB,CAAC,cACzB,MAAM,iBACH,MAAM,4BACK,MAAM,YAAY,CAAC,yBACtB,MAAM,gBACf,MAAM,gBACN,OAAO,KACtB,QAAQ,MAAM,CA2DhB,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,yBAAyB,aAAc,MAAM,UAAS,QAAQ,aAAa,CAAC,OAAO,CAAC,KAAY,MAQvG,CAAA;AAEN;;;;;;;GAOG;AACH,eAAO,MAAM,iBAAiB,kBACX,MAAM,UACb,MAAM,UACN,MAAM,YACJ,YAAY,KACvB,MAYF,CAAA;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,WAAW,sBAAuB,MAAM,KAAG,eA0IvD,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,WAAY,MAAM,KAAG,MAA0D,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vm.d.ts","sourceRoot":"","sources":["../../../../src/helpers/vm.ts"],"names":[],"mappings":"AAAA,OAAO,EAMH,SAAS,EAEZ,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAEH,SAAS,EAGZ,MAAM,qBAAqB,CAAA;AAE5B,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAA;AACnC,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAOtC;;;GAGG;AACH,eAAO,MAAM,eAAe,QAAa,QAAQ,SAAS,CAYzD,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,eAAe,QAAa,QAAQ,SAAS,CAYzD,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,eAAgB,MAAM,KAAG,MAAM,MAAM,CAInE,CAAA;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,sCAAsC,aACrC,MAAM,WACP,MAAM,YACL,MAAM,UACR,MAAM,KACf,MAAM,MAAM,
|
|
1
|
+
{"version":3,"file":"vm.d.ts","sourceRoot":"","sources":["../../../../src/helpers/vm.ts"],"names":[],"mappings":"AAAA,OAAO,EAMH,SAAS,EAEZ,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAEH,SAAS,EAGZ,MAAM,qBAAqB,CAAA;AAE5B,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAA;AACnC,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAOtC;;;GAGG;AACH,eAAO,MAAM,eAAe,QAAa,QAAQ,SAAS,CAYzD,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,eAAe,QAAa,QAAQ,SAAS,CAYzD,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,eAAgB,MAAM,KAAG,MAAM,MAAM,CAInE,CAAA;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,sCAAsC,aACrC,MAAM,WACP,MAAM,YACL,MAAM,UACR,MAAM,KACf,MAAM,MAAM,CAyBd,CAAA;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,iCAAiC,eAC9B,MAAM,uBACG,MAAM,gDACmB,MAAM,KACrD,MAAM,MAAM,CAOd,CAAA;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,oBAAoB,oBAAqB,MAAM,OAAO,MAAM,KAAG,MACuB,CAAA;AAEnG;;;;;;;;GAQG;AACH,eAAO,MAAM,iBAAiB,QACrB,SAAS,YACJ,MAAM,EAAE,gBACJ,MAAM,cACR,MAAM,YACR,aAAa,KACxB,QAAQ,WAAW,CAgErB,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,cAAc,cAAqB,SAAS,cAAc,MAAM,KAAG,QAAQ,OAAO,CAe9F,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,QAAe,SAAS,cAAc,MAAM,kBAYxE,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,eAAe,QAAe,SAAS,cAAc,MAAM,kBAYvE,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,QAAe,SAAS,cAAc,MAAM,kBAc5E,CAAA;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,kBAAkB,QACtB,SAAS,cACF,MAAM,YACR,MAAM,MAAM,CAAC,KACxB,QAAQ,MAAM,CAwBhB,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,QAAe,SAAS,cAAc,MAAM,aAAa,MAAM,KAAG,QAAQ,MAAM,CAiBjH,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,QAAe,SAAS,cAAc,MAAM,aAAa,MAAM,KAAG,QAAQ,MAAM,CAgBjH,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/types/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/types/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@devtion/actions",
|
|
3
|
-
"version": "0.0.0-
|
|
3
|
+
"version": "0.0.0-7cfaa5d",
|
|
4
4
|
"description": "A set of actions and helpers for CLI commands",
|
|
5
5
|
"repository": "git@github.com:privacy-scaling-explorations/p0tion.git",
|
|
6
6
|
"homepage": "https://github.com/privacy-scaling-explorations/p0tion",
|
|
@@ -55,10 +55,6 @@
|
|
|
55
55
|
"firebase": "^9.21.0",
|
|
56
56
|
"firebase-admin": "^11.8.0",
|
|
57
57
|
"googleapis": "^118.0.0",
|
|
58
|
-
"puppeteer": "^20.1.2",
|
|
59
|
-
"puppeteer-extra": "^3.3.6",
|
|
60
|
-
"puppeteer-extra-plugin-anonymize-ua": "^2.4.6",
|
|
61
|
-
"puppeteer-extra-plugin-stealth": "^2.11.2",
|
|
62
58
|
"rimraf": "^5.0.0",
|
|
63
59
|
"rollup": "^3.21.6",
|
|
64
60
|
"snarkjs": "^0.6.11",
|
|
@@ -83,5 +79,5 @@
|
|
|
83
79
|
"publishConfig": {
|
|
84
80
|
"access": "public"
|
|
85
81
|
},
|
|
86
|
-
"gitHead": "
|
|
82
|
+
"gitHead": "53164d43af65410911da5fa33f1ac0cade724872"
|
|
87
83
|
}
|
package/src/helpers/constants.ts
CHANGED
|
@@ -217,6 +217,12 @@ export const commonTerms = {
|
|
|
217
217
|
verificationStartedAt: "verificationStartedAt"
|
|
218
218
|
}
|
|
219
219
|
},
|
|
220
|
+
avatars: {
|
|
221
|
+
name: "avatars",
|
|
222
|
+
fields: {
|
|
223
|
+
avatarUrl: "avatarUrl"
|
|
224
|
+
}
|
|
225
|
+
},
|
|
220
226
|
ceremonies: {
|
|
221
227
|
name: "ceremonies",
|
|
222
228
|
fields: {
|
|
@@ -307,6 +313,6 @@ export const commonTerms = {
|
|
|
307
313
|
finalizeCircuit: "finalizeCircuit",
|
|
308
314
|
finalizeCeremony: "finalizeCeremony",
|
|
309
315
|
downloadCircuitArtifacts: "downloadCircuitArtifacts",
|
|
310
|
-
transferObject: "transferObject"
|
|
316
|
+
transferObject: "transferObject"
|
|
311
317
|
}
|
|
312
318
|
}
|
package/src/helpers/functions.ts
CHANGED
package/src/helpers/security.ts
CHANGED
|
@@ -1,57 +1,29 @@
|
|
|
1
1
|
import fetch from "@adobe/node-fetch-retry"
|
|
2
2
|
/**
|
|
3
|
-
* This function
|
|
4
|
-
* @param user
|
|
5
|
-
* @returns
|
|
3
|
+
* This function queries the GitHub API to fetch users statistics
|
|
4
|
+
* @param user {string} the user uid
|
|
5
|
+
* @returns {any} the stats from the GitHub API
|
|
6
6
|
*/
|
|
7
|
-
const
|
|
8
|
-
const response = await fetch(`https://api.github.com/user/${user}
|
|
7
|
+
const getGitHubStats = async (user: string): Promise<any> => {
|
|
8
|
+
const response = await fetch(`https://api.github.com/user/${user}`, {
|
|
9
9
|
method: "GET",
|
|
10
10
|
headers: {
|
|
11
11
|
Authorization: `token ${process.env.GITHUB_ACCESS_TOKEN!}`
|
|
12
12
|
}
|
|
13
13
|
})
|
|
14
14
|
if (response.status !== 200)
|
|
15
|
-
throw new Error("It was not possible to retrieve the
|
|
16
|
-
const jsonData: any = await response.json()
|
|
17
|
-
return jsonData.length
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* This function will return the number of followers of a user
|
|
21
|
-
* @param user <string> The username of the user
|
|
22
|
-
* @returns <number> The number of followers
|
|
23
|
-
*/
|
|
24
|
-
const getNumberOfFollowersGitHub = async (user: string): Promise<number> => {
|
|
25
|
-
const response = await fetch(`https://api.github.com/user/${user}/followers`, {
|
|
26
|
-
method: "GET",
|
|
27
|
-
headers: {
|
|
28
|
-
Authorization: `token ${process.env.GITHUB_ACCESS_TOKEN!}`
|
|
29
|
-
}
|
|
30
|
-
})
|
|
31
|
-
if (response.status !== 200)
|
|
32
|
-
throw new Error("It was not possible to retrieve the number of followers. Please try again.")
|
|
33
|
-
const jsonData: any = await response.json()
|
|
34
|
-
return jsonData.length
|
|
35
|
-
}
|
|
36
|
-
/**
|
|
37
|
-
* This function will return the number of following of a user
|
|
38
|
-
* @param user <string> The username of the user
|
|
39
|
-
* @returns <number> The number of following users
|
|
40
|
-
*/
|
|
41
|
-
const getNumberOfFollowingGitHub = async (user: string): Promise<number> => {
|
|
42
|
-
const response = await fetch(`https://api.github.com/user/${user}/following`, {
|
|
43
|
-
method: "GET",
|
|
44
|
-
headers: {
|
|
45
|
-
Authorization: `token ${process.env.GITHUB_ACCESS_TOKEN!}`
|
|
46
|
-
}
|
|
47
|
-
})
|
|
48
|
-
|
|
49
|
-
if (response.status !== 200)
|
|
50
|
-
throw new Error("It was not possible to retrieve the number of following. Please try again.")
|
|
15
|
+
throw new Error("It was not possible to retrieve the user's statistic. Please try again.")
|
|
51
16
|
|
|
52
17
|
const jsonData: any = await response.json()
|
|
53
18
|
|
|
54
|
-
|
|
19
|
+
const data = {
|
|
20
|
+
following: jsonData.following,
|
|
21
|
+
followers: jsonData.followers,
|
|
22
|
+
publicRepos: jsonData.public_repos,
|
|
23
|
+
avatarUrl: jsonData.avatar_url
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
return data
|
|
55
27
|
}
|
|
56
28
|
|
|
57
29
|
/**
|
|
@@ -60,27 +32,33 @@ const getNumberOfFollowingGitHub = async (user: string): Promise<number> => {
|
|
|
60
32
|
* @param minimumAmountOfFollowing <number> The minimum amount of following the user should have
|
|
61
33
|
* @param minimumAmountOfFollowers <number> The minimum amount of followers the user should have
|
|
62
34
|
* @param minimumAmountOfPublicRepos <number> The minimum amount of public repos the user should have
|
|
63
|
-
* @returns <
|
|
35
|
+
* @returns <any> Return the avatar URL of the user if the user is reputable, false otherwise
|
|
64
36
|
*/
|
|
65
37
|
export const githubReputation = async (
|
|
66
38
|
userLogin: string,
|
|
67
39
|
minimumAmountOfFollowing: number,
|
|
68
40
|
minimumAmountOfFollowers: number,
|
|
69
41
|
minimumAmountOfPublicRepos: number
|
|
70
|
-
): Promise<
|
|
42
|
+
): Promise<any> => {
|
|
71
43
|
if (!process.env.GITHUB_ACCESS_TOKEN)
|
|
72
44
|
throw new Error(
|
|
73
45
|
"The GitHub access token is missing. Please insert a valid token to be used for anti-sybil checks on user registation, and then try again."
|
|
74
46
|
)
|
|
75
|
-
|
|
76
|
-
const
|
|
77
|
-
const followers = await getNumberOfFollowersGitHub(userLogin)
|
|
47
|
+
|
|
48
|
+
const { following, followers, publicRepos, avatarUrl } = await getGitHubStats(userLogin)
|
|
78
49
|
|
|
79
50
|
if (
|
|
80
51
|
following < minimumAmountOfFollowing ||
|
|
81
|
-
|
|
52
|
+
publicRepos < minimumAmountOfPublicRepos ||
|
|
82
53
|
followers < minimumAmountOfFollowers
|
|
83
54
|
)
|
|
84
|
-
return
|
|
85
|
-
|
|
55
|
+
return {
|
|
56
|
+
reputable: false,
|
|
57
|
+
avatarUrl: ""
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
return {
|
|
61
|
+
reputable: true,
|
|
62
|
+
avatarUrl: avatarUrl
|
|
63
|
+
}
|
|
86
64
|
}
|
package/src/helpers/services.ts
CHANGED
|
@@ -22,7 +22,7 @@ export const getFirestoreDatabase = (app: FirebaseApp): Firestore => getFirestor
|
|
|
22
22
|
* @param app <FirebaseApp> - the Firebase application.
|
|
23
23
|
* @returns <Functions> - the Cloud Functions associated to the application.
|
|
24
24
|
*/
|
|
25
|
-
export const getFirebaseFunctions = (app: FirebaseApp): Functions => getFunctions(app,
|
|
25
|
+
export const getFirebaseFunctions = (app: FirebaseApp): Functions => getFunctions(app, "europe-west1")
|
|
26
26
|
|
|
27
27
|
/**
|
|
28
28
|
* Retrieve the configuration variables for the AWS services (S3, EC2).
|
package/src/helpers/utils.ts
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
import { Firestore } from "firebase/firestore"
|
|
2
|
-
import fs, { ReadPosition } from "fs"
|
|
2
|
+
import fs, { ReadPosition, createWriteStream } from "fs"
|
|
3
3
|
import { utils as ffUtils } from "ffjavascript"
|
|
4
4
|
import winston, { Logger } from "winston"
|
|
5
|
-
import
|
|
6
|
-
import {
|
|
7
|
-
CircuitMetadata,
|
|
8
|
-
Contribution,
|
|
9
|
-
CircuitDocument,
|
|
5
|
+
import fetch from "@adobe/node-fetch-retry"
|
|
6
|
+
import {
|
|
7
|
+
CircuitMetadata,
|
|
8
|
+
Contribution,
|
|
9
|
+
CircuitDocument,
|
|
10
10
|
CircuitInputData,
|
|
11
|
-
ContributionValidity,
|
|
12
|
-
FirebaseDocumentInfo,
|
|
13
|
-
SetupCeremonyData,
|
|
11
|
+
ContributionValidity,
|
|
12
|
+
FirebaseDocumentInfo,
|
|
13
|
+
SetupCeremonyData,
|
|
14
14
|
CeremonySetupTemplate,
|
|
15
|
-
CeremonySetupTemplateCircuitArtifacts
|
|
15
|
+
CeremonySetupTemplateCircuitArtifacts
|
|
16
16
|
} from "../types/index"
|
|
17
17
|
import { finalContributionIndex, genesisZkeyIndex, potFilenameTemplate } from "./constants"
|
|
18
18
|
import {
|
|
@@ -22,14 +22,14 @@ import {
|
|
|
22
22
|
getContributionsCollectionPath
|
|
23
23
|
} from "./database"
|
|
24
24
|
import { CeremonyTimeoutType } from "../types/enums"
|
|
25
|
-
import {
|
|
26
|
-
getPotStorageFilePath,
|
|
27
|
-
getR1csStorageFilePath,
|
|
28
|
-
getWasmStorageFilePath,
|
|
25
|
+
import {
|
|
26
|
+
getPotStorageFilePath,
|
|
27
|
+
getR1csStorageFilePath,
|
|
28
|
+
getWasmStorageFilePath,
|
|
29
29
|
getZkeyStorageFilePath
|
|
30
30
|
} from "./storage"
|
|
31
31
|
import { blake512FromPath } from "./crypto"
|
|
32
|
-
import {
|
|
32
|
+
import { pipeline } from "stream"
|
|
33
33
|
import { promisify } from "util"
|
|
34
34
|
|
|
35
35
|
/**
|
|
@@ -41,23 +41,29 @@ import { promisify } from "util"
|
|
|
41
41
|
*/
|
|
42
42
|
export const parseCeremonyFile = async (path: string, cleanup: boolean = false): Promise<SetupCeremonyData> => {
|
|
43
43
|
// check that the path exists
|
|
44
|
-
if (!fs.existsSync(path))
|
|
45
|
-
|
|
44
|
+
if (!fs.existsSync(path))
|
|
45
|
+
throw new Error(
|
|
46
|
+
"The provided path to the configuration file does not exist. Please provide an absolute path and try again."
|
|
47
|
+
)
|
|
48
|
+
|
|
46
49
|
try {
|
|
47
50
|
// read the data
|
|
48
51
|
const data: CeremonySetupTemplate = JSON.parse(fs.readFileSync(path).toString())
|
|
49
52
|
|
|
50
53
|
// verify that the data is correct
|
|
51
|
-
if (
|
|
54
|
+
if (
|
|
55
|
+
data["timeoutMechanismType"] !== CeremonyTimeoutType.DYNAMIC &&
|
|
56
|
+
data["timeoutMechanismType"] !== CeremonyTimeoutType.FIXED
|
|
57
|
+
)
|
|
52
58
|
throw new Error("Invalid timeout type. Please choose between DYNAMIC and FIXED.")
|
|
53
|
-
|
|
59
|
+
|
|
54
60
|
// validate that we have at least 1 circuit input data
|
|
55
|
-
if (!data.circuits || data.circuits.length === 0)
|
|
61
|
+
if (!data.circuits || data.circuits.length === 0)
|
|
56
62
|
throw new Error("You need to provide the data for at least 1 circuit.")
|
|
57
63
|
|
|
58
64
|
// validate that the end date is in the future
|
|
59
|
-
let endDate: Date
|
|
60
|
-
let startDate: Date
|
|
65
|
+
let endDate: Date
|
|
66
|
+
let startDate: Date
|
|
61
67
|
try {
|
|
62
68
|
endDate = new Date(data.endDate)
|
|
63
69
|
startDate = new Date(data.startDate)
|
|
@@ -66,12 +72,12 @@ export const parseCeremonyFile = async (path: string, cleanup: boolean = false):
|
|
|
66
72
|
}
|
|
67
73
|
|
|
68
74
|
if (endDate <= startDate) throw new Error("The end date should be greater than the start date.")
|
|
69
|
-
|
|
75
|
+
|
|
70
76
|
const currentDate = new Date()
|
|
71
77
|
|
|
72
|
-
if (endDate <= currentDate || startDate <= currentDate)
|
|
78
|
+
if (endDate <= currentDate || startDate <= currentDate)
|
|
73
79
|
throw new Error("The start and end dates should be in the future.")
|
|
74
|
-
|
|
80
|
+
|
|
75
81
|
// validate penalty
|
|
76
82
|
if (data.penalty <= 0) throw new Error("The penalty should be greater than zero.")
|
|
77
83
|
|
|
@@ -87,58 +93,49 @@ export const parseCeremonyFile = async (path: string, cleanup: boolean = false):
|
|
|
87
93
|
circuitArtifacts.push({
|
|
88
94
|
artifacts: artifacts
|
|
89
95
|
})
|
|
90
|
-
const r1csPath = artifacts.r1csStoragePath
|
|
91
|
-
const wasmPath = artifacts.wasmStoragePath
|
|
92
96
|
|
|
93
97
|
// where we storing the r1cs downloaded
|
|
94
98
|
const localR1csPath = `./${circuitData.name}.r1cs`
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
// we don't need any privileges to download this
|
|
98
|
-
// just the correct region
|
|
99
|
-
const s3 = new S3Client({region: artifacts.region})
|
|
100
|
-
|
|
101
|
-
try {
|
|
102
|
-
await s3.send(new HeadObjectCommand({
|
|
103
|
-
Bucket: artifacts.bucket,
|
|
104
|
-
Key: r1csPath
|
|
105
|
-
}))
|
|
106
|
-
} catch (error: any) {
|
|
107
|
-
throw new Error(`The r1cs file (${r1csPath}) seems to not exist. Please ensure this is correct and that the object is publicly available.`)
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
try {
|
|
111
|
-
await s3.send(new HeadObjectCommand({
|
|
112
|
-
Bucket: artifacts.bucket,
|
|
113
|
-
Key: wasmPath
|
|
114
|
-
}))
|
|
115
|
-
} catch (error: any) {
|
|
116
|
-
throw new Error(`The wasm file (${wasmPath}) seems to not exist. Please ensure this is correct and that the object is publicly available.`)
|
|
117
|
-
}
|
|
99
|
+
// where we storing the wasm downloaded
|
|
100
|
+
const localWasmPath = `./${circuitData.name}.wasm`
|
|
118
101
|
|
|
119
102
|
// download the r1cs to extract the metadata
|
|
120
|
-
const command = new GetObjectCommand({ Bucket: artifacts.bucket, Key: artifacts.r1csStoragePath })
|
|
121
|
-
const response = await s3.send(command)
|
|
122
103
|
const streamPipeline = promisify(pipeline)
|
|
123
104
|
|
|
124
|
-
|
|
125
|
-
|
|
105
|
+
// Make the call.
|
|
106
|
+
const responseR1CS = await fetch(artifacts.r1csStoragePath)
|
|
107
|
+
|
|
108
|
+
// Handle errors.
|
|
109
|
+
if (!responseR1CS.ok && responseR1CS.status !== 200)
|
|
110
|
+
throw new Error(
|
|
111
|
+
`There was an error while trying to download the r1cs file for circuit ${circuitData.name}. Please check that the file has the correct permissions (public) set.`
|
|
112
|
+
)
|
|
113
|
+
|
|
114
|
+
await streamPipeline(responseR1CS.body!, createWriteStream(localR1csPath))
|
|
115
|
+
// Write the file locally
|
|
126
116
|
|
|
127
|
-
if (response.Body instanceof Readable)
|
|
128
|
-
await streamPipeline(response.Body, fs.createWriteStream(localR1csPath))
|
|
129
|
-
|
|
130
117
|
// extract the metadata from the r1cs
|
|
131
118
|
const metadata = getR1CSInfo(localR1csPath)
|
|
132
119
|
|
|
120
|
+
// download wasm too to ensure it's available
|
|
121
|
+
const responseWASM = await fetch(artifacts.wasmStoragePath)
|
|
122
|
+
if (!responseWASM.ok && responseWASM.status !== 200)
|
|
123
|
+
throw new Error(
|
|
124
|
+
`There was an error while trying to download the WASM file for circuit ${circuitData.name}. Please check that the file has the correct permissions (public) set.`
|
|
125
|
+
)
|
|
126
|
+
await streamPipeline(responseWASM.body!, createWriteStream(localWasmPath))
|
|
127
|
+
|
|
133
128
|
// validate that the circuit hash and template links are valid
|
|
134
129
|
const template = circuitData.template
|
|
135
130
|
|
|
136
131
|
const URLMatch = template.source.match(urlPattern)
|
|
137
|
-
if (!URLMatch || URLMatch.length === 0 || URLMatch.length > 1)
|
|
132
|
+
if (!URLMatch || URLMatch.length === 0 || URLMatch.length > 1)
|
|
133
|
+
throw new Error("You should provide the URL to the circuits templates on GitHub.")
|
|
138
134
|
|
|
139
135
|
const hashMatch = template.commitHash.match(commitHashPattern)
|
|
140
|
-
if (!hashMatch || hashMatch.length === 0 || hashMatch.length > 1)
|
|
141
|
-
|
|
136
|
+
if (!hashMatch || hashMatch.length === 0 || hashMatch.length > 1)
|
|
137
|
+
throw new Error("You should provide a valid commit hash of the circuit templates.")
|
|
138
|
+
|
|
142
139
|
// calculate the hash of the r1cs file
|
|
143
140
|
const r1csBlake2bHash = await blake512FromPath(localR1csPath)
|
|
144
141
|
|
|
@@ -151,12 +148,12 @@ export const parseCeremonyFile = async (path: string, cleanup: boolean = false):
|
|
|
151
148
|
const smallestPowersOfTauCompleteFilenameForCircuit = `${potFilenameTemplate}${doubleDigitsPowers}.ptau`
|
|
152
149
|
const firstZkeyCompleteFilename = `${circuitPrefix}_${genesisZkeyIndex}.zkey`
|
|
153
150
|
|
|
154
|
-
// storage paths
|
|
151
|
+
// storage paths
|
|
155
152
|
const r1csStorageFilePath = getR1csStorageFilePath(circuitPrefix, r1csCompleteFilename)
|
|
156
153
|
const wasmStorageFilePath = getWasmStorageFilePath(circuitPrefix, wasmCompleteFilename)
|
|
157
154
|
const potStorageFilePath = getPotStorageFilePath(smallestPowersOfTauCompleteFilenameForCircuit)
|
|
158
155
|
const zkeyStorageFilePath = getZkeyStorageFilePath(circuitPrefix, firstZkeyCompleteFilename)
|
|
159
|
-
|
|
156
|
+
|
|
160
157
|
const files: any = {
|
|
161
158
|
potFilename: smallestPowersOfTauCompleteFilenameForCircuit,
|
|
162
159
|
r1csFilename: r1csCompleteFilename,
|
|
@@ -169,14 +166,15 @@ export const parseCeremonyFile = async (path: string, cleanup: boolean = false):
|
|
|
169
166
|
r1csBlake2bHash: r1csBlake2bHash
|
|
170
167
|
}
|
|
171
168
|
|
|
172
|
-
// validate that the compiler hash is a valid hash
|
|
169
|
+
// validate that the compiler hash is a valid hash
|
|
173
170
|
const compiler = circuitData.compiler
|
|
174
171
|
const compilerHashMatch = compiler.commitHash.match(commitHashPattern)
|
|
175
|
-
if (!compilerHashMatch || compilerHashMatch.length === 0 || compilerHashMatch.length > 1)
|
|
172
|
+
if (!compilerHashMatch || compilerHashMatch.length === 0 || compilerHashMatch.length > 1)
|
|
173
|
+
throw new Error("You should provide a valid commit hash of the circuit compiler.")
|
|
176
174
|
|
|
177
175
|
// validate that the verification options are valid
|
|
178
176
|
const verification = circuitData.verification
|
|
179
|
-
if (verification.cfOrVm !== "CF" && verification.cfOrVm !== "VM")
|
|
177
|
+
if (verification.cfOrVm !== "CF" && verification.cfOrVm !== "VM")
|
|
180
178
|
throw new Error("Please enter a valid verification mechanism: either CF or VM")
|
|
181
179
|
|
|
182
180
|
// @todo VM parameters verification
|
|
@@ -189,8 +187,7 @@ export const parseCeremonyFile = async (path: string, cleanup: boolean = false):
|
|
|
189
187
|
let circuit: CircuitDocument | CircuitInputData = {} as CircuitDocument | CircuitInputData
|
|
190
188
|
|
|
191
189
|
if (data.timeoutMechanismType === CeremonyTimeoutType.DYNAMIC) {
|
|
192
|
-
if (circuitData.dynamicThreshold <= 0)
|
|
193
|
-
throw new Error("The dynamic threshold should be > 0.")
|
|
190
|
+
if (circuitData.dynamicThreshold <= 0) throw new Error("The dynamic threshold should be > 0.")
|
|
194
191
|
dynamicThreshold = circuitData.dynamicThreshold
|
|
195
192
|
|
|
196
193
|
// the Circuit data for the ceremony setup
|
|
@@ -198,7 +195,7 @@ export const parseCeremonyFile = async (path: string, cleanup: boolean = false):
|
|
|
198
195
|
name: circuitData.name,
|
|
199
196
|
description: circuitData.description,
|
|
200
197
|
prefix: circuitPrefix,
|
|
201
|
-
sequencePosition: i+1,
|
|
198
|
+
sequencePosition: i + 1,
|
|
202
199
|
metadata: metadata,
|
|
203
200
|
files: files,
|
|
204
201
|
template: template,
|
|
@@ -209,23 +206,20 @@ export const parseCeremonyFile = async (path: string, cleanup: boolean = false):
|
|
|
209
206
|
contributionComputation: 0,
|
|
210
207
|
fullContribution: 0,
|
|
211
208
|
verifyCloudFunction: 0
|
|
212
|
-
}
|
|
213
|
-
|
|
209
|
+
}
|
|
214
210
|
}
|
|
215
211
|
}
|
|
216
212
|
|
|
217
213
|
if (data.timeoutMechanismType === CeremonyTimeoutType.FIXED) {
|
|
218
|
-
if (circuitData.fixedTimeWindow <= 0)
|
|
219
|
-
throw new Error("The fixed time window threshold should be > 0.")
|
|
214
|
+
if (circuitData.fixedTimeWindow <= 0) throw new Error("The fixed time window threshold should be > 0.")
|
|
220
215
|
fixedTimeWindow = circuitData.fixedTimeWindow
|
|
221
216
|
|
|
222
|
-
|
|
223
217
|
// the Circuit data for the ceremony setup
|
|
224
218
|
circuit = {
|
|
225
219
|
name: circuitData.name,
|
|
226
220
|
description: circuitData.description,
|
|
227
221
|
prefix: circuitPrefix,
|
|
228
|
-
sequencePosition: i+1,
|
|
222
|
+
sequencePosition: i + 1,
|
|
229
223
|
metadata: metadata,
|
|
230
224
|
files: files,
|
|
231
225
|
template: template,
|
|
@@ -236,16 +230,15 @@ export const parseCeremonyFile = async (path: string, cleanup: boolean = false):
|
|
|
236
230
|
contributionComputation: 0,
|
|
237
231
|
fullContribution: 0,
|
|
238
232
|
verifyCloudFunction: 0
|
|
239
|
-
}
|
|
240
|
-
|
|
233
|
+
}
|
|
241
234
|
}
|
|
242
235
|
}
|
|
243
236
|
|
|
244
|
-
|
|
245
237
|
circuits.push(circuit)
|
|
246
238
|
|
|
247
|
-
// remove the local r1cs
|
|
239
|
+
// remove the local r1cs and wasm downloads (if used for verifying the config only vs setup)
|
|
248
240
|
if (cleanup) fs.unlinkSync(localR1csPath)
|
|
241
|
+
fs.unlinkSync(localWasmPath)
|
|
249
242
|
}
|
|
250
243
|
|
|
251
244
|
const setupData: SetupCeremonyData = {
|
|
@@ -263,7 +256,6 @@ export const parseCeremonyFile = async (path: string, cleanup: boolean = false):
|
|
|
263
256
|
}
|
|
264
257
|
|
|
265
258
|
return setupData
|
|
266
|
-
|
|
267
259
|
} catch (error: any) {
|
|
268
260
|
throw new Error(`Error while parsing up the ceremony setup file. ${error.message}`)
|
|
269
261
|
}
|
|
@@ -457,9 +449,11 @@ export const getPublicAttestationPreambleForContributor = (
|
|
|
457
449
|
ceremonyName: string,
|
|
458
450
|
isFinalizing: boolean
|
|
459
451
|
) =>
|
|
460
|
-
`Hey, I'm ${contributorIdentifier} and I have ${
|
|
461
|
-
|
|
462
|
-
|
|
452
|
+
`Hey, I'm ${contributorIdentifier} and I have ${isFinalizing ? "finalized" : "contributed to"} the ${ceremonyName}${
|
|
453
|
+
ceremonyName.toLowerCase().includes("trusted setup") || ceremonyName.toLowerCase().includes("ceremony")
|
|
454
|
+
? "."
|
|
455
|
+
: " MPC Phase2 Trusted Setup ceremony."
|
|
456
|
+
}\nThe following are my contribution signatures:`
|
|
463
457
|
|
|
464
458
|
/**
|
|
465
459
|
* Check and prepare public attestation for the contributor made only of its valid contributions.
|
|
@@ -740,4 +734,4 @@ export const getR1CSInfo = (localR1CSFilePath: string): CircuitMetadata => {
|
|
|
740
734
|
* @param in <number> - the input number to be converted.
|
|
741
735
|
* @returns <string> - the two digits stringified number derived from the conversion.
|
|
742
736
|
*/
|
|
743
|
-
export const convertToDoubleDigits = (amount: number): string => (amount < 10 ? `0${amount}` : amount.toString())
|
|
737
|
+
export const convertToDoubleDigits = (amount: number): string => (amount < 10 ? `0${amount}` : amount.toString())
|
package/src/helpers/vm.ts
CHANGED
|
@@ -82,7 +82,7 @@ export const vmDependenciesAndCacheArtifactsCommand = (
|
|
|
82
82
|
zKeyPath: string,
|
|
83
83
|
potPath: string,
|
|
84
84
|
snsTopic: string,
|
|
85
|
-
region: string
|
|
85
|
+
region: string
|
|
86
86
|
): Array<string> => [
|
|
87
87
|
"#!/bin/bash",
|
|
88
88
|
'MARKER_FILE="/var/run/my_script_ran"',
|
|
@@ -93,8 +93,13 @@ export const vmDependenciesAndCacheArtifactsCommand = (
|
|
|
93
93
|
// eslint-disable-next-line no-template-curly-in-string
|
|
94
94
|
"touch ${MARKER_FILE}",
|
|
95
95
|
"sudo yum update -y",
|
|
96
|
-
"curl -
|
|
97
|
-
"
|
|
96
|
+
"curl -O https://nodejs.org/dist/v16.13.0/node-v16.13.0-linux-x64.tar.xz",
|
|
97
|
+
"tar -xf node-v16.13.0-linux-x64.tar.xz",
|
|
98
|
+
"mv node-v16.13.0-linux-x64 nodejs",
|
|
99
|
+
"sudo mv nodejs /opt/",
|
|
100
|
+
"echo 'export NODEJS_HOME=/opt/nodejs' >> /etc/profile",
|
|
101
|
+
"echo 'export PATH=$NODEJS_HOME/bin:$PATH' >> /etc/profile",
|
|
102
|
+
"source /etc/profile",
|
|
98
103
|
"npm install -g snarkjs",
|
|
99
104
|
`aws s3 cp s3://${zKeyPath} /var/tmp/genesisZkey.zkey`,
|
|
100
105
|
`aws s3 cp s3://${potPath} /var/tmp/pot.ptau`,
|
|
@@ -118,6 +123,7 @@ export const vmContributionVerificationCommand = (
|
|
|
118
123
|
lastZkeyStoragePath: string,
|
|
119
124
|
verificationTranscriptStoragePathAndFilename: string
|
|
120
125
|
): Array<string> => [
|
|
126
|
+
`source /etc/profile`,
|
|
121
127
|
`aws s3 cp s3://${bucketName}/${lastZkeyStoragePath} /var/tmp/lastZKey.zkey > /var/tmp/log.txt`,
|
|
122
128
|
`snarkjs zkvi /var/tmp/genesisZkey.zkey /var/tmp/pot.ptau /var/tmp/lastZKey.zkey > /var/tmp/verification_transcript.log`,
|
|
123
129
|
`aws s3 cp /var/tmp/verification_transcript.log s3://${bucketName}/${verificationTranscriptStoragePathAndFilename} &>/dev/null`,
|
package/src/index.ts
CHANGED
|
@@ -87,7 +87,7 @@ export {
|
|
|
87
87
|
verifyContribution,
|
|
88
88
|
checkAndPrepareCoordinatorForFinalization,
|
|
89
89
|
finalizeCircuit,
|
|
90
|
-
finalizeCeremony
|
|
90
|
+
finalizeCeremony
|
|
91
91
|
} from "./helpers/functions"
|
|
92
92
|
export { toHex, blake512FromPath, computeSHA256ToHex, compareHashes } from "./helpers/crypto"
|
|
93
93
|
export {
|
|
@@ -159,4 +159,4 @@ export {
|
|
|
159
159
|
createEC2Client,
|
|
160
160
|
vmContributionVerificationCommand,
|
|
161
161
|
retrieveCommandStatus
|
|
162
|
-
} from "./helpers/vm"
|
|
162
|
+
} from "./helpers/vm"
|
package/src/types/index.ts
CHANGED
|
@@ -620,7 +620,6 @@ export type SetupCeremonyData = {
|
|
|
620
620
|
circuitArtifacts: Array<CeremonySetupTemplateCircuitArtifacts>
|
|
621
621
|
}
|
|
622
622
|
|
|
623
|
-
|
|
624
623
|
export type CeremonySetupTemplateCircuitArtifacts = {
|
|
625
624
|
artifacts: {
|
|
626
625
|
bucket: string
|
|
@@ -640,11 +639,16 @@ export type CeremonySetupTemplateCircuitName = {
|
|
|
640
639
|
}
|
|
641
640
|
|
|
642
641
|
export type CeremonySetupTemplate = {
|
|
643
|
-
title: string
|
|
642
|
+
title: string
|
|
644
643
|
description: string
|
|
645
644
|
startDate: string
|
|
646
645
|
endDate: string
|
|
647
646
|
timeoutMechanismType: CeremonyTimeoutType
|
|
648
|
-
penalty: number
|
|
649
|
-
circuits: Array<
|
|
650
|
-
|
|
647
|
+
penalty: number
|
|
648
|
+
circuits: Array<
|
|
649
|
+
CircuitDocument &
|
|
650
|
+
CeremonySetupTemplateCircuitArtifacts &
|
|
651
|
+
CeremonySetupTemplateCircuitTimeout &
|
|
652
|
+
CeremonySetupTemplateCircuitName
|
|
653
|
+
>
|
|
654
|
+
}
|