【问题标题】:Cannot write keyfile with crate无法用 crate 写入密钥文件
【发布时间】:2019-07-25 12:13:09
【问题描述】:

我正在尝试使用https://docs.rs/ethkey/0.2.5/ethkey/ 此处的函数为以太坊编写密钥文件:

let key = EthAccount::load_or_generate("Users/Documents/Code/Thor/thor/parity/keys", "passwd")
        .expect("should load or generate new eth key");

    println!("{:?}", key.address());

不幸的是,它不起作用并出现以下错误:

thread 'main' panicked at 'should load or generate new eth key: Error(SerdeJsonError(Error("Is a directory (os error 21)", line: 0, column: 0)), State { next_error: None, backtrace: InternalBacktrace { backtrace: None } })', src/libcore/result.rs:999:5
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace.

更新

load_or_generate 在我输入~ 作为第一个参数时有效,但不是我真正想要我的密钥的文件路径,即Users/Documents/Code/Thor/thor/parity/keys

更新

我现在正在使用前面带有斜杠的完整路径,但仍然有效。即

let key = EthAccount::load_or_generate("./Users/samueldare/Documents/Code/Thor/thor/parity/keys", "passwd")
        .expect("should load or generate new eth key");

    println!("{:?}", key.address());

我会在这方面给予指点

【问题讨论】:

  • 这与your other question有何不同?
  • 现在不使用 home,使用文件路径适用于 home,即 ` ~ ` 但不是文件路径。即"Users/Documents/Code/Thor/thor/parity/keys"
  • 正在使用 vscode 吗?如果是这样,请右键单击函数 (load_or_generate) 并转到该函数的源代码并开始阅读以确定该函数需要什么。这将帮助您了解 Serde crate 生成的错误消息,其中包含用于解析此消息。
  • 但如果我理解错误,ethkey 会抱怨 .../parity/keys 是一个目录,而不是一个文件。该文档还说:pub fn load_or_generate<P, W>(file_path: P, password: W) 所以它应该是一个文件,而不是一个目录?
  • 这就是 ok(()) 腿.. 错误是要创建一个新的密钥文件 let (secret, log_msg) = match File::open(&file_path) { Ok(file) => { 让 key_file: KeyFile = serde_json::from_reader(file)?;让秘密 = SecretKey::from_crypto(&key_file.crypto, &pwd)?; (秘密,“加载”)} Err(_e) => { 让秘密 = SecretKey::from_raw(&random_bytes())?; save_key(&secret, &file_path, pwd)?; (秘密,“生成并保存”)

标签: rust rust-cargo


【解决方案1】:

在文件路径的开头添加一个“/”。

https://doc.rust-lang.org/std/path/struct.Path.html

例如:

let key = EthAccount::load_or_generate("/Users/Documents/Code/Thor/thor/parity/keys", "passwd")
        .expect("should load or generate new eth key");

在您的第一个问题中,这不是必需的,因为您使用“~”作为您的路径,这本身就是一条有效的路径。这一次,您从 '/Users...' 开始,它需要一个初始斜杠 '/'。

【讨论】:

  • 不认为它有效.. 我什至进入了pwd 的目录,即"/Users/samueldare/Documents/Code/Thor/thor/parity/keys" 我得到了下面的错误:thread 'main' panicked at 'should load or generate new eth key: Error(SerdeJsonError(Error("Is a directory (os error 21)", line: 0, column: 0)), State { next_error: None, backtrace: InternalBacktrace { backtrace: None } })', src/libcore/result.rs:999:5 note: run with RUST_BACKTRACE=1` 环境变量以显示回溯。 `
  • SerdeJsonError(Error("Is a directory (os error 21)) 是您现在应该用谷歌搜索的潜在错误消息。第一个问题是缺少开头的斜线。这是一条新的错误消息,与在预期文件名时传递目录有关(反之亦然)。当然,该函数在不存在密钥时需要一个目录,而在密钥文件确实存在时需要一个文件名,因此您必须弄清楚该目录是否存在以及为什么会混淆。
  • 如果您看到我的最后评论,我会收回并感谢您。想通了
猜你喜欢
  • 2016-07-31
  • 2015-07-21
  • 2013-02-12
  • 2011-02-18
  • 2012-08-15
  • 1970-01-01
  • 2021-02-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多