Libsodium generateKeys 只能偶尔工作

Libsodium generateKeys working only sporadically

我是 运行 这个代码:

import React, { Component } from "react";
import logo from "./logo.svg";
import "./App.css";
import sotez from "sotez";

class App extends Component {
  state = {
    pkh: "",
    mnemonic: "",
    sk: ""
  };

  async componentDidMount() {
    await this.main();
  }

  main = async () => {
    const password = "yanterzzz";
    await sotez.node
      .query("/chains/main/blocks/head")
      .then(response => console.log(response));
    const result = await sotez.crypto.generateMnemonic();
    const answer = await sotez.crypto.generateKeys(result, password);
    console.log(answer.mnemonic);
    this.setState({ mnemonic: answer.mnemonic });
    this.setState({ sk: answer.sk });
    this.setState({ pkh: answer.pkh });
  };
}

它可以工作一段时间并正确生成密钥,但最终我会 运行 陷入这个错误:

Unhandled Rejection (TypeError): library.sodium.crypto_sign_seed_keypair is not a function

我的问题是 React 和组件重新加载还是 libsodium 库的问题?

所以可能发生的情况是用于 generateKeys 的伪随机数生成器需要从熵池中播种。通常,此池会在信息可用时自动更新信息。 RNG 在决定重新播种之前只会输出特定数量的数据。

它不会阻塞并等待自动重新播种发生,而是会进行显式调用以尽快检索熵。但是,此特定调用在 运行 时间内不可用,届时程序将因给定错误而崩溃。通常,除非在紧密循环中检索随机值,否则永远不会生成错误。

密钥对生成至少需要与密钥大小一样多的高质量随机数据,因此这是导致系统 运行 熵耗尽的已知原因之一。