Skip to content
Merged
21 changes: 19 additions & 2 deletions barretenberg/cpp/srs_db/download_ignition.sh
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,9 @@ cd ignition
mkdir -p monomial
cd monomial
NUM=${1:-19}
RANGE_START=${2:-}
RANGE_END=${3:-}
APPEND=${4:-"false"}

if command -v sha256sum > /dev/null; then
SHASUM=sha256sum
Expand All @@ -33,12 +36,26 @@ checksum() {
}

download() {
curl https://aztec-ignition.s3-eu-west-2.amazonaws.com/MAIN%20IGNITION/monomial/transcript${1}.dat > transcript${1}.dat
# Initialize an empty variable for the Range header
RANGE_HEADER=""

# If both RANGE_START and RANGE_END are set, add them to the Range header
if [ -n "$RANGE_START" ] && [ -n "$RANGE_END" ]; then
RANGE_HEADER="-H Range:bytes=$RANGE_START-$RANGE_END"
fi

# Download the file
if [ "$APPEND" = "true" ]; then
curl $RANGE_HEADER https://aztec-ignition.s3-eu-west-2.amazonaws.com/MAIN%20IGNITION/monomial/transcript${1}.dat >> transcript${1}.dat
else
curl $RANGE_HEADER https://aztec-ignition.s3-eu-west-2.amazonaws.com/MAIN%20IGNITION/monomial/transcript${1}.dat > transcript${1}.dat
fi

}

for TRANSCRIPT in $(seq 0 $NUM); do
NUM=$(printf %02d $TRANSCRIPT)
if [ -f checksums ]; then
if [ -f checksums ] && [ -z "$RANGE_START" ] && [ -z "$RANGE_END" ] ; then
checksum $NUM && continue
download $NUM
checksum $NUM || exit 1
Expand Down
9 changes: 9 additions & 0 deletions yarn-project/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,13 @@ RUN yarn tsc -b

FROM 278380418400.dkr.ecr.eu-west-2.amazonaws.com/yarn-project-base
COPY --from=builder /usr/src/yarn-project /usr/src/yarn-project

# Download minimal CRS requirements
COPY --from=builder /usr/src/barretenberg/cpp/srs_db/download_ignition.sh /usr/src/yarn-project/circuits.js/resources/download_ignition.sh
WORKDIR /usr/src/yarn-project/circuits.js/resources
RUN ./download_ignition.sh 0 28 3200027
RUN ./download_ignition.sh 0 322560092 322560219 true

WORKDIR /usr/src/yarn-project

ENTRYPOINT ["yarn"]
1 change: 1 addition & 0 deletions yarn-project/circuits.js/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
resources/ignition/
65 changes: 65 additions & 0 deletions yarn-project/circuits.js/resources/download_ignition.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
#!/bin/sh
# Downloads the ignition trusted setup transcripts.
#
# See here for details of the contents of the transcript.dat files:
# https://github.com/AztecProtocol/ignition-verification/blob/master/Transcript_spec.md
#
# To download all transcripts.
# ./download_ignition.sh
#
# To download a range of transcripts, e.g. 0, 1 and 2.
# ./download_ignition.sh 2
#
# If a checksums file is available, it will be used to validate if a download is required
# and also check the validity of the downloaded transcripts. If not the script downloads
# whatever is requested but does not check the validity of the downloads.
set -eu

mkdir -p ignition
cd ignition
mkdir -p monomial
cd monomial
NUM=${1:-19}
RANGE_START=${2:-}
RANGE_END=${3:-}
APPEND=${4:-"false"}

if command -v sha256sum > /dev/null; then
SHASUM=sha256sum
else
SHASUM="shasum -a 256"
fi

checksum() {
grep transcript${1}.dat checksums | $SHASUM -c
return $?
}

