2 个版本
0.1.1 | 2023 年 4 月 13 日 |
---|---|
0.1.0 | 2023 年 4 月 13 日 |
#12 在 #key-input
600KB
798 行
包含 (Mach-o exe, 775KB) 预构建/osx/solsign,(ELF exe/lib, 575KB) 预构建/linux/solsign
sol-sign — 用于离线签署 solana 交易的实用程序
简介
sol-sign 是一个小型实用程序,便于离线签署 solana 交易。 离线签署 指的是使用存储在用户计算机本地的密钥签署交易,而无需连接到任何“钱包”软件。
sol-sign 读取已编码为 Base64 格式的完整 solana 交易。Base64 允许 solana 交易的二进制数据仅以适合复制和粘贴到终端窗口的文本字符呈现。sol-sign 读取交易,签署它,然后输出新签署的交易(也以 Base64 格式),如果交易现在已完全签署,还会输出交易的签名。
sol-sign 支持一些常见的流程
-
签署单签名人交易:通过将
--no-prompt
参数传递给 sol-sign,并附带密钥文件的路径来实现。sol-sign 从标准输入读取要签署的交易,然后签署它并输出签署后的版本。 -
反复签署单签名人交易:通过在命令行中将密钥文件的路径传递给 sol-sign,或者 在 sol-sign 启动后输入助记词和密码。之后,sol-sign 将从标准输入读取交易,签署它们,并将签名写入标准输出,直到用户结束输入。这对于使用相同的签署密钥反复离线签署许多交易非常有用。
-
执行多签名人操作:在这种情况下,单个交易需要许多方的签名。首先将未签署的交易通过一个 sol-sign 实例传递,该实例提供一个用于签署交易的密钥。生成的部分签署交易可以发送给下一个签署人,该签署人将使用类似 sol-sign 的方式提供他们的签名。这可以重复多次,直到交易被所有方完全签署,此时 sol-sign 将打印出完全签署的交易及其签名。
关于安全性的说明
solSign是安全的。它读取用于签署事务的密钥对,但不输出任何敏感信息,包括任何关于私钥的方面,也不会写入标准输出以外的任何地方。它写入标准输出的内容是完全安全的、可以自由分享的信息:作为通过网络发送到solana验证器进行执行而编码的交易,以及这些交易的费支付者签名,该签名也被solana网络用作交易ID。显然,交易ID不是敏感信息,因为它们在各个地方都会显示和使用。为了重申:solSign永远不会打印或传输任何类型的敏感信息。
solSign启动后,用户可以删除任何用作输入的密钥文件,因为solSign只在启动时读取它们。请注意,永远不要删除您的密钥的最后一份副本!
solSign的整个目的是以最高的安全性签署事务 -- 在用户的电脑上本地执行,可能完全不连接互联网,并且只复制交易和签名。
solSign可以与非常安全的签署策略一起使用,例如将Base64编码的交易复制到U盘上,将U盘带到完全断网的电脑上,使用solSign在那里签署它们,然后将签署的交易复制回将它们提交到网络的互联网连接电脑,使用相同的U盘。这样,密钥可以完全存在于断网的电脑上,但任意的交易仍然可以签署并提交到网络。
安装solSign
您应该从源代码构建solSign。要这样做,首先安装rust编译器(如果您还没有安装的话);说明如下:https://www.rust-lang.net.cn/tools/install
接下来,克隆solSign源代码
git clone https://github.com/bji/solsign.git
最后,构建它
cargobuild --manifest-pathsolsign/Cargo.toml --release
您将在solsign/target/release/solsign
找到solSign的二进制文件。
预构建的二进制文件
不建议您安装预构建的二进制文件,因为您无法确定二进制文件的真实性。然而,如果您愿意承担风险,以下是作者预先构建的二进制文件
Linux
https://github.com/bji/solsign/blob/master/prebuilt/linux/solsign?raw=true
保存此文件,然后使用chmod +x solsign
使其可执行。
Mac OS X
https://github.com/bji/solsign/blob/master/prebuilt/osx/solsign?raw=true
保存此文件,然后使用chmod +x solsign
使其可执行。
使用solSign
solsign --help
将显示描述其用法的简要帮助文本。
传递--no-prompt
命令行选项将导致solSign跳过“从标准输入读取密钥”的步骤,并在读取并处理完单个事务后退出。
除了--help
和--no-prompt
之外的 所有参数都是密钥文件的路径,这些文件将被读取并用于签署交易。
启动后,除非指定了--no-prompt
,否则solSign将提示用户输入任何希望用于签署的附加密钥。这些是以可选密码短语作为助记词种子短语提供的,在输入这些值之后,solSign将提示用户从可能的密钥派生中选择一个。
密钥输入序列包括以下步骤
- solSign打印出当前签署密钥列表的公钥。
- solSign提示:
Enter mnemonic seed words of next key, or press ENTER to continue:
- 如果用户在未输入其他任何内容的情况下按下回车键,则键输入阶段结束。注意:在输入过程中,助记词种子词不会显示在屏幕上。
- 如果用户输入了助记词词序列,solsign 将显示提示:
输入密钥种子, 或按 回车 选择 无密码
- 如果用户在未输入密码的情况下按下了回车键,则不使用密码。注意:密码在输入过程中不会显示在屏幕上。
- solsign 然后生成 9 种可能的密钥对推导方式。第一种是直接使用助记词和密码生成的种子,类似于由
solana-keygen
程序生成的。其余的是标准 BIP-44 推导方式,通常用于钱包软件。 - 用户通过在下一个提示中输入行号来选择与其公钥对应的行:
从上面选择一个推导密钥 0 - 9, 或按 回车 跳过
。如果用户没有输入任何数字就按下了回车,则忽略推导密钥。 - 此过程会重复进行,直到用户在助记词提示处按下回车键,表示没有更多密钥要添加。
在输入密钥后,solscan 会提示用户输入一个挑战密码,提示文本如下:
在每笔交易签名前输入一个挑战密码或按回车键 选择无签名挑战密码:
用户可以输入一个密码,然后必须在任何交易签名前重新输入该密码。请注意,密码在任何时候都是不可见的。输入挑战密码是**强烈建议**的,因为它可以保护用户免受可能获得访问命令行并使用用户密钥签署交易的入侵者的侵害。入侵者将不知道输入的挑战密码,因此无法签署任何交易。
solsign 然后进入一个循环,从标准输入读取 Base64 编码的交易,签署它们,并将结果打印到标准输出。如果提供了 --no-prompt
命令行参数,则停止单个交易的签署,否则循环继续等待并处理交易,直到标准输入结束。
当输入交易时,solsign 使用其拥有的匹配密钥签署交易,然后如果交易完全签署,则输出
交易完成:
后跟完全签署交易的 Base64 编码版本,然后是
签名:
最后打印出交易的签名。
如果交易未完全签署但仍需要更多签署者,则 solsign 将打印
还需要签名的公钥:
后跟必须签署该交易的密钥对公钥列表,然后是
部分签署交易:
然后是部分签署交易的 Base64 编码版本,准备用于后续 solsign 调用以继续签署。
示例会话
以下是一个使用 solsign 签署交易的示例。其中穿插了注释。
$ solsign /tmp/key.json
使用单个密钥文件启动 solsign 以用于签署(/tmp/key.json)。不需要从文件开始;用户也可以稍后使用助记词和密码输入密钥。
Public keys provided thus far:
C7e6JVJQ2FnrLvETJ2KMHR8pvwSDJcQ2n8UTFaZz3yEy
solsign 打印出它知道并可以用于签署交易的密钥。
Enter mnemonic seed words of next key, or press ENTER to continue:
Enter passphrase seed, or press ENTER for no passphrase:
用户已选择输入助记词种子短语和密码。在输入时,这些内容不会显示。
Derived Keys:
(0) 9xXVsPkh8jLwxQBJk6kf2CZp8ko27UHbiHCQifECLpbi
(1) m/44'/501'/0'/0' CfRpvpSDq3kfvxrYyLqw1E1UQHnHD5aiLJ6vXeRJc98W
(2) m/44'/501'/0'/1' 4K1SvwTLrvYoyPGPpP5G1wiL72mgtJiJipEDewBAccD3
(3) m/44'/501'/0'/2' 4auo9rDdsaNuRTAvj3m5qGGRuRwMutk5XKACwbhrrx6K
(4) m/44'/501'/0'/3' 5FVg3XqMmFdPATZ2zeyMeoanp9eyVKfgBJxYYEq7PeDG
(5) m/44'/501'/0'/4' ATBCmChQuf3jZDjB49F4sMaG5c7J38kioxKpsdc9MLuT
(6) m/44'/501'/0'/5' BiVGWuLgQU8iCwQ7xWZi2tFApF7Vv51AxfhC5HPf8KQ5
(7) m/44'/501'/0'/6' 6BKweChix9m9Di9SnBFGvV6Py3XZBVgVf4M7DptDZJud
(8) m/44'/501'/0'/7' qMxq1R1amcX5tmUk21bCt4WSqeD7mRqer74nuqYsBo8
(9) m/44'/501'/0'/8' E29LTv4qHTevCjvZS3eT7qx8K5cKJJvbrKP2ufuz7a5D
Select a derived key 0 - 9 from above, or press ENTER to skip: 1
从助记符和密码派生的密钥显示出来,用户选择(1)作为他们的密钥。派生多个密钥的原因是,相同的助记符和密码可以生成不同的密钥,这取决于用于生成密钥的程序。Solana命令行会在(0)处产生密钥,而大多数钱包会在(1)处产生密钥,除非用户从同一个钱包创建了多个账户,在这种情况下,一些后来的密钥派生可能是正确的。
用户知道他们的公钥(它由钱包显示,并且不是敏感信息),这就是他们知道如何选择的原因。
Public keys provided thus far:
C7e6JVJQ2FnrLvETJ2KMHR8pvwSDJcQ2n8UTFaZz3yEy
CfRpvpSDq3kfvxrYyLqw1E1UQHnHD5aiLJ6vXeRJc98W
Enter mnemonic seed words of next key, or press ENTER to continue:
solsign显示有一个新的密钥可用于签名——用户刚刚输入的那个。但现在用户按下ENTER键来拒绝输入更多密钥。
Enter a password to be challenged with before each transaction is signed
or press ENTER for no signing challenge password:
用户输入了一个密码,这个密码将在每次要签署交易之前挑战他们,以确保只有用户才能签署交易。这有助于在solsign长时间运行,等待接受新的交易进行签名的情况下。密码挑战确保没有人可以走到用户的终端并签署交易。
请注意,挑战密码不会保存在任何地方,因此对于每次solsign的运行,用户都可以并且应该为那次运行选择一个全新的唯一密码。如果忘记了密码,简单地重新启动solsign并输入一个新密码即可。
Enter Base64 encoded transaction:
solsign现在正在等待输入交易。
AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAcPpSP6/XjGgrH6v7iCy7QQOeOQBPwglBAk9Jy6QyeSwSpPb+EUsfYZyL62JkOHBWY52pVBwq0oLK4uTwWtaNHTv3tz5xPtCaHjGkJYHJH/BA1HTzS7j/hQTPgHtfJEJzoHhRIKD3+birK4FGp9UCjyEDhlMU/LjvCCfMf2+XvsNWSOMvkiyxpjfBXOn304hEPQliTMS85DRtUEgx4Cxd9ergJlqycce6gJ0gKAD8LOUY6W3cIpDz7GqVwAc/9PSL6KoHEUh6vG6a8uC4MiZduBbIveTuvg6ssUHcgA9hS7utuumN1RTvJI/arQIHQgqWJ7SfBTaflWjdefWROfCmSOxQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAT0U9YrEr9wvxm7fiypSDWhnhQDstuaKolGxPYp1m5OqMlyWPTiSJ8bs9ECkUjg2DC1oTmdr/EIQEjnvY2+n4WZnNE8PV/r7jqaHrzOqvvKZNn5JYxJCHl/cO22HkjM+LC3BlsePRfEU4nVJ/awTDzVi4bHMaoP21SbbRvAP4KUYGlZAfwZF6jQzN8J60SCFssIJXW4MY1QnXxrDjna74MQbd9uHXZaGT2cvhRs7reawctIXtX1s3kTqM9YV+/wCpwD34W2dbMjp93Injd9sI5B+MqhHQPT6cjVRD78sNwNkBDRAACQQDBgECCwcABQ0OCgwIEAgAAAAAAAAAAGXNHQAAAAA=
Enter challenge password (5 attempts remaining):
Enter challenge password (4 attempts remaining):
Enter challenge password (3 attempts remaining):
用户复制粘贴一个用于签名的Base64编码的交易,然后尝试几次正确输入他们的挑战密码。
Transaction is complete:
Ab+EThyFDLUilIm6Dm1VDcZ+6ivtOH5G77IrcdsCeFJ1avmPmO0NPDHzHB9FNQr4UYptrc+O
6zi0r4sYg1s3KQABAAcPpSP6/XjGgrH6v7iCy7QQOeOQBPwglBAk9Jy6QyeSwSpPb+EUsfYZ
yL62JkOHBWY52pVBwq0oLK4uTwWtaNHTv3tz5xPtCaHjGkJYHJH/BA1HTzS7j/hQTPgHtfJE
JzoHhRIKD3+birK4FGp9UCjyEDhlMU/LjvCCfMf2+XvsNWSOMvkiyxpjfBXOn304hEPQliTM
S85DRtUEgx4Cxd9ergJlqycce6gJ0gKAD8LOUY6W3cIpDz7GqVwAc/9PSL6KoHEUh6vG6a8u
C4MiZduBbIveTuvg6ssUHcgA9hS7utuumN1RTvJI/arQIHQgqWJ7SfBTaflWjdefWROfCmSO
xQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAT0U9YrEr9wvxm7fiypSDWhnhQDst
uaKolGxPYp1m5OqMlyWPTiSJ8bs9ECkUjg2DC1oTmdr/EIQEjnvY2+n4WZnNE8PV/r7jqaHr
zOqvvKZNn5JYxJCHl/cO22HkjM+LC3BlsePRfEU4nVJ/awTDzVi4bHMaoP21SbbRvAP4KUYG
lZAfwZF6jQzN8J60SCFssIJXW4MY1QnXxrDjna74MQbd9uHXZaGT2cvhRs7reawctIXtX1s3
kTqM9YV+/wCpwD34W2dbMjp93Injd9sI5B+MqhHQPT6cjVRD78sNwNkBDRAACQQDBgECCwcA
BQ0OCgwIEAgAAAAAAAAAAGXNHQAAAAA=
Signature:
4q5sbcseTSPcc9V8iPDE6JMJtznbWDM9xaUWatPo8sk8c65RQxobuDFWvwxFKFQPh7b2yDvbHh1YXVVgYKdQwrMu
用户提供给solsign的密钥足以签署交易。完全签名的交易以Base64编码打印出来,以及交易的签名(即交易ID)。
希望用户有一个程序可以接受此文本并将已签名的交易提交以执行。例如,作者有一个Discord机器人,它将在开发中的defi系统中完成这项工作。
Enter Base64 encoded transaction:
$
solsign正在等待另一个交易进行签名,但用户输入了Ctrl-D来结束输入;solsign退出,用户返回到他们的shell提示符。
$ solsign --help
Usage: solsign [--help]
solsign [--no-prompt] [KEY_FILE]...
solsign reads Solana transactions in Base64 encoded format from stdin,
displays them, signs them, writes signed transactions and signatures to
stdout.
On start-up, solsign reads any private key files specified on the command
line. It also prompts for mnemonic and passcode combinations from stdin.
Collectively these signing keys become available to the program to sign
transactions.
After reading in private keys, solsign enters a loop where it waits to read
Base64 encoded transactions from standard input. After each encoded
transaction is read in, for any signatures not provided within the
transaction, if the key required for that signature was provided to solsign,
the transaction will be signed with that key.
After all possible signatures are applied, if the transaction is still not
completely signed, then the list of pubkeys which must still sign the
transaction is printed, along with the Base64 encoded version of the
partially signed transaction is printed, ready for further signing.
If after signing, the transaction is completely signed, then the signature
of the transaction is printed.
许可证
GPLv3,请参阅LICENSE.txt。
依赖项
~3.5–4.5MB
~93K SLoC