跳转到主要内容

用于EIP712对象的Python库

项目描述

EIP-712 Structs 构建状态 覆盖率状态

一个用于简单EIP-712结构构造的Python接口。

在这个模块中,“结构”是指按照标准定义的有结构的数据。它不同于Python标准库中的struct(例如,import struct)。

阅读提案
https://github.com/ethereum/EIPs/blob/master/EIPS/eip-712.md

支持的Python版本

  • 3.6
  • 3.7

安装

pip install eip712-structs

用法

有关可用方法的简要总结,请参阅API.md

以下为示例/详细信息。

快速入门

假设我们想要表示以下结构,将其转换为消息并签名

struct MyStruct {
    string some_string;
    uint256 some_number;
}

使用此模块,这将看起来像

# Make a unique domain
from eip712_structs import make_domain
domain = make_domain(name='Some name', version='1.0.0')  # Make a Domain Separator

# Define your struct type
from eip712_structs import EIP712Struct, String, Uint
class MyStruct(EIP712Struct):
    some_string = String()
    some_number = Uint(256)

# Create an instance with some data
mine = MyStruct(some_string='hello world', some_number=1234)

# Into a message dict (serializable to JSON) - domain required
my_msg = mine.to_message(domain)

# Into signable bytes - domain required
my_bytes = mine.signable_bytes(domain)

有关支持的类型更多信息,请参阅成员类型

动态构建

属性也可以动态添加。如果需要使用保留关键字(如from),则可能需要这样做。

from eip712_structs import EIP712Struct, Address
class Message(EIP712Struct):
    pass

Message.to = Address()
setattr(Message, 'from', Address())

域分隔符

EIP-712指定了一个域结构,以区分可能无关的相同结构。为此存在一个辅助方法。所有传递给make_domain()函数的值都是可选的 - 但至少必须定义一个。如果省略,则生成的域结构的定义将完全省略该参数。

完整签名
make_domain(name: string, version: string, chainId: uint256, verifyingContract: address, salt: bytes32)

设置默认域

不断提供相同的域可能会很麻烦。您可以选择设置一个默认值,然后忘记它。它将自动由 .to_message().signable_bytes() 使用

import eip712_structs

foo = SomeStruct()

my_domain = eip712_structs.make_domain(name='hello world')
eip712_structs.default_domain = my_domain

assert foo.to_message() == foo.to_message(my_domain)
assert foo.signable_bytes() == foo.signable_bytes(my_domain)

成员类型

基本类型

EIP712的基本类型直接映射到solidity类型。

from eip712_structs import Address, Boolean, Bytes, Int, String, Uint

Address()  # Solidity's 'address'
Boolean()  # 'bool'
Bytes()    # 'bytes'
Bytes(N)   # 'bytesN' - N must be an int from 1 through 32
Int(N)     # 'intN' - N must be a multiple of 8, from 8 to 256
String()   # 'string'
Uint(N)    # 'uintN' - N must be a multiple of 8, from 8 to 256

使用方法

from eip712_structs import EIP712Struct, Address, Bytes

class Foo(EIP712Struct):
    member_name_0 = Address()
    member_name_1 = Bytes(5)
    # ...etc

结构引用

除了包含基本类型,EIP712结构还可以包含其他结构!用法几乎相同 - 不同之处在于您不需要“实例化”类。

示例

from eip712_structs import EIP712Struct, String

class Dog(EIP712Struct):
    name = String()
    breed = String()

class Person(EIP712Struct):
    name = String()
    dog = Dog  # Take note - no parentheses!

# Dog "stands alone"
Dog.encode_type()     # Dog(string name,string breed)

# But Person knows how to include Dog
Person.encode_type()  # Person(string name,Dog dog)Dog(string name,string breed)

使用嵌套值实例化结构可能有几种不同的方法

# Method one: set it to a struct
dog = Dog(name='Mochi', breed='Corgi')
person = Person(name='E.M.', dog=dog)

# Method two: set it to a dict - the underlying struct is built for you
person = Person(
    name='E.M.',
    dog={
        'name': 'Mochi',
        'breed': 'Corgi',
    }
)

数组

该标准也支持数组。

array_member = Array(<item_type>[, <optional_length>])
  • <item_type> - 将驻留在数组中的基本类型或结构
  • <optional_length> - 如果提供,则将数组设置为该长度。

例如

dynamic_array = Array(String())      # String[] dynamic_array
static_array  = Array(String(), 10)  # String[10] static_array
struct_array = Array(MyStruct, 10)   # MyStruct[10] - again, don't instantiate structs like the basic types

开发

欢迎贡献。

安装依赖项

  • pip install -r requirements.txt

运行测试

  • python setup.py test
  • 某些测试期望本地ganache链在 http://localhost:8545 上处于活动状态。Docker会为您编译合约并启动链。
  • Docker是可选的,但有助于测试整个套件。如果没有检测到链,则会跳过链测试。
  • 用法
    • docker-compose up -d (在后台启动容器)
    • 注意:在运行 up 时编译合约,但不会部署,直到运行测试。
    • 您完成时清理容器:docker-compose down

部署新版本

  • setup.py 中增加版本号,并将其提交到master。
  • 在GitHub的master分支上创建一个发布标签。Travis应该处理剩下的工作。

无耻的推广

ConsenSys 为我们自己和社会编写! :heart

项目详情


下载文件

下载适合您平台的应用程序。如果您不确定选择哪一个,请了解有关 安装包 的更多信息。

源分布

eip712-structs-1.1.0.tar.gz (12.9 kB 查看哈希)

上传时间

由以下支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面