用于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 的哈希
算法 | 哈希摘要 | |
---|---|---|
SHA256 | b24400aef07b4d0287fb9bf8ce02b0abbe80c476d1b67222a7c5158df3a3e38d |
|
MD5 | 91b66a28a1e8343dd6fe94312d12aa5d |
|
BLAKE2b-256 | 36e00c79d27da8918f7642cba8ad4b0e6176ff7a8b4774f363c6ceb2513474be |