-
Notifications
You must be signed in to change notification settings - Fork 998
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
release v0.7.1
#1176
Merged
release v0.7.1
#1176
Changes from all commits
Commits
Show all changes
19 commits
Select commit
Hold shift + click to select a range
7c0cc7f
fix #1169 bytes type error
djrtwo 4a08abf
ensure sanity tests run with bls
djrtwo e4704e0
Merge pull request #1175 from ethereum/bytes-type-error
protolambda e7bb9bf
SSZ decoding through pyssz, with translation of types/values
protolambda c391017
address #1146 by inserting state root and re-signing blocks in tests
djrtwo f834f72
lint
djrtwo 7cf0dcd
Merge pull request #1177 from ethereum/block-state-root-fix
protolambda aed5db0
enforce byte length for g2 values in test generators
djrtwo 79e6850
Merge pull request #1179 from ethereum/bls-test-pad-issue
protolambda 7b0ffc1
move decoder for fuzzing, minor fixes, update dependency to support S…
protolambda 01be8b7
minor fix
protolambda 895ab67
fix decoder, also fix bug in pyssz, see PR 74
protolambda d4bf55e
update pyssz to include deserialization bugfix
protolambda 367586d
remove need for presets loading, just test mainnet, not too many/larg…
protolambda 1c51982
generate coverage reports in make test, open as html site
protolambda 20aa539
update clean command
protolambda 25a16bd
Merge pull request #1178 from ethereum/decode-with-pyssz
djrtwo 2f9c554
minor fix to makefile, add codecov instructiosn to readme
djrtwo ac76c6d
Merge pull request #1182 from ethereum/cov-reports
djrtwo File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Empty file.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,84 @@ | ||
from eth2spec.utils.ssz import ssz_typing as spec_ssz | ||
import ssz | ||
|
||
|
||
def translate_typ(typ) -> ssz.BaseSedes: | ||
""" | ||
Translates a spec type to a Py-SSZ type description (sedes). | ||
:param typ: The spec type, a class. | ||
:return: The Py-SSZ equivalent. | ||
""" | ||
if spec_ssz.is_container_type(typ): | ||
return ssz.Container( | ||
[translate_typ(field_typ) for (field_name, field_typ) in typ.get_fields()]) | ||
elif spec_ssz.is_bytesn_type(typ): | ||
return ssz.ByteVector(typ.length) | ||
elif spec_ssz.is_bytes_type(typ): | ||
return ssz.ByteList() | ||
elif spec_ssz.is_vector_type(typ): | ||
return ssz.Vector(translate_typ(spec_ssz.read_vector_elem_type(typ)), typ.length) | ||
elif spec_ssz.is_list_type(typ): | ||
return ssz.List(translate_typ(spec_ssz.read_list_elem_type(typ))) | ||
elif spec_ssz.is_bool_type(typ): | ||
return ssz.boolean | ||
elif spec_ssz.is_uint_type(typ): | ||
size = spec_ssz.uint_byte_size(typ) | ||
if size == 1: | ||
return ssz.uint8 | ||
elif size == 2: | ||
return ssz.uint16 | ||
elif size == 4: | ||
return ssz.uint32 | ||
elif size == 8: | ||
return ssz.uint64 | ||
elif size == 16: | ||
return ssz.uint128 | ||
elif size == 32: | ||
return ssz.uint256 | ||
else: | ||
raise TypeError("invalid uint size") | ||
else: | ||
raise TypeError("Type not supported: {}".format(typ)) | ||
|
||
|
||
def translate_value(value, typ): | ||
""" | ||
Translate a value output from Py-SSZ deserialization into the given spec type. | ||
:param value: The PySSZ value | ||
:param typ: The type from the spec to translate into | ||
:return: the translated value | ||
""" | ||
if spec_ssz.is_uint_type(typ): | ||
size = spec_ssz.uint_byte_size(typ) | ||
if size == 1: | ||
return spec_ssz.uint8(value) | ||
elif size == 2: | ||
return spec_ssz.uint16(value) | ||
elif size == 4: | ||
return spec_ssz.uint32(value) | ||
elif size == 8: | ||
# uint64 is default (TODO this is changing soon) | ||
return value | ||
elif size == 16: | ||
return spec_ssz.uint128(value) | ||
elif size == 32: | ||
return spec_ssz.uint256(value) | ||
else: | ||
raise TypeError("invalid uint size") | ||
elif spec_ssz.is_list_type(typ): | ||
elem_typ = spec_ssz.read_elem_type(typ) | ||
return [translate_value(elem, elem_typ) for elem in value] | ||
elif spec_ssz.is_bool_type(typ): | ||
return value | ||
elif spec_ssz.is_vector_type(typ): | ||
elem_typ = spec_ssz.read_elem_type(typ) | ||
return typ(*(translate_value(elem, elem_typ) for elem in value)) | ||
elif spec_ssz.is_bytesn_type(typ): | ||
return typ(value) | ||
elif spec_ssz.is_bytes_type(typ): | ||
return value | ||
elif spec_ssz.is_container_type(typ): | ||
return typ(**{f_name: translate_value(f_val, f_typ) for (f_name, f_val, f_typ) | ||
in zip(typ.get_field_names(), value, typ.get_field_types())}) | ||
else: | ||
raise TypeError("Type not supported: {}".format(typ)) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
from eth2spec.fuzzing.decoder import translate_typ, translate_value | ||
from eth2spec.phase0 import spec | ||
from eth2spec.utils.ssz import ssz_impl as spec_ssz_impl | ||
from random import Random | ||
from eth2spec.debug import random_value | ||
|
||
|
||
def test_decoder(): | ||
rng = Random(123) | ||
|
||
# check these types only, Block covers a lot of operation types already. | ||
for typ in [spec.BeaconBlock, spec.BeaconState, spec.IndexedAttestation, spec.AttestationDataAndCustodyBit]: | ||
# create a random pyspec value | ||
original = random_value.get_random_ssz_object(rng, typ, 100, 10, | ||
mode=random_value.RandomizationMode.mode_random, | ||
chaos=True) | ||
# serialize it, using pyspec | ||
pyspec_data = spec_ssz_impl.serialize(original) | ||
# get the py-ssz type for it | ||
block_sedes = translate_typ(typ) | ||
# try decoding using the py-ssz type | ||
raw_value = block_sedes.deserialize(pyspec_data) | ||
|
||
# serialize it using py-ssz | ||
pyssz_data = block_sedes.serialize(raw_value) | ||
# now check if the serialized form is equal. If so, we confirmed decoding and encoding to work. | ||
assert pyspec_data == pyssz_data | ||
|
||
# now translate the py-ssz value in a pyspec-value | ||
block = translate_value(raw_value, typ) | ||
|
||
# and see if the hash-tree-root of the original matches the hash-tree-root of the decoded & translated value. | ||
assert spec_ssz_impl.hash_tree_root(original) == spec_ssz_impl.hash_tree_root(block) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Verified we are not outputting any blocks in the tests not produced by this function.
appyl_empty_block
is not used for output anywhere. But we may want to remove its return in the future, so we don't accidentally get a block with faulty state root in there.