download() {
# Initialize an empty variable for the Range header
RANGE_HEADER=""

# If both RANGE_START and RANGE_END are set, add them to the Range header
if [ -n "$RANGE_START" ] && [ -n "$RANGE_END" ]; then
RANGE_HEADER="-H Range:bytes=$RANGE_START-$RANGE_END"
fi

# Download the file
if [ "$APPEND" = "true" ]; then
curl $RANGE_HEADER https://aztec-ignition.s3-eu-west-2.amazonaws.com/MAIN%20IGNITION/monomial/transcript${1}.dat >> transcript${1}.dat
else
curl $RANGE_HEADER https://aztec-ignition.s3-eu-west-2.amazonaws.com/MAIN%20IGNITION/monomial/transcript${1}.dat > transcript${1}.dat
fi

}

for TRANSCRIPT in $(seq 0 $NUM); do
NUM=$(printf %02d $TRANSCRIPT)
if [ -f checksums ] && [ -z "$RANGE_START" ] && [ -z "$RANGE_END" ] ; then
checksum $NUM && continue
download $NUM
checksum $NUM || exit 1
else
download $NUM
fi
done
70 changes: 57 additions & 13 deletions yarn-project/circuits.js/src/crs/index.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
import { createDebugLogger } from '@aztec/foundation/log';
import { fileURLToPath } from '@aztec/foundation/url';

import isNode from 'detect-node';
import { existsSync } from 'fs';
import { open } from 'fs/promises';
import { dirname } from 'path';
import { dirname, join } from 'path';

