#ed25519 #ecdsa #blockchain #密码学 #axelar

应用 tofnd

密码学签名服务,由 Axelar 网络使用

2 个稳定版本

3.0.0 2023年2月25日
1.0.1 2024年7月13日
1.0.0 2024年7月11日

#1065 in 神奇豆子

MIT/Apache

135KB
2K SLoC

tofnd:密码学签名服务

Tofnd 是一个用 Rust 编写的 gRPC 服务器,它封装了 tofn 密码学库。

设置

git clone [email protected]:axelarnetwork/tofnd.git --recursive

安装 protoc

# Ubuntu
sudo apt install protobuf-compiler

# MacOS
brew install protobuf

构建二进制文件

预构建版本可以在 这里 找到

自行构建,请运行

cargo build --release --locked

运行测试

cargo test --release

为相关测试生成黄金文件

GOLDIE_UPDATE=1 cargo test --release

运行服务器

# install tofnd at ./target/release/tofnd
cargo install --locked --path . && cd ./target/release

# init tofnd
./tofnd -m create

# IMPORTANT: store the content of ./.tofnd/export file at a safe, offline place, and then delete the file
rm ./.tofnd/export

# start tofnd daemon
./tofnd

使用 ctrl+C 终止服务器。

密码

默认情况下,tofnd 在启动时立即从 stdin 提示输入密码。此密码用于加密磁盘存储。用户有责任保持此密码安全。

用户可以根据需要自动化密码输入。以下是一些示例。这些示例的安全性不一定可靠——用户有责任确保密码输入的安全性。

# feed password from MacOS keyring
security find-generic-password -a $(whoami) -s "tofnd" -w | ./tofnd

# feed password from 1password-cli
op get item tofnd --fields password | ./tofnd

# feed password from Pass
pass show tofnd | ./tofnd

# feed password from environment variable `PASSWORD`
echo $PASSWORD | ./tofnd

# feed password from a file `password.txt`
cat ./password.txt | ./tofnd

高级用户可以通过终端参数 --no-password 显式选择不输入密码(见下文)。在这种情况下,磁盘存储不安全——用户有责任采取额外措施确保磁盘存储的安全。

命令行参数

我们使用 clap 来管理命令行参数。

用户可以指定

  1. Tofnd 的根目录。使用 --directory-d 指定完整路径或相对路径。如果没有提供参数,则使用环境变量 TOFND_HOME。如果没有设置环境变量,则使用默认目录 ./tofnd
  2. gRPC 服务器端口号(默认为 50051)。
  3. mnemonic 操作为其 tofnd 实例(默认为 Existing)。有关更多信息,请参阅助记词选项。
  4. 默认情况下,tofnd 预期从标准输入获取密码。不希望使用密码的用户可以使用 --no-password 标志。注意:仅用于测试时使用 --no-password
A cryptographic signing service

USAGE:
    tofnd [FLAGS] [OPTIONS]

FLAGS:
        --no-password    Skip providing a password. Disabled by default. **Important note** If --no-password is set, the
                         a default (and public) password is used to encrypt.
    -h, --help           Prints help information
    -V, --version        Prints version information

OPTIONS:
    -a, --address <ip>              [default: 0.0.0.0]
    -d, --directory <directory>     [env: TOFND_HOME=]  [default: .tofnd]
    -m, --mnemonic <mnemonic>       [default: existing]  [possible values: existing, create, import, export]
    -p, --port <port>               [default: 50051]

Docker

Docker 配置

要设置 tofnd 容器,请使用 create 简记命令

docker-compose run -e MNEMONIC_CMD=create tofnd

这将初始化 tofnd,然后退出。

执行

要在容器内运行 tofnd 守护进程,请运行

docker-compose up

存储

我们使用 数据容器 在重启之间持久化数据。要清理存储,删除所有 tofnd 容器,然后运行

docker volume rm tofnd_tofnd

测试

为了测试目的,提供了 docker-compose.test.yml,它相当于 ./tofnd --no-password。要启动测试 tofnd 容器,请运行

docker-compose -f docker-compose.test.yml up

auto 命令

在容器化环境中,可以使用 auto 简记命令。此命令在 entrypoint.sh 中实现,并执行以下操作

  1. 尝试使用现有的简记。如果成功,则启动 tofnd 服务器。
  2. 尝试从文件导入简记。如果成功,则启动 tofnd 服务器。
  3. 创建一个新的简记。新创建的简记将自动写入文件 TOFND_HOME/export---将该文件重命名为 TOFND_HOME/import 以解除对 tofnd 未来执行的锁定。然后启动 tofnd 服务器。

auto 的背后原理是,用户可以无摩擦地启动和重启他们的 tofnd 节点,而无需执行多个命令。auto 目前仅在 docker-compose.test.yml 中是默认命令,但用户可以编辑 docker-compose.yml 以根据自己的意愿使用它。

注意: auto 将简记以纯文本形式留在磁盘上。您应删除 TOFND_HOME/import 文件并将简记存储在安全、离线的地方。

简记

Tofnd 使用 tiny-bip39 crate 来启用用户管理助记词短语。目前,每个参与者只能使用一个助记词短语。

简记选项

命令行 API 支持以下命令

  • Existing 使用现有的简记启动 gRPC 守护进程;如果没有简记,则失败。

  • Create 创建一个新的简记,将其插入到 kv-store 中,将其导出到文件并退出;如果简记已存在,则失败。

  • Import 提示用户从标准输入提供新的简记,将其插入到 kv-store 中并退出;如果简记已存在或提供的字符串不是有效的 bip39 简记,则失败。

  • Export 将现有的简记写入 <tofnd_root>/.tofnd/export 并退出;如果存在现有的简记,则成功。如果没有存储简记或导出文件已存在,则失败。

零化

我们使用 zeroize crate 作为良好实践来清除有关内存的敏感信息。我们清理的数据与简记有关

  1. 密码

请注意,tiny-bip39 在内部也使用了 zeroize

键值存储

为了在不同的 gRPC 之间持久化信息(例如 keygensign),我们使用了基于 sled 的键值存储。

Tofnd 使用一个加密的密语键值存储,该存储存储密语口令的熵。这个熵用于派生用户的密钥。键值存储使用用户提供的密码进行加密。密码用于派生一个加密键值存储的密钥。

门限密码学

关于 GG20 门限-ECDSA 协议的实现,请参阅 tofnd 的这个版本。GG20 协议的实现不应被视为生产就绪,因为它不能抵御最近发现的针对协议实现的攻击。由于它不在 Axelar 协议中使用,因此已从 tofnd 中删除。

许可证

所有受以下任一许可证授权的 crate:

任选其一。

贡献

除非您明确声明,否则根据 Apache-2.0 许可证定义的,您有意提交的任何旨在包含在作品中的贡献,将按上述方式双授权,不附加任何额外条款或条件。

依赖关系

~16–30MB
~403K SLoC