1
0
Fork 0
mirror of synced 2025-09-23 20:28:36 +00:00

Create binaries with libsnark disabled on new tags (#319)

* add appveyor, travis, remove libsnark as default, add push to gh

* fix appveyor

* change appveyor to nightly

* use cargo for build job

* change to build everywhere

* update token, reduce targets

* add more targets

* add on liner script

* remove rustc dep

* add need_cmd

* add check cmd

* simple brackets

* use check_cmd for curl

* copy stdlib to OUT_DIR

* ship stdlib in archive

* install stdlib, give PATH hints after build script

* clean

* comment

* scripts: ensure one-liner install script works with FreeBSD

* remove appveyor for now

* clean, remove windows, remove appveyor, remove travis test

* put back cross install

* fix stdlib test generation

* disable tests in travis

* restore test script to prevent tests to run..

* change scripts to keep same behaviour now that libsnark is disabled by default

* update docs with installer

* change docker to dockerhub

* change repo
This commit is contained in:
Thibaut Schaeffer 2019-04-11 23:20:44 +02:00 committed by GitHub
parent 0014fdee48
commit b93bf6f1ef
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
16 changed files with 555 additions and 21 deletions

BIN
.cargo/bin/zokrates Executable file

Binary file not shown.

71
.travis.yml Normal file
View file

@ -0,0 +1,71 @@
# Based on the "trust" template v0.1.2
# https://github.com/japaric/trust/tree/v0.1.2
dist: trusty
language: rust
rust:
- nightly
services: docker
sudo: required
env:
global:
- CRATE_NAME=zokrates
matrix:
include:
# Linux
- env: TARGET=aarch64-unknown-linux-gnu
- env: TARGET=arm-unknown-linux-gnueabi
- env: TARGET=i686-unknown-linux-gnu
- env: TARGET=x86_64-unknown-linux-gnu
# OSX
- env: TARGET=i686-apple-darwin
os: osx
- env: TARGET=x86_64-apple-darwin
os: osx
# *BSD
- env: TARGET=x86_64-unknown-freebsd
before_install:
- set -e
- rustup self update
install:
- sh ci/install.sh
- source ~/.cargo/env || true
script:
- bash ci/script.sh
after_script: set +e
before_deploy:
- sh ci/before_deploy.sh
deploy:
api_key:
secure: bJV3yFnt19nv2mc+0ekX6y6qfrq1mPCo+RZaPfY+KaUNJCposqIlvwZ0+TZIzKNNqrvC+oUyt8/jWU2A/hy1oFTkZmdtdcGkKYkm1C9v62ntOK6xv88qsZ4lz0Q6qKGoa7Ao3MZ9zomDl9WV+IESnPlnE5mCqw0sW1YF+pabZIojHPJyjspsKmcRADpPCSm9Qbotq521Q8+vGcfCLSlVOpGTMfG4MwB2K8FRV9m/wVaFjbKHg97rVMj1RKwtCDt0UNYTUhtfQ0jKqFGnQBxMKGhuvcoWQfjjcAcBGcBPfhXMXhOHEdbxrsdgpj/AJ4UTZlU15iTZ9wZlkSvBx4ttN2I0QEGt8UbzcXyG2JWkNBdKMAecQQU2g+UoAzLWFahzVgxrTfxiTQ8l9ax2hnY4xy+Qh4sMMWg1on1n0iHfIc4co5T0hNeCwXm8tcFIUtbE3FC92r5l23jom8EpQkDR3KnNt22wOqYOXH5yre2ZCi29phK3JkoXBfJfs1A8PQKXw/CiIfpPTQWYR2A6C2eQ27zia2sowzA4RUbplP1CAnCZrhjcNhU2R2DlgklDUkqwmaSetCQ1ZaWzXI6mUs/VJLpMbWKcX5kRT1C+ZhC0ZBbGrxrIPKWEdZHseE5uHNXFWxxvh5QrdpmULpeFL5wnXyWnrDOMpnkZx60w6VUHfbM=
file_glob: true
file: $CRATE_NAME-$TRAVIS_TAG-$TARGET.*
on:
tags: true
provider: releases
skip_cleanup: true
cache: cargo
before_cache:
# Travis can't cache files that are not readable by "others"
- chmod -R a+r $HOME/.cargo
branches:
only:
# release tags
- /^\d+\.\d+\.\d+.*$/
- master
notifications:
email:
on_success: never

7
Cargo.lock generated
View file

@ -396,6 +396,11 @@ dependencies = [
"syn 0.14.9 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "fs_extra"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "fuchsia-cprng"
version = "0.1.1"
@ -1278,6 +1283,7 @@ dependencies = [
name = "zokrates_stdlib"
version = "0.1.0"
dependencies = [
"fs_extra 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
"glob 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
"serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)",
"serde_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)",
@ -1333,6 +1339,7 @@ dependencies = [
"checksum error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "07e791d3be96241c77c43846b665ef1384606da2cd2a48730abe606a12906e02"
"checksum ff 0.5.0 (git+https://github.com/matterinc/ff?tag=0.5)" = "<none>"
"checksum ff_derive 0.4.0 (git+https://github.com/matterinc/ff?tag=0.5)" = "<none>"
"checksum fs_extra 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5f2a4a2034423744d2cc7ca2068453168dcdb82c438419e639a26bd87839c674"
"checksum fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba"
"checksum futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)" = "62941eff9507c8177d448bd83a44d9b9760856e184081d8cd79ba9f03dd24981"
"checksum futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "ab90cde24b3319636588d0c35fe03b1333857621051837ed769faefb4c2162e4"

View file

@ -13,6 +13,10 @@ _This is a proof-of-concept implementation. It has not been tested for productio
## Getting Started
```bash
curl -LSfs get.zokrat.es | sh
```
Have a look at the [documentation](https://zokrates.github.io/) for more information about using ZoKrates.
A getting started tutorial can be found [here](https://zokrates.github.io/sha256example.html).

View file

@ -4,7 +4,7 @@
set -e
if [ -n "$WITH_LIBSNARK" ]; then
cargo build
cargo -Z package-features build --package zokrates_cli --features="libsnark"
else
cargo -Z package-features build --no-default-features
cargo build
fi

View file

@ -4,7 +4,7 @@
set -e
if [ -n "$WITH_LIBSNARK" ]; then
cargo build --release
cargo -Z package-features build --release --package zokrates_cli --features="libsnark"
else
cargo -Z package-features build --release --no-default-features
cargo build --release
fi

35
ci/before_deploy.sh Executable file
View file

@ -0,0 +1,35 @@
# This script takes care of building your crate and packaging it for release
set -ex
main() {
local src=$(pwd) \
stage=
case $TRAVIS_OS_NAME in
linux)
stage=$(mktemp -d)
;;
osx)
stage=$(mktemp -d -t tmp)
;;
esac
test -f Cargo.lock || cargo generate-lockfile
cross build --bin zokrates --target $TARGET --release
# Package artifacts
# Binary
cp target/$TARGET/release/zokrates $stage/
# Standard library
cp -r zokrates_stdlib/stdlib $stage
cd $stage
tar czf $src/$CRATE_NAME-$TRAVIS_TAG-$TARGET.tar.gz *
cd $src
rm -rf $stage
}
main

47
ci/install.sh Executable file
View file

@ -0,0 +1,47 @@
set -ex
main() {
local target=
if [ $TRAVIS_OS_NAME = linux ]; then
target=x86_64-unknown-linux-musl
sort=sort
else
target=x86_64-apple-darwin
sort=gsort # for `sort --sort-version`, from brew's coreutils.
fi
# Builds for iOS are done on OSX, but require the specific target to be
# installed.
case $TARGET in
aarch64-apple-ios)
rustup target install aarch64-apple-ios
;;
armv7-apple-ios)
rustup target install armv7-apple-ios
;;
armv7s-apple-ios)
rustup target install armv7s-apple-ios
;;
i386-apple-ios)
rustup target install i386-apple-ios
;;
x86_64-apple-ios)
rustup target install x86_64-apple-ios
;;
esac
# This fetches latest stable release
local tag=$(git ls-remote --tags --refs --exit-code https://github.com/japaric/cross \
| cut -d/ -f3 \
| grep -E '^v[0.1.0-9.]+$' \
| $sort --version-sort \
| tail -n1)
curl -LSfs https://japaric.github.io/trust/install.sh | \
sh -s -- \
--force \
--git japaric/cross \
--tag $tag \
--target $target
}
main

