不受束缚的资本隐士
项目描述
隐士
Hermit 是一个 分片的高清命令行钱包,专为要求最高安全形式的加密货币所有者设计。
Hermit 实现了 分层 Shamir 分片的SLIP-0039 标准。
Hermit 旨在与可以与区块链对话的在线钱包协同运行。用户、Hermit 和在线钱包之间的所有通信都是通过二维码、相机、屏幕和键盘完成的。
这意味着 Hermit 安装不需要 WiFi、蓝牙或任何其他形式的有线或无线通信。Hermit 可以在完全气隙的环境中运行。
继续阅读或观看这些视频以了解有关 Hermit 的更多信息:
快速开始
$ pip install hermit # may need 'sudo' for this command
...
$ hermit # launch hermit
...
wallet> help # see wallet commands
...
wallet> shards # enter shard mode
...
shards> help # see shard commands
...
shards> list-shards # see current shards
...
shards> build-family-from-random # create new shard family from random data
...
shards> list-shards # see newly created shards
...
shards> write # save newly created shards to disk
shards> quit # back to wallet mode
wallet> export-xpub m/45'/0'/0' # export an extended public key
...
wallet> sign-bitcoin # sign a bitcoin transaction
# see examples/signature_requests/bitcoin_testnet.png
...
在下面的“使用”部分中查看更多详细信息。
设计
Hermit 遵循以下设计原则:
- 单向信息传输——信息只能向一个方向移动
- 永远在线的分片和加密——密钥应该总是被分片并且每个分片都被加密
- 开源一切——完全控制您的软件和硬件,为您提供最佳安全性
- 人类安全的灵活性——您可以自定义分片配置以适合您的组织
观众
Hermit 是一个难以使用但高度安全的钱包。
对于拥有少量加密货币的非技术人员,不建议使用Hermit 。
Hermit 专为精通计算机的人员和组织设计,用于自行保管大量加密货币。
分片
Hermit 与您可能使用过的其他钱包不同,因为它总是对您的密钥进行分片。
分片是使用 SLIP-39完成的 ,这意味着有两个级别的结构:
-
组 - 需要一定数量的P个Q组来解锁密钥
-
分片——解锁每个组需要n个m分片的法定人数,每个组的n和m可能不同
这种结构为不同的场景创造了很大的灵活性。
Hermit 通过使用密码加密每个分片来扩展当前的 SLIP-39 提案。
Hermit 中的分片通常使用密码进行加密。每个分片都有自己的密码,允许团队一起操作一个密钥,每个团队成员操作一个给定的分片(在某个组中)。但是,如果用户在创建分片或更改分片密码时明确提供空字符串作为密码,则生成的分片将是未加密的。虽然这会降低分片传输的安全性,但它确实可以将分片导出到仅支持未加密 SLIP-39 实现的技术。
与其他钱包的兼容性
如果您使用的是非分片钱包,例如硬件钱包(Trezor、Ledger 等)或 Electrum,您可以从 BIP39“种子短语”导入您的密钥,Hermit 将为您分片。
您也可以使用您喜欢的任何随机源输入新密钥。
Hermit不会将密钥导出为 BIP39 短语;仅作为加密的 SLIP39 短语。这意味着从 Hermit 安装中提取密钥以用于例如硬件钱包或 Electrum 具有挑战性。此约束是设计而存在的。
输入输出
Hermit 旨在部署在气隙环境中。
-
数据应该能够进入 Hermit 运行的设备的唯一方法是通过键盘和摄像头。
-
数据离开 Hermit 的唯一方法是通过运行它的设备的屏幕。
Hermit 不知道区块链上发生了什么,并依赖外部的在线钱包应用程序来起草交易请求。这些交易请求通过二维码传递给 Hermit。Hermit 生成的签名类似地以二维码的形式显示在屏幕上。
使用 QR 码进行交易请求和签名限制了 Hermit 可以签署的交易的复杂程度。有一天,这种限制将通过 QR 码打包算法得到解决。
贮存
Hermit 使用 3 个存储位置:
_________ _____________ ____________
| | | | | |
| memory | -- write -> | filesystem | -- persist --> | data store |
|_________| |_____________| |____________|
当 Hermit 首次启动时,数据存储或文件系统中的分片(按此顺序)被加载到内存中。对分片所做的更改始终在内存中进行,并且不会在 Hermit 重新启动后继续存在。
要在 Hermit 重新启动时保存数据,请确保将write其保存到文件系统。
如果您的 Hermit 存在于只读文件系统上,要在 Hermit 机器重新启动时保存数据,请确保将persist其保存到数据存储中。
模式
Hermit 是具有两种模式的模态应用程序:
wallet模式是您将花费大部分时间、签署交易和导出公钥的地方shards当您需要导入密钥或分片、导出分片或以其他方式更改有关您的密钥解锁方式的某些内容时,将访问模式
仅限比特币
作为一个分片的高清钱包,Hermit 是一种工具,可以与任何符合 BIP32 标准的加密货币一起使用。
但是 Hermit 还附带了一个sign-bitcoin可以签署比特币 (BTC) 交易的命令。
如果需要,您可以为其他加密货币扩展 Hermit;请参阅下面的“插件”部分。
用法
安装
可以通过以下方式安装 Hermit pip:
$ pip install hermit
如果您想针对 Hermit 进行开发,请参阅下面的“开发人员”部分,了解安装 Hermit 的不同方式。
开始隐士
要启动 Hermit,只需运行hermit命令。
$ hermit
你也可以传递一个配置文件
$ HERMIT_CONFIG=/path/to/hermit.yml hermit
有关如何配置 Hermit 的更多信息,请参阅下面的“配置”部分。
创建密钥
在您可以使用 Hermit 做很多事情之前,您需要创建或导入至少一个密钥。为此,首先进入分片模式:
$ hermit
...
wallet> shards
两个shard模式命令可让您导入密钥:
build-family-from-phrase-- 输入一个 BIP39 短语。如果您从 Trezor 或 Ledger 等硬件钱包或 Electrum 等其他软件钱包导入密钥,这将非常有用。build-family-from-random-- 输入随机字符。如果您想生成自己的熵(例如,从掷骰子),这很有用
无论您选择哪种方式,系统都会提示您输入分片配置。
从密钥创建安全分片集需要超出密钥种子的额外随机性。因此,即使您选择
build-family-from-phrase,您仍然会被要求输入随机字符。确保您准备好使用良好的随机性来源(例如掷骰子)这样做。
导出公钥
Hermit 可以从它保护的密钥中导出公钥(或扩展公钥)。这些对于想要引用 Hermit 密钥但显然不能看到其私有内容的其他应用程序很有用。
两个wallet模式命令对此很有用:
export-xpub-- 导出一个扩展的公钥export-pub-- 导出公钥
这些命令中的每一个都需要一个 BIP32 路径作为参数,并且每个命令都将其数据显示为 QR 码。
签署交易
Hermit 的全部意义在于最终签署交易。事务签名请求必须由外部应用程序创建。您还可以使用 示例/signature_requests/bitcoin.png中提供的测试签名请求。
一旦你有一个签名请求,并且你处于wallet模式,你可以运行sign-bitcoin开始签署比特币交易。
配置
/etc/hermit.ymlHermit 在默认情况下查找配置文件。HERMIT_CONFIG您可以通过在启动hermit程序时传递环境变量来更改此路径:
$ HERMIT_CONFIG=/path/to/hermit.yml hermit
配置文件是一个 YAML 文件。HermitConfig有关允许的配置设置的详细信息,请参阅该类的文档
。
开发者
开发人员将希望克隆 Hermit 源代码的副本:
$ git clone --recursive https://github.com/unchained-capital/hermit
$ cd hermit
$ make
注意:要使用此目录中的 Hermit 代码进行开发,请运行
source environment.sh. 这适用于本节下面的所有命令。
测试
Hermit 附带了一个完整的pytest套件。运行如下:
$ source environment.sh
$ make test
$ make lint
Hermit 已经在以下平台上进行了测试:
- OS X High Sierra 10.13.6
- Linux Ubuntu 18.04
- Linux Slax 9.6.4
(tests/test_script.md)[tests/test_script.md] 还提供了一个完整的示例脚本,您可以按照它来查看和测试所有功能。
开发者
整合
Hermit 需要一个外部的在线钱包应用程序才能工作。此应用程序可能需要通过几种方式与 Hermit 集成:
-
读取 Hermit 显示的公钥
-
为 Hermit 生成签名请求(参见examples/signature_requests/bitcoin_testnet.json)
-
读取 Hermit 显示的签名(参见examples/signatures/bitcoin.json)
在所有情况下,Hermit 都使用相同的方案将数据编码/解码为 QR 码。管道如下所示:
- 通过以下方式创建 QR 码
string:utf-8 编码 -> gzip-compress -> Base32 编码 - 解析二维码
string:Base32 decode -> gzip-decompress -> utf-8 decode
string数据有时本身可能是 JSON 。
插件
Hermit 允许您编写插件来扩展其功能。这主要是为了让您可以Signer为比特币(BTC)以外的加密货币编写类。
插件代码的默认目录是/var/lib/hermit. *.pyHermit 在启动时将加载此目录中的任何
文件(尽管您可以自定义此目录;请参阅上面的“配置”部分)。
下面是一个示例签名者类
#
# Example signer class for a putative "MyCoin" currency.
#
# Put in /var/lib/hermit/mycoin_signer.py
#
from hermit.errors import InvalidSignatureRequest
from hermit.signer.base import Signer
from hermit.ui.wallet import wallet_command
import hermit.ui.state as state
# Some library for MyCoin
from mycoin_lib import sign_mycoin_transaction
class MyCoinSigner(Signer):
"""Signs MyCoin transactions"""
def validate_request(self) -> None:
"""Validates a MyCoin signature request"""
# This is built into the Signer class
self.validate_bip32_path(request.get('bip32_path'))
# this isn't great validation code, but you get the point...
if 'input' not in self.request:
raise InvalidSignatureRequest("The param 'input' is required.")
if 'output' not in self.request:
raise InvalidSignatureRequest("The param 'output' is required.")
if 'amount' not in self.request:
raise InvalidSignatureRequest("The param 'amount' is required.")
self.bip32_path = self.request['bip32_path']
self.input = self.request[input]
self.output = self.request['output']
self.amount = self.request['amount']
def display_request(self) -> None:
"""Displays the transaction to be signed"""
print("""
INPUT: {}
OUTPUT: {}
AMOUNT: {}
SIGNING AS: {}
""".format(self.input,
self.output,
self.amount,
self.bip32_path))
def create_signature(self) -> None:
"""Signs a transaction"""
keys = self.generate_child_keys(self.bip32_path)
# Here is the magic of MyCoin...
self.signature = sign_mycoin_transaction(self.input, self.output, self.amount, keys)
@wallet_command('sign-mycoin')
def sign_mycoin():
"""usage: sign-mycoin
Create a signature for a MyCoin transaction.
Hermit will open a QR code reader window and wait for you to scan an
Ethereum transaction signature request.
Once scanned, the details of the signature request will be displayed
on screen and you will be prompted whether or not you want to sign
the transaction.
If you agree, Hermit will open a window displaying the signature as
a QR code.
Creating a signature requires unlocking the wallet.
"""
MyCoinSigner(state.Wallet, state.Session).sign()
为隐士做贡献
Unchained Capital 欢迎 Hermit 的错误报告、新功能和更好的文档。要做出贡献,请在 GitHub 上针对Hermit 的 Unchained Capital 分支创建一个拉取请求 (PR) 。
在提交 PR 之前,请确保 lint 代码并运行测试套件!
$ source environment.sh
$ make test
$ make lint
密钥轮换
每个单独的份额都应该由一个团队管理。每个团队都有多个密码副本来解密共享。该共享仅存在于 Hermit 设备上,并且已加密。轮换成员是通过使用其他团队成员之一来解密共享,然后使用新密码重新加密共享来实现的,从而排除以前的用户。
去做
- 根据比特币签名者中提供的赎回脚本验证钱包公钥/签名。
- 标准出现后重做 QR 码协议细节
项目详情
下载文件
下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。