/**
* Downloader for CRS from the web or local.
Expand All @@ -26,7 +27,6 @@ export class NetCrs {
// We need numPoints number of g1 points.
const g1Start = 28;
const g1End = g1Start + this.numPoints * 64 - 1;

// Download required range of data.
const response = await fetch('https://aztec-ignition.s3.amazonaws.com/MAIN%20IGNITION/monomial/transcript00.dat', {
headers: {
Expand All @@ -43,7 +43,8 @@ export class NetCrs {
* Download the G2 points data.
*/
async downloadG2Data() {
const g2Start = 28 + 5040001 * 64;
const g2Start = 28 + 5_040_001 * 64; // = 322_560_092

const g2End = g2Start + 128 - 1;

const response2 = await fetch('https://aztec-ignition.s3.amazonaws.com/MAIN%20IGNITION/monomial/transcript00.dat', {
Expand Down Expand Up @@ -85,17 +86,18 @@ export class FileCrs {
*/
public readonly numPoints: number,
private path: string,
private readonly offsetStart = true,
) {}

/**
* Read the data file.
*/
async init() {
// We need numPoints number of g1 points.
const g1Start = 28;
const g1Start = this.offsetStart ? 28 : 0;
const g1Length = this.numPoints * 64;

const g2Start = 28 + 5040001 * 64;
const g2Start = 28 + 5_040_001 * 64; // = 322_560_092
const g2Length = 128;
// Lazily seek our data
const fileHandle = await open(this.path, 'r');
Expand All @@ -104,7 +106,7 @@ export class FileCrs {
await fileHandle.read(this.data, 0, g1Length, g1Start);

this.g2Data = Buffer.alloc(g2Length);
await fileHandle.read(this.g2Data, 0, g2Length, g2Start);
await fileHandle.read(this.g2Data, 0, g2Length, this.offsetStart ? g2Start : g1Start + g1Length);
} finally {
await fileHandle.close();
}
Expand Down Expand Up @@ -132,21 +134,40 @@ export class FileCrs {
*/
export class Crs {
private crs: FileCrs | NetCrs;
private logger = createDebugLogger('circuits:crs');
/**
* The path to our SRS object, assuming that we are in the aztec3-packages folder structure.
*/
private devPath = '/../../../../barretenberg/cpp/srs_db/ignition/monomial/transcript00.dat';
/**
* The path of our SRS object, if we downloaded on init.
*/
private localPath = `/../../resources/ignition/monomial/transcript00.dat`;

constructor(
/**
* The number of circuit gates.
*/
public readonly numPoints: number,

/**
* Option to save downloaded SRS on file.
*/
private readonly saveOnFile = true,
) {
if (isNode) {
/**
* The path to our SRS object, assuming that we are in the aztec3-packages folder structure.
*/
const SRS_DEV_PATH =
dirname(fileURLToPath(import.meta.url)) +
'/../../../../barretenberg/cpp/srs_db/ignition/monomial/transcript00.dat';
this.crs = existsSync(SRS_DEV_PATH) ? new FileCrs(numPoints, SRS_DEV_PATH) : new NetCrs(numPoints);
const devPath = join(fileURLToPath(import.meta.url), this.devPath);
const localPath = join(dirname(fileURLToPath(import.meta.url)), this.localPath);
const existsDev = existsSync(devPath);
const existsLocal = existsSync(localPath);

if (existsDev) {
this.crs = new FileCrs(numPoints, devPath);
} else if (existsLocal) {
this.crs = new FileCrs(numPoints, localPath, false);
} else {
this.crs = new NetCrs(numPoints);
}
} else {
this.crs = new NetCrs(numPoints);
}
Expand All @@ -157,6 +178,29 @@ export class Crs {
*/
async init() {
await this.crs.init();
if (isNode) {
const localPath = dirname(fileURLToPath(import.meta.url)) + this.localPath;
// save downloaded CRS on file
if (this.saveOnFile && !existsSync(localPath)) {
const fileHandle = await open(localPath, 'w');
const g1Data = Buffer.from(this.crs.getG1Data());
try {
await fileHandle.write(g1Data);
} catch (err: any) {
this.logger.warn('Failed to save CRS data: ', err.message);
}

const g2Data = Buffer.from(this.crs.getG2Data());
try {
await fileHandle.write(g2Data, 0, g2Data.length, g1Data.length);
// appendFileSync(localPath, Buffer.from(g2Data));
} catch (err: any) {
this.logger.warn('Failed to append G2 data: ', err.message);
} finally {
await fileHandle.close();
}
}
}
}

/**
Expand Down
86 changes: 43 additions & 43 deletions yarn-project/deploy_npm.sh
Original file line number Diff line number Diff line change
Expand Up @@ -8,52 +8,52 @@ cd project/src/yarn-project
echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" > .npmrc

function deploy_package() {
REPOSITORY=$1
VERSION=$(extract_tag_version $REPOSITORY false)

# If the commit tag itself has a dist-tag (e.g. v2.1.0-testnet.123), extract the dist-tag.
TAG=$(echo "$VERSION" | grep -oP ".*-\K(.*)(?=\.\d+)" || true)
TAG_ARG=""
if [ -n "$TAG" ]; then
TAG_ARG="--tag $TAG"
fi

readonly PUBLISHED_VERSION=$(npm show . version ${TAG_ARG:-} 2> /dev/null)
readonly HIGHER_VERSION=$(npx semver ${VERSION} ${PUBLISHED_VERSION} | tail -1)

# If there is already a published package equal to given version, assume this is a re-run of a deploy, and early out.
if [ "$VERSION" == "$PUBLISHED_VERSION" ]; then
echo "Tagged version $VERSION is equal to published version $PUBLISHED_VERSION. Skipping publish."
exit 0
fi

# If the published version is > the given version, something's gone wrong.
if [ "$VERSION" != "$HIGHER_VERSION" ]; then
echo "Tagged version $VERSION is lower than published version $PUBLISHED_VERSION."
exit 1
fi

# Update the package version in package.json.
TMP=$(mktemp)
jq --arg v $VERSION '.version = $v' package.json > $TMP && mv $TMP package.json

if [ -z "$STANDALONE" ]; then
REPOSITORY=$1

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Has this file changed other than whitespace?

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

indeed no, will remove from PR

VERSION=$(extract_tag_version $REPOSITORY false)
# If the commit tag itself has a dist-tag (e.g. v2.1.0-testnet.123), extract the dist-tag.
TAG=$(echo "$VERSION" | grep -oP ".*-\K(.*)(?=\.\d+)" || true)
TAG_ARG=""
if [ -n "$TAG" ]; then
TAG_ARG="--tag $TAG"
fi
readonly PUBLISHED_VERSION=$(npm show . version ${TAG_ARG:-} 2> /dev/null)
readonly HIGHER_VERSION=$(npx semver ${VERSION} ${PUBLISHED_VERSION} | tail -1)
# If there is already a published package equal to given version, assume this is a re-run of a deploy, and early out.
if [ "$VERSION" == "$PUBLISHED_VERSION" ]; then
echo "Tagged version $VERSION is equal to published version $PUBLISHED_VERSION. Skipping publish."
exit 0
fi
# If the published version is > the given version, something's gone wrong.
if [ "$VERSION" != "$HIGHER_VERSION" ]; then
echo "Tagged version $VERSION is lower than published version $PUBLISHED_VERSION."
exit 1
fi
# Update the package version in package.json.
TMP=$(mktemp)
jq --arg v $VERSION '.version = $v' package.json > $TMP && mv $TMP package.json
if [ -z "$STANDALONE" ]; then
# Update each dependent @aztec package version in package.json.
for PKG in $(jq --raw-output ".dependencies | keys[] | select(contains(\"@aztec/\"))" package.json); do
jq --arg v $VERSION ".dependencies[\"$PKG\"] = \$v" package.json > $TMP && mv $TMP package.json
jq --arg v $VERSION ".dependencies[\"$PKG\"] = \$v" package.json > $TMP && mv $TMP package.json
done
fi

# Filter on whitelist of properties.
jq '{name, version, exports, main, homepage, author, type, license, dependencies, description, bin} | with_entries( select( .value != null ) )' \
package.json > $TMP && mv $TMP package.json

# Publish
if [ -n "$COMMIT_TAG" ] ; then
npm publish $TAG_ARG --access public
else
npm publish --dry-run $TAG_ARG --access public
fi
fi
# Filter on whitelist of properties.
jq '{name, version, exports, main, homepage, author, type, license, dependencies, description, bin} | with_entries( select( .value != null ) )' \
package.json > $TMP && mv $TMP package.json
# Publish
if [ -n "$COMMIT_TAG" ] ; then
npm publish $TAG_ARG --access public
else
npm publish --dry-run $TAG_ARG --access public
fi
}
deploy_package foundation
deploy_package circuits.js
Expand Down
6 changes: 5 additions & 1 deletion yarn-project/yarn-project-base/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,8 @@ FROM 278380418400.dkr.ecr.eu-west-2.amazonaws.com/circuits-wasm-linux-clang as c
FROM 278380418400.dkr.ecr.eu-west-2.amazonaws.com/l1-contracts as contracts

FROM node:18-alpine
RUN apk update && apk add --no-cache bash jq
RUN apk update && apk add --no-cache bash jq curl

WORKDIR /usr/src/yarn-project

# The dockerignore file ensures the context only contains package.json and tsconfig.json files.
Expand All @@ -69,6 +70,9 @@ RUN yarn prepare:check
# Bring in circuits wasms.
COPY --from=circuits /usr/src/circuits/cpp/build-wasm/bin /usr/src/circuits/cpp/build-wasm/bin

# Copy ignition download script.
COPY --from=circuits /usr/src/barretenberg/cpp/srs_db/download_ignition.sh /usr/src/barretenberg/cpp/srs_db/download_ignition.sh

# Generate L1 contract TypeScript artifacts.
COPY --from=contracts /usr/src/l1-contracts/out /usr/src/l1-contracts/out
RUN cd l1-artifacts && ./scripts/generate-artifacts.sh