11
ci/script.sh Normal file
View file

@ -0,0 +1,11 @@
# This script takes care of testing your crate
set -ex
# This is the test phase. We will only build as tests happened before.
main() {
cross build --target $TARGET
cross build --target $TARGET --release
}
main

View file

@ -4,7 +4,7 @@
set -e
if [ -n "$WITH_LIBSNARK" ]; then
cargo test --release -- --ignored
cargo -Z package-features test --release --package zokrates_cli --features="libsnark" -- --ignored
else
cargo -Z package-features test --release --no-default-features -- --ignored
cargo test --release -- --ignored
fi

337
scripts/one_liner.sh Executable file
View file

@ -0,0 +1,337 @@
#!/bin/sh
set -e
help() {
cat <<'EOF'
Install ZoKrates
Usage:
one_liner.sh [options]
Options:
-f, --force Force overwriting an existing installation
--to LOCATION Where to install (default ~/.zokrates)
EOF
}
check_cmd() {
command -v "$1" > /dev/null 2>&1
}
need_cmd() {
if ! check_cmd "$1"; then
err "need '$1' (command not found)"
fi
}
get_bitness() {
need_cmd head
# Architecture detection without dependencies beyond coreutils.
# ELF files start out "\x7fELF", and the following byte is
# 0x01 for 32-bit and
# 0x02 for 64-bit.
# The printf builtin on some shells like dash only supports octal
# escape sequences, so we use those.
local _current_exe_head
_current_exe_head=$(head -c 5 /proc/self/exe )
if [ "$_current_exe_head" = "$(printf '\177ELF\001')" ]; then
echo 32
elif [ "$_current_exe_head" = "$(printf '\177ELF\002')" ]; then
echo 64
else
err "unknown platform bitness"
fi
}
get_endianness() {
local cputype=$1
local suffix_eb=$2
local suffix_el=$3
# detect endianness without od/hexdump, like get_bitness() does.
need_cmd head
need_cmd tail
local _current_exe_endianness
_current_exe_endianness="$(head -c 6 /proc/self/exe | tail -c 1)"
if [ "$_current_exe_endianness" = "$(printf '\001')" ]; then
echo "${cputype}${suffix_el}"
elif [ "$_current_exe_endianness" = "$(printf '\002')" ]; then
echo "${cputype}${suffix_eb}"
else
err "unknown platform endianness"
fi
}
get_architecture() {
local _ostype _cputype _bitness _arch
_ostype="$(uname -s)"
_cputype="$(uname -m)"
if [ "$_ostype" = Linux ]; then
if [ "$(uname -o)" = Android ]; then
_ostype=Android
fi
fi
if [ "$_ostype" = Darwin ] && [ "$_cputype" = i386 ]; then
# Darwin `uname -m` lies
if sysctl hw.optional.x86_64 | grep -q ': 1'; then
_cputype=x86_64
fi
fi
case "$_ostype" in
Android)
_ostype=linux-android
;;
Linux)
_ostype=unknown-linux-gnu
_bitness=$(get_bitness)
;;
FreeBSD)
_ostype=unknown-freebsd
;;
NetBSD)
_ostype=unknown-netbsd
;;
DragonFly)
_ostype=unknown-dragonfly
;;
Darwin)
_ostype=apple-darwin
;;
MINGW* | MSYS* | CYGWIN*)
_ostype=pc-windows-gnu
;;
*)
err "unrecognized OS type: $_ostype"
;;
esac
case "$_cputype" in
i386 | i486 | i686 | i786 | x86)
_cputype=i686
;;
xscale | arm)
_cputype=arm
if [ "$_ostype" = "linux-android" ]; then
_ostype=linux-androideabi
fi
;;
armv6l)
_cputype=arm
if [ "$_ostype" = "linux-android" ]; then
_ostype=linux-androideabi
else
_ostype="${_ostype}eabihf"
fi
;;
armv7l | armv8l)
_cputype=armv7
if [ "$_ostype" = "linux-android" ]; then
_ostype=linux-androideabi
else
_ostype="${_ostype}eabihf"
fi
;;
aarch64)
_cputype=aarch64
;;
x86_64 | x86-64 | x64 | amd64)
_cputype=x86_64
;;
mips)
_cputype=$(get_endianness mips '' el)
;;
mips64)
if [ "$_bitness" -eq 64 ]; then
# only n64 ABI is supported for now
_ostype="${_ostype}abi64"
_cputype=$(get_endianness mips64 '' el)
fi
;;
ppc)
_cputype=powerpc
;;
ppc64)
_cputype=powerpc64
;;
ppc64le)
_cputype=powerpc64le
;;
*)
err "unknown CPU type: $_cputype"
esac
# Detect 64-bit linux with 32-bit userland
if [ "${_ostype}" = unknown-linux-gnu ] && [ "${_bitness}" -eq 32 ]; then
case $_cputype in
x86_64)
_cputype=i686
;;
mips64)
_cputype=$(get_endianness mips '' el)
;;
powerpc64)
_cputype=powerpc
;;
esac
fi
# Detect armv7 but without the CPU features Rust needs in that build,
# and fall back to arm.
# See https://github.com/rust-lang/rustup.rs/issues/587.
if [ "$_ostype" = "unknown-linux-gnueabihf" ] && [ "$_cputype" = armv7 ]; then
if ensure grep '^Features' /proc/cpuinfo | grep -q -v neon; then
# At least one processor does not have NEON.
_cputype=arm
fi
fi
_arch="${_cputype}-${_ostype}"
RETVAL="$_arch"
}
say() {
echo "ZoKrates: $1"
}
say_err() {
say "$1" >&2
}
err() {
if [ ! -z $td ]; then
rm -rf $td
fi
say_err "ERROR $1"
exit 1
}
need() {
if ! command -v $1 > /dev/null 2>&1; then
err "need $1 (command not found)"
fi
}
main() {
need_cmd curl
force=false
while test $# -gt 0; do
case $1 in
--force | -f)
force=true
;;
--to)
dest=$2
shift
;;
*)
;;
esac
shift
done
# Dependencies
need basename
need curl
need install
need mkdir
need mktemp
need tar
git="schaeff/zokrates"
url="https://github.com/$git"
url="$url/releases"
tag=$(curl -s "$url/latest" | cut -d'"' -f2 | rev | cut -d'/' -f1 | rev)
say_err "Tag: latest ($tag)"
# detect host architecture
get_architecture || return 1
arch="$RETVAL"
# find file extension. For now always tar.gz
ext="tar.gz"
say_err "Detected architecture: $arch"
# Set target directory
if [ -z $dest ]; then
dest="$HOME/.zokrates"
fi
say_err "Installing to: $dest"
# Fetch archive
url="$url/download/$tag/zokrates-$tag-$arch.$ext"
say_err "Fetching: $url"
td=$(mktemp -d || mktemp -d -t tmp)
curl -sLf --show-error $url | tar -C $td -xzf -
# install ZoKrates
for f in $(ls $td); do
# put folders into $dest
if [ -d $td/$f ]; then
if [ -e "$dest/$f" ] && [ $force = false ]; then
err "$f already exists in $dest, use --force to overwrite"
else
mkdir -p $dest
cp -rf $td/$f $dest
rm -rf $td/$f
fi
fi
# put executables into $dest/bin
if [ -x $td/$f ]; then
if [ -e "$dest/$f" ] && [ $force = false ]; then
err "$f already exists in $dest, use --force to overwrite"
else
mkdir -p $dest/bin
install -m 755 $td/$f $dest/bin
fi
fi
done
rm -rf $td
cat <<'EOF'
ZoKrates was installed succesfully!
If this is the first time you're installing ZoKrates run the following:
export PATH=$PATH:$HOME/.zokrates/bin
export ZOKRATES_HOME=$HOME/.zokrates/stdlib
EOF
}
main

