0

I have the k256 crate and I'm trying to sign a string. Here is my code:

let priv_key = SigningKey::from_bytes(self.private_key.as_bytes()).expect("Make priv key");
let tx_hash = transaction.get_hash();
let signer = Signer::new(&tx_hash);
let sig = signer.sign_digest_with_rng(&mut OsRng, tx_hash);

However, compilation results in the following error:

error[E0599]: the function or associated item `new` exists for trait object `dyn Signer<_>`, but its trait bounds were not satisfied
  --> src/wallet.rs:32:30
   |
32 |         let signer = Signer::new(&tx_hash);
   |                              ^^^ function or associated item cannot be called on `dyn Signer<_>` due to unsatisfied trait bounds
   |
  ::: /Users/oriont/.cargo/registry/src/github.com-1ecc6299db9ec823/signature-1.4.0/src/signer.rs:13:1
   |
13 | pub trait Signer<S: Signature> {
   | ------------------------------
   | |
   | doesn't satisfy `dyn Signer<_>: Default`
   | doesn't satisfy `dyn Signer<_>: HashMarker`
   | doesn't satisfy `dyn Signer<_>: Sized`
   | doesn't satisfy `dyn Signer<_>: sha2::Digest`
   | doesn't satisfy `dyn Signer<_>: sha2::digest::FixedOutput`
   | doesn't satisfy `dyn Signer<_>: sha2::digest::Update`
   |
   = note: the following trait bounds were not satisfied:
           `dyn Signer<_>: Sized`
           which is required by `dyn Signer<_>: sha2::Digest`
           `dyn Signer<_>: sha2::digest::FixedOutput`
           which is required by `dyn Signer<_>: sha2::Digest`
           `dyn Signer<_>: Default`
           which is required by `dyn Signer<_>: sha2::Digest`
           `dyn Signer<_>: sha2::digest::Update`
           which is required by `dyn Signer<_>: sha2::Digest`
           `dyn Signer<_>: HashMarker`
           which is required by `dyn Signer<_>: sha2::Digest`
           `&dyn Signer<_>: sha2::digest::FixedOutput`
           which is required by `&dyn Signer<_>: sha2::Digest`
           `&dyn Signer<_>: Default`
           which is required by `&dyn Signer<_>: sha2::Digest`
           `&dyn Signer<_>: sha2::digest::Update`
           which is required by `&dyn Signer<_>: sha2::Digest`
           `&dyn Signer<_>: HashMarker`
           which is required by `&dyn Signer<_>: sha2::Digest`
           `&mut dyn Signer<_>: sha2::digest::FixedOutput`
           which is required by `&mut dyn Signer<_>: sha2::Digest`
           `&mut dyn Signer<_>: Default`
           which is required by `&mut dyn Signer<_>: sha2::Digest`
           `&mut dyn Signer<_>: sha2::digest::Update`
           which is required by `&mut dyn Signer<_>: sha2::Digest`
           `&mut dyn Signer<_>: HashMarker`
           which is required by `&mut dyn Signer<_>: sha2::Digest`

For more information about this error, try `rustc --explain E0599`.

It seems like Signer has to have some sort of generic signature type, but the example in the docs don't reflect this. https://docs.rs/k256/0.4.2/k256/ecdsa/index.html

My Cargo.toml file has the ecdsa and ecdsa-core features:

[dependencies]
...
k256 = { version = "0.10.2", features = ["ecdsa", "ecdsa-core"] }

How can I fix this?

oriont
  • 684
  • 2
  • 10
  • 25

1 Answers1

0

I fixed my problem: I was looking at 2 different versions of the doc at once. This page shows the latest version: https://docs.rs/p256/latest/p256/ecdsa/index.html

I updated my code accordingly (and used hex to turn bytes to a string`)

let priv_key_bytes = &hex::decode(&self.private_key).unwrap();
let priv_key = SigningKey::from_bytes(&priv_key_bytes).unwrap();
let tx_hash = transaction.get_hash();
let sig: Signature = priv_key.sign(tx_hash.as_bytes());
let sig_str = hex::encode(sig.to_vec());

Now it works!

oriont
  • 684
  • 2
  • 10
  • 25