@devtion/backend 0.0.0-f784f3a → 0.0.0-f7df5e1
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/README.md +5 -5
- package/dist/src/functions/index.js +123 -93
- package/dist/src/functions/index.mjs +125 -95
- package/dist/types/functions/ceremony.d.ts.map +1 -1
- package/dist/types/functions/circuit.d.ts.map +1 -1
- package/dist/types/functions/storage.d.ts.map +1 -1
- package/dist/types/functions/timeout.d.ts.map +1 -1
- package/dist/types/functions/user.d.ts.map +1 -1
- package/dist/types/lib/errors.d.ts +1 -0
- package/dist/types/lib/errors.d.ts.map +1 -1
- package/dist/types/lib/utils.d.ts +1 -1
- package/dist/types/lib/utils.d.ts.map +1 -1
- package/dist/types/types/index.d.ts +1 -1
- package/dist/types/types/index.d.ts.map +1 -1
- package/package.json +3 -3
- package/src/functions/ceremony.ts +8 -3
- package/src/functions/circuit.ts +119 -113
- package/src/functions/participant.ts +8 -8
- package/src/functions/storage.ts +5 -3
- package/src/functions/timeout.ts +3 -2
- package/src/functions/user.ts +31 -7
- package/src/lib/errors.ts +5 -0
- package/src/lib/utils.ts +3 -3
- package/src/types/index.ts +1 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @module @
|
|
3
|
-
* @version 1.0.
|
|
2
|
+
* @module @devtion/backend
|
|
3
|
+
* @version 1.0.8
|
|
4
4
|
* @file MPC Phase 2 backend for Firebase services management
|
|
5
5
|
* @copyright Ethereum Foundation 2022
|
|
6
6
|
* @license MIT
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
import admin from 'firebase-admin';
|
|
10
10
|
import * as functions from 'firebase-functions';
|
|
11
11
|
import dotenv from 'dotenv';
|
|
12
|
-
import { getCircuitsCollectionPath, getTimeoutsCollectionPath, commonTerms, finalContributionIndex, getContributionsCollectionPath, githubReputation, getBucketName, vmBootstrapCommand, vmDependenciesAndCacheArtifactsCommand, vmBootstrapScriptFilename, computeDiskSizeForVM, createEC2Instance, getParticipantsCollectionPath, terminateEC2Instance, formatZkeyIndex, getTranscriptStorageFilePath, getZkeyStorageFilePath, startEC2Instance, vmContributionVerificationCommand, runCommandUsingSSM, getPotStorageFilePath, genesisZkeyIndex, createCustomLoggerForFile, blake512FromPath, getVerificationKeyStorageFilePath, getVerifierContractStorageFilePath, computeSHA256ToHex,
|
|
12
|
+
import { getCircuitsCollectionPath, getTimeoutsCollectionPath, commonTerms, finalContributionIndex, getContributionsCollectionPath, githubReputation, getBucketName, vmBootstrapCommand, vmDependenciesAndCacheArtifactsCommand, vmBootstrapScriptFilename, computeDiskSizeForVM, createEC2Instance, getParticipantsCollectionPath, terminateEC2Instance, formatZkeyIndex, getTranscriptStorageFilePath, getZkeyStorageFilePath, startEC2Instance, vmContributionVerificationCommand, runCommandUsingSSM, getPotStorageFilePath, genesisZkeyIndex, createCustomLoggerForFile, blake512FromPath, getVerificationKeyStorageFilePath, getVerifierContractStorageFilePath, computeSHA256ToHex, checkIfRunning, retrieveCommandOutput, stopEC2Instance, verificationKeyAcronym, verifierSmartContractAcronym, retrieveCommandStatus } from '@devtion/actions';
|
|
13
13
|
import { encode } from 'html-entities';
|
|
14
14
|
import { Timestamp, FieldValue } from 'firebase-admin/firestore';
|
|
15
15
|
import { S3Client, GetObjectCommand, PutObjectCommand, DeleteObjectCommand, HeadBucketCommand, CreateBucketCommand, PutPublicAccessBlockCommand, PutBucketCorsCommand, HeadObjectCommand, CreateMultipartUploadCommand, UploadPartCommand, CompleteMultipartUploadCommand } from '@aws-sdk/client-s3';
|
|
@@ -19,7 +19,7 @@ import { pipeline } from 'node:stream';
|
|
|
19
19
|
import { promisify } from 'node:util';
|
|
20
20
|
import fs, { readFileSync } from 'fs';
|
|
21
21
|
import mime from 'mime-types';
|
|
22
|
-
import { setTimeout } from 'timers/promises';
|
|
22
|
+
import { setTimeout as setTimeout$1 } from 'timers/promises';
|
|
23
23
|
import fetch from '@adobe/node-fetch-retry';
|
|
24
24
|
import path from 'path';
|
|
25
25
|
import os from 'os';
|
|
@@ -121,7 +121,8 @@ const SPECIFIC_ERRORS = {
|
|
|
121
121
|
SE_VM_FAILED_COMMAND_EXECUTION: makeError("failed-precondition", "VM command execution failed", "Please, contact the coordinator if this error persists."),
|
|
122
122
|
SE_VM_TIMEDOUT_COMMAND_EXECUTION: makeError("deadline-exceeded", "VM command execution took too long and has been timed-out", "Please, contact the coordinator if this error persists."),
|
|
123
123
|
SE_VM_CANCELLED_COMMAND_EXECUTION: makeError("cancelled", "VM command execution has been cancelled", "Please, contact the coordinator if this error persists."),
|
|
124
|
-
SE_VM_DELAYED_COMMAND_EXECUTION: makeError("unavailable", "VM command execution has been delayed since there were no available instance at the moment", "Please, contact the coordinator if this error persists.")
|
|
124
|
+
SE_VM_DELAYED_COMMAND_EXECUTION: makeError("unavailable", "VM command execution has been delayed since there were no available instance at the moment", "Please, contact the coordinator if this error persists."),
|
|
125
|
+
SE_VM_UNKNOWN_COMMAND_STATUS: makeError("unavailable", "VM command execution has failed due to an unknown status code", "Please, contact the coordinator if this error persists.")
|
|
125
126
|
};
|
|
126
127
|
/**
|
|
127
128
|
* A set of common errors.
|
|
@@ -191,7 +192,7 @@ const getCurrentServerTimestampInMillis = () => Timestamp.now().toMillis();
|
|
|
191
192
|
* Interrupt the current execution for a specified amount of time.
|
|
192
193
|
* @param ms <number> - the amount of time expressed in milliseconds.
|
|
193
194
|
*/
|
|
194
|
-
const sleep = async (ms) => setTimeout(ms);
|
|
195
|
+
const sleep = async (ms) => setTimeout$1(ms);
|
|
195
196
|
/**
|
|
196
197
|
* Query for ceremony circuits.
|
|
197
198
|
* @notice the order by sequence position is fundamental to maintain parallelism among contributions for different circuits.
|
|
@@ -305,7 +306,7 @@ const downloadArtifactFromS3Bucket = async (bucketName, objectKey, localFilePath
|
|
|
305
306
|
const writeStream = createWriteStream(localFilePath);
|
|
306
307
|
const streamPipeline = promisify(pipeline);
|
|
307
308
|
await streamPipeline(response.body, writeStream);
|
|
308
|
-
writeStream.on(
|
|
309
|
+
writeStream.on("finish", () => {
|
|
309
310
|
writeStream.end();
|
|
310
311
|
});
|
|
311
312
|
};
|
|
@@ -521,8 +522,10 @@ const registerAuthUser = functions
|
|
|
521
522
|
const { uid } = user;
|
|
522
523
|
// Reference to a document using uid.
|
|
523
524
|
const userRef = firestore.collection(commonTerms.collections.users.name).doc(uid);
|
|
524
|
-
// html encode the display name
|
|
525
|
-
const encodedDisplayName = encode(displayName);
|
|
525
|
+
// html encode the display name (or put the ID if the name is not displayed)
|
|
526
|
+
const encodedDisplayName = user.displayName === "Null" || user.displayName === null ? user.uid : encode(displayName);
|
|
527
|
+
// store the avatar URL of a contributor
|
|
528
|
+
let avatarUrl = "";
|
|
526
529
|
// we only do reputation check if the user is not a coordinator
|
|
527
530
|
if (!(email?.endsWith(`@${process.env.CUSTOM_CLAIMS_COORDINATOR_EMAIL_ADDRESS_OR_DOMAIN}`) ||
|
|
528
531
|
email === process.env.CUSTOM_CLAIMS_COORDINATOR_EMAIL_ADDRESS_OR_DOMAIN)) {
|
|
@@ -532,14 +535,18 @@ const registerAuthUser = functions
|
|
|
532
535
|
const vars = getGitHubVariables();
|
|
533
536
|
// this return true or false
|
|
534
537
|
try {
|
|
535
|
-
const
|
|
536
|
-
if (!
|
|
538
|
+
const { reputable, avatarUrl: avatarURL } = await githubReputation(user.providerData[0].uid, vars.minimumFollowing, vars.minimumFollowers, vars.minimumPublicRepos);
|
|
539
|
+
if (!reputable) {
|
|
537
540
|
// Delete user
|
|
538
541
|
await auth.deleteUser(user.uid);
|
|
539
542
|
// Throw error
|
|
540
|
-
logAndThrowError(makeError("permission-denied", "The user is not allowed to sign up because their Github reputation is not high enough.", `The user ${user.displayName
|
|
543
|
+
logAndThrowError(makeError("permission-denied", "The user is not allowed to sign up because their Github reputation is not high enough.", `The user ${user.displayName === "Null" || user.displayName === null
|
|
544
|
+
? user.uid
|
|
545
|
+
: user.displayName} is not allowed to sign up because their Github reputation is not high enough. Please contact the administrator if you think this is a mistake.`));
|
|
541
546
|
}
|
|
542
|
-
|
|
547
|
+
// store locally
|
|
548
|
+
avatarUrl = avatarURL;
|
|
549
|
+
printLog(`Github reputation check passed for user ${user.displayName === "Null" || user.displayName === null ? user.uid : user.displayName}`, LogLevel.DEBUG);
|
|
543
550
|
}
|
|
544
551
|
catch (error) {
|
|
545
552
|
// Delete user
|
|
@@ -549,6 +556,8 @@ const registerAuthUser = functions
|
|
|
549
556
|
}
|
|
550
557
|
}
|
|
551
558
|
// Set document (nb. we refer to providerData[0] because we use Github OAuth provider only).
|
|
559
|
+
// In future releases we might want to loop through the providerData array as we support
|
|
560
|
+
// more providers.
|
|
552
561
|
await userRef.set({
|
|
553
562
|
name: encodedDisplayName,
|
|
554
563
|
encodedDisplayName,
|
|
@@ -561,7 +570,13 @@ const registerAuthUser = functions
|
|
|
561
570
|
photoURL: photoURL || "",
|
|
562
571
|
lastUpdated: getCurrentServerTimestampInMillis()
|
|
563
572
|
});
|
|
573
|
+
// we want to create a new collection for the users to store the avatars
|
|
574
|
+
const avatarRef = firestore.collection(commonTerms.collections.avatars.name).doc(uid);
|
|
575
|
+
await avatarRef.set({
|
|
576
|
+
avatarUrl: avatarUrl || ""
|
|
577
|
+
});
|
|
564
578
|
printLog(`Authenticated user document with identifier ${uid} has been correctly stored`, LogLevel.DEBUG);
|
|
579
|
+
printLog(`Authenticated user avatar with identifier ${uid} has been correctly stored`, LogLevel.DEBUG);
|
|
565
580
|
});
|
|
566
581
|
/**
|
|
567
582
|
* Set custom claims for role-based access control on the newly created user.
|
|
@@ -698,7 +713,7 @@ const setupCeremony = functions
|
|
|
698
713
|
// Check if using the VM approach for contribution verification.
|
|
699
714
|
if (circuit.verification.cfOrVm === "VM" /* CircuitContributionVerificationMechanism.VM */) {
|
|
700
715
|
// VM command to be run at the startup.
|
|
701
|
-
const startupCommand = vmBootstrapCommand(bucketName);
|
|
716
|
+
const startupCommand = vmBootstrapCommand(`${bucketName}/circuits/${circuit.name}`);
|
|
702
717
|
// Get EC2 client.
|
|
703
718
|
const ec2Client = await createEC2Client();
|
|
704
719
|
// Get AWS variables.
|
|
@@ -707,7 +722,8 @@ const setupCeremony = functions
|
|
|
707
722
|
const vmCommands = vmDependenciesAndCacheArtifactsCommand(`${bucketName}/${circuit.files?.initialZkeyStoragePath}`, `${bucketName}/${circuit.files?.potStoragePath}`, snsTopic, region);
|
|
708
723
|
printLog(`Check VM dependencies and cache artifacts commands ${vmCommands.join("\n")}`, LogLevel.DEBUG);
|
|
709
724
|
// Upload the post-startup commands script file.
|
|
710
|
-
|
|
725
|
+
printLog(`Uploading VM post-startup commands script file ${vmBootstrapScriptFilename}`, LogLevel.DEBUG);
|
|
726
|
+
await uploadFileToBucketNoFile(bucketName, `circuits/${circuit.name}/${vmBootstrapScriptFilename}`, vmCommands.join("\n"));
|
|
711
727
|
// Compute the VM disk space requirement (in GB).
|
|
712
728
|
const vmDiskSize = computeDiskSizeForVM(circuit.zKeySizeInBytes, circuit.metadata?.pot);
|
|
713
729
|
printLog(`Check VM startup commands ${startupCommand.join("\n")}`, LogLevel.DEBUG);
|
|
@@ -854,7 +870,7 @@ dotenv.config();
|
|
|
854
870
|
* @dev true when the participant can participate (1.A, 3.B, 1.D); otherwise false.
|
|
855
871
|
*/
|
|
856
872
|
const checkParticipantForCeremony = functions
|
|
857
|
-
.region(
|
|
873
|
+
.region("europe-west1")
|
|
858
874
|
.runWith({
|
|
859
875
|
memory: "512MB"
|
|
860
876
|
})
|
|
@@ -958,7 +974,7 @@ const checkParticipantForCeremony = functions
|
|
|
958
974
|
* 2) the participant has just finished the contribution for a circuit (contributionProgress != 0 && status = CONTRIBUTED && contributionStep = COMPLETED).
|
|
959
975
|
*/
|
|
960
976
|
const progressToNextCircuitForContribution = functions
|
|
961
|
-
.region(
|
|
977
|
+
.region("europe-west1")
|
|
962
978
|
.runWith({
|
|
963
979
|
memory: "512MB"
|
|
964
980
|
})
|
|
@@ -1005,7 +1021,7 @@ const progressToNextCircuitForContribution = functions
|
|
|
1005
1021
|
* 5) Completed contribution computation and verification.
|
|
1006
1022
|
*/
|
|
1007
1023
|
const progressToNextContributionStep = functions
|
|
1008
|
-
.region(
|
|
1024
|
+
.region("europe-west1")
|
|
1009
1025
|
.runWith({
|
|
1010
1026
|
memory: "512MB"
|
|
1011
1027
|
})
|
|
@@ -1056,7 +1072,7 @@ const progressToNextContributionStep = functions
|
|
|
1056
1072
|
* @dev enable the current contributor to resume a contribution from where it had left off.
|
|
1057
1073
|
*/
|
|
1058
1074
|
const permanentlyStoreCurrentContributionTimeAndHash = functions
|
|
1059
|
-
.region(
|
|
1075
|
+
.region("europe-west1")
|
|
1060
1076
|
.runWith({
|
|
1061
1077
|
memory: "512MB"
|
|
1062
1078
|
})
|
|
@@ -1098,7 +1114,7 @@ const permanentlyStoreCurrentContributionTimeAndHash = functions
|
|
|
1098
1114
|
* @dev enable the current contributor to resume a multi-part upload from where it had left off.
|
|
1099
1115
|
*/
|
|
1100
1116
|
const temporaryStoreCurrentContributionMultiPartUploadId = functions
|
|
1101
|
-
.region(
|
|
1117
|
+
.region("europe-west1")
|
|
1102
1118
|
.runWith({
|
|
1103
1119
|
memory: "512MB"
|
|
1104
1120
|
})
|
|
@@ -1136,7 +1152,7 @@ const temporaryStoreCurrentContributionMultiPartUploadId = functions
|
|
|
1136
1152
|
* @dev enable the current contributor to resume a multi-part upload from where it had left off.
|
|
1137
1153
|
*/
|
|
1138
1154
|
const temporaryStoreCurrentContributionUploadedChunkData = functions
|
|
1139
|
-
.region(
|
|
1155
|
+
.region("europe-west1")
|
|
1140
1156
|
.runWith({
|
|
1141
1157
|
memory: "512MB"
|
|
1142
1158
|
})
|
|
@@ -1178,7 +1194,7 @@ const temporaryStoreCurrentContributionUploadedChunkData = functions
|
|
|
1178
1194
|
* contributed to every selected ceremony circuits (= DONE).
|
|
1179
1195
|
*/
|
|
1180
1196
|
const checkAndPrepareCoordinatorForFinalization = functions
|
|
1181
|
-
.region(
|
|
1197
|
+
.region("europe-west1")
|
|
1182
1198
|
.runWith({
|
|
1183
1199
|
memory: "512MB"
|
|
1184
1200
|
})
|
|
@@ -1330,39 +1346,54 @@ const coordinate = async (participant, circuit, isSingleParticipantCoordination,
|
|
|
1330
1346
|
* Wait until the command has completed its execution inside the VM.
|
|
1331
1347
|
* @dev this method implements a custom interval to check 5 times after 1 minute if the command execution
|
|
1332
1348
|
* has been completed or not by calling the `retrieveCommandStatus` method.
|
|
1333
|
-
* @param {any} resolve the promise.
|
|
1334
|
-
* @param {any} reject the promise.
|
|
1335
1349
|
* @param {SSMClient} ssm the SSM client.
|
|
1336
1350
|
* @param {string} vmInstanceId the unique identifier of the VM instance.
|
|
1337
1351
|
* @param {string} commandId the unique identifier of the VM command.
|
|
1338
1352
|
* @returns <Promise<void>> true when the command execution succeed; otherwise false.
|
|
1339
1353
|
*/
|
|
1340
|
-
const waitForVMCommandExecution = (
|
|
1341
|
-
const
|
|
1354
|
+
const waitForVMCommandExecution = (ssm, vmInstanceId, commandId) => new Promise((resolve, reject) => {
|
|
1355
|
+
const poll = async () => {
|
|
1342
1356
|
try {
|
|
1343
1357
|
// Get command status.
|
|
1344
1358
|
const cmdStatus = await retrieveCommandStatus(ssm, vmInstanceId, commandId);
|
|
1345
1359
|
printLog(`Checking command ${commandId} status => ${cmdStatus}`, LogLevel.DEBUG);
|
|
1346
|
-
|
|
1347
|
-
|
|
1348
|
-
|
|
1349
|
-
|
|
1350
|
-
|
|
1351
|
-
|
|
1352
|
-
|
|
1353
|
-
|
|
1354
|
-
|
|
1355
|
-
|
|
1356
|
-
|
|
1357
|
-
|
|
1358
|
-
|
|
1359
|
-
|
|
1360
|
-
|
|
1361
|
-
|
|
1360
|
+
let error;
|
|
1361
|
+
switch (cmdStatus) {
|
|
1362
|
+
case CommandInvocationStatus.CANCELLING:
|
|
1363
|
+
case CommandInvocationStatus.CANCELLED: {
|
|
1364
|
+
error = SPECIFIC_ERRORS.SE_VM_CANCELLED_COMMAND_EXECUTION;
|
|
1365
|
+
break;
|
|
1366
|
+
}
|
|
1367
|
+
case CommandInvocationStatus.DELAYED: {
|
|
1368
|
+
error = SPECIFIC_ERRORS.SE_VM_DELAYED_COMMAND_EXECUTION;
|
|
1369
|
+
break;
|
|
1370
|
+
}
|
|
1371
|
+
case CommandInvocationStatus.FAILED: {
|
|
1372
|
+
error = SPECIFIC_ERRORS.SE_VM_FAILED_COMMAND_EXECUTION;
|
|
1373
|
+
break;
|
|
1374
|
+
}
|
|
1375
|
+
case CommandInvocationStatus.TIMED_OUT: {
|
|
1376
|
+
error = SPECIFIC_ERRORS.SE_VM_TIMEDOUT_COMMAND_EXECUTION;
|
|
1377
|
+
break;
|
|
1378
|
+
}
|
|
1379
|
+
case CommandInvocationStatus.IN_PROGRESS:
|
|
1380
|
+
case CommandInvocationStatus.PENDING: {
|
|
1381
|
+
// wait a minute and poll again
|
|
1382
|
+
setTimeout(poll, 60000);
|
|
1383
|
+
return;
|
|
1384
|
+
}
|
|
1385
|
+
case CommandInvocationStatus.SUCCESS: {
|
|
1386
|
+
printLog(`Command ${commandId} successfully completed`, LogLevel.DEBUG);
|
|
1387
|
+
// Resolve the promise.
|
|
1388
|
+
resolve();
|
|
1389
|
+
return;
|
|
1390
|
+
}
|
|
1391
|
+
default: {
|
|
1392
|
+
logAndThrowError(SPECIFIC_ERRORS.SE_VM_UNKNOWN_COMMAND_STATUS);
|
|
1393
|
+
}
|
|
1362
1394
|
}
|
|
1363
|
-
|
|
1364
|
-
logAndThrowError(
|
|
1365
|
-
reject();
|
|
1395
|
+
if (error) {
|
|
1396
|
+
logAndThrowError(error);
|
|
1366
1397
|
}
|
|
1367
1398
|
}
|
|
1368
1399
|
catch (error) {
|
|
@@ -1372,12 +1403,9 @@ const waitForVMCommandExecution = (resolve, reject, ssm, vmInstanceId, commandId
|
|
|
1372
1403
|
// Reject the promise.
|
|
1373
1404
|
reject();
|
|
1374
1405
|
}
|
|
1375
|
-
|
|
1376
|
-
|
|
1377
|
-
|
|
1378
|
-
}
|
|
1379
|
-
}, 60000); // 1 minute.
|
|
1380
|
-
};
|
|
1406
|
+
};
|
|
1407
|
+
setTimeout(poll, 60000);
|
|
1408
|
+
});
|
|
1381
1409
|
/**
|
|
1382
1410
|
* This method is used to coordinate the waiting queues of ceremony circuits.
|
|
1383
1411
|
* @dev this cloud function is triggered whenever an update of a document related to a participant of a ceremony occurs.
|
|
@@ -1398,7 +1426,7 @@ const waitForVMCommandExecution = (resolve, reject, ssm, vmInstanceId, commandId
|
|
|
1398
1426
|
* - Just completed a contribution or all contributions for each circuit. If yes, coordinate (multi-participant scenario).
|
|
1399
1427
|
*/
|
|
1400
1428
|
const coordinateCeremonyParticipant = functionsV1
|
|
1401
|
-
.region(
|
|
1429
|
+
.region("europe-west1")
|
|
1402
1430
|
.runWith({
|
|
1403
1431
|
memory: "512MB"
|
|
1404
1432
|
})
|
|
@@ -1501,7 +1529,7 @@ const checkIfVMRunning = async (ec2, vmInstanceId, attempts = 5) => {
|
|
|
1501
1529
|
* 1.A.4.C.1) If true, update circuit waiting for queue and average timings accordingly to contribution verification results;
|
|
1502
1530
|
* 2) Send all updates atomically to the Firestore database.
|
|
1503
1531
|
*/
|
|
1504
|
-
const verifycontribution = functionsV2.https.onCall({ memory: "16GiB", timeoutSeconds: 3600, region:
|
|
1532
|
+
const verifycontribution = functionsV2.https.onCall({ memory: "16GiB", timeoutSeconds: 3600, region: "europe-west1" }, async (request) => {
|
|
1505
1533
|
if (!request.auth || (!request.auth.token.participant && !request.auth.token.coordinator))
|
|
1506
1534
|
logAndThrowError(SPECIFIC_ERRORS.SE_AUTH_NO_CURRENT_AUTH_USER);
|
|
1507
1535
|
if (!request.data.ceremonyId ||
|
|
@@ -1612,8 +1640,6 @@ const verifycontribution = functionsV2.https.onCall({ memory: "16GiB", timeoutSe
|
|
|
1612
1640
|
lastZkeyBlake2bHash = match.at(0);
|
|
1613
1641
|
// re upload the formatted verification transcript
|
|
1614
1642
|
await uploadFileToBucket(bucketName, verificationTranscriptStoragePathAndFilename, verificationTranscriptTemporaryLocalPath, true);
|
|
1615
|
-
// Stop VM instance.
|
|
1616
|
-
await stopEC2Instance(ec2, vmInstanceId);
|
|
1617
1643
|
}
|
|
1618
1644
|
else {
|
|
1619
1645
|
// Upload verification transcript.
|
|
@@ -1674,6 +1700,9 @@ const verifycontribution = functionsV2.https.onCall({ memory: "16GiB", timeoutSe
|
|
|
1674
1700
|
lastUpdated: getCurrentServerTimestampInMillis()
|
|
1675
1701
|
});
|
|
1676
1702
|
}
|
|
1703
|
+
// Stop VM instance
|
|
1704
|
+
if (isUsingVM)
|
|
1705
|
+
await stopEC2Instance(ec2, vmInstanceId);
|
|
1677
1706
|
// Step (1.A.4.C)
|
|
1678
1707
|
if (!isFinalizing) {
|
|
1679
1708
|
// Step (1.A.4.C.1)
|
|
@@ -1688,7 +1717,7 @@ const verifycontribution = functionsV2.https.onCall({ memory: "16GiB", timeoutSe
|
|
|
1688
1717
|
const newAvgVerifyCloudFunctionTime = avgVerifyCloudFunctionTime > 0
|
|
1689
1718
|
? (avgVerifyCloudFunctionTime + verifyCloudFunctionTime) / 2
|
|
1690
1719
|
: verifyCloudFunctionTime;
|
|
1691
|
-
// Prepare tx to update circuit average contribution/verification time.
|
|
1720
|
+
// Prepare tx to update circuit average contribution/verification time.
|
|
1692
1721
|
const updatedCircuitDoc = await getDocumentById(getCircuitsCollectionPath(ceremonyId), circuitId);
|
|
1693
1722
|
const { waitingQueue: updatedWaitingQueue } = updatedCircuitDoc.data();
|
|
1694
1723
|
/// @dev this must happen only for valid contributions.
|
|
@@ -1738,7 +1767,7 @@ const verifycontribution = functionsV2.https.onCall({ memory: "16GiB", timeoutSe
|
|
|
1738
1767
|
commandId = await runCommandUsingSSM(ssm, vmInstanceId, verificationCommand);
|
|
1739
1768
|
printLog(`Starting the execution of command ${commandId}`, LogLevel.DEBUG);
|
|
1740
1769
|
// Step (1.A.3.3).
|
|
1741
|
-
return
|
|
1770
|
+
return waitForVMCommandExecution(ssm, vmInstanceId, commandId)
|
|
1742
1771
|
.then(async () => {
|
|
1743
1772
|
// Command execution successfully completed.
|
|
1744
1773
|
printLog(`Command ${commandId} execution has been successfully completed`, LogLevel.DEBUG);
|
|
@@ -1750,40 +1779,38 @@ const verifycontribution = functionsV2.https.onCall({ memory: "16GiB", timeoutSe
|
|
|
1750
1779
|
logAndThrowError(COMMON_ERRORS.CM_INVALID_COMMAND_EXECUTION);
|
|
1751
1780
|
});
|
|
1752
1781
|
}
|
|
1753
|
-
|
|
1754
|
-
|
|
1755
|
-
|
|
1756
|
-
|
|
1757
|
-
|
|
1758
|
-
|
|
1759
|
-
|
|
1760
|
-
|
|
1761
|
-
|
|
1762
|
-
|
|
1763
|
-
|
|
1764
|
-
|
|
1765
|
-
|
|
1766
|
-
|
|
1767
|
-
|
|
1768
|
-
|
|
1769
|
-
|
|
1770
|
-
|
|
1771
|
-
|
|
1772
|
-
|
|
1773
|
-
|
|
1774
|
-
|
|
1775
|
-
|
|
1776
|
-
|
|
1777
|
-
|
|
1778
|
-
|
|
1779
|
-
|
|
1780
|
-
|
|
1781
|
-
|
|
1782
|
-
|
|
1783
|
-
printLog(`Error while unlinking temporary files - Error ${error}`, LogLevel.WARN);
|
|
1784
|
-
}
|
|
1785
|
-
await completeVerification();
|
|
1782
|
+
// CF approach.
|
|
1783
|
+
printLog(`CF mechanism`, LogLevel.DEBUG);
|
|
1784
|
+
const potStoragePath = getPotStorageFilePath(files.potFilename);
|
|
1785
|
+
const firstZkeyStoragePath = getZkeyStorageFilePath(prefix, `${prefix}_${genesisZkeyIndex}.zkey`);
|
|
1786
|
+
// Prepare temporary file paths.
|
|
1787
|
+
// (nb. these are needed to download the necessary artifacts for verification from AWS S3).
|
|
1788
|
+
verificationTranscriptTemporaryLocalPath = createTemporaryLocalPath(verificationTranscriptCompleteFilename);
|
|
1789
|
+
const potTempFilePath = createTemporaryLocalPath(`${circuitId}_${participantDoc.id}.pot`);
|
|
1790
|
+
const firstZkeyTempFilePath = createTemporaryLocalPath(`${circuitId}_${participantDoc.id}_genesis.zkey`);
|
|
1791
|
+
const lastZkeyTempFilePath = createTemporaryLocalPath(`${circuitId}_${participantDoc.id}_last.zkey`);
|
|
1792
|
+
// Create and populate transcript.
|
|
1793
|
+
const transcriptLogger = createCustomLoggerForFile(verificationTranscriptTemporaryLocalPath);
|
|
1794
|
+
transcriptLogger.info(`${isFinalizing ? `Final verification` : `Verification`} transcript for ${prefix} circuit Phase 2 contribution.\n${isFinalizing ? `Coordinator ` : `Contributor # ${Number(lastZkeyIndex)}`} (${contributorOrCoordinatorIdentifier})\n`);
|
|
1795
|
+
// Step (1.A.2).
|
|
1796
|
+
await downloadArtifactFromS3Bucket(bucketName, potStoragePath, potTempFilePath);
|
|
1797
|
+
await downloadArtifactFromS3Bucket(bucketName, firstZkeyStoragePath, firstZkeyTempFilePath);
|
|
1798
|
+
await downloadArtifactFromS3Bucket(bucketName, lastZkeyStoragePath, lastZkeyTempFilePath);
|
|
1799
|
+
// Step (1.A.4).
|
|
1800
|
+
isContributionValid = await zKey.verifyFromInit(firstZkeyTempFilePath, potTempFilePath, lastZkeyTempFilePath, transcriptLogger);
|
|
1801
|
+
// Compute contribution hash.
|
|
1802
|
+
lastZkeyBlake2bHash = await blake512FromPath(lastZkeyTempFilePath);
|
|
1803
|
+
// Free resources by unlinking temporary folders.
|
|
1804
|
+
// Do not free-up verification transcript path here.
|
|
1805
|
+
try {
|
|
1806
|
+
fs.unlinkSync(potTempFilePath);
|
|
1807
|
+
fs.unlinkSync(firstZkeyTempFilePath);
|
|
1808
|
+
fs.unlinkSync(lastZkeyTempFilePath);
|
|
1809
|
+
}
|
|
1810
|
+
catch (error) {
|
|
1811
|
+
printLog(`Error while unlinking temporary files - Error ${error}`, LogLevel.WARN);
|
|
1786
1812
|
}
|
|
1813
|
+
await completeVerification();
|
|
1787
1814
|
}
|
|
1788
1815
|
});
|
|
1789
1816
|
/**
|
|
@@ -1792,7 +1819,7 @@ const verifycontribution = functionsV2.https.onCall({ memory: "16GiB", timeoutSe
|
|
|
1792
1819
|
* this does not happen if the participant is actually the coordinator who is finalizing the ceremony.
|
|
1793
1820
|
*/
|
|
1794
1821
|
const refreshParticipantAfterContributionVerification = functionsV1
|
|
1795
|
-
.region(
|
|
1822
|
+
.region("europe-west1")
|
|
1796
1823
|
.runWith({
|
|
1797
1824
|
memory: "512MB"
|
|
1798
1825
|
})
|
|
@@ -1853,7 +1880,7 @@ const refreshParticipantAfterContributionVerification = functionsV1
|
|
|
1853
1880
|
* and verification key extracted from the circuit final contribution (as part of the ceremony finalization process).
|
|
1854
1881
|
*/
|
|
1855
1882
|
const finalizeCircuit = functionsV1
|
|
1856
|
-
.region(
|
|
1883
|
+
.region("europe-west1")
|
|
1857
1884
|
.runWith({
|
|
1858
1885
|
memory: "512MB"
|
|
1859
1886
|
})
|
|
@@ -2050,8 +2077,10 @@ const createBucket = functions
|
|
|
2050
2077
|
CORSConfiguration: {
|
|
2051
2078
|
CORSRules: [
|
|
2052
2079
|
{
|
|
2053
|
-
AllowedMethods: ["GET"],
|
|
2054
|
-
AllowedOrigins: ["*"]
|
|
2080
|
+
AllowedMethods: ["GET", "PUT"],
|
|
2081
|
+
AllowedOrigins: ["*"],
|
|
2082
|
+
ExposeHeaders: ["ETag", "Content-Length"],
|
|
2083
|
+
AllowedHeaders: ["*"]
|
|
2055
2084
|
}
|
|
2056
2085
|
]
|
|
2057
2086
|
}
|
|
@@ -2528,7 +2557,8 @@ const resumeContributionAfterTimeoutExpiration = functions
|
|
|
2528
2557
|
if (status === "EXHUMED" /* ParticipantStatus.EXHUMED */)
|
|
2529
2558
|
await participantDoc.ref.update({
|
|
2530
2559
|
status: "READY" /* ParticipantStatus.READY */,
|
|
2531
|
-
lastUpdated: getCurrentServerTimestampInMillis()
|
|
2560
|
+
lastUpdated: getCurrentServerTimestampInMillis(),
|
|
2561
|
+
tempContributionData: {}
|
|
2532
2562
|
});
|
|
2533
2563
|
else
|
|
2534
2564
|
logAndThrowError(SPECIFIC_ERRORS.SE_CONTRIBUTE_CANNOT_PROGRESS_TO_NEXT_CIRCUIT);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ceremony.d.ts","sourceRoot":"","sources":["../../../src/functions/ceremony.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,oBAAoB,CAAA;AAuC/C;;;;;GAKG;AACH,eAAO,MAAM,aAAa,kCAiBpB,CAAA;AAEN;;;;;GAKG;AACH,eAAO,MAAM,YAAY,kCAkBnB,CAAA;AAEN;;;;GAIG;AACH,eAAO,MAAM,aAAa,
|
|
1
|
+
{"version":3,"file":"ceremony.d.ts","sourceRoot":"","sources":["../../../src/functions/ceremony.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,oBAAoB,CAAA;AAuC/C;;;;;GAKG;AACH,eAAO,MAAM,aAAa,kCAiBpB,CAAA;AAEN;;;;;GAKG;AACH,eAAO,MAAM,YAAY,kCAkBnB,CAAA;AAEN;;;;GAIG;AACH,eAAO,MAAM,aAAa,mDA8HpB,CAAA;AAEN;;;GAGG;AACH,eAAO,MAAM,+BAA+B,oEAsCtC,CAAA;AAEN;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,mDAiEvB,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"circuit.d.ts","sourceRoot":"","sources":["../../../src/functions/circuit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,WAAW,MAAM,uBAAuB,CAAA;AACpD,OAAO,KAAK,WAAW,MAAM,uBAAuB,CAAA;AAyCpD,OAAO,EAAuB,sBAAsB,EAAE,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"circuit.d.ts","sourceRoot":"","sources":["../../../src/functions/circuit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,WAAW,MAAM,uBAAuB,CAAA;AACpD,OAAO,KAAK,WAAW,MAAM,uBAAuB,CAAA;AAyCpD,OAAO,EAAuB,sBAAsB,EAAE,MAAM,gBAAgB,CAAA;AAiP5E;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,6BAA6B,4FAoGpC,CAAA;AAyBN;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,eAAO,MAAM,kBAAkB,0EAsZ9B,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,+CAA+C,wEA4EtD,CAAA;AAEN;;;;GAIG;AACH,eAAO,MAAM,eAAe,uDA8EtB,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../../src/functions/storage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,oBAAoB,CAAA;AAiI/C;;;GAGG;AACH,eAAO,MAAM,YAAY,
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../../src/functions/storage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,oBAAoB,CAAA;AAiI/C;;;GAGG;AACH,eAAO,MAAM,YAAY,mDAkGnB,CAAA;AAEN;;;GAGG;AACH,eAAO,MAAM,kBAAkB,mDAgDzB,CAAA;AAEN;;;;;GAKG;AACH,eAAO,MAAM,6BAA6B,mDAyCpC,CAAA;AAEN;;;GAGG;AACH,eAAO,MAAM,oBAAoB,mDA2D3B,CAAA;AAEN;;;;;;GAMG;AACH,eAAO,MAAM,0BAA0B,mDAuElC,CAAA;AAEL;;;GAGG;AACH,eAAO,MAAM,uBAAuB,mDAgE9B,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timeout.d.ts","sourceRoot":"","sources":["../../../src/functions/timeout.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,oBAAoB,CAAA;AAuB/C;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,iCAAiC,kCA6MxC,CAAA;AAEN;;;GAGG;AACH,eAAO,MAAM,wCAAwC,
|
|
1
|
+
{"version":3,"file":"timeout.d.ts","sourceRoot":"","sources":["../../../src/functions/timeout.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,oBAAoB,CAAA;AAuB/C;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,iCAAiC,kCA6MxC,CAAA;AAEN;;;GAGG;AACH,eAAO,MAAM,wCAAwC,mDA0C/C,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user.d.ts","sourceRoot":"","sources":["../../../src/functions/user.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,oBAAoB,CAAA;AAW/C;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,
|
|
1
|
+
{"version":3,"file":"user.d.ts","sourceRoot":"","sources":["../../../src/functions/user.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,oBAAoB,CAAA;AAW/C;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,mEA+GvB,CAAA;AACN;;;;GAIG;AACH,eAAO,MAAM,6BAA6B,mEA+BpC,CAAA"}
|
|
@@ -55,6 +55,7 @@ export declare const SPECIFIC_ERRORS: {
|
|
|
55
55
|
SE_VM_TIMEDOUT_COMMAND_EXECUTION: functions.auth.HttpsError;
|
|
56
56
|
SE_VM_CANCELLED_COMMAND_EXECUTION: functions.auth.HttpsError;
|
|
57
57
|
SE_VM_DELAYED_COMMAND_EXECUTION: functions.auth.HttpsError;
|
|
58
|
+
SE_VM_UNKNOWN_COMMAND_STATUS: functions.auth.HttpsError;
|
|
58
59
|
};
|
|
59
60
|
/**
|
|
60
61
|
* A set of common errors.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/lib/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,oBAAoB,CAAA;AAC/C,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAA;AAC5E,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAEzC;;;;;;;;GAQG;AACH,eAAO,MAAM,SAAS,cAAe,kBAAkB,WAAW,MAAM,YAAY,MAAM,KAAG,UAC9B,CAAA;AAE/D;;;;GAIG;AACH,eAAO,MAAM,QAAQ,YAAa,MAAM,YAAY,QAAQ,SAqB3D,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,gBAAgB,UAAW,UAAU,UAGjD,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,eAAe
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/lib/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,oBAAoB,CAAA;AAC/C,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAA;AAC5E,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAEzC;;;;;;;;GAQG;AACH,eAAO,MAAM,SAAS,cAAe,kBAAkB,WAAW,MAAM,YAAY,MAAM,KAAG,UAC9B,CAAA;AAE/D;;;;GAIG;AACH,eAAO,MAAM,QAAQ,YAAa,MAAM,YAAY,QAAQ,SAqB3D,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,gBAAgB,UAAW,UAAU,UAGjD,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuI3B,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,aAAa;;;;;;;;;;;CA2CzB,CAAA"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { DocumentData, QuerySnapshot, DocumentSnapshot, QueryDocumentSnapshot, WhereFilterOp } from "firebase-admin/firestore";
|
|
2
2
|
import admin from "firebase-admin";
|
|
3
|
-
import { CircuitDocument } from "@
|
|
3
|
+
import { CircuitDocument } from "@devtion/actions";
|
|
4
4
|
import { SSMClient } from "@aws-sdk/client-ssm";
|
|
5
5
|
import { EC2Client } from "@aws-sdk/client-ec2";
|
|
6
6
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/lib/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,YAAY,EACZ,aAAa,EACb,gBAAgB,EAChB,qBAAqB,EAErB,aAAa,EAChB,MAAM,0BAA0B,CAAA;AACjC,OAAO,KAAK,MAAM,gBAAgB,CAAA;AAWlC,OAAO,EAOH,eAAe,EAClB,MAAM,
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/lib/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,YAAY,EACZ,aAAa,EACb,gBAAgB,EAChB,qBAAqB,EAErB,aAAa,EAChB,MAAM,0BAA0B,CAAA;AACjC,OAAO,KAAK,MAAM,gBAAgB,CAAA;AAWlC,OAAO,EAOH,eAAe,EAClB,MAAM,kBAAkB,CAAA;AAIzB,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAM/C;;;;;;;;GAQG;AACH,eAAO,MAAM,eAAe,eACZ,MAAM,cACN,MAAM,KACnB,QAAQ,iBAAiB,YAAY,CAAC,CASxC,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,iCAAiC,QAAO,MAAoC,CAAA;AAEzF;;;GAGG;AACH,eAAO,MAAM,KAAK,OAAc,MAAM,KAAG,QAAQ,IAAI,CAAmB,CAAA;AAExE;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,eAAsB,MAAM,KAAG,QAAQ,MAAM,sBAAsB,YAAY,CAAC,CAAC,CAYhH,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,+BAA+B,eAC5B,MAAM,aACP,MAAM,KAClB,QAAQ,MAAM,sBAAsB,YAAY,CAAC,CAAC,CAUpD,CAAA;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,uBAAuB,eACpB,MAAM,iBACH,MAAM,KACtB,QAAQ,cAAc,YAAY,CAAC,CASrC,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,QAAa,QAAQ,MAAM,sBAAsB,YAAY,CAAC,CAAC,CAWhG,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,4BAA4B,eACzB,MAAM,oBACA,MAAM,KACzB,QAAQ,sBAAsB,YAAY,CAAC,CAY7C,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB,qBAAsB,MAAM,KAAG,MAAkD,CAAA;AAEtH;;;;;;GAMG;AACH,eAAO,MAAM,4BAA4B,eAAsB,MAAM,aAAa,MAAM,iBAAiB,MAAM,kBA6B9G,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,eACf,MAAM,aACP,MAAM,iBACF,MAAM,aACX,OAAO,kBA4BpB,CAAA;AAED,eAAO,MAAM,wBAAwB,eACrB,MAAM,aACP,MAAM,QACX,MAAM,aACF,OAAO,kBAyBpB,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,YAAY,eAAsB,MAAM,aAAa,MAAM,kBAWvE,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,6BAA6B,UAC/B,MAAM,wBACS,OAAO,SACtB,aAAa,KACrB,QAAQ,MAAM,SAAS,cAAc,CAAC,MAAM,SAAS,aAAa,CAAC,CAYxD,CAAA;AAEd;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,eACjB,MAAM,aACP,MAAM,KAClB,QAAQ,sBAAsB,YAAY,CAAC,CAgB7C,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,oBAAqB,eAAe,KAAG,eAKvE,CAAA;AAEF;;;GAGG;AACH,eAAO,MAAM,kBAAkB,QAAO,GAarC,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,eAAe,QAAO,GAkBlC,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,eAAe,QAAa,QAAQ,SAAS,CAYzD,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,eAAe,QAAa,QAAQ,SAAS,CAYzD,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,cAAqB,MAAM,KAAG,QAAQ,MAAM,CAQxE,CAAA"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { CeremonyInputData, CircuitDocument, ETagWithPartNumber } from "@
|
|
1
|
+
import { CeremonyInputData, CircuitDocument, ETagWithPartNumber } from "@devtion/actions";
|
|
2
2
|
/**
|
|
3
3
|
* Group all the necessary data needed for running the `setupCeremony` cloud function.
|
|
4
4
|
* @typedef {Object} SetupCeremonyData
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAEzF;;;;;;GAMG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAC5B,iBAAiB,EAAE,iBAAiB,CAAA;IACpC,cAAc,EAAE,MAAM,CAAA;IACtB,QAAQ,EAAE,KAAK,CAAC,eAAe,CAAC,CAAA;CACnC,CAAA;AAED;;;;GAIG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC3B,UAAU,EAAE,MAAM,CAAA;CACrB,CAAA;AAED;;;;;GAKG;AACH,MAAM,MAAM,sBAAsB,GAAG;IACjC,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;CACpB,CAAA;AAED;;;;;;GAMG;AACH,MAAM,MAAM,wBAAwB,GAAG,sBAAsB,GAAG;IAC5D,UAAU,CAAC,EAAE,MAAM,CAAA;CACtB,CAAA;AAED;;;;;;;;GAQG;AACH,MAAM,MAAM,8BAA8B,GAAG,sBAAsB,GAAG;IAClE,QAAQ,EAAE,MAAM,CAAA;IAChB,aAAa,EAAE,MAAM,CAAA;IACrB,UAAU,CAAC,EAAE,MAAM,CAAA;CACtB,CAAA;AAED;;;;;;;;GAQG;AACH,MAAM,MAAM,2BAA2B,GAAG,sBAAsB,GAAG;IAC/D,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,KAAK,CAAC,kBAAkB,CAAC,CAAA;IAChC,UAAU,CAAC,EAAE,MAAM,CAAA;CACtB,CAAA;AAED;;;;;;GAMG;AACH,MAAM,MAAM,8CAA8C,GAAG;IACzD,UAAU,EAAE,MAAM,CAAA;IAClB,2BAA2B,EAAE,MAAM,CAAA;IACnC,gBAAgB,EAAE,MAAM,CAAA;CAC3B,CAAA;AAED;;;;;GAKG;AACH,MAAM,MAAM,kDAAkD,GAAG;IAC7D,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;CACnB,CAAA;AAED;;;;;GAKG;AACH,MAAM,MAAM,kDAAkD,GAAG;IAC7D,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,kBAAkB,CAAA;CAC5B,CAAA;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,sBAAsB,GAAG;IACjC,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,kCAAkC,EAAE,MAAM,CAAA;CAC7C,CAAA;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,mBAAmB,GAAG;IAC9B,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,MAAM,CAAA;CACjB,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@devtion/backend",
|
|
3
|
-
"version": "0.0.0-
|
|
3
|
+
"version": "0.0.0-f7df5e1",
|
|
4
4
|
"description": "MPC Phase 2 backend for Firebase services management",
|
|
5
5
|
"repository": "git@github.com:privacy-scaling-explorations/p0tion.git",
|
|
6
6
|
"homepage": "https://github.com/privacy-scaling-explorations/p0tion",
|
|
@@ -67,7 +67,7 @@
|
|
|
67
67
|
"@aws-sdk/client-ssm": "^3.357.0",
|
|
68
68
|
"@aws-sdk/middleware-endpoint": "^3.329.0",
|
|
69
69
|
"@aws-sdk/s3-request-presigner": "^3.329.0",
|
|
70
|
-
"@
|
|
70
|
+
"@devtion/actions": "latest",
|
|
71
71
|
"blakejs": "^1.2.1",
|
|
72
72
|
"dotenv": "^16.0.3",
|
|
73
73
|
"ethers": "5.7.2",
|
|
@@ -85,5 +85,5 @@
|
|
|
85
85
|
"publishConfig": {
|
|
86
86
|
"access": "public"
|
|
87
87
|
},
|
|
88
|
-
"gitHead": "
|
|
88
|
+
"gitHead": "b5e67b5aab3948e7dae6eec480d727db8e6de80f"
|
|
89
89
|
}
|
|
@@ -18,7 +18,7 @@ import {
|
|
|
18
18
|
vmBootstrapCommand,
|
|
19
19
|
vmDependenciesAndCacheArtifactsCommand,
|
|
20
20
|
vmBootstrapScriptFilename
|
|
21
|
-
} from "@
|
|
21
|
+
} from "@devtion/actions"
|
|
22
22
|
import { encode } from "html-entities"
|
|
23
23
|
import { SetupCeremonyData } from "../types/index"
|
|
24
24
|
import { COMMON_ERRORS, logAndThrowError, printLog, SPECIFIC_ERRORS } from "../lib/errors"
|
|
@@ -146,7 +146,7 @@ export const setupCeremony = functions
|
|
|
146
146
|
// Check if using the VM approach for contribution verification.
|
|
147
147
|
if (circuit.verification.cfOrVm === CircuitContributionVerificationMechanism.VM) {
|
|
148
148
|
// VM command to be run at the startup.
|
|
149
|
-
const startupCommand = vmBootstrapCommand(bucketName)
|
|
149
|
+
const startupCommand = vmBootstrapCommand(`${bucketName}/circuits/${circuit.name!}`)
|
|
150
150
|
|
|
151
151
|
// Get EC2 client.
|
|
152
152
|
const ec2Client = await createEC2Client()
|
|
@@ -165,7 +165,12 @@ export const setupCeremony = functions
|
|
|
165
165
|
printLog(`Check VM dependencies and cache artifacts commands ${vmCommands.join("\n")}`, LogLevel.DEBUG)
|
|
166
166
|
|
|
167
167
|
// Upload the post-startup commands script file.
|
|
168
|
-
|
|
168
|
+
printLog(`Uploading VM post-startup commands script file ${vmBootstrapScriptFilename}`, LogLevel.DEBUG)
|
|
169
|
+
await uploadFileToBucketNoFile(
|
|
170
|
+
bucketName,
|
|
171
|
+
`circuits/${circuit.name!}/${vmBootstrapScriptFilename}`,
|
|
172
|
+
vmCommands.join("\n")
|
|
173
|
+
)
|
|
169
174
|
|
|
170
175
|
// Compute the VM disk space requirement (in GB).
|
|
171
176
|
const vmDiskSize = computeDiskSizeForVM(circuit.zKeySizeInBytes!, circuit.metadata?.pot!)
|