mirror of
https://gitlab.com/pulsechaincom/staking-deposit-cli.git
synced 2025-01-10 21:11:21 +00:00
4542faca87
Co-authored-by: Hsiao-Wei Wang <hwwang156@gmail.com>
91 lines
2.2 KiB
Python
91 lines
2.2 KiB
Python
from ssz import (
|
|
ByteVector,
|
|
Serializable,
|
|
uint64,
|
|
bytes4,
|
|
bytes32,
|
|
bytes48,
|
|
bytes96
|
|
)
|
|
from eth2deposit.utils.constants import (
|
|
DOMAIN_DEPOSIT,
|
|
ZERO_BYTES32,
|
|
)
|
|
|
|
bytes8 = ByteVector(8)
|
|
|
|
|
|
# Crypto Domain SSZ
|
|
|
|
class SigningData(Serializable):
|
|
fields = [
|
|
('object_root', bytes32),
|
|
('domain', bytes32)
|
|
]
|
|
|
|
|
|
class ForkData(Serializable):
|
|
fields = [
|
|
('current_version', bytes4),
|
|
('genesis_validators_root', bytes32),
|
|
]
|
|
|
|
|
|
def compute_deposit_domain(fork_version: bytes) -> bytes:
|
|
"""
|
|
Deposit-only `compute_domain`
|
|
"""
|
|
assert len(fork_version) == 4
|
|
domain_type = DOMAIN_DEPOSIT
|
|
fork_data_root = compute_deposit_fork_data_root(fork_version)
|
|
return domain_type + fork_data_root[:28]
|
|
|
|
|
|
def compute_deposit_fork_data_root(current_version: bytes) -> bytes:
|
|
"""
|
|
Return the appropriate ForkData root for a given deposit version.
|
|
"""
|
|
genesis_validators_root = ZERO_BYTES32 # For deposit, it's fixed value
|
|
assert len(current_version) == 4
|
|
return ForkData(
|
|
current_version=current_version,
|
|
genesis_validators_root=genesis_validators_root,
|
|
).hash_tree_root
|
|
|
|
|
|
def compute_signing_root(ssz_object: Serializable, domain: bytes) -> bytes:
|
|
"""
|
|
Return the signing root of an object by calculating the root of the object-domain tree.
|
|
The root is the hash tree root of:
|
|
https://github.com/ethereum/eth2.0-specs/blob/dev/specs/phase0/beacon-chain.md#signingdata
|
|
"""
|
|
assert len(domain) == 32
|
|
domain_wrapped_object = SigningData(
|
|
object_root=ssz_object.hash_tree_root,
|
|
domain=domain,
|
|
)
|
|
return domain_wrapped_object.hash_tree_root
|
|
|
|
|
|
class DepositMessage(Serializable):
|
|
"""
|
|
Ref: https://github.com/ethereum/eth2.0-specs/blob/dev/specs/phase0/beacon-chain.md#depositmessage
|
|
"""
|
|
fields = [
|
|
('pubkey', bytes48),
|
|
('withdrawal_credentials', bytes32),
|
|
('amount', uint64),
|
|
]
|
|
|
|
|
|
class DepositData(Serializable):
|
|
"""
|
|
Ref: https://github.com/ethereum/eth2.0-specs/blob/dev/specs/phase0/beacon-chain.md#depositdata
|
|
"""
|
|
fields = [
|
|
('pubkey', bytes48),
|
|
('withdrawal_credentials', bytes32),
|
|
('amount', uint64),
|
|
('signature', bytes96)
|
|
]
|