莫诺代理

monero-agent的Python项目详细描述


Monero Wallet Python实现

build status monero-trezor-doc

此回购协议的主要目的是为 与Trezor硬件钱包进行交易签名。回购协议 包含trezor端的初始实现。特雷泽 协议方面经历了大量的重构,即将合并到 trezor core存储库。

回购协议为Trezor钱包交易提供集成测试 签署.

支持的功能

  • 全环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

目前,代理功能仅用于测试和 POCTrezor的支持已经集成到官方的Monero中 cli gui 钱包。

序列化库

该项目取决于我的monero serialize库。数据对象 Monero中使用的是在那里定义的,它支持序列化/ 反序列化为二进制格式。序列化的二进制消息是 在事务签名期间进行哈希运算。

https://github.com/ph4r05/monero serialize

加密

Monero使用ED25519椭圆曲线。纯python实现是 未优化以避免侧通道泄漏(例如,定时) 主要作为POC。

该项目使用ED25519实现,在扩展的爱德华兹工作 坐标 (x,y,z,t)

唯一直接处理点表示的代码是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) 或 扩展爱德华兹点坐标 (x,y,z,t)。需要64和80 B 分别存储2和4个元素的元组。因此需要184 B和 320 B以自然形式存储EC点,而不是65 B字节 表示法。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
rest如何在java中访问摘要身份验证   Java如何获取类和jar文件的Java代码   java查找给定数字中的十进制数   类Lcom/google/firebase/FirebaseApp中没有虚拟方法zzbzo()Z;或者它的超类   javahibernate二级缓存&JUnit   java如何自动添加XMLAnnotations   使用java在google drive中获取上传的文件名?   Java使用GLFW复制可转移图像   java Android Intent不会发送值   使用Objectify在Google CloudDatastore中使用java findRecord   照片编辑器中的java pointerIndex超出范围异常   java使用Spring Boot/JPA生成唯一字段的正确方法是什么?   安卓无法在firebase上上载图像,因为拒绝了之前失败的java类上的reinit。类错误   java如何在thymeleaf中构建绝对URL?   从Linux到2012r2 Active Directory的LDAPS Java查询的最低要求是什么   泛型Java接口反射   带地址字段的java Google地图标记   关于即将推出的forkjoin框架的java资源   jsp中的BEAN法则