diff --git a/Cargo.lock b/Cargo.lock index 14c37b2..dad5f53 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -284,6 +284,26 @@ name = "data-encoding" version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "data-encoding-macro" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "data-encoding 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "data-encoding-macro-internal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-hack 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "data-encoding-macro-internal" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "data-encoding 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-hack 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "digest" version = "0.7.2" @@ -366,7 +386,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "futures" -version = "0.1.19" +version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -529,6 +549,7 @@ dependencies = [ "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "data-encoding 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "data-encoding-macro 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "ed25519-dalek 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -549,7 +570,7 @@ dependencies = [ "data-encoding 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "fern 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", "indexmap 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "nano-lib-rs 0.0.1", @@ -682,6 +703,19 @@ dependencies = [ "syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "proc-macro-hack" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro-hack-impl 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "proc-macro-hack-impl" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "proc-macro2" version = "0.2.3" @@ -949,7 +983,7 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.6.14 (registry+https://github.com/rust-lang/crates.io-index)", @@ -965,7 +999,7 @@ name = "tokio-executor" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -974,7 +1008,7 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -983,7 +1017,7 @@ name = "tokio-reactor" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.6.14 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -997,7 +1031,7 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crossbeam-deque 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1009,7 +1043,7 @@ name = "tokio-timer" version = "0.1.2" source = "git+https://github.com/termhn/tokio-timer#e8a7ae8afafd103cb53386f5775fd5f6e2005936" dependencies = [ - "futures 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1132,6 +1166,8 @@ dependencies = [ "checksum crypto-mac 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0999b4ff4d3446d4ddb19a63e9e00c1876e75cd7000d20e57a693b4b3f08d958" "checksum curve25519-dalek 0.14.4 (registry+https://github.com/rust-lang/crates.io-index)" = "6734ff1a930d90b3ee54b7d6eba1b520f8724a1f353cf4f2b4b171a9ce63d814" "checksum data-encoding 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "67df0571a74bf0d97fb8b2ed22abdd9a48475c96bd327db968b7d9cace99655e" +"checksum data-encoding-macro 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05d74fe5b9e438951801efbc8c2acca091f70008eebd6edef061f89105aa8cd7" +"checksum data-encoding-macro-internal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b9f31cd0086d3b61c74c6d5a678e47aa3ac8b0c648dfc9165f8f97ccf1925cf1" "checksum digest 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "00a49051fef47a72c9623101b19bd71924a45cca838826caae3eaa4d00772603" "checksum dtoa 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "09c3753c3db574d215cba4ea76018483895d7bff25a31b49ba45db21c48e50ab" "checksum ed25519-dalek 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e3692ef38cc617236a39120ef0b91794e5e4d5c96227607a6740bfaaab53ac3c" @@ -1142,7 +1178,7 @@ dependencies = [ "checksum fern 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)" = "50475651fccc56343c766e4d1889428ea753308a977e1315db358ada28cc8c9d" "checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" "checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" -"checksum futures 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)" = "83f32b9e9aaa890fe8b9453b27ebbf3d11136a5ce59032500effd0e707bbcd80" +"checksum futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)" = "1a70b146671de62ec8c8ed572219ca5d594d9b06c0b364d5e67b722fc559b48c" "checksum generic-array 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ef25c5683767570c2bbd7deba372926a55eaae9982d7726ee2a1050239d45b9d" "checksum handlebars 0.31.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e7bdb08e879b8c78ee90f5022d121897c31ea022cb0cc6d13f2158c7a9fbabb1" "checksum indexmap 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b9378f1f3923647a9aea6af4c6b5de68cc8a71415459ad25ef191191c48f5b7" @@ -1175,6 +1211,8 @@ dependencies = [ "checksum parking_lot_core 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)" = "538ef00b7317875071d5e00f603f24d16f0b474c1a5fc0ccb8b454ca72eafa79" "checksum pest 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0fce5d8b5cc33983fc74f78ad552b5522ab41442c4ca91606e4236eb4b5ceefc" "checksum pest_derive 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "6453faedc5c9980a3c278f28b1df33344a79cc6d4a2fd96e2b56288374dc822a" +"checksum proc-macro-hack 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3ba8d4f9257b85eb6cdf13f055cea3190520aab1409ca2ab43493ea4820c25f0" +"checksum proc-macro-hack-impl 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d5cb6f960ad471404618e9817c0e5d10b1ae74cfdf01fab89ea0641fe7fb2892" "checksum proc-macro2 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "cd07deb3c6d1d9ff827999c7f9b04cdfd66b1b17ae508e14fe47b620f2282ae0" "checksum quick-error 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "eda5fe9b71976e62bc81b781206aaa076401769b2143379d3eb2118388babac4" "checksum quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e920b65c65f10b2ae65c831a81a073a89edd28c7cce89475bff467ab4167a" diff --git a/nano-lib-rs/Cargo.toml b/nano-lib-rs/Cargo.toml index 988d765..575d80f 100644 --- a/nano-lib-rs/Cargo.toml +++ b/nano-lib-rs/Cargo.toml @@ -15,6 +15,7 @@ blake2 = "0.7" ed25519-dalek = { version = "0.6", features = ["nightly"] } nanopow-rs = { path = "../nanopow-rs" } data-encoding = "2.1" +data-encoding-macro = "0.1.1" serde = "1.0" serde_derive = "1.0" serde_json = "1.0" diff --git a/nano-lib-rs/src/keys.rs b/nano-lib-rs/src/keys.rs index 3ccfc07..8fbefc1 100644 --- a/nano-lib-rs/src/keys.rs +++ b/nano-lib-rs/src/keys.rs @@ -1,32 +1,72 @@ -use nanopow_rs::InputHash; use super::hash::{Hash, Hasher}; - -pub use ed25519_dalek::{Keypair, PublicKey, SecretKey, Signature, PUBLIC_KEY_LENGTH, SECRET_KEY_LENGTH, SIGNATURE_LENGTH}; +use blake2::{ + digest::{Input, VariableOutput}, + Blake2b +}; +use data_encoding::Encoding; +pub use ed25519_dalek::{ + Keypair, + PublicKey, + SecretKey, + Signature, + PUBLIC_KEY_LENGTH, + SECRET_KEY_LENGTH, + SIGNATURE_LENGTH +}; +use nanopow_rs::InputHash; impl Hash for PublicKey { - fn hash(&self, state: &mut H) { - state.write(self.as_bytes()) - } + fn hash(&self, state: &mut H) { + state.write(self.as_bytes()) + } } +const XRB_ENCODING: Encoding = new_encoding!{ + symbols: "13456789abcdefghijkmnopqrstuwxyz", +}; + pub struct Address(pub String); impl From for Address { - fn from(_key: PublicKey) -> Self { - unimplemented!(); - } + fn from(key: PublicKey) -> Self { + let mut p_key = key.to_bytes().to_vec(); + let mut h = [0u8, 4].to_vec(); + h.append(&mut p_key); + let checksum = XRB_ENCODING.encode(&compute_address_checksum(key)); + let address = { + let encoded_addr = XRB_ENCODING.encode(&h); + let mut addr = String::from("xrb_"); + addr.push_str(encoded_addr.get(4..).unwrap()); + addr.push_str(&checksum); + addr + }; + + Address(address) + } +} + + +/// the address checksum is the 5byte hash of the public key reversed +/// +pub fn compute_address_checksum(key: PublicKey) -> [u8; 5] { + let mut blake = Blake2b::new(5).unwrap(); + let mut buf = [0u8; 5]; + blake.process(key.as_bytes()); + blake.variable_result(&mut buf).unwrap(); + buf.reverse(); + buf } pub struct Account { - pub public_key: PublicKey, - pub address: Address, + pub public_key: PublicKey, + pub address: Address, } impl From for Account { - fn from(key: PublicKey) -> Self { - Account { - public_key: key.clone(), - address: key.into(), - } - } + fn from(key: PublicKey) -> Self { + Account { + public_key: key.clone(), + address: key.into(), + } + } } diff --git a/nano-lib-rs/src/lib.rs b/nano-lib-rs/src/lib.rs index 7ffa8f6..9e37b1f 100644 --- a/nano-lib-rs/src/lib.rs +++ b/nano-lib-rs/src/lib.rs @@ -22,6 +22,7 @@ extern crate ed25519_dalek; extern crate bytes; extern crate data_encoding; +#[macro_use] extern crate data_encoding_macro; extern crate nanopow_rs; diff --git a/src/main.rs b/src/main.rs index 3162b8a..488e589 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,4 +1,3 @@ -#![feature(conservative_impl_trait)] extern crate tokio; extern crate tokio_io; extern crate tokio_timer;