2 个稳定版本
3.0.0 |
|
---|---|
1.0.1 | 2024年7月13日 |
1.0.0 | 2024年7月11日 |
#1065 in 神奇豆子
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 来管理命令行参数。
用户可以指定
- Tofnd 的根目录。使用
--directory
或-d
指定完整路径或相对路径。如果没有提供参数,则使用环境变量TOFND_HOME
。如果没有设置环境变量,则使用默认目录./tofnd
。 - gRPC 服务器端口号(默认为 50051)。
mnemonic
操作为其tofnd
实例(默认为Existing
)。有关更多信息,请参阅助记词选项。- 默认情况下,
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
中实现,并执行以下操作
- 尝试使用现有的简记。如果成功,则启动
tofnd
服务器。 - 尝试从文件导入简记。如果成功,则启动
tofnd
服务器。 - 创建一个新的简记。新创建的简记将自动写入文件
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 作为良好实践来清除有关内存的敏感信息。我们清理的数据与简记有关
- 熵
- 密码
请注意,tiny-bip39 在内部也使用了 zeroize
。
键值存储
为了在不同的 gRPC 之间持久化信息(例如 keygen 和 sign),我们使用了基于 sled 的键值存储。
Tofnd
使用一个加密的密语键值存储,该存储存储密语口令的熵。这个熵用于派生用户的密钥。键值存储使用用户提供的密码进行加密。密码用于派生一个加密键值存储的密钥。
门限密码学
关于 GG20 门限-ECDSA 协议的实现,请参阅 tofnd 的这个版本。GG20 协议的实现不应被视为生产就绪,因为它不能抵御最近发现的针对协议实现的攻击。由于它不在 Axelar 协议中使用,因此已从 tofnd
中删除。
许可证
所有受以下任一许可证授权的 crate:
任选其一。
贡献
除非您明确声明,否则根据 Apache-2.0 许可证定义的,您有意提交的任何旨在包含在作品中的贡献,将按上述方式双授权,不附加任何额外条款或条件。
依赖关系
~16–30MB
~403K SLoC