diff --git a/README.md b/README.md index d7f388e..3a5c971 100644 --- a/README.md +++ b/README.md @@ -2,18 +2,25 @@ FFI (NIF) export of Ethereum's ecrecover for use from Erlang. ### prerequisite: -- a checked out copy of my fork of parity-ethereum (https://github.com/johnsnewby/parity-ethereum) checked out in the same directory this is (i.e. it will be referenced as `../parity-ethereum`) +- a checked out copy of my fork of parity-ethereum (https://github.com/johnsnewby/parity-ethereum) checked out into this directory this is (i.e. it will be referenced as `./parity-ethereum`) ### to compile: `cargo build` ## Erlang integration -The shared library uses NIF. Use the erlang file `sec/nifecrecover.erl` to use this: +The shared library uses NIF. Use the erlang file `src/ecrecover.erl` to use this: ``` c("src/ecrecover"). -Decoded = ecrecover:hexstr_to_bin("47173285a8d7341e5e972fc677286384f802f8ef42a5ec5f03bbfa254cb01fad000000000000000000000000000000000000000000000000000000000000001b650acf9d3f5f0a2c799776a1254355d5f4061762a237396a99a0e0e3fc2bcd6729514a0dacb2e623ac4abd157cb18163ff942280db4d5caad66ddf941ba12e03"). -ecrecover:ecrecover(Decoded). -ecrecover:time_taken_to_execute(fun() -> ecrecover:ecrecover(Decoded) end). +c("src/ecrecover_util"). +Decoded = ecrecover_util:hex_to_bin("47173285a8d7341e5e972fc677286384f802f8ef42a5ec5f03bbfa254cb01fad000000000000000000000000000000000000000000000000000000000000001b650acf9d3f5f0a2c799776a1254355d5f4061762a237396a99a0e0e3fc2bcd6729514a0dacb2e623ac4abd157cb18163ff942280db4d5caad66ddf941ba12e03"). +List = binary:bin_to_list(Decoded). +Hash = binary:list_to_bin(lists:sublist(List, 1, 32)). +Sig = binary:list_to_bin(lists:sublist(List, 64, 65)). +Input = <>. +binary:bin_to_list(Input) == binary:bin_to_list(Decoded). +Result = ecrecover:recover(Hash, Sig). +Expected = ecrecover_util:hex_to_bin("000000000000000000000000c08b5542d177ac6686946920409741463a15dddb"). +binary:bin_to_list(Result) == binary:bin_to_list(Expected). %% check result ``` diff --git a/src/lib.rs b/src/lib.rs index 9ec33b9..93d60a5 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -7,8 +7,8 @@ extern crate parity_bytes; #[macro_use] extern crate rustler; -use ethcore_builtin::EcRecover; use crate::ethcore_builtin::Implementation; +use ethcore_builtin::EcRecover; use parity_bytes::BytesRef; use rustler::*; @@ -20,13 +20,10 @@ mod atoms { rustler_export_nifs!( "ecrecover", - [ - ("ecrecover", 1, nif_ecrecover), - ], + [("recover_", 1, nif_ecrecover),], Some(on_load) ); - #[no_mangle] fn on_load(_env: Env, _load_info: Term) -> bool { true @@ -35,9 +32,9 @@ fn on_load(_env: Env, _load_info: Term) -> bool { pub fn nif_ecrecover<'a>(env: Env<'a>, args: &[Term<'a>]) -> Result, Error> { let input: Binary = args[0].decode()?; let mut byte_ref = Vec::new(); - let ecrecover = EcRecover { }; - let _result = match ecrecover.execute(input.as_slice(), - &mut BytesRef::Fixed(&mut byte_ref)) { + let ecrecover = EcRecover {}; + let _result = match ecrecover.execute(input.as_slice(), &mut BytesRef::Flexible(&mut byte_ref)) + { Ok(_) => (), Err(_e) => return Err(rustler::Error::Atom("ecrecover_failed")), };