View file

@ -4,7 +4,7 @@
set -e
if [ -n "$WITH_LIBSNARK" ]; then
cargo test
cargo -Z package-features test --release --package zokrates_cli --features="libsnark"
else
cargo -Z package-features test --no-default-features
cargo test --release
fi

View file

@ -2,9 +2,17 @@
## Installation
### One-line install
We provide a one-line install for Linux, MacOS and FreeBSD:
```bash
curl -LSfs get.zokrat.es | sh
```
### Docker
Using Docker is currently the recommended way to get started with ZoKrates.
ZoKrates is available on Dockerhub.
```bash
docker run -ti zokrates/zokrates /bin/bash
@ -14,13 +22,12 @@ From there on, you can use the `zokrates` CLI.
### From source
You can build the container yourself from [source](https://github.com/JacobEberhardt/ZoKrates/) with the following commands:
You can build the container yourself from [source](https://github.com/ZoKrates/ZoKrates/) with the following commands:
```bash
git clone https://github.com/JacobEberhardt/ZoKrates
git clone https://github.com/ZoKrates/ZoKrates
cd ZoKrates
docker build -t zokrates .
docker run -ti zokrates /bin/bash
cargo build --release
cd ZoKrates/target/release
```

View file

@ -6,7 +6,7 @@ repository = "https://github.com/JacobEberhardt/ZoKrates.git"
edition = "2018"
[features]
default = ["libsnark"]
default = []
libsnark = ["zokrates_core/libsnark"]
[dependencies]

View file

@ -4,10 +4,6 @@ version = "0.1.0"
authors = ["Stefan Deml <stefandeml@gmail.com>", "schaeff <thibaut@schaeff.fr>"]
edition = "2018"
[features]
default = ["libsnark"]
libsnark = ["zokrates_core/libsnark"]
[dev-dependencies]
zokrates_field = { version = "0.3", path = "../zokrates_field" }
zokrates_core = { version = "0.3", path = "../zokrates_core" }
@ -18,3 +14,4 @@ serde_json = "1.0"
[build-dependencies]
glob = "0.3.0"
fs_extra = "1.1.0"

View file

@ -1,10 +1,28 @@
use glob::glob;
use fs_extra::copy_items;
use fs_extra::dir::CopyOptions;
use std::env;
use std::fs::File;
use std::io::Write;
use std::path::{Path, PathBuf};
fn main() {
// export stdlib folder to OUT_DIR
export_stdlib();
// generate tests
write_tests();
}
fn export_stdlib() {
let out_dir = env::var("OUT_DIR").unwrap();
let mut options = CopyOptions::new();
options.overwrite = true;
copy_items(&vec!["stdlib"], out_dir, &options).unwrap();
}
fn write_tests() {
use glob::glob;
let out_dir = env::var("OUT_DIR").unwrap();
let destination = Path::new(&out_dir).join("tests.rs");
let mut test_file = File::create(&destination).unwrap();