From 4a82f9e6e0431585ef00629f95e27f9041706b22 Mon Sep 17 00:00:00 2001 From: Rene Vergara Date: Sat, 15 Apr 2023 18:54:54 -0500 Subject: [PATCH 1/2] Include the wrapper for librustzcash --- configure | 4 ++++ package.yaml | 2 +- src/C/GettingStarted.chs | 12 ------------ src/C/Zcash.chs | 2 +- zcash-haskell.cabal | 3 +-- 5 files changed, 7 insertions(+), 16 deletions(-) create mode 100755 configure delete mode 100644 src/C/GettingStarted.chs diff --git a/configure b/configure new file mode 100755 index 0000000..0af689b --- /dev/null +++ b/configure @@ -0,0 +1,4 @@ +#!/bin/bash + +export PKG_CONFIG_PATH=$(pwd)/librustzcash-wrapper/target/x86_64-unknown-linux-gnu/debug +export LD_LIBRARY_PATH=$(pwd)/librustzcash-wrapper/target/x86_64-unknown-linux-gnu/debug diff --git a/package.yaml b/package.yaml index 3182baf..4abaff2 100644 --- a/package.yaml +++ b/package.yaml @@ -30,7 +30,7 @@ library: - text - foreign-rust pkg-config-dependencies: - - rust_wrapper-uninstalled + - rustzcash_wrapper-uninstalled tests: zcash-haskell-test: diff --git a/src/C/GettingStarted.chs b/src/C/GettingStarted.chs deleted file mode 100644 index 36e4c4e..0000000 --- a/src/C/GettingStarted.chs +++ /dev/null @@ -1,12 +0,0 @@ -module C.GettingStarted (rustWrapperAdd) where - -#include "rust_wrapper.h" - -import Data.Word - -{# fun pure unsafe rust_wrapper_add as rustWrapperAdd - { `Word64' - , `Word64' - } - -> `Word64' -#} diff --git a/src/C/Zcash.chs b/src/C/Zcash.chs index 05a5d2a..17cdeb5 100644 --- a/src/C/Zcash.chs +++ b/src/C/Zcash.chs @@ -5,7 +5,7 @@ module C.Zcash where -#include "rust_wrapper.h" +#include "rustzcash_wrapper.h" import qualified Data.ByteString as BS import Codec.Borsh diff --git a/zcash-haskell.cabal b/zcash-haskell.cabal index 1f60903..a4f20d2 100644 --- a/zcash-haskell.cabal +++ b/zcash-haskell.cabal @@ -25,7 +25,6 @@ source-repository head library exposed-modules: - C.GettingStarted C.Zcash Zcash other-modules: @@ -33,7 +32,7 @@ library hs-source-dirs: src pkgconfig-depends: - rust_wrapper-uninstalled + rustzcash_wrapper-uninstalled build-depends: base >=4.7 && <5 , borsh From 0d34c73a602237fb93ab183afad955e828a8ce8f Mon Sep 17 00:00:00 2001 From: Rene Vergara Date: Sat, 15 Apr 2023 19:07:08 -0500 Subject: [PATCH 2/2] Add rust code to repo --- .gitignore | 4 +- librustzcash-wrapper/Cargo.lock | 434 +++++++++++++++++++++++++++++ librustzcash-wrapper/Cargo.toml | 19 ++ librustzcash-wrapper/cbindgen.toml | 3 + librustzcash-wrapper/src/lib.rs | 45 +++ 5 files changed, 504 insertions(+), 1 deletion(-) create mode 100644 librustzcash-wrapper/Cargo.lock create mode 100644 librustzcash-wrapper/Cargo.toml create mode 100644 librustzcash-wrapper/cbindgen.toml create mode 100644 librustzcash-wrapper/src/lib.rs diff --git a/.gitignore b/.gitignore index c368d45..bb46a99 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ .stack-work/ -*~ \ No newline at end of file +*~ +librustzcash-wrapper/target/ +stack.yaml.lock diff --git a/librustzcash-wrapper/Cargo.lock b/librustzcash-wrapper/Cargo.lock new file mode 100644 index 0000000..c5c6ca0 --- /dev/null +++ b/librustzcash-wrapper/Cargo.lock @@ -0,0 +1,434 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "ahash" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" +dependencies = [ + "getrandom", + "once_cell", + "version_check", +] + +[[package]] +name = "arrayref" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" + +[[package]] +name = "arrayvec" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" + +[[package]] +name = "bech32" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf9ff0bbfd639f15c74af777d81383cf53efb7c93613f6cab67c6c11e05bbf8b" + +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + +[[package]] +name = "blake2b_simd" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c2f0dc9a68c6317d884f97cc36cf5a3d20ba14ce404227df55e1af708ab04bc" +dependencies = [ + "arrayref", + "arrayvec", + "constant_time_eq", +] + +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "generic-array", +] + +[[package]] +name = "borsh" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15bf3650200d8bffa99015595e10f1fbd17de07abbc25bb067da79e769939bfa" +dependencies = [ + "borsh-derive 0.9.3", + "hashbrown", +] + +[[package]] +name = "borsh" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4114279215a005bc675e386011e594e1d9b800918cea18fcadadcce864a2046b" +dependencies = [ + "borsh-derive 0.10.3", + "hashbrown", +] + +[[package]] +name = "borsh-derive" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6441c552f230375d18e3cc377677914d2ca2b0d36e52129fe15450a2dce46775" +dependencies = [ + "borsh-derive-internal 0.9.3", + "borsh-schema-derive-internal 0.9.3", + "proc-macro-crate", + "proc-macro2", + "syn 1.0.109", +] + +[[package]] +name = "borsh-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0754613691538d51f329cce9af41d7b7ca150bc973056f1156611489475f54f7" +dependencies = [ + "borsh-derive-internal 0.10.3", + "borsh-schema-derive-internal 0.10.3", + "proc-macro-crate", + "proc-macro2", + "syn 1.0.109", +] + +[[package]] +name = "borsh-derive-internal" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5449c28a7b352f2d1e592a8a28bf139bc71afb0764a14f3c02500935d8c44065" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "borsh-derive-internal" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afb438156919598d2c7bad7e1c0adf3d26ed3840dbc010db1a882a65583ca2fb" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "borsh-schema-derive-internal" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdbd5696d8bfa21d53d9fe39a714a18538bad11492a42d066dbbc395fb1951c0" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "borsh-schema-derive-internal" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "634205cc43f74a1b9046ef87c4540ebda95696ec0f315024860cad7c5b0f5ccd" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "bs58" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "771fe0050b883fcc3ea2359b1a96bcfbc090b7116eae7c3c512c7a083fdf23d3" +dependencies = [ + "sha2", +] + +[[package]] +name = "byteorder" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "constant_time_eq" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13418e745008f7349ec7e449155f419a61b92b58a99cc3616942b926825ec76b" + +[[package]] +name = "cpufeatures" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "280a9f2d8b3a38871a3c8a46fb80db65e5e5ed97da80c4d08bf27fb63e35e181" +dependencies = [ + "libc", +] + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + +[[package]] +name = "f4jumble" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a83e8d7fd0c526af4aad893b7c9fe41e2699ed8a776a6c74aecdeafe05afc75" +dependencies = [ + "blake2b_simd", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "hashbrown" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" +dependencies = [ + "ahash", +] + +[[package]] +name = "haskell-ffi" +version = "0.1.0" +source = "git+https://github.com/BeFunctional/haskell-rust-ffi.git?rev=2bf292e2e56eac8e9fb0fb2e1450cf4a4bd01274#2bf292e2e56eac8e9fb0fb2e1450cf4a4bd01274" +dependencies = [ + "bincode", + "borsh 0.9.3", + "haskell-ffi-derive", + "ref-cast", + "serde", +] + +[[package]] +name = "haskell-ffi-derive" +version = "0.1.0" +source = "git+https://github.com/BeFunctional/haskell-rust-ffi.git?rev=2bf292e2e56eac8e9fb0fb2e1450cf4a4bd01274#2bf292e2e56eac8e9fb0fb2e1450cf4a4bd01274" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "libc" +version = "0.2.141" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3304a64d199bb964be99741b7a14d26972741915b3649639149b2479bb46f4b5" + +[[package]] +name = "nonempty" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9e591e719385e6ebaeb5ce5d3887f7d5676fceca6411d1925ccc95745f3d6f7" + +[[package]] +name = "once_cell" +version = "1.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" + +[[package]] +name = "opaque-debug" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" + +[[package]] +name = "proc-macro-crate" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785" +dependencies = [ + "toml", +] + +[[package]] +name = "proc-macro2" +version = "1.0.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "ref-cast" +version = "1.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f43faa91b1c8b36841ee70e97188a869d37ae21759da6846d4be66de5bf7b12c" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d2275aab483050ab2a7364c1a46604865ee7d6906684e08db0f090acf74f9e7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.13", +] + +[[package]] +name = "rustzcash-wrapper" +version = "0.1.0" +dependencies = [ + "borsh 0.10.3", + "f4jumble", + "haskell-ffi", + "zcash_address", +] + +[[package]] +name = "serde" +version = "1.0.159" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c04e8343c3daeec41f58990b9d77068df31209f2af111e059e9fe9646693065" + +[[package]] +name = "sha2" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" +dependencies = [ + "block-buffer", + "cfg-if", + "cpufeatures", + "digest", + "opaque-debug", +] + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c9da457c5285ac1f936ebd076af6dac17a61cfe7826f2076b4d015cf47bc8ec" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "toml" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" +dependencies = [ + "serde", +] + +[[package]] +name = "typenum" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" + +[[package]] +name = "unicode-ident" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "zcash_address" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "804268e702b664fc09d3e2ce82786d0addf4ae57ba6976469be63e09066bf9f7" +dependencies = [ + "bech32", + "bs58", + "f4jumble", + "zcash_encoding", +] + +[[package]] +name = "zcash_encoding" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f03391b81727875efa6ac0661a20883022b6fba92365dc121c48fa9b00c5aac0" +dependencies = [ + "byteorder", + "nonempty", +] diff --git a/librustzcash-wrapper/Cargo.toml b/librustzcash-wrapper/Cargo.toml new file mode 100644 index 0000000..d26b3d0 --- /dev/null +++ b/librustzcash-wrapper/Cargo.toml @@ -0,0 +1,19 @@ +[package] +name = "rustzcash-wrapper" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +haskell-ffi.git = "https://github.com/BeFunctional/haskell-rust-ffi.git" +haskell-ffi.rev = "2bf292e2e56eac8e9fb0fb2e1450cf4a4bd01274" +f4jumble = "0.1" +zcash_address = "0.2.0" +borsh = "0.10" + +[features] +capi = [] + +[package.metadata.capi.library] +versioning = false diff --git a/librustzcash-wrapper/cbindgen.toml b/librustzcash-wrapper/cbindgen.toml new file mode 100644 index 0000000..96d4490 --- /dev/null +++ b/librustzcash-wrapper/cbindgen.toml @@ -0,0 +1,3 @@ +include_guard = "RUST_WRAPPER_H" +include_version = false +language = "C" diff --git a/librustzcash-wrapper/src/lib.rs b/librustzcash-wrapper/src/lib.rs new file mode 100644 index 0000000..696573b --- /dev/null +++ b/librustzcash-wrapper/src/lib.rs @@ -0,0 +1,45 @@ + +use std::{ + marker::PhantomData, + io::Write, + fmt::{Debug, Display, Formatter} +}; + +use f4jumble; + +use borsh::{BorshDeserialize, BorshSerialize}; +use haskell_ffi::{ + error::Result, + from_haskell::{marshall_from_haskell_var}, + to_haskell::{marshall_to_haskell_var, marshall_to_haskell_fixed}, + FromHaskell, HaskellSize, ToHaskell +}; + +use zcash_address::{ + Network, + unified::{Address, Encoding} +}; + +pub enum RW {} +pub const RW: PhantomData = PhantomData; + + +#[no_mangle] +pub extern "C" fn rust_wrapper_f4jumble( + input: *const u8, + input_len: usize, + out: *mut u8, + out_len: &mut usize) { + let input: Vec = marshall_from_haskell_var(input, input_len, RW); + let result = f4jumble::f4jumble(&input).unwrap(); + marshall_to_haskell_var(&result, out, out_len, RW); +} + +#[no_mangle] +pub extern "C" fn rust_wrapper_ua_decode( + input: *const u8, + input_len: usize,) -> bool { + let input: String = marshall_from_haskell_var(input, input_len, RW); + Address::decode(&input).is_ok() + //marshall_to_haskell_var(&result, out, out_len, RW); +}