莫诺代理
monero-agent的Python项目详细描述
Monero Wallet Python实现
此回购协议的主要目的是为 与Trezor硬件钱包进行交易签名。回购协议 包含trezor端的初始实现。特雷泽 协议方面经历了大量的重构,即将合并到 trezor core存储库。
回购协议为Trezor钱包交易提供集成测试 签署.
- PR将Monero支持添加到Trezor硬件钱包(客户端 签署协议的一部分): https://github.com/trezor/trezor-core/pull/293
- PR将Trezor硬件支持添加到官方Monero代码库: https://github.com/monero project/monero/pull/4241
支持的功能
- 全环CT(一个UTXO)
- 简单环形CT(超过1个UTXOS)
- 子地址
- 键图像同步
- 防弹(批量验证、签名、V9分叉就绪)
- 账本协议实现,硬件钱包端
路线图
- 花费证明
- 保留证明
- 多西格
- 钱包实现(资金接收,utxo混合)
- 分类帐协议实现,主机端
协议
为了支持资源有限的硬件钱包上的RingCT 必须执行细分协议。加工是不可行的 一次在硬件钱包上运行的签名交易 UTXOS和多输出。
本主题介绍如下:
https://github.com/ph4r05/monero-trezor-doc
文档可能与代码不同步。获取此源 代码作为主要参考。
在当前协议中,假设可能有多个输入utxo (十到几百)。因此它被优化为以增量方式工作,一个utxo 一次。这是合理的假设,因为你的资金可能会分散 很多小交易。另一方面,我们假设 输出相对较小(小单位),通常在Monero中 交易。
扩展协议来处理大量 输出,但由于稍后签名的消息结构,它将 需要在发送输出相关数据时再添加两个roundrip 一个到trezor进行增量散列。
输出固定在协议的开头-输出数 在Trezor和HMAC中的这一点用唯一键(索引)固定 为每个输出生成。所以在以后的往返中 仅保证以前按精确给定顺序固定的输出是 处理。对于 以后用作输入的Trezor。
项目结构
代理<;->;trezor
代理是一个应该在主机pc上运行的对象,其中trezor是hw 钱包实现。 agent.py 和 trezor.py 主要是端口 C++代码的用于poc、实验和测试的python。 这些版本没有针对硬件环境的使用进行优化。
优化后的版本是 agent-lite.py 和 trezor-lite.py
序列化库
该项目取决于我的monero serialize库。数据对象 Monero中使用的是在那里定义的,它支持序列化/ 反序列化为二进制格式。序列化的二进制消息是 在事务签名期间进行哈希运算。
加密
Monero使用ED25519椭圆曲线。纯python实现是 未优化以避免侧通道泄漏(例如,定时) 主要作为POC。
该项目使用ED25519实现,在扩展的爱德华兹工作
坐标
唯一直接处理点表示的代码是crypto.py。 所有其他对象都在使用crypto.py来进行ec计算。 点表示对其他模块来说是不透明的。
不透明点表示可以转换为bytearray 适合运输的表示(压缩,Y坐标+符号 (标志)使用crypto.encodepoint()和crypto.decodepoint()
标量表示为整数(不需要编码/解码)。 但是,我们是在模环中工作的,所以对于标量操作,比如 加法、除法、比较使用 crypto.sc. 方法。
trezor密码
除了纯python加密后端之外,还有一个产品就绪 Trezor Crypto后端。我实现了所需的Monero相关 加密算法到 trezor密码(tcry)。特克 实现恒定时间曲线操作,使用 libnadium 生成随机 价值观。borromean range proof在c中重新实现,用于cpu和内存 效率。
我创建了一个python绑定 py-trezor加密 可从PIP安装。PIP构建 trezor crypto库。 请参阅 py-trezor加密 安装详细信息(依赖项)。
要使用代理运行安装python绑定,请执行以下操作:
pip install -U --no-cache 'monero_agent[tcry]'# Or laternativelly pip install -U --no-cache py_trezor_crypto_ph4
依赖关系:
- 锂钠
- 包配置 <
- python开发人员
travis测试有两个密码后端。为了用tcry测试 安装其所有依赖项。只有一种依赖性 对于共享库。要了解更多信息,请查看 travis安装libtrezor crypto.sh
加密依赖项是基于 ec_后端选择的 env var. 0 对于python后端, 1 对于tcry。tcry的路径是通过 libtrezor_crypto_path env var.如果找不到或找不到tcry 将代码回退加载到python后端。这种行为可能是 通过设置 ec_backend_force env var到 1
tcry也快20倍(单元测试)。
$> EC_BACKEND_FORCE=1EC_BACKEND=0 ./venv/bin/python -m unittest monero_glue_test/test_*.py ...s................................................................ ---------------------------------------------------------------------- Ran 68 tests in 416.823s OK
tcry后端:
$> EC_BACKEND_FORCE=1EC_BACKEND=1 ./venv/bin/python -m unittest monero_glue_test/test_*.py .................................................................... ---------------------------------------------------------------------- Ran 68 tests in 84.057s OK
使用Trezor进行测试
pip3 install -U --no-cache monero-agent py_trezor_crypto_ph4 python3 -m unittest trezor_monero_test.test_trezor # To test only one transaction: TREZOR_TEST_ONLY_TX=1TREZOR_TEST_NUM_TX=1 python3 -m unittest trezor_monero_test.test_trezor # To test with interactive Trezor prompts: TREZOR_TEST_INTERACTIVE=1TREZOR_TEST_ONLY_TX=1TREZOR_TEST_NUM_TX=1 python3 -m unittest trezor_monero_test.test_trezor # Note: if testing with local py files, use trezor_monero_test/test_trezor.py
有关使用回购协议的更多信息
请P>有关更多用法示例,请参阅poc.md。内存注意事项
python使用具有内存开销的任意精度整数。这个 以下命令显示某些数据所需的内存量 型号和尺寸:
>>>sys.getsizeof(0)24>>>sys.getsizeof(2**32-1)# 4B num32>>>sys.getsizeof(2**64-1)# 8B num36>>>sys.getsizeof(2**256-1)# 32B num60>>>sys.getsizeof(b'\x00'*32)# 32B hex65>>>sys.getsizeof(b'\x00'*64)# 64B hex97
Monero在EC工作,有32B个号码。储存一个32B的号码需要60 整数表示为b,字节字符串编码为65b 表示(一些ed25519库和mininero使用这个 代表)。对于标量来说,存储显然更有效 自然整数,通过重新编码节省内存和CPU周期。
EC点算法可以使用经典点坐标
(x,y)
或
扩展爱德华兹点坐标