[WIP] nice impl but that does not work because of private attributes of ZcashAddress

This commit is contained in:
Francisco Gindre 2021-09-24 21:10:45 -03:00
parent c49d181fbb
commit e9ad07c90d
5 changed files with 271 additions and 114 deletions

191
Cargo.lock generated
View File

@ -4,9 +4,15 @@ version = 3
[[package]] [[package]]
name = "anyhow" name = "anyhow"
version = "1.0.43" version = "1.0.44"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "28ae2b3dec75a406790005a200b1bd89785afc02517a00ca99ecfe093ee9e6cf" checksum = "61604a8f862e1d5c3229fdd78f8b02c68dcf73a4c4b05fd636d12240aaa242c1"
[[package]]
name = "arrayref"
version = "0.3.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544"
[[package]] [[package]]
name = "arrayvec" name = "arrayvec"
@ -57,6 +63,12 @@ dependencies = [
"toml", "toml",
] ]
[[package]]
name = "bech32"
version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cf9ff0bbfd639f15c74af777d81383cf53efb7c93613f6cab67c6c11e05bbf8b"
[[package]] [[package]]
name = "bitflags" name = "bitflags"
version = "1.3.2" version = "1.3.2"
@ -76,10 +88,45 @@ dependencies = [
] ]
[[package]] [[package]]
name = "bytes" name = "blake2b_simd"
version = "1.0.1" version = "0.5.11"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b700ce4376041dcd0a327fd0097c41095743c4c8af8887265942faf1100bd040" checksum = "afa748e348ad3be8263be728124b24a24f268266f6f5d58af9d75f6a40b5c587"
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 = "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 = "bytes"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8"
[[package]] [[package]]
name = "camino" name = "camino"
@ -130,12 +177,54 @@ dependencies = [
"unicode-width", "unicode-width",
] ]
[[package]]
name = "constant_time_eq"
version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc"
[[package]]
name = "cpufeatures"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "95059428f66df56b63431fdb4e1947ed2190586af5c5a8a8b71122bdf5a7f469"
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.0.0"
source = "git+https://github.com/zcash/librustzcash.git?rev=e13e746e8a4883d6683e24da00580d55f632b115#e13e746e8a4883d6683e24da00580d55f632b115"
dependencies = [
"blake2b_simd",
]
[[package]] [[package]]
name = "funty" name = "funty"
version = "1.1.0" version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fed34cd105917e91daa4da6b3728c47b068749d6a62c59811f06ed2ac71d9da7" checksum = "fed34cd105917e91daa4da6b3728c47b068749d6a62c59811f06ed2ac71d9da7"
[[package]]
name = "generic-array"
version = "0.14.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "501466ecc8a30d1d3b7fc9229b122b2ce8ed6e9d9223f1138d4babb253e51817"
dependencies = [
"typenum",
"version_check",
]
[[package]] [[package]]
name = "glob" name = "glob"
version = "0.3.0" version = "0.3.0"
@ -153,9 +242,9 @@ dependencies = [
[[package]] [[package]]
name = "itoa" name = "itoa"
version = "0.4.7" version = "0.4.8"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4"
[[package]] [[package]]
name = "lazy_static" name = "lazy_static"
@ -176,6 +265,12 @@ dependencies = [
"static_assertions", "static_assertions",
] ]
[[package]]
name = "libc"
version = "0.2.102"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a2a5ac8f984bfcf3a823267e5fde638acc3325f6496633a5da6bb6eb2171e103"
[[package]] [[package]]
name = "log" name = "log"
version = "0.4.14" version = "0.4.14"
@ -214,6 +309,18 @@ dependencies = [
"version_check", "version_check",
] ]
[[package]]
name = "nonempty"
version = "0.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e9e591e719385e6ebaeb5ce5d3887f7d5676fceca6411d1925ccc95745f3d6f7"
[[package]]
name = "opaque-debug"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5"
[[package]] [[package]]
name = "paste" name = "paste"
version = "1.0.5" version = "1.0.5"
@ -231,9 +338,9 @@ dependencies = [
[[package]] [[package]]
name = "proc-macro2" name = "proc-macro2"
version = "1.0.28" version = "1.0.29"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5c7ed8b8c7b886ea3ed7dde405212185f423ab44682667c8c6dd14aa1d9f6612" checksum = "b9f5105d4fdaab20335ca9565e106a5d9b82b6219b5ba735731124ac6711d23d"
dependencies = [ dependencies = [
"unicode-xid", "unicode-xid",
] ]
@ -280,18 +387,18 @@ dependencies = [
[[package]] [[package]]
name = "serde" name = "serde"
version = "1.0.127" version = "1.0.130"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f03b9878abf6d14e6779d3f24f07b2cfa90352cfec4acc5aab8f1ac7f146fae8" checksum = "f12d06de37cf59146fbdecab66aa99f9fe4f78722e3607577a5375d66bd0c913"
dependencies = [ dependencies = [
"serde_derive", "serde_derive",
] ]
[[package]] [[package]]
name = "serde_derive" name = "serde_derive"
version = "1.0.127" version = "1.0.130"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a024926d3432516606328597e0f224a51355a493b49fdd67e9209187cbe55ecc" checksum = "d7bc1a1ab1961464eae040d96713baa5a724a8152c1222492465b54322ec508b"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@ -300,15 +407,28 @@ dependencies = [
[[package]] [[package]]
name = "serde_json" name = "serde_json"
version = "1.0.66" version = "1.0.68"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "336b10da19a12ad094b59d870ebde26a45402e5b470add4b5fd03c5048a32127" checksum = "0f690853975602e1bfe1ccbf50504d67174e3bcf340f23b5ea9992e0587a52d8"
dependencies = [ dependencies = [
"itoa", "itoa",
"ryu", "ryu",
"serde", "serde",
] ]
[[package]]
name = "sha2"
version = "0.9.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b69f9a4c9740d74c5baa3fd2e547f9525fa8088a8a958e0ca2409a514e33f5fa"
dependencies = [
"block-buffer",
"cfg-if",
"cpufeatures",
"digest",
"opaque-debug",
]
[[package]] [[package]]
name = "static_assertions" name = "static_assertions"
version = "1.1.0" version = "1.1.0"
@ -317,9 +437,9 @@ checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
[[package]] [[package]]
name = "syn" name = "syn"
version = "1.0.74" version = "1.0.77"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1873d832550d4588c3dbc20f01361ab00bfe741048f71e3fecf145a7cc18b29c" checksum = "5239bc68e0fef57495900cfea4e8dc75596d9a319d7e16b1e0a440d24e6fe0a0"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@ -343,18 +463,18 @@ dependencies = [
[[package]] [[package]]
name = "thiserror" name = "thiserror"
version = "1.0.26" version = "1.0.29"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "93119e4feac1cbe6c798c34d3a53ea0026b0b1de6a120deef895137c0529bfe2" checksum = "602eca064b2d83369e2b2f34b09c70b605402801927c65c11071ac911d299b88"
dependencies = [ dependencies = [
"thiserror-impl", "thiserror-impl",
] ]
[[package]] [[package]]
name = "thiserror-impl" name = "thiserror-impl"
version = "1.0.26" version = "1.0.29"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "060d69a0afe7796bf42e9e2ff91f5ee691fb15c53d38b4b62a9a53eb23164745" checksum = "bad553cc2c78e8de258400763a647e80e6d1b31ee237275d756f6836d204494c"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@ -370,6 +490,12 @@ dependencies = [
"serde", "serde",
] ]
[[package]]
name = "typenum"
version = "1.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b63708a265f51345575b27fe43f9500ad611579e764c79edbc2037b1121959ec"
[[package]] [[package]]
name = "ucd-trie" name = "ucd-trie"
version = "0.1.3" version = "0.1.3"
@ -384,9 +510,9 @@ checksum = "8895849a949e7845e06bd6dc1aa51731a103c42707010a5b591c0038fb73385b"
[[package]] [[package]]
name = "unicode-width" name = "unicode-width"
version = "0.1.8" version = "0.1.9"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9337591893a19b88d8d87f2cec1e73fad5cdfd10e5a6f349f498ad6ea2ffb1e3" checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973"
[[package]] [[package]]
name = "unicode-xid" name = "unicode-xid"
@ -483,5 +609,20 @@ dependencies = [
[[package]] [[package]]
name = "zcash_address" name = "zcash_address"
version = "0.0.0" version = "0.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "git+https://github.com/zcash/librustzcash.git?rev=e13e746e8a4883d6683e24da00580d55f632b115#e13e746e8a4883d6683e24da00580d55f632b115"
checksum = "be44d6e2ddbadf6bc21f71b072e9e6e5829446a14e4366d16a24f32a79b34108" dependencies = [
"bech32",
"blake2b_simd",
"bs58",
"f4jumble",
"zcash_encoding",
]
[[package]]
name = "zcash_encoding"
version = "0.0.0"
source = "git+https://github.com/zcash/librustzcash.git?rev=e13e746e8a4883d6683e24da00580d55f632b115#e13e746e8a4883d6683e24da00580d55f632b115"
dependencies = [
"byteorder",
"nonempty",
]

View File

@ -15,7 +15,11 @@ name = "uniffi_zcash_addresses"
uniffi_macros = "0.13" uniffi_macros = "0.13"
uniffi = {version = "0.13", features=["builtin-bindgen"]} uniffi = {version = "0.13", features=["builtin-bindgen"]}
thiserror = "1.0" thiserror = "1.0"
zcash_address = "0.0" zcash_address = "0.0.0"
[build-dependencies] [build-dependencies]
uniffi_build = {version = "0.13", features=["builtin-bindgen"]} uniffi_build = {version = "0.13", features=["builtin-bindgen"]}
[patch.crates-io]
zcash_address = { git = "https://github.com/zcash/librustzcash.git" , rev = "e13e746e8a4883d6683e24da00580d55f632b115" }

View File

@ -2,19 +2,20 @@
// mod zcash_address::{ZcashAddress}; // mod zcash_address::{ZcashAddress};
uniffi_macros::include_scaffolding!("zcash_address"); uniffi_macros::include_scaffolding!("zcash_address");
use zcash_address::{ZcashAddress, ParseError, Network};
#[derive(Debug, thiserror::Error)] #[derive(Debug, thiserror::Error)]
pub enum AddressError { pub enum AddressError {
#[error("The received address string is invalid")] #[error("The received address string is invalid")]
InvalidAddress, InvalidAddress,
#[error("The received address string does not appear to be a Zcash address")]
NotZcash,
#[error("The received address was matched as a UA but resulted invalid")]
InvalidUnifiedAddress,
} }
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
pub enum Kind { pub enum NetworkType {
Sransparent,
Sapling,
Unified,
}
#[derive(Debug, Clone)]
pub enum Network {
Main, Main,
Test, Test,
Regtest Regtest
@ -22,38 +23,81 @@ pub enum Network {
#[derive(Debug)] #[derive(Debug)]
pub struct Address { pub struct Address {
kind: Kind, network: NetworkType,
network: Network,
string: String, string: String,
} }
fn parse(
address_text: String
) -> Result<Address, AddressError> {
ZcashAddress::try_from_encoded(&address_text.as_str())
.map(|zcash_address| zcash_address.to_address())
.map_err(|e| e.to_address_error())
}
impl Address { fn derive_transparent_address(
fn parse(address_text: &str) -> Result<Self, AddressError> { seed_bytes: &[u8],
Err(AddressError::InvalidAddress) account: i32,
index: i32
) -> Result<Address, AddressError> {
Err(AddressError::InvalidAddress)
}
fn derive_sapling_address(
seed_bytes: &[u8],
account: i32,
index: i32
) -> Result<Address, AddressError> {
Err(AddressError::InvalidAddress)
}
fn derive_unified_address(
seed_bytes: &[u8],
account: i32,
index: i32
) -> Result<Address, AddressError> {
Err(AddressError::InvalidAddress)
}
trait ToAddress {
fn to_address(&self) -> Address;
}
trait ToAddressError {
fn to_address_error(&self) -> AddressError;
}
trait ToNetworkType {
fn to_network_type(&self) -> NetworkType;
}
impl ToNetworkType for Network {
fn to_network_type(&self) -> NetworkType {
match self {
Network::Main => NetworkType::Main,
Network::Test => NetworkType::Test,
Network::Regtest => NetworkType::Regtest,
}
} }
}
fn derive_transaparent_address( impl ToAddressError for ParseError {
seed_bytes: &[u8], fn to_address_error(&self) -> AddressError {
account: i32, match self {
index: i32 ParseError::InvalidEncoding => AddressError::InvalidAddress,
) -> Result<Self, AddressError> { ParseError::NotZcash => AddressError::InvalidAddress,
Err(AddressError::InvalidAddress) ParseError::Unified(_) => AddressError::InvalidUnifiedAddress
}
} }
}
impl ToAddress for ZcashAddress {
fn to_address(&self) -> Address {
let address = Address {
network: self.net.to_network_type(),
string: self.to_string()
}
fn derive_sapling_address(
seed_bytes: &[u8],
account: i32,
index: i32
) -> Result<Self, AddressError> {
Err(AddressError::InvalidAddress)
}
fn derive_unified_address( return address
seed_bytes: &[u8],
account: i32,
index: i32
) -> Result<Self, AddressError> {
Err(AddressError::InvalidAddress)
} }
} }

View File

@ -1,31 +1,28 @@
namespace zcash_address { namespace zcash_address_util {
[Throws=AddressError] [Throws=AddressError]
Address parse(string address_text); Address parse(string address_text);
[Throws=AddressError]
Address derive_transparent_address([ByRef] sequence<u8> seed_bytes, i32 account, i32 index);
[Throws=AddressError]
Address derive_sapling_address([ByRef] sequence<u8> seed_bytes, i32 account, i32 index);
[Throws=AddressError]
Address derive_unified_address([ByRef] sequence<u8> seed_bytes, i32 account, i32 index);
}; };
enum Kind { enum NetworkType {
"Transparent", "Sapling", "Unified" "Test",
}; "Main",
"Regtest"
enum Network {
"Test", "Main", "Regtest"
}; };
dictionary Address { dictionary Address {
Kind kind; NetworkType network;
Network network; string string;
string str;
}; };
[Error] [Error]
enum AddressError { enum AddressError {
"InvalidAddress" "InvalidAddress",
}; "NotZcash",
"InvalidUnifiedAddress"
interface ZcashAddressHelper {
constructor();
Address parse(string address_text);
Address derive_transparent_address(sequence<u8> seed_bytes, i32 account, i32 index);
Address derive_sapling_address(sequence<u8> seed_bytes, i32 account, i32 index);
Address derive_unified_address(sequence<u8> seed_bytes, i32 account, i32 index);
}; };

View File

@ -1,42 +1,13 @@
import zcash_address import zcash_address
extension zcash_address.Address: Equatable {}
// extension Network: Equatable { do {
// static func ==(lhs: Network, rhs: Network) -> Bool { let testSaplingAddress = "ztestsapling1ysrf4uq52n5hhj0vzxpcfneszlk8flalh3ajdwsyucnpc0fjktp9afzcclnxdrnzfl7w7wyx3kz"
// switch lhs { let parsedAddress = try zcash_address.parse(testSaplingAddress)
// case .main: // assert(parsedAddress.network == .test)
// switch rhs { assert(true)
// case .main: } catch {
// return true fatalError("Invalid Address when it should have been valid")
// default: }
// return false
// }
// case .test:
// switch rhs {
// case .test:
// return true
// default:
// return false
// }
// case .regtest:
// switch rhs {
// case .regtest:
// return true
// default:
// return false
// }
// }
// }
// }
// let helper = ZcashAddressHelper()
// do {
// let testSaplingAddress = "ztestsapling1ysrf4uq52n5hhj0vzxpcfneszlk8flalh3ajdwsyucnpc0fjktp9afzcclnxdrnzfl7w7wyx3kz"
// let parsedAddress = try helper.parse(testSaplingAddress)
// // assert(parsedAddress.network == .test)
// assert(true)
// } catch {
// fatalError("Invalid Address when it should have been valid")
// }