From 09f7114b63d65ad4fa369f35f365d8e94a623f8c Mon Sep 17 00:00:00 2001 From: Hsiao-Wei Wang Date: Mon, 27 May 2019 13:15:10 +0800 Subject: [PATCH 01/21] copied from deposit contract --- deposit_contract/contracts/__init__.py | 0 deposit_contract/contracts/utils.py | 16 ++ .../contracts/validator_registration.json | 1 + .../contracts/validator_registration.v.py | 138 +++++++++++ deposit_contract/requirements-testing.txt | 7 + deposit_contract/tests/__init__.py | 0 deposit_contract/tests/contracts/__init__.py | 0 deposit_contract/tests/contracts/conftest.py | 111 +++++++++ .../tests/contracts/test_compile.py | 18 ++ .../tests/contracts/test_deposit.py | 221 ++++++++++++++++++ deposit_contract/tests/core/conftest.py | 0 deposit_contract/tests/core/test_import.py | 4 + .../tool/compile_deposit_contract.py | 33 +++ 13 files changed, 549 insertions(+) create mode 100644 deposit_contract/contracts/__init__.py create mode 100644 deposit_contract/contracts/utils.py create mode 100644 deposit_contract/contracts/validator_registration.json create mode 100644 deposit_contract/contracts/validator_registration.v.py create mode 100644 deposit_contract/requirements-testing.txt create mode 100644 deposit_contract/tests/__init__.py create mode 100644 deposit_contract/tests/contracts/__init__.py create mode 100644 deposit_contract/tests/contracts/conftest.py create mode 100644 deposit_contract/tests/contracts/test_compile.py create mode 100644 deposit_contract/tests/contracts/test_deposit.py create mode 100644 deposit_contract/tests/core/conftest.py create mode 100644 deposit_contract/tests/core/test_import.py create mode 100644 deposit_contract/tool/compile_deposit_contract.py diff --git a/deposit_contract/contracts/__init__.py b/deposit_contract/contracts/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/deposit_contract/contracts/utils.py b/deposit_contract/contracts/utils.py new file mode 100644 index 0000000000..2aa42ecd3e --- /dev/null +++ b/deposit_contract/contracts/utils.py @@ -0,0 +1,16 @@ +import json +import os + +DIR = os.path.dirname(__file__) + + +def get_deposit_contract_code(): + file_path = os.path.join(DIR, './validator_registration.v.py') + deposit_contract_code = open(file_path).read() + return deposit_contract_code + + +def get_deposit_contract_json(): + file_path = os.path.join(DIR, './validator_registration.json') + deposit_contract_json = open(file_path).read() + return json.loads(deposit_contract_json) diff --git a/deposit_contract/contracts/validator_registration.json b/deposit_contract/contracts/validator_registration.json new file mode 100644 index 0000000000..253eedf6d0 --- /dev/null +++ b/deposit_contract/contracts/validator_registration.json @@ -0,0 +1 @@ +{"abi": [{"name": "Deposit", "inputs": [{"type": "bytes", "name": "pubkey", "indexed": false}, {"type": "bytes", "name": "withdrawal_credentials", "indexed": false}, {"type": "bytes", "name": "amount", "indexed": false}, {"type": "bytes", "name": "signature", "indexed": false}, {"type": "bytes", "name": "merkle_tree_index", "indexed": false}], "anonymous": false, "type": "event"}, {"name": "Eth2Genesis", "inputs": [{"type": "bytes32", "name": "deposit_root", "indexed": false}, {"type": "bytes", "name": "deposit_count", "indexed": false}, {"type": "bytes", "name": "time", "indexed": false}], "anonymous": false, "type": "event"}, {"outputs": [], "inputs": [], "constant": false, "payable": false, "type": "constructor"}, {"name": "to_little_endian_64", "outputs": [{"type": "bytes", "name": "out"}], "inputs": [{"type": "uint256", "name": "value"}], "constant": true, "payable": false, "type": "function", "gas": 7077}, {"name": "from_little_endian_64", "outputs": [{"type": "uint256", "name": "out"}], "inputs": [{"type": "bytes", "name": "value"}], "constant": true, "payable": false, "type": "function", "gas": 5983}, {"name": "get_deposit_root", "outputs": [{"type": "bytes32", "name": "out"}], "inputs": [], "constant": true, "payable": false, "type": "function", "gas": 79251}, {"name": "get_deposit_count", "outputs": [{"type": "bytes", "name": "out"}], "inputs": [], "constant": true, "payable": false, "type": "function", "gas": 11056}, {"name": "deposit", "outputs": [], "inputs": [{"type": "bytes", "name": "pubkey"}, {"type": "bytes", "name": "withdrawal_credentials"}, {"type": "bytes", "name": "signature"}], "constant": false, "payable": true, "type": "function", "gas": 456517}, {"name": "chainStarted", "outputs": [{"type": "bool", "name": "out"}], "inputs": [], "constant": true, "payable": false, "type": "function", "gas": 633}], "bytecode": "0x600035601c52740100000000000000000000000000000000000000006020526f7fffffffffffffffffffffffffffffff6040527fffffffffffffffffffffffffffffffff8000000000000000000000000000000060605274012a05f1fffffffffffffffffffffffffdabf41c006080527ffffffffffffffffffffffffed5fa0e000000000000000000000000000000000060a052341561009e57600080fd5b6101406000601f818352015b600061014051602081106100bd57600080fd5b600060c052602060c020015460208261016001015260208101905061014051602081106100e957600080fd5b600060c052602060c020015460208261016001015260208101905080610160526101609050602060c0825160208401600060025af161012757600080fd5b60c0519050606051600161014051018060405190131561014657600080fd5b809190121561015457600080fd5b6020811061016157600080fd5b600060c052602060c0200155606051600161014051018060405190131561018757600080fd5b809190121561019557600080fd5b602081106101a257600080fd5b600060c052602060c020015460605160016101405101806040519013156101c857600080fd5b80919012156101d657600080fd5b602081106101e357600080fd5b600160c052602060c02001555b81516001018083528114156100aa575b505061160856600035601c52740100000000000000000000000000000000000000006020526f7fffffffffffffffffffffffffffffff6040527fffffffffffffffffffffffffffffffff8000000000000000000000000000000060605274012a05f1fffffffffffffffffffffffffdabf41c006080527ffffffffffffffffffffffffed5fa0e000000000000000000000000000000000060a0526380673289600051141561026b57602060046101403734156100b457600080fd5b67ffffffffffffffff6101405111156100cc57600080fd5b60006101605261014051610180526101a060006008818352015b6101605160086000811215610103578060000360020a820461010a565b8060020a82025b905090506101605260ff61018051166101c052610160516101c0516101605101101561013557600080fd5b6101c051610160510161016052610180517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8600081121561017e578060000360020a8204610185565b8060020a82025b90509050610180525b81516001018083528114156100e6575b505060186008602082066101e001602082840111156101bc57600080fd5b60208061020082610160600060046015f15050818152809050905090508051602001806102a0828460006004600a8704601201f16101f957600080fd5b50506102a05160206001820306601f82010390506103006102a0516008818352015b8261030051111561022b57610247565b6000610300516102c001535b815160010180835281141561021b575b50505060206102805260406102a0510160206001820306601f8201039050610280f3005b639d70e8066000511415610405576020600461014037341561028c57600080fd5b60286004356004016101603760086004356004013511156102ac57600080fd5b60006101c0526101608060200151600082518060209013156102cd57600080fd5b80919012156102db57600080fd5b806020036101000a82049050905090506101e05261020060006008818352015b60ff6101e05116606051606051610200516007038060405190131561031f57600080fd5b809190121561032d57600080fd5b6008028060405190131561034057600080fd5b809190121561034e57600080fd5b6000811215610365578060000360020a820461036c565b8060020a82025b90509050610220526101c051610220516101c05101101561038c57600080fd5b610220516101c051016101c0526101e0517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff860008112156103d5578060000360020a82046103dc565b8060020a82025b905090506101e0525b81516001018083528114156102fb575b50506101c05160005260206000f3005b63c5f2892f600051141561055d57341561041e57600080fd5b6000610140526002546101605261018060006020818352015b60016001610160511614156104b8576000610180516020811061045957600080fd5b600160c052602060c02001546020826102200101526020810190506101405160208261022001015260208101905080610220526102209050602060c0825160208401600060025af16104aa57600080fd5b60c051905061014052610526565b6000610140516020826101a001015260208101905061018051602081106104de57600080fd5b600060c052602060c02001546020826101a0010152602081019050806101a0526101a09050602060c0825160208401600060025af161051c57600080fd5b60c0519050610140525b610160600261053457600080fd5b60028151048152505b8151600101808352811415610437575b50506101405160005260206000f3005b63621fd130600051141561063357341561057657600080fd5b60606101c060246380673289610140526002546101605261015c6000305af161059e57600080fd5b6101e0805160200180610260828460006004600a8704601201f16105c157600080fd5b50506102605160206001820306601f82010390506102c0610260516008818352015b826102c05111156105f35761060f565b60006102c05161028001535b81516001018083528114156105e3575b5050506020610240526040610260510160206001820306601f8201039050610240f3005b63c47e300d60005114156113d557606060046101403760506004356004016101a037603060043560040135111561066957600080fd5b604060243560040161022037602060243560040135111561068957600080fd5b60806044356004016102803760606044356004013511156106a957600080fd5b633b9aca0061034052610340516106bf57600080fd5b61034051340461032052633b9aca006103205110156106dd57600080fd5b6060610440602463806732896103c052610320516103e0526103dc6000305af161070657600080fd5b610460805160200180610360828460006004600a8704601201f161072957600080fd5b50506002546104a05260006104c05260026104e05261050060006020818352015b60006104e05161075957600080fd5b6104e0516104a05160016104a05101101561077357600080fd5b60016104a0510106141515610787576107f3565b6104c06060516001825101806040519013156107a257600080fd5b80919012156107b057600080fd5b8152506104e0805115156107c55760006107df565b60028151600283510204146107d957600080fd5b60028151025b8152505b815160010180835281141561074a575b505060006101a06030806020846105e001018260208501600060046016f15050805182019150506000601060208206610560016020828401111561083657600080fd5b60208061058082610520600060046015f15050818152809050905090506010806020846105e001018260208501600060046013f1505080518201915050806105e0526105e09050602060c0825160208401600060025af161089657600080fd5b60c05190506105405260006000604060208206610680016102805182840111156108bf57600080fd5b6060806106a0826020602088068803016102800160006004601bf1505081815280905090509050602060c0825160208401600060025af16108ff57600080fd5b60c0519050602082610880010152602081019050600060406020602082066107400161028051828401111561093357600080fd5b606080610760826020602088068803016102800160006004601bf150508181528090509050905060208060208461080001018260208501600060046015f15050805182019150506105205160208261080001015260208101905080610800526108009050602060c0825160208401600060025af16109b057600080fd5b60c051905060208261088001015260208101905080610880526108809050602060c0825160208401600060025af16109e757600080fd5b60c051905061066052600060006105405160208261092001015260208101905061022060208060208461092001018260208501600060046015f150508051820191505080610920526109209050602060c0825160208401600060025af1610a4d57600080fd5b60c0519050602082610aa00101526020810190506000610360600880602084610a2001018260208501600060046012f150508051820191505060006018602082066109a00160208284011115610aa257600080fd5b6020806109c082610520600060046015f1505081815280905090509050601880602084610a2001018260208501600060046014f150508051820191505061066051602082610a2001015260208101905080610a2052610a209050602060c0825160208401600060025af1610b1557600080fd5b60c0519050602082610aa001015260208101905080610aa052610aa09050602060c0825160208401600060025af1610b4c57600080fd5b60c051905061090052610b2060006020818352015b6104c051610b20511215610be1576000610b205160208110610b8257600080fd5b600160c052602060c0200154602082610b4001015260208101905061090051602082610b4001015260208101905080610b4052610b409050602060c0825160208401600060025af1610bd357600080fd5b60c051905061090052610be6565b610bf7565b5b8151600101808352811415610b61575b5050610900516104c05160208110610c0e57600080fd5b600160c052602060c02001556002805460018254011015610c2e57600080fd5b60018154018155506020610c40600463c5f2892f610be052610bfc6000305af1610c5757600080fd5b610c4051610bc0526060610ce060246380673289610c60526104a051610c8052610c7c6000305af1610c8857600080fd5b610d00805160200180610d40828460006004600a8704601201f1610cab57600080fd5b505060a0610dc052610dc051610e00526101a0805160200180610dc051610e0001828460006004600a8704601201f1610ce357600080fd5b5050610dc051610e00015160206001820306601f8201039050610dc051610e0001610da081516040818352015b83610da051101515610d2157610d3e565b6000610da0516020850101535b8151600101808352811415610d10575b505050506020610dc051610e00015160206001820306601f8201039050610dc0510101610dc052610dc051610e2052610220805160200180610dc051610e0001828460006004600a8704601201f1610d9557600080fd5b5050610dc051610e00015160206001820306601f8201039050610dc051610e0001610da081516020818352015b83610da051101515610dd357610df0565b6000610da0516020850101535b8151600101808352811415610dc2575b505050506020610dc051610e00015160206001820306601f8201039050610dc0510101610dc052610dc051610e4052610360805160200180610dc051610e0001828460006004600a8704601201f1610e4757600080fd5b5050610dc051610e00015160206001820306601f8201039050610dc051610e0001610da081516020818352015b83610da051101515610e8557610ea2565b6000610da0516020850101535b8151600101808352811415610e74575b505050506020610dc051610e00015160206001820306601f8201039050610dc0510101610dc052610dc051610e6052610280805160200180610dc051610e0001828460006004600a8704601201f1610ef957600080fd5b5050610dc051610e00015160206001820306601f8201039050610dc051610e0001610da081516060818352015b83610da051101515610f3757610f54565b6000610da0516020850101535b8151600101808352811415610f26575b505050506020610dc051610e00015160206001820306601f8201039050610dc0510101610dc052610dc051610e8052610d40805160200180610dc051610e0001828460006004600a8704601201f1610fab57600080fd5b5050610dc051610e00015160206001820306601f8201039050610dc051610e0001610da081516020818352015b83610da051101515610fe957611006565b6000610da0516020850101535b8151600101808352811415610fd8575b505050506020610dc051610e00015160206001820306601f8201039050610dc0510101610dc0527fdc5fc95703516abd38fa03c3737ff3b52dc52347055c8028460fdf5bbe2f12ce610dc051610e00a1640773594000610320511015156113d357600380546001825401101561107b57600080fd5b60018154018155506201000060035414156113d25742610ec05242610ee052620151806110a757600080fd5b62015180610ee05106610ec05110156110bf57600080fd5b42610ee052620151806110d157600080fd5b62015180610ee05106610ec051036202a30042610ec05242610ee052620151806110fa57600080fd5b62015180610ee05106610ec051101561111257600080fd5b42610ee0526201518061112457600080fd5b62015180610ee05106610ec0510301101561113e57600080fd5b6202a30042610ec05242610ee0526201518061115957600080fd5b62015180610ee05106610ec051101561117157600080fd5b42610ee0526201518061118357600080fd5b62015180610ee05106610ec0510301610ea0526060610f8060246380673289610f0052600254610f2052610f1c6000305af16111be57600080fd5b610fa0805160200180610fe0828460006004600a8704601201f16111e157600080fd5b505060606110c06024638067328961104052610ea0516110605261105c6000305af161120c57600080fd5b6110e0805160200180611120828460006004600a8704601201f161122f57600080fd5b5050610bc0516111e05260606111a0526111a05161120052610fe08051602001806111a0516111e001828460006004600a8704601201f161126f57600080fd5b50506111a0516111e0015160206001820306601f82010390506111a0516111e00161118081516020818352015b83611180511015156112ad576112ca565b6000611180516020850101535b815160010180835281141561129c575b5050505060206111a0516111e0015160206001820306601f82010390506111a05101016111a0526111a051611220526111208051602001806111a0516111e001828460006004600a8704601201f161132157600080fd5b50506111a0516111e0015160206001820306601f82010390506111a0516111e00161118081516020818352015b836111805110151561135f5761137c565b6000611180516020850101535b815160010180835281141561134e575b5050505060206111a0516111e0015160206001820306601f82010390506111a05101016111a0527f08b71ef3f1b58f7a23ffb82e27f12f0888c8403f1ceb0ea7ea26b274e2189d4c6111a0516111e0a160016004555b5b005b63845980e860005114156113fb5734156113ee57600080fd5b60045460005260206000f3005b60006000fd5b61020761160803610207600039610207611608036000f3"} \ No newline at end of file diff --git a/deposit_contract/contracts/validator_registration.v.py b/deposit_contract/contracts/validator_registration.v.py new file mode 100644 index 0000000000..751d3a2e83 --- /dev/null +++ b/deposit_contract/contracts/validator_registration.v.py @@ -0,0 +1,138 @@ +MIN_DEPOSIT_AMOUNT: constant(uint256) = 1000000000 # Gwei +FULL_DEPOSIT_AMOUNT: constant(uint256) = 32000000000 # Gwei +CHAIN_START_FULL_DEPOSIT_THRESHOLD: constant(uint256) = 65536 # 2**16 +DEPOSIT_CONTRACT_TREE_DEPTH: constant(uint256) = 32 +SECONDS_PER_DAY: constant(uint256) = 86400 +MAX_64_BIT_VALUE: constant(uint256) = 18446744073709551615 # 2**64 - 1 + +Deposit: event({ + pubkey: bytes[48], + withdrawal_credentials: bytes[32], + amount: bytes[8], + signature: bytes[96], + merkle_tree_index: bytes[8], +}) +Eth2Genesis: event({deposit_root: bytes32, deposit_count: bytes[8], time: bytes[8]}) + +zerohashes: bytes32[DEPOSIT_CONTRACT_TREE_DEPTH] +branch: bytes32[DEPOSIT_CONTRACT_TREE_DEPTH] +deposit_count: uint256 +full_deposit_count: uint256 +chainStarted: public(bool) + + +@public +def __init__(): + for i in range(DEPOSIT_CONTRACT_TREE_DEPTH - 1): + self.zerohashes[i+1] = sha256(concat(self.zerohashes[i], self.zerohashes[i])) + self.branch[i+1] = self.zerohashes[i + 1] + + +@public +@constant +def to_little_endian_64(value: uint256) -> bytes[8]: + assert value <= MAX_64_BIT_VALUE + + # array access for bytes[] not currently supported in vyper so + # reversing bytes using bitwise uint256 manipulations + y: uint256 = 0 + x: uint256 = value + for i in range(8): + y = shift(y, 8) + y = y + bitwise_and(x, 255) + x = shift(x, -8) + + return slice(convert(y, bytes32), start=24, len=8) + + +@public +@constant +def from_little_endian_64(value: bytes[8]) -> uint256: + y: uint256 = 0 + x: uint256 = convert(value, uint256) + for i in range(8): + y = y + shift(bitwise_and(x, 255), 8 * (7-i)) + x = shift(x, -8) + + return y + + +@public +@constant +def get_deposit_root() -> bytes32: + root: bytes32 = 0x0000000000000000000000000000000000000000000000000000000000000000 + size: uint256 = self.deposit_count + for h in range(DEPOSIT_CONTRACT_TREE_DEPTH): + if bitwise_and(size, 1) == 1: + root = sha256(concat(self.branch[h], root)) + else: + root = sha256(concat(root, self.zerohashes[h])) + size /= 2 + return root + +@public +@constant +def get_deposit_count() -> bytes[8]: + return self.to_little_endian_64(self.deposit_count) + +@payable +@public +def deposit(pubkey: bytes[48], withdrawal_credentials: bytes[32], signature: bytes[96]): + deposit_amount: uint256 = msg.value / as_wei_value(1, "gwei") + assert deposit_amount >= MIN_DEPOSIT_AMOUNT + amount: bytes[8] = self.to_little_endian_64(deposit_amount) + + index: uint256 = self.deposit_count + + # add deposit to merkle tree + i: int128 = 0 + power_of_two: uint256 = 2 + for _ in range(DEPOSIT_CONTRACT_TREE_DEPTH): + if (index+1) % power_of_two != 0: + break + i += 1 + power_of_two *= 2 + + zero_bytes_32: bytes32 + pubkey_root: bytes32 = sha256(concat(pubkey, slice(zero_bytes_32, start=0, len=16))) + signature_root: bytes32 = sha256(concat( + sha256(slice(signature, start=0, len=64)), + sha256(concat(slice(signature, start=64, len=32), zero_bytes_32)) + )) + value: bytes32 = sha256(concat( + sha256(concat(pubkey_root, withdrawal_credentials)), + sha256(concat( + amount, + slice(zero_bytes_32, start=0, len=24), + signature_root, + )) + )) + for j in range(DEPOSIT_CONTRACT_TREE_DEPTH): + if j < i: + value = sha256(concat(self.branch[j], value)) + else: + break + self.branch[i] = value + + self.deposit_count += 1 + new_deposit_root: bytes32 = self.get_deposit_root() + log.Deposit( + pubkey, + withdrawal_credentials, + amount, + signature, + self.to_little_endian_64(index), + ) + + if deposit_amount >= FULL_DEPOSIT_AMOUNT: + self.full_deposit_count += 1 + if self.full_deposit_count == CHAIN_START_FULL_DEPOSIT_THRESHOLD: + timestamp_day_boundary: uint256 = ( + as_unitless_number(block.timestamp) - + as_unitless_number(block.timestamp) % SECONDS_PER_DAY + + 2 * SECONDS_PER_DAY + ) + log.Eth2Genesis(new_deposit_root, + self.to_little_endian_64(self.deposit_count), + self.to_little_endian_64(timestamp_day_boundary)) + self.chainStarted = True diff --git a/deposit_contract/requirements-testing.txt b/deposit_contract/requirements-testing.txt new file mode 100644 index 0000000000..5900af8f00 --- /dev/null +++ b/deposit_contract/requirements-testing.txt @@ -0,0 +1,7 @@ +pytest>=3.6,<3.7 +tox==3.0.0, +eth-tester[py-evm]==0.1.0b29, +vyper==0.1.0b9, +web3==4.8.3, +pytest==3.6.1, +../../test_libs/pyspec diff --git a/deposit_contract/tests/__init__.py b/deposit_contract/tests/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/deposit_contract/tests/contracts/__init__.py b/deposit_contract/tests/contracts/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/deposit_contract/tests/contracts/conftest.py b/deposit_contract/tests/contracts/conftest.py new file mode 100644 index 0000000000..634ab26fa5 --- /dev/null +++ b/deposit_contract/tests/contracts/conftest.py @@ -0,0 +1,111 @@ +from random import ( + randint, +) +import re + +import pytest + +from deposit_contract.contracts.utils import ( + get_deposit_contract_code, + get_deposit_contract_json, +) +import eth_tester +from eth_tester import ( + EthereumTester, + PyEVMBackend, +) +from vyper import ( + compiler, +) +from web3 import Web3 +from web3.providers.eth_tester import ( + EthereumTesterProvider, +) + +# Constants +MIN_DEPOSIT_AMOUNT = 1000000000 # Gwei +FULL_DEPOSIT_AMOUNT = 32000000000 # Gwei +CHAIN_START_FULL_DEPOSIT_THRESHOLD = 65536 # 2**16 +DEPOSIT_CONTRACT_TREE_DEPTH = 32 +TWO_TO_POWER_OF_TREE_DEPTH = 2**DEPOSIT_CONTRACT_TREE_DEPTH + + +@pytest.fixture +def tester(): + return EthereumTester(PyEVMBackend()) + + +@pytest.fixture +def a0(tester): + return tester.get_accounts()[0] + + +@pytest.fixture +def w3(tester): + web3 = Web3(EthereumTesterProvider(tester)) + return web3 + + +@pytest.fixture +def registration_contract(w3, tester): + contract_bytecode = get_deposit_contract_json()['bytecode'] + contract_abi = get_deposit_contract_json()['abi'] + registration = w3.eth.contract( + abi=contract_abi, + bytecode=contract_bytecode) + tx_hash = registration.constructor().transact() + tx_receipt = w3.eth.waitForTransactionReceipt(tx_hash) + registration_deployed = w3.eth.contract( + address=tx_receipt.contractAddress, + abi=contract_abi + ) + return registration_deployed + + +@pytest.fixture(scope="session") +def chain_start_full_deposit_thresholds(): + return [randint(1, 5), randint(6, 10), randint(11, 15)] + + +@pytest.fixture(params=[0, 1, 2]) +def modified_registration_contract( + request, + w3, + tester, + chain_start_full_deposit_thresholds): + # Set CHAIN_START_FULL_DEPOSIT_THRESHOLD to different threshold t + registration_code = get_deposit_contract_code() + t = str(chain_start_full_deposit_thresholds[request.param]) + modified_registration_code = re.sub( + r'CHAIN_START_FULL_DEPOSIT_THRESHOLD: constant\(uint256\) = [0-9]+', + 'CHAIN_START_FULL_DEPOSIT_THRESHOLD: constant(uint256) = ' + t, + registration_code, + ) + assert modified_registration_code != registration_code + contract_bytecode = compiler.compile_code(modified_registration_code)['bytecode'] + contract_abi = compiler.mk_full_signature(modified_registration_code) + registration = w3.eth.contract( + abi=contract_abi, + bytecode=contract_bytecode) + tx_hash = registration.constructor().transact() + tx_receipt = w3.eth.waitForTransactionReceipt(tx_hash) + registration_deployed = w3.eth.contract( + address=tx_receipt.contractAddress, + abi=contract_abi + ) + setattr( + registration_deployed, + 'chain_start_full_deposit_threshold', + chain_start_full_deposit_thresholds[request.param] + ) + return registration_deployed + + +@pytest.fixture +def assert_tx_failed(tester): + def assert_tx_failed(function_to_test, exception=eth_tester.exceptions.TransactionFailed): + snapshot_id = tester.take_snapshot() + with pytest.raises(exception): + function_to_test() + tester.revert_to_snapshot(snapshot_id) + return assert_tx_failed diff --git a/deposit_contract/tests/contracts/test_compile.py b/deposit_contract/tests/contracts/test_compile.py new file mode 100644 index 0000000000..72593fd5b5 --- /dev/null +++ b/deposit_contract/tests/contracts/test_compile.py @@ -0,0 +1,18 @@ +from deposit_contract.contracts.utils import ( + get_deposit_contract_code, + get_deposit_contract_json, +) +from vyper import ( + compiler, +) + + +def test_compile_deposit_contract(): + compiled_deposit_contract_json = get_deposit_contract_json() + + deposit_contract_code = get_deposit_contract_code() + abi = compiler.mk_full_signature(deposit_contract_code) + bytecode = compiler.compile_code(deposit_contract_code)['bytecode'] + + assert abi == compiled_deposit_contract_json["abi"] + assert bytecode == compiled_deposit_contract_json["bytecode"] diff --git a/deposit_contract/tests/contracts/test_deposit.py b/deposit_contract/tests/contracts/test_deposit.py new file mode 100644 index 0000000000..600d74c856 --- /dev/null +++ b/deposit_contract/tests/contracts/test_deposit.py @@ -0,0 +1,221 @@ +from hashlib import ( + sha256, +) +from random import ( + randint, +) + +import pytest + +import eth_utils +from tests.contracts.conftest import ( + DEPOSIT_CONTRACT_TREE_DEPTH, + FULL_DEPOSIT_AMOUNT, + MIN_DEPOSIT_AMOUNT, +) +from eth2spec.utils.minimal_ssz import + SSZType, + hash_tree_root, +) + + +DepositData = SSZType({ + # BLS pubkey + 'pubkey': 'bytes48', + # Withdrawal credentials + 'withdrawal_credentials': 'bytes32', + # Amount in Gwei + 'amount': 'uint64', + # Container self-signature + 'signature': 'bytes96', +}) + + +def hash(data): + return sha256(data).digest() + + +def compute_merkle_root(leaf_nodes): + assert len(leaf_nodes) >= 1 + empty_node = b'\x00' * 32 + child_nodes = leaf_nodes[:] + for _ in range(DEPOSIT_CONTRACT_TREE_DEPTH): + parent_nodes = [] + if len(child_nodes) % 2 == 1: + child_nodes.append(empty_node) + for j in range(0, len(child_nodes), 2): + parent_nodes.append(hash(child_nodes[j] + child_nodes[j + 1])) + child_nodes = parent_nodes + empty_node = hash(empty_node + empty_node) + return child_nodes[0] + + +@pytest.fixture +def deposit_input(): + """ + pubkey: bytes[48] + withdrawal_credentials: bytes[32] + signature: bytes[96] + """ + return ( + b'\x11' * 48, + b'\x22' * 32, + b'\x33' * 96, + ) + + +@pytest.mark.parametrize( + 'value,success', + [ + (0, True), + (10, True), + (55555, True), + (2**64 - 1, True), + (2**64, False), + ] +) +def test_to_little_endian_64(registration_contract, value, success, assert_tx_failed): + call = registration_contract.functions.to_little_endian_64(value) + + if success: + little_endian_64 = call.call() + assert little_endian_64 == (value).to_bytes(8, 'little') + else: + assert_tx_failed( + lambda: call.call() + ) + + +def test_from_little_endian_64(registration_contract, assert_tx_failed): + values = [0, 2**64 - 1] + [randint(1, 2**64 - 2) for _ in range(10)] + for value in values: + call = registration_contract.functions.from_little_endian_64((value).to_bytes(8, 'little')) + assert call.call() == value + + +@pytest.mark.parametrize( + 'success,deposit_amount', + [ + (True, FULL_DEPOSIT_AMOUNT), + (True, MIN_DEPOSIT_AMOUNT), + (False, MIN_DEPOSIT_AMOUNT - 1), + (True, FULL_DEPOSIT_AMOUNT + 1) + ] +) +def test_deposit_amount(registration_contract, + w3, + success, + deposit_amount, + assert_tx_failed, + deposit_input): + call = registration_contract.functions.deposit(*deposit_input) + if success: + assert call.transact({"value": deposit_amount * eth_utils.denoms.gwei}) + else: + assert_tx_failed( + lambda: call.transact({"value": deposit_amount * eth_utils.denoms.gwei}) + ) + + +def test_deposit_log(registration_contract, a0, w3, deposit_input): + log_filter = registration_contract.events.Deposit.createFilter( + fromBlock='latest', + ) + + deposit_amount_list = [randint(MIN_DEPOSIT_AMOUNT, FULL_DEPOSIT_AMOUNT * 2) for _ in range(3)] + for i in range(3): + registration_contract.functions.deposit( + *deposit_input, + ).transact({"value": deposit_amount_list[i] * eth_utils.denoms.gwei}) + + logs = log_filter.get_new_entries() + assert len(logs) == 1 + log = logs[0]['args'] + + assert log['pubkey'] == deposit_input[0] + assert log['withdrawal_credentials'] == deposit_input[1] + assert log['amount'] == deposit_amount_list[i].to_bytes(8, 'little') + assert log['signature'] == deposit_input[2] + assert log['merkle_tree_index'] == i.to_bytes(8, 'little') + + +def test_deposit_tree(registration_contract, w3, assert_tx_failed, deposit_input): + log_filter = registration_contract.events.Deposit.createFilter( + fromBlock='latest', + ) + + deposit_amount_list = [randint(MIN_DEPOSIT_AMOUNT, FULL_DEPOSIT_AMOUNT * 2) for _ in range(10)] + leaf_nodes = [] + for i in range(0, 10): + tx_hash = registration_contract.functions.deposit( + *deposit_input, + ).transact({"value": deposit_amount_list[i] * eth_utils.denoms.gwei}) + receipt = w3.eth.getTransactionReceipt(tx_hash) + print("deposit transaction consumes %d gas" % receipt['gasUsed']) + + logs = log_filter.get_new_entries() + assert len(logs) == 1 + log = logs[0]['args'] + + assert log["merkle_tree_index"] == i.to_bytes(8, 'little') + + deposit_data = DepositData( + pubkey=deposit_input[0][:20], + withdrawal_credentials=deposit_input[1], + amount=deposit_amount_list[i], + signature=deposit_input[2], + ) + hash_tree_root_result = hash_tree_root(deposit_data) + leaf_nodes.append(hash_tree_root_result) + root = compute_merkle_root(leaf_nodes) + assert root == registration_contract.functions.get_deposit_root().call() + + +def test_chain_start(modified_registration_contract, w3, assert_tx_failed, deposit_input): + t = getattr(modified_registration_contract, 'chain_start_full_deposit_threshold') + # CHAIN_START_FULL_DEPOSIT_THRESHOLD is set to t + min_deposit_amount = MIN_DEPOSIT_AMOUNT * eth_utils.denoms.gwei # in wei + full_deposit_amount = FULL_DEPOSIT_AMOUNT * eth_utils.denoms.gwei + log_filter = modified_registration_contract.events.Eth2Genesis.createFilter( + fromBlock='latest', + ) + + index_not_full_deposit = randint(0, t - 1) + for i in range(t): + if i == index_not_full_deposit: + # Deposit with value below FULL_DEPOSIT_AMOUNT + modified_registration_contract.functions.deposit( + *deposit_input, + ).transact({"value": min_deposit_amount}) + logs = log_filter.get_new_entries() + # Eth2Genesis event should not be triggered + assert len(logs) == 0 + else: + # Deposit with value FULL_DEPOSIT_AMOUNT + modified_registration_contract.functions.deposit( + *deposit_input, + ).transact({"value": full_deposit_amount}) + logs = log_filter.get_new_entries() + # Eth2Genesis event should not be triggered + assert len(logs) == 0 + + # Make 1 more deposit with value FULL_DEPOSIT_AMOUNT to trigger Eth2Genesis event + modified_registration_contract.functions.deposit( + *deposit_input, + ).transact({"value": full_deposit_amount}) + logs = log_filter.get_new_entries() + assert len(logs) == 1 + timestamp = int(w3.eth.getBlock(w3.eth.blockNumber)['timestamp']) + timestamp_day_boundary = timestamp + (86400 - timestamp % 86400) + 86400 + log = logs[0]['args'] + assert log['deposit_root'] == modified_registration_contract.functions.get_deposit_root().call() + assert int.from_bytes(log['time'], byteorder='little') == timestamp_day_boundary + assert modified_registration_contract.functions.chainStarted().call() is True + + # Make 1 deposit with value FULL_DEPOSIT_AMOUNT and + # check that Eth2Genesis event is not triggered + modified_registration_contract.functions.deposit( + *deposit_input, + ).transact({"value": full_deposit_amount}) + logs = log_filter.get_new_entries() + assert len(logs) == 0 diff --git a/deposit_contract/tests/core/conftest.py b/deposit_contract/tests/core/conftest.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/deposit_contract/tests/core/test_import.py b/deposit_contract/tests/core/test_import.py new file mode 100644 index 0000000000..d25e6ed67e --- /dev/null +++ b/deposit_contract/tests/core/test_import.py @@ -0,0 +1,4 @@ + + +def test_import(): + import deposit_contract # noqa: F401 diff --git a/deposit_contract/tool/compile_deposit_contract.py b/deposit_contract/tool/compile_deposit_contract.py new file mode 100644 index 0000000000..58f974b8d8 --- /dev/null +++ b/deposit_contract/tool/compile_deposit_contract.py @@ -0,0 +1,33 @@ +import argparse +import json +import os + +from vyper import ( + compiler, +) + +DIR = os.path.dirname(__file__) + + +def generate_compiled_json(file_path: str): + deposit_contract_code = open(file_path).read() + abi = compiler.mk_full_signature(deposit_contract_code) + bytecode = compiler.compile_code(deposit_contract_code)['bytecode'] + contract_json = { + 'abi': abi, + 'bytecode': bytecode, + } + # write json + basename = os.path.basename(file_path) + dirname = os.path.dirname(file_path) + contract_name = basename.split('.')[0] + with open(dirname + "/{}.json".format(contract_name), 'w') as f_write: + json.dump(contract_json, f_write) + + +if __name__ == '__main__': + parser = argparse.ArgumentParser() + parser.add_argument("path", type=str, help="the path of the contract") + args = parser.parse_args() + path = args.path + generate_compiled_json(path) From b05444a92ce8c8747c4367eb68d318fe0df17126 Mon Sep 17 00:00:00 2001 From: Hsiao-Wei Wang Date: Mon, 27 May 2019 15:57:55 +0800 Subject: [PATCH 02/21] Update Makefile and CI config 1. Add `install_deposit_contract_test` command 2. Add `test_deposit_contract` command --- .circleci/config.yml | 18 +++++++++++++++++- Makefile | 10 ++++++++++ deposit_contract/requirements-testing.txt | 13 ++++++------- deposit_contract/tests/contracts/conftest.py | 9 +++++---- .../tests/contracts/test_compile.py | 9 +++++---- .../tests/contracts/test_deposit.py | 17 ++++------------- .../{ => tests}/contracts/utils.py | 4 ++-- deposit_contract/tests/core/conftest.py | 0 deposit_contract/tests/core/test_import.py | 4 ---- 9 files changed, 49 insertions(+), 35 deletions(-) rename deposit_contract/{ => tests}/contracts/utils.py (64%) delete mode 100644 deposit_contract/tests/core/conftest.py delete mode 100644 deposit_contract/tests/core/test_import.py diff --git a/.circleci/config.yml b/.circleci/config.yml index f3c5f6a81c..8d44c76ac3 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -64,7 +64,7 @@ jobs: reqs_checksum: '{{ checksum "test_libs/pyspec/requirements.txt" }}-{{ checksum "test_libs/pyspec/requirements-testing.txt" }}' - run: name: Install pyspec requirements - command: make install_test && make install_lint + command: make install_test && make install_lint && make install_deposit_contract_test - save_cached_venv: venv_name: v1-pyspec-03 reqs_checksum: '{{ checksum "test_libs/pyspec/requirements.txt" }}-{{ checksum "test_libs/pyspec/requirements-testing.txt" }}' @@ -97,6 +97,19 @@ jobs: - run: name: Run linter command: make lint + deposit_contract: + docker: + - image: circleci/python:3.6 + working_directory: ~/specs-repo + steps: + - restore_cache: + key: v1-specs-repo-{{ .Branch }}-{{ .Revision }} + - restore_cached_venv: + venv_name: v1-pyspec-03 + reqs_checksum: '{{ checksum "test_libs/pyspec/requirements.txt" }}-{{ checksum "test_libs/pyspec/requirements-testing.txt" }}' + - run: + name: Run deposit contract test + command: make test_deposit_contract workflows: version: 2.1 test_spec: @@ -111,3 +124,6 @@ workflows: - lint: requires: - test + - deposit_contract: + requires: + - test diff --git a/Makefile b/Makefile index a6b379b719..ff1891a7c7 100644 --- a/Makefile +++ b/Makefile @@ -4,6 +4,7 @@ TEST_LIBS_DIR = ./test_libs PY_SPEC_DIR = $(TEST_LIBS_DIR)/pyspec YAML_TEST_DIR = ./eth2.0-spec-tests/tests GENERATOR_DIR = ./test_generators +DEPOSIT_CONTRACT_DIR = ./deposit_contract CONFIGS_DIR = ./configs # Collect a list of generator names @@ -46,6 +47,15 @@ lint: $(PY_SPEC_ALL_TARGETS) cd $(PY_SPEC_DIR); . venv/bin/activate; \ flake8 --max-line-length=120 ./eth2spec; +install_deposit_contract_test: + cd $(PY_SPEC_DIR); python3 -m venv venv; . venv/bin/activate; \ + cd ../..; cd $(DEPOSIT_CONTRACT_DIR); \ + pip3 install -r requirements-testing.txt + +test_deposit_contract: + cd $(PY_SPEC_DIR); python3 -m venv venv; . venv/bin/activate; \ + cd ../.. && cd $(DEPOSIT_CONTRACT_DIR) && python -m pytest . + # "make pyspec" to create the pyspec for all phases. pyspec: $(PY_SPEC_ALL_TARGETS) diff --git a/deposit_contract/requirements-testing.txt b/deposit_contract/requirements-testing.txt index 5900af8f00..c1f96a0120 100644 --- a/deposit_contract/requirements-testing.txt +++ b/deposit_contract/requirements-testing.txt @@ -1,7 +1,6 @@ -pytest>=3.6,<3.7 -tox==3.0.0, -eth-tester[py-evm]==0.1.0b29, -vyper==0.1.0b9, -web3==4.8.3, -pytest==3.6.1, -../../test_libs/pyspec +tox==3.0.0 +eth-tester[py-evm]==0.1.0b29 +vyper==0.1.0b9 +web3==4.8.3 +pytest==3.6.1 +../test_libs/pyspec diff --git a/deposit_contract/tests/contracts/conftest.py b/deposit_contract/tests/contracts/conftest.py index 634ab26fa5..69ece247d6 100644 --- a/deposit_contract/tests/contracts/conftest.py +++ b/deposit_contract/tests/contracts/conftest.py @@ -5,10 +5,6 @@ import pytest -from deposit_contract.contracts.utils import ( - get_deposit_contract_code, - get_deposit_contract_json, -) import eth_tester from eth_tester import ( EthereumTester, @@ -21,6 +17,11 @@ from web3.providers.eth_tester import ( EthereumTesterProvider, ) +from .utils import ( + get_deposit_contract_code, + get_deposit_contract_json, +) + # Constants MIN_DEPOSIT_AMOUNT = 1000000000 # Gwei diff --git a/deposit_contract/tests/contracts/test_compile.py b/deposit_contract/tests/contracts/test_compile.py index 72593fd5b5..fc732a6db1 100644 --- a/deposit_contract/tests/contracts/test_compile.py +++ b/deposit_contract/tests/contracts/test_compile.py @@ -1,11 +1,12 @@ -from deposit_contract.contracts.utils import ( - get_deposit_contract_code, - get_deposit_contract_json, -) from vyper import ( compiler, ) +from .utils import ( + get_deposit_contract_code, + get_deposit_contract_json, +) + def test_compile_deposit_contract(): compiled_deposit_contract_json = get_deposit_contract_json() diff --git a/deposit_contract/tests/contracts/test_deposit.py b/deposit_contract/tests/contracts/test_deposit.py index 600d74c856..92371421e2 100644 --- a/deposit_contract/tests/contracts/test_deposit.py +++ b/deposit_contract/tests/contracts/test_deposit.py @@ -13,22 +13,13 @@ FULL_DEPOSIT_AMOUNT, MIN_DEPOSIT_AMOUNT, ) -from eth2spec.utils.minimal_ssz import +from eth2spec.utils.minimal_ssz import ( SSZType, hash_tree_root, ) - - -DepositData = SSZType({ - # BLS pubkey - 'pubkey': 'bytes48', - # Withdrawal credentials - 'withdrawal_credentials': 'bytes32', - # Amount in Gwei - 'amount': 'uint64', - # Container self-signature - 'signature': 'bytes96', -}) +from eth2spec.phase0.spec import ( + DepositData, +) def hash(data): diff --git a/deposit_contract/contracts/utils.py b/deposit_contract/tests/contracts/utils.py similarity index 64% rename from deposit_contract/contracts/utils.py rename to deposit_contract/tests/contracts/utils.py index 2aa42ecd3e..de7c544896 100644 --- a/deposit_contract/contracts/utils.py +++ b/deposit_contract/tests/contracts/utils.py @@ -5,12 +5,12 @@ def get_deposit_contract_code(): - file_path = os.path.join(DIR, './validator_registration.v.py') + file_path = os.path.join(DIR, './../../contracts/validator_registration.v.py') deposit_contract_code = open(file_path).read() return deposit_contract_code def get_deposit_contract_json(): - file_path = os.path.join(DIR, './validator_registration.json') + file_path = os.path.join(DIR, './../../contracts/validator_registration.json') deposit_contract_json = open(file_path).read() return json.loads(deposit_contract_json) diff --git a/deposit_contract/tests/core/conftest.py b/deposit_contract/tests/core/conftest.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/deposit_contract/tests/core/test_import.py b/deposit_contract/tests/core/test_import.py deleted file mode 100644 index d25e6ed67e..0000000000 --- a/deposit_contract/tests/core/test_import.py +++ /dev/null @@ -1,4 +0,0 @@ - - -def test_import(): - import deposit_contract # noqa: F401 From bff945a2989cf81177510b1aa6e0eaaecf6455c3 Mon Sep 17 00:00:00 2001 From: Hsiao-Wei Wang Date: Mon, 27 May 2019 17:39:50 +0800 Subject: [PATCH 03/21] Add `restore_default_cached_venv` --- .circleci/config.yml | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 8d44c76ac3..52c03ca391 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -31,6 +31,12 @@ commands: - save_cache: key: << parameters.venv_name >>-venv-<< parameters.reqs_checksum >> paths: << parameters.venv_path >> + restore_default_cached_venv: + description: "Restore the cache with default keys" + steps: + - restore_cached_venv: + venv_name: v1-pyspec-04 + reqs_checksum: '{{ checksum "test_libs/pyspec/requirements.txt" }}-{{ checksum "test_libs/pyspec/requirements-testing.txt" }}' jobs: checkout_specs: docker: @@ -59,9 +65,7 @@ jobs: steps: - restore_cache: key: v1-specs-repo-{{ .Branch }}-{{ .Revision }} - - restore_cached_venv: - venv_name: v1-pyspec-03 - reqs_checksum: '{{ checksum "test_libs/pyspec/requirements.txt" }}-{{ checksum "test_libs/pyspec/requirements-testing.txt" }}' + - restore_default_cached_venv - run: name: Install pyspec requirements command: make install_test && make install_lint && make install_deposit_contract_test @@ -76,9 +80,7 @@ jobs: steps: - restore_cache: key: v1-specs-repo-{{ .Branch }}-{{ .Revision }} - - restore_cached_venv: - venv_name: v1-pyspec-03 - reqs_checksum: '{{ checksum "test_libs/pyspec/requirements.txt" }}-{{ checksum "test_libs/pyspec/requirements-testing.txt" }}' + - restore_default_cached_venv - run: name: Run py-tests command: make citest @@ -91,9 +93,7 @@ jobs: steps: - restore_cache: key: v1-specs-repo-{{ .Branch }}-{{ .Revision }} - - restore_cached_venv: - venv_name: v1-pyspec-03 - reqs_checksum: '{{ checksum "test_libs/pyspec/requirements.txt" }}-{{ checksum "test_libs/pyspec/requirements-testing.txt" }}' + - restore_default_cached_venv - run: name: Run linter command: make lint @@ -104,9 +104,7 @@ jobs: steps: - restore_cache: key: v1-specs-repo-{{ .Branch }}-{{ .Revision }} - - restore_cached_venv: - venv_name: v1-pyspec-03 - reqs_checksum: '{{ checksum "test_libs/pyspec/requirements.txt" }}-{{ checksum "test_libs/pyspec/requirements-testing.txt" }}' + - restore_default_cached_venv - run: name: Run deposit contract test command: make test_deposit_contract From 18cb67425af35b544ab84687df01a349485f69e9 Mon Sep 17 00:00:00 2001 From: Hsiao-Wei Wang Date: Mon, 27 May 2019 18:05:21 +0800 Subject: [PATCH 04/21] Add `deposit_contract/requirements-testing.txt` to checksum --- .circleci/config.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 52c03ca391..d15783cfe3 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -35,8 +35,8 @@ commands: description: "Restore the cache with default keys" steps: - restore_cached_venv: - venv_name: v1-pyspec-04 - reqs_checksum: '{{ checksum "test_libs/pyspec/requirements.txt" }}-{{ checksum "test_libs/pyspec/requirements-testing.txt" }}' + venv_name: v1-pyspec-01 + reqs_checksum: '{{ checksum "test_libs/pyspec/requirements.txt" }}-{{ checksum "test_libs/pyspec/requirements-testing.txt" }}--{{ checksum "deposit_contract/requirements-testing.txt" }}' jobs: checkout_specs: docker: From 98cabb665abeb6f08c278701c127962c93d88ead Mon Sep 17 00:00:00 2001 From: Hsiao-Wei Wang Date: Mon, 27 May 2019 18:11:15 +0800 Subject: [PATCH 05/21] Add `save_default_cached_venv` --- .circleci/config.yml | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index d15783cfe3..23d68113b0 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,7 +1,7 @@ version: 2.1 commands: restore_cached_venv: - description: "Restores a cached venv" + description: "Restore a cached venv" parameters: reqs_checksum: type: string @@ -16,7 +16,7 @@ commands: # fallback to using the latest cache if no exact match is found - << parameters.venv_name >>-venv- save_cached_venv: - description: "Saves a venv into a cache" + description: "Save a venv into a cache" parameters: reqs_checksum: type: string @@ -37,6 +37,13 @@ commands: - restore_cached_venv: venv_name: v1-pyspec-01 reqs_checksum: '{{ checksum "test_libs/pyspec/requirements.txt" }}-{{ checksum "test_libs/pyspec/requirements-testing.txt" }}--{{ checksum "deposit_contract/requirements-testing.txt" }}' + save_default_cached_venv: + description: Save a venv into a cache with default keys" + steps: + - save_cached_venv: + venv_name: v1-pyspec-01 + reqs_checksum: '{{ checksum "test_libs/pyspec/requirements.txt" }}-{{ checksum "test_libs/pyspec/requirements-testing.txt" }}--{{ checksum "deposit_contract/requirements-testing.txt" }}' + venv_path: ./test_libs/pyspec/venv jobs: checkout_specs: docker: @@ -69,10 +76,7 @@ jobs: - run: name: Install pyspec requirements command: make install_test && make install_lint && make install_deposit_contract_test - - save_cached_venv: - venv_name: v1-pyspec-03 - reqs_checksum: '{{ checksum "test_libs/pyspec/requirements.txt" }}-{{ checksum "test_libs/pyspec/requirements-testing.txt" }}' - venv_path: ./test_libs/pyspec/venv + - save_default_cached_venv test: docker: - image: circleci/python:3.6 From 05dc4b576f89f8e5049be76351278e27f552509b Mon Sep 17 00:00:00 2001 From: Hsiao-Wei Wang Date: Mon, 27 May 2019 18:15:33 +0800 Subject: [PATCH 06/21] deposit contract requires `eth2spec.phase0.spec.DepositData` --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index ff1891a7c7..e40c7e95c9 100644 --- a/Makefile +++ b/Makefile @@ -52,7 +52,7 @@ install_deposit_contract_test: cd ../..; cd $(DEPOSIT_CONTRACT_DIR); \ pip3 install -r requirements-testing.txt -test_deposit_contract: +test_deposit_contract: $(PY_SPEC_ALL_TARGETS) cd $(PY_SPEC_DIR); python3 -m venv venv; . venv/bin/activate; \ cd ../.. && cd $(DEPOSIT_CONTRACT_DIR) && python -m pytest . From 30bb8986c4ef16747de349c0707c9e41bf0235d5 Mon Sep 17 00:00:00 2001 From: Hsiao-Wei Wang Date: Mon, 27 May 2019 18:25:31 +0800 Subject: [PATCH 07/21] Bump to latest deposit contract dev branch (fad5c32) --- .../contracts/validator_registration.json | 2 +- .../contracts/validator_registration.v.py | 32 +++++++------ .../tests/contracts/test_deposit.py | 46 +++++++++++++++---- 3 files changed, 56 insertions(+), 24 deletions(-) diff --git a/deposit_contract/contracts/validator_registration.json b/deposit_contract/contracts/validator_registration.json index 253eedf6d0..afc86ec1dc 100644 --- a/deposit_contract/contracts/validator_registration.json +++ b/deposit_contract/contracts/validator_registration.json @@ -1 +1 @@ -{"abi": [{"name": "Deposit", "inputs": [{"type": "bytes", "name": "pubkey", "indexed": false}, {"type": "bytes", "name": "withdrawal_credentials", "indexed": false}, {"type": "bytes", "name": "amount", "indexed": false}, {"type": "bytes", "name": "signature", "indexed": false}, {"type": "bytes", "name": "merkle_tree_index", "indexed": false}], "anonymous": false, "type": "event"}, {"name": "Eth2Genesis", "inputs": [{"type": "bytes32", "name": "deposit_root", "indexed": false}, {"type": "bytes", "name": "deposit_count", "indexed": false}, {"type": "bytes", "name": "time", "indexed": false}], "anonymous": false, "type": "event"}, {"outputs": [], "inputs": [], "constant": false, "payable": false, "type": "constructor"}, {"name": "to_little_endian_64", "outputs": [{"type": "bytes", "name": "out"}], "inputs": [{"type": "uint256", "name": "value"}], "constant": true, "payable": false, "type": "function", "gas": 7077}, {"name": "from_little_endian_64", "outputs": [{"type": "uint256", "name": "out"}], "inputs": [{"type": "bytes", "name": "value"}], "constant": true, "payable": false, "type": "function", "gas": 5983}, {"name": "get_deposit_root", "outputs": [{"type": "bytes32", "name": "out"}], "inputs": [], "constant": true, "payable": false, "type": "function", "gas": 79251}, {"name": "get_deposit_count", "outputs": [{"type": "bytes", "name": "out"}], "inputs": [], "constant": true, "payable": false, "type": "function", "gas": 11056}, {"name": "deposit", "outputs": [], "inputs": [{"type": "bytes", "name": "pubkey"}, {"type": "bytes", "name": "withdrawal_credentials"}, {"type": "bytes", "name": "signature"}], "constant": false, "payable": true, "type": "function", "gas": 456517}, {"name": "chainStarted", "outputs": [{"type": "bool", "name": "out"}], "inputs": [], "constant": true, "payable": false, "type": "function", "gas": 633}], "bytecode": "0x600035601c52740100000000000000000000000000000000000000006020526f7fffffffffffffffffffffffffffffff6040527fffffffffffffffffffffffffffffffff8000000000000000000000000000000060605274012a05f1fffffffffffffffffffffffffdabf41c006080527ffffffffffffffffffffffffed5fa0e000000000000000000000000000000000060a052341561009e57600080fd5b6101406000601f818352015b600061014051602081106100bd57600080fd5b600060c052602060c020015460208261016001015260208101905061014051602081106100e957600080fd5b600060c052602060c020015460208261016001015260208101905080610160526101609050602060c0825160208401600060025af161012757600080fd5b60c0519050606051600161014051018060405190131561014657600080fd5b809190121561015457600080fd5b6020811061016157600080fd5b600060c052602060c0200155606051600161014051018060405190131561018757600080fd5b809190121561019557600080fd5b602081106101a257600080fd5b600060c052602060c020015460605160016101405101806040519013156101c857600080fd5b80919012156101d657600080fd5b602081106101e357600080fd5b600160c052602060c02001555b81516001018083528114156100aa575b505061160856600035601c52740100000000000000000000000000000000000000006020526f7fffffffffffffffffffffffffffffff6040527fffffffffffffffffffffffffffffffff8000000000000000000000000000000060605274012a05f1fffffffffffffffffffffffffdabf41c006080527ffffffffffffffffffffffffed5fa0e000000000000000000000000000000000060a0526380673289600051141561026b57602060046101403734156100b457600080fd5b67ffffffffffffffff6101405111156100cc57600080fd5b60006101605261014051610180526101a060006008818352015b6101605160086000811215610103578060000360020a820461010a565b8060020a82025b905090506101605260ff61018051166101c052610160516101c0516101605101101561013557600080fd5b6101c051610160510161016052610180517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8600081121561017e578060000360020a8204610185565b8060020a82025b90509050610180525b81516001018083528114156100e6575b505060186008602082066101e001602082840111156101bc57600080fd5b60208061020082610160600060046015f15050818152809050905090508051602001806102a0828460006004600a8704601201f16101f957600080fd5b50506102a05160206001820306601f82010390506103006102a0516008818352015b8261030051111561022b57610247565b6000610300516102c001535b815160010180835281141561021b575b50505060206102805260406102a0510160206001820306601f8201039050610280f3005b639d70e8066000511415610405576020600461014037341561028c57600080fd5b60286004356004016101603760086004356004013511156102ac57600080fd5b60006101c0526101608060200151600082518060209013156102cd57600080fd5b80919012156102db57600080fd5b806020036101000a82049050905090506101e05261020060006008818352015b60ff6101e05116606051606051610200516007038060405190131561031f57600080fd5b809190121561032d57600080fd5b6008028060405190131561034057600080fd5b809190121561034e57600080fd5b6000811215610365578060000360020a820461036c565b8060020a82025b90509050610220526101c051610220516101c05101101561038c57600080fd5b610220516101c051016101c0526101e0517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff860008112156103d5578060000360020a82046103dc565b8060020a82025b905090506101e0525b81516001018083528114156102fb575b50506101c05160005260206000f3005b63c5f2892f600051141561055d57341561041e57600080fd5b6000610140526002546101605261018060006020818352015b60016001610160511614156104b8576000610180516020811061045957600080fd5b600160c052602060c02001546020826102200101526020810190506101405160208261022001015260208101905080610220526102209050602060c0825160208401600060025af16104aa57600080fd5b60c051905061014052610526565b6000610140516020826101a001015260208101905061018051602081106104de57600080fd5b600060c052602060c02001546020826101a0010152602081019050806101a0526101a09050602060c0825160208401600060025af161051c57600080fd5b60c0519050610140525b610160600261053457600080fd5b60028151048152505b8151600101808352811415610437575b50506101405160005260206000f3005b63621fd130600051141561063357341561057657600080fd5b60606101c060246380673289610140526002546101605261015c6000305af161059e57600080fd5b6101e0805160200180610260828460006004600a8704601201f16105c157600080fd5b50506102605160206001820306601f82010390506102c0610260516008818352015b826102c05111156105f35761060f565b60006102c05161028001535b81516001018083528114156105e3575b5050506020610240526040610260510160206001820306601f8201039050610240f3005b63c47e300d60005114156113d557606060046101403760506004356004016101a037603060043560040135111561066957600080fd5b604060243560040161022037602060243560040135111561068957600080fd5b60806044356004016102803760606044356004013511156106a957600080fd5b633b9aca0061034052610340516106bf57600080fd5b61034051340461032052633b9aca006103205110156106dd57600080fd5b6060610440602463806732896103c052610320516103e0526103dc6000305af161070657600080fd5b610460805160200180610360828460006004600a8704601201f161072957600080fd5b50506002546104a05260006104c05260026104e05261050060006020818352015b60006104e05161075957600080fd5b6104e0516104a05160016104a05101101561077357600080fd5b60016104a0510106141515610787576107f3565b6104c06060516001825101806040519013156107a257600080fd5b80919012156107b057600080fd5b8152506104e0805115156107c55760006107df565b60028151600283510204146107d957600080fd5b60028151025b8152505b815160010180835281141561074a575b505060006101a06030806020846105e001018260208501600060046016f15050805182019150506000601060208206610560016020828401111561083657600080fd5b60208061058082610520600060046015f15050818152809050905090506010806020846105e001018260208501600060046013f1505080518201915050806105e0526105e09050602060c0825160208401600060025af161089657600080fd5b60c05190506105405260006000604060208206610680016102805182840111156108bf57600080fd5b6060806106a0826020602088068803016102800160006004601bf1505081815280905090509050602060c0825160208401600060025af16108ff57600080fd5b60c0519050602082610880010152602081019050600060406020602082066107400161028051828401111561093357600080fd5b606080610760826020602088068803016102800160006004601bf150508181528090509050905060208060208461080001018260208501600060046015f15050805182019150506105205160208261080001015260208101905080610800526108009050602060c0825160208401600060025af16109b057600080fd5b60c051905060208261088001015260208101905080610880526108809050602060c0825160208401600060025af16109e757600080fd5b60c051905061066052600060006105405160208261092001015260208101905061022060208060208461092001018260208501600060046015f150508051820191505080610920526109209050602060c0825160208401600060025af1610a4d57600080fd5b60c0519050602082610aa00101526020810190506000610360600880602084610a2001018260208501600060046012f150508051820191505060006018602082066109a00160208284011115610aa257600080fd5b6020806109c082610520600060046015f1505081815280905090509050601880602084610a2001018260208501600060046014f150508051820191505061066051602082610a2001015260208101905080610a2052610a209050602060c0825160208401600060025af1610b1557600080fd5b60c0519050602082610aa001015260208101905080610aa052610aa09050602060c0825160208401600060025af1610b4c57600080fd5b60c051905061090052610b2060006020818352015b6104c051610b20511215610be1576000610b205160208110610b8257600080fd5b600160c052602060c0200154602082610b4001015260208101905061090051602082610b4001015260208101905080610b4052610b409050602060c0825160208401600060025af1610bd357600080fd5b60c051905061090052610be6565b610bf7565b5b8151600101808352811415610b61575b5050610900516104c05160208110610c0e57600080fd5b600160c052602060c02001556002805460018254011015610c2e57600080fd5b60018154018155506020610c40600463c5f2892f610be052610bfc6000305af1610c5757600080fd5b610c4051610bc0526060610ce060246380673289610c60526104a051610c8052610c7c6000305af1610c8857600080fd5b610d00805160200180610d40828460006004600a8704601201f1610cab57600080fd5b505060a0610dc052610dc051610e00526101a0805160200180610dc051610e0001828460006004600a8704601201f1610ce357600080fd5b5050610dc051610e00015160206001820306601f8201039050610dc051610e0001610da081516040818352015b83610da051101515610d2157610d3e565b6000610da0516020850101535b8151600101808352811415610d10575b505050506020610dc051610e00015160206001820306601f8201039050610dc0510101610dc052610dc051610e2052610220805160200180610dc051610e0001828460006004600a8704601201f1610d9557600080fd5b5050610dc051610e00015160206001820306601f8201039050610dc051610e0001610da081516020818352015b83610da051101515610dd357610df0565b6000610da0516020850101535b8151600101808352811415610dc2575b505050506020610dc051610e00015160206001820306601f8201039050610dc0510101610dc052610dc051610e4052610360805160200180610dc051610e0001828460006004600a8704601201f1610e4757600080fd5b5050610dc051610e00015160206001820306601f8201039050610dc051610e0001610da081516020818352015b83610da051101515610e8557610ea2565b6000610da0516020850101535b8151600101808352811415610e74575b505050506020610dc051610e00015160206001820306601f8201039050610dc0510101610dc052610dc051610e6052610280805160200180610dc051610e0001828460006004600a8704601201f1610ef957600080fd5b5050610dc051610e00015160206001820306601f8201039050610dc051610e0001610da081516060818352015b83610da051101515610f3757610f54565b6000610da0516020850101535b8151600101808352811415610f26575b505050506020610dc051610e00015160206001820306601f8201039050610dc0510101610dc052610dc051610e8052610d40805160200180610dc051610e0001828460006004600a8704601201f1610fab57600080fd5b5050610dc051610e00015160206001820306601f8201039050610dc051610e0001610da081516020818352015b83610da051101515610fe957611006565b6000610da0516020850101535b8151600101808352811415610fd8575b505050506020610dc051610e00015160206001820306601f8201039050610dc0510101610dc0527fdc5fc95703516abd38fa03c3737ff3b52dc52347055c8028460fdf5bbe2f12ce610dc051610e00a1640773594000610320511015156113d357600380546001825401101561107b57600080fd5b60018154018155506201000060035414156113d25742610ec05242610ee052620151806110a757600080fd5b62015180610ee05106610ec05110156110bf57600080fd5b42610ee052620151806110d157600080fd5b62015180610ee05106610ec051036202a30042610ec05242610ee052620151806110fa57600080fd5b62015180610ee05106610ec051101561111257600080fd5b42610ee0526201518061112457600080fd5b62015180610ee05106610ec0510301101561113e57600080fd5b6202a30042610ec05242610ee0526201518061115957600080fd5b62015180610ee05106610ec051101561117157600080fd5b42610ee0526201518061118357600080fd5b62015180610ee05106610ec0510301610ea0526060610f8060246380673289610f0052600254610f2052610f1c6000305af16111be57600080fd5b610fa0805160200180610fe0828460006004600a8704601201f16111e157600080fd5b505060606110c06024638067328961104052610ea0516110605261105c6000305af161120c57600080fd5b6110e0805160200180611120828460006004600a8704601201f161122f57600080fd5b5050610bc0516111e05260606111a0526111a05161120052610fe08051602001806111a0516111e001828460006004600a8704601201f161126f57600080fd5b50506111a0516111e0015160206001820306601f82010390506111a0516111e00161118081516020818352015b83611180511015156112ad576112ca565b6000611180516020850101535b815160010180835281141561129c575b5050505060206111a0516111e0015160206001820306601f82010390506111a05101016111a0526111a051611220526111208051602001806111a0516111e001828460006004600a8704601201f161132157600080fd5b50506111a0516111e0015160206001820306601f82010390506111a0516111e00161118081516020818352015b836111805110151561135f5761137c565b6000611180516020850101535b815160010180835281141561134e575b5050505060206111a0516111e0015160206001820306601f82010390506111a05101016111a0527f08b71ef3f1b58f7a23ffb82e27f12f0888c8403f1ceb0ea7ea26b274e2189d4c6111a0516111e0a160016004555b5b005b63845980e860005114156113fb5734156113ee57600080fd5b60045460005260206000f3005b60006000fd5b61020761160803610207600039610207611608036000f3"} \ No newline at end of file +{"abi": [{"name": "Deposit", "inputs": [{"type": "bytes", "name": "pubkey", "indexed": false}, {"type": "bytes", "name": "withdrawal_credentials", "indexed": false}, {"type": "bytes", "name": "amount", "indexed": false}, {"type": "bytes", "name": "signature", "indexed": false}, {"type": "bytes", "name": "merkle_tree_index", "indexed": false}], "anonymous": false, "type": "event"}, {"name": "Eth2Genesis", "inputs": [{"type": "bytes32", "name": "deposit_root", "indexed": false}, {"type": "bytes", "name": "deposit_count", "indexed": false}, {"type": "bytes", "name": "time", "indexed": false}], "anonymous": false, "type": "event"}, {"outputs": [], "inputs": [], "constant": false, "payable": false, "type": "constructor"}, {"name": "to_little_endian_64", "outputs": [{"type": "bytes", "name": "out"}], "inputs": [{"type": "uint256", "name": "value"}], "constant": true, "payable": false, "type": "function", "gas": 7077}, {"name": "get_deposit_root", "outputs": [{"type": "bytes32", "name": "out"}], "inputs": [], "constant": true, "payable": false, "type": "function", "gas": 79221}, {"name": "get_deposit_count", "outputs": [{"type": "bytes", "name": "out"}], "inputs": [], "constant": true, "payable": false, "type": "function", "gas": 11026}, {"name": "deposit", "outputs": [], "inputs": [{"type": "bytes", "name": "pubkey"}, {"type": "bytes", "name": "withdrawal_credentials"}, {"type": "bytes", "name": "signature"}], "constant": false, "payable": true, "type": "function", "gas": 457042}, {"name": "chainStarted", "outputs": [{"type": "bool", "name": "out"}], "inputs": [], "constant": true, "payable": false, "type": "function", "gas": 603}], "bytecode": "0x600035601c52740100000000000000000000000000000000000000006020526f7fffffffffffffffffffffffffffffff6040527fffffffffffffffffffffffffffffffff8000000000000000000000000000000060605274012a05f1fffffffffffffffffffffffffdabf41c006080527ffffffffffffffffffffffffed5fa0e000000000000000000000000000000000060a052341561009e57600080fd5b6101406000601f818352015b600061014051602081106100bd57600080fd5b600060c052602060c020015460208261016001015260208101905061014051602081106100e957600080fd5b600060c052602060c020015460208261016001015260208101905080610160526101609050602060c0825160208401600060025af161012757600080fd5b60c0519050606051600161014051018060405190131561014657600080fd5b809190121561015457600080fd5b6020811061016157600080fd5b600060c052602060c02001555b81516001018083528114156100aa575b505061142e56600035601c52740100000000000000000000000000000000000000006020526f7fffffffffffffffffffffffffffffff6040527fffffffffffffffffffffffffffffffff8000000000000000000000000000000060605274012a05f1fffffffffffffffffffffffffdabf41c006080527ffffffffffffffffffffffffed5fa0e000000000000000000000000000000000060a0526380673289600051141561026b57602060046101403734156100b457600080fd5b67ffffffffffffffff6101405111156100cc57600080fd5b60006101605261014051610180526101a060006008818352015b6101605160086000811215610103578060000360020a820461010a565b8060020a82025b905090506101605260ff61018051166101c052610160516101c0516101605101101561013557600080fd5b6101c051610160510161016052610180517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8600081121561017e578060000360020a8204610185565b8060020a82025b90509050610180525b81516001018083528114156100e6575b505060186008602082066101e001602082840111156101bc57600080fd5b60208061020082610160600060046015f15050818152809050905090508051602001806102a0828460006004600a8704601201f16101f957600080fd5b50506102a05160206001820306601f82010390506103006102a0516008818352015b8261030051111561022b57610247565b6000610300516102c001535b815160010180835281141561021b575b50505060206102805260406102a0510160206001820306601f8201039050610280f3005b63c5f2892f60005114156103c357341561028457600080fd5b6000610140526002546101605261018060006020818352015b600160016101605116141561031e57600061018051602081106102bf57600080fd5b600160c052602060c02001546020826102200101526020810190506101405160208261022001015260208101905080610220526102209050602060c0825160208401600060025af161031057600080fd5b60c05190506101405261038c565b6000610140516020826101a0010152602081019050610180516020811061034457600080fd5b600060c052602060c02001546020826101a0010152602081019050806101a0526101a09050602060c0825160208401600060025af161038257600080fd5b60c0519050610140525b610160600261039a57600080fd5b60028151048152505b815160010180835281141561029d575b50506101405160005260206000f3005b63621fd13060005114156104995734156103dc57600080fd5b60606101c060246380673289610140526002546101605261015c6000305af161040457600080fd5b6101e0805160200180610260828460006004600a8704601201f161042757600080fd5b50506102605160206001820306601f82010390506102c0610260516008818352015b826102c051111561045957610475565b60006102c05161028001535b8151600101808352811415610449575b5050506020610240526040610260510160206001820306601f8201039050610240f3005b63c47e300d600051141561127d57606060046101403760506004356004016101a03760306004356004013511156104cf57600080fd5b60406024356004016102203760206024356004013511156104ef57600080fd5b608060443560040161028037606060443560040135111561050f57600080fd5b63ffffffff6002541061052157600080fd5b60306101a0511461053157600080fd5b6020610220511461054157600080fd5b6060610280511461055157600080fd5b633b9aca00610340526103405161056757600080fd5b61034051340461032052633b9aca0061032051101561058557600080fd5b6060610440602463806732896103c052610320516103e0526103dc6000305af16105ae57600080fd5b610460805160200180610360828460006004600a8704601201f16105d157600080fd5b50506002546104a05260006104c05260026104e05261050060006020818352015b60006104e05161060157600080fd5b6104e0516104a05160016104a05101101561061b57600080fd5b60016104a051010614151561062f5761069b565b6104c060605160018251018060405190131561064a57600080fd5b809190121561065857600080fd5b8152506104e08051151561066d576000610687565b600281516002835102041461068157600080fd5b60028151025b8152505b81516001018083528114156105f2575b505060006101a06030806020846105e001018260208501600060046016f1505080518201915050600060106020820661056001602082840111156106de57600080fd5b60208061058082610520600060046015f15050818152809050905090506010806020846105e001018260208501600060046013f1505080518201915050806105e0526105e09050602060c0825160208401600060025af161073e57600080fd5b60c051905061054052600060006040602082066106800161028051828401111561076757600080fd5b6060806106a0826020602088068803016102800160006004601bf1505081815280905090509050602060c0825160208401600060025af16107a757600080fd5b60c051905060208261088001015260208101905060006040602060208206610740016102805182840111156107db57600080fd5b606080610760826020602088068803016102800160006004601bf150508181528090509050905060208060208461080001018260208501600060046015f15050805182019150506105205160208261080001015260208101905080610800526108009050602060c0825160208401600060025af161085857600080fd5b60c051905060208261088001015260208101905080610880526108809050602060c0825160208401600060025af161088f57600080fd5b60c051905061066052600060006105405160208261092001015260208101905061022060208060208461092001018260208501600060046015f150508051820191505080610920526109209050602060c0825160208401600060025af16108f557600080fd5b60c0519050602082610aa00101526020810190506000610360600880602084610a2001018260208501600060046012f150508051820191505060006018602082066109a0016020828401111561094a57600080fd5b6020806109c082610520600060046015f1505081815280905090509050601880602084610a2001018260208501600060046014f150508051820191505061066051602082610a2001015260208101905080610a2052610a209050602060c0825160208401600060025af16109bd57600080fd5b60c0519050602082610aa001015260208101905080610aa052610aa09050602060c0825160208401600060025af16109f457600080fd5b60c051905061090052610b2060006020818352015b6104c051610b20511215610a89576000610b205160208110610a2a57600080fd5b600160c052602060c0200154602082610b4001015260208101905061090051602082610b4001015260208101905080610b4052610b409050602060c0825160208401600060025af1610a7b57600080fd5b60c051905061090052610a8e565b610a9f565b5b8151600101808352811415610a09575b5050610900516104c05160208110610ab657600080fd5b600160c052602060c02001556002805460018254011015610ad657600080fd5b60018154018155506060610c4060246380673289610bc0526104a051610be052610bdc6000305af1610b0757600080fd5b610c60805160200180610ca0828460006004600a8704601201f1610b2a57600080fd5b505060a0610d2052610d2051610d60526101a0805160200180610d2051610d6001828460006004600a8704601201f1610b6257600080fd5b5050610d2051610d60015160206001820306601f8201039050610d2051610d6001610d0081516040818352015b83610d0051101515610ba057610bbd565b6000610d00516020850101535b8151600101808352811415610b8f575b505050506020610d2051610d60015160206001820306601f8201039050610d20510101610d2052610d2051610d8052610220805160200180610d2051610d6001828460006004600a8704601201f1610c1457600080fd5b5050610d2051610d60015160206001820306601f8201039050610d2051610d6001610d0081516020818352015b83610d0051101515610c5257610c6f565b6000610d00516020850101535b8151600101808352811415610c41575b505050506020610d2051610d60015160206001820306601f8201039050610d20510101610d2052610d2051610da052610360805160200180610d2051610d6001828460006004600a8704601201f1610cc657600080fd5b5050610d2051610d60015160206001820306601f8201039050610d2051610d6001610d0081516020818352015b83610d0051101515610d0457610d21565b6000610d00516020850101535b8151600101808352811415610cf3575b505050506020610d2051610d60015160206001820306601f8201039050610d20510101610d2052610d2051610dc052610280805160200180610d2051610d6001828460006004600a8704601201f1610d7857600080fd5b5050610d2051610d60015160206001820306601f8201039050610d2051610d6001610d0081516060818352015b83610d0051101515610db657610dd3565b6000610d00516020850101535b8151600101808352811415610da5575b505050506020610d2051610d60015160206001820306601f8201039050610d20510101610d2052610d2051610de052610ca0805160200180610d2051610d6001828460006004600a8704601201f1610e2a57600080fd5b5050610d2051610d60015160206001820306601f8201039050610d2051610d6001610d0081516020818352015b83610d0051101515610e6857610e85565b6000610d00516020850101535b8151600101808352811415610e57575b505050506020610d2051610d60015160206001820306601f8201039050610d20510101610d20527fdc5fc95703516abd38fa03c3737ff3b52dc52347055c8028460fdf5bbe2f12ce610d2051610d60a16407735940006103205110151561127b576003805460018254011015610efa57600080fd5b600181540181555062010000600354141561127a5742610e205242610e405262015180610f2657600080fd5b62015180610e405106610e20511015610f3e57600080fd5b42610e405262015180610f5057600080fd5b62015180610e405106610e2051036202a30042610e205242610e405262015180610f7957600080fd5b62015180610e405106610e20511015610f9157600080fd5b42610e405262015180610fa357600080fd5b62015180610e405106610e205103011015610fbd57600080fd5b6202a30042610e205242610e405262015180610fd857600080fd5b62015180610e405106610e20511015610ff057600080fd5b42610e40526201518061100257600080fd5b62015180610e405106610e20510301610e00526020610ee0600463c5f2892f610e8052610e9c6000305af161103657600080fd5b610ee051610e60526060610f8060246380673289610f0052600254610f2052610f1c6000305af161106657600080fd5b610fa0805160200180610fe0828460006004600a8704601201f161108957600080fd5b505060606110c06024638067328961104052610e00516110605261105c6000305af16110b457600080fd5b6110e0805160200180611120828460006004600a8704601201f16110d757600080fd5b5050610e60516111e05260606111a0526111a05161120052610fe08051602001806111a0516111e001828460006004600a8704601201f161111757600080fd5b50506111a0516111e0015160206001820306601f82010390506111a0516111e00161118081516020818352015b836111805110151561115557611172565b6000611180516020850101535b8151600101808352811415611144575b5050505060206111a0516111e0015160206001820306601f82010390506111a05101016111a0526111a051611220526111208051602001806111a0516111e001828460006004600a8704601201f16111c957600080fd5b50506111a0516111e0015160206001820306601f82010390506111a0516111e00161118081516020818352015b836111805110151561120757611224565b6000611180516020850101535b81516001018083528114156111f6575b5050505060206111a0516111e0015160206001820306601f82010390506111a05101016111a0527f08b71ef3f1b58f7a23ffb82e27f12f0888c8403f1ceb0ea7ea26b274e2189d4c6111a0516111e0a160016004555b5b005b63845980e860005114156112a357341561129657600080fd5b60045460005260206000f3005b60006000fd5b61018561142e0361018560003961018561142e036000f3"} \ No newline at end of file diff --git a/deposit_contract/contracts/validator_registration.v.py b/deposit_contract/contracts/validator_registration.v.py index 751d3a2e83..82704f59ef 100644 --- a/deposit_contract/contracts/validator_registration.v.py +++ b/deposit_contract/contracts/validator_registration.v.py @@ -4,6 +4,10 @@ DEPOSIT_CONTRACT_TREE_DEPTH: constant(uint256) = 32 SECONDS_PER_DAY: constant(uint256) = 86400 MAX_64_BIT_VALUE: constant(uint256) = 18446744073709551615 # 2**64 - 1 +PUBKEY_LENGTH: constant(uint256) = 48 # bytes +WITHDRAWAL_CREDENTIALS_LENGTH: constant(uint256) = 32 # bytes +SIGNATURE_LENGTH: constant(uint256) = 96 # bytes +MAX_DEPOSIT_COUNT: constant(uint256) = 4294967295 # 2**DEPOSIT_CONTRACT_TREE_DEPTH - 1 Deposit: event({ pubkey: bytes[48], @@ -25,7 +29,6 @@ def __init__(): for i in range(DEPOSIT_CONTRACT_TREE_DEPTH - 1): self.zerohashes[i+1] = sha256(concat(self.zerohashes[i], self.zerohashes[i])) - self.branch[i+1] = self.zerohashes[i + 1] @public @@ -45,18 +48,6 @@ def to_little_endian_64(value: uint256) -> bytes[8]: return slice(convert(y, bytes32), start=24, len=8) -@public -@constant -def from_little_endian_64(value: bytes[8]) -> uint256: - y: uint256 = 0 - x: uint256 = convert(value, uint256) - for i in range(8): - y = y + shift(bitwise_and(x, 255), 8 * (7-i)) - x = shift(x, -8) - - return y - - @public @constant def get_deposit_root() -> bytes32: @@ -77,7 +68,18 @@ def get_deposit_count() -> bytes[8]: @payable @public -def deposit(pubkey: bytes[48], withdrawal_credentials: bytes[32], signature: bytes[96]): +def deposit(pubkey: bytes[PUBKEY_LENGTH], + withdrawal_credentials: bytes[WITHDRAWAL_CREDENTIALS_LENGTH], + signature: bytes[SIGNATURE_LENGTH]): + # Prevent edge case in computing `self.branch` when `self.deposit_count == MAX_DEPOSIT_COUNT` + # NOTE: reaching this point with the constants as currently defined is impossible due to the + # uni-directional nature of transfers from eth1 to eth2 and the total ether supply (< 130M). + assert self.deposit_count < MAX_DEPOSIT_COUNT + + assert len(pubkey) == PUBKEY_LENGTH + assert len(withdrawal_credentials) == WITHDRAWAL_CREDENTIALS_LENGTH + assert len(signature) == SIGNATURE_LENGTH + deposit_amount: uint256 = msg.value / as_wei_value(1, "gwei") assert deposit_amount >= MIN_DEPOSIT_AMOUNT amount: bytes[8] = self.to_little_endian_64(deposit_amount) @@ -115,7 +117,6 @@ def deposit(pubkey: bytes[48], withdrawal_credentials: bytes[32], signature: byt self.branch[i] = value self.deposit_count += 1 - new_deposit_root: bytes32 = self.get_deposit_root() log.Deposit( pubkey, withdrawal_credentials, @@ -132,6 +133,7 @@ def deposit(pubkey: bytes[48], withdrawal_credentials: bytes[32], signature: byt as_unitless_number(block.timestamp) % SECONDS_PER_DAY + 2 * SECONDS_PER_DAY ) + new_deposit_root: bytes32 = self.get_deposit_root() log.Eth2Genesis(new_deposit_root, self.to_little_endian_64(self.deposit_count), self.to_little_endian_64(timestamp_day_boundary)) diff --git a/deposit_contract/tests/contracts/test_deposit.py b/deposit_contract/tests/contracts/test_deposit.py index 92371421e2..7c5b85907a 100644 --- a/deposit_contract/tests/contracts/test_deposit.py +++ b/deposit_contract/tests/contracts/test_deposit.py @@ -77,13 +77,6 @@ def test_to_little_endian_64(registration_contract, value, success, assert_tx_fa ) -def test_from_little_endian_64(registration_contract, assert_tx_failed): - values = [0, 2**64 - 1] + [randint(1, 2**64 - 2) for _ in range(10)] - for value in values: - call = registration_contract.functions.from_little_endian_64((value).to_bytes(8, 'little')) - assert call.call() == value - - @pytest.mark.parametrize( 'success,deposit_amount', [ @@ -108,6 +101,43 @@ def test_deposit_amount(registration_contract, ) +@pytest.mark.parametrize( + 'invalid_pubkey,invalid_withdrawal_credentials,invalid_signature,success', + [ + (False, False, False, True), + (True, False, False, False), + (False, True, False, False), + (False, False, True, False), + ] +) +def test_deposit_inputs(registration_contract, + w3, + assert_tx_failed, + deposit_input, + invalid_pubkey, + invalid_withdrawal_credentials, + invalid_signature, + success): + pubkey = deposit_input[0][2:] if invalid_pubkey else deposit_input[0] + if invalid_withdrawal_credentials: # this one is different to satisfy linter + withdrawal_credentials = deposit_input[1][2:] + else: + withdrawal_credentials = deposit_input[1] + signature = deposit_input[2][2:] if invalid_signature else deposit_input[2] + + call = registration_contract.functions.deposit( + pubkey, + withdrawal_credentials, + signature, + ) + if success: + assert call.transact({"value": FULL_DEPOSIT_AMOUNT * eth_utils.denoms.gwei}) + else: + assert_tx_failed( + lambda: call.transact({"value": FULL_DEPOSIT_AMOUNT * eth_utils.denoms.gwei}) + ) + + def test_deposit_log(registration_contract, a0, w3, deposit_input): log_filter = registration_contract.events.Deposit.createFilter( fromBlock='latest', @@ -151,7 +181,7 @@ def test_deposit_tree(registration_contract, w3, assert_tx_failed, deposit_input assert log["merkle_tree_index"] == i.to_bytes(8, 'little') deposit_data = DepositData( - pubkey=deposit_input[0][:20], + pubkey=deposit_input[0], withdrawal_credentials=deposit_input[1], amount=deposit_amount_list[i], signature=deposit_input[2], From 11196ea87d2d67a532d13c83f7cbaf963be09926 Mon Sep 17 00:00:00 2001 From: Hsiao-Wei Wang Date: Mon, 27 May 2019 18:33:35 +0800 Subject: [PATCH 08/21] sequentially execute the jobs --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 23d68113b0..100be47047 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -128,4 +128,4 @@ workflows: - test - deposit_contract: requires: - - test + - lint From 3e6f7a2e961183b0f1d65e4bf1a7f694f24574e9 Mon Sep 17 00:00:00 2001 From: Hsiao-Wei Wang Date: Mon, 27 May 2019 18:42:09 +0800 Subject: [PATCH 09/21] kick --- .circleci/config.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 100be47047..164dc98a03 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -35,13 +35,13 @@ commands: description: "Restore the cache with default keys" steps: - restore_cached_venv: - venv_name: v1-pyspec-01 + venv_name: v1-pyspec-05 reqs_checksum: '{{ checksum "test_libs/pyspec/requirements.txt" }}-{{ checksum "test_libs/pyspec/requirements-testing.txt" }}--{{ checksum "deposit_contract/requirements-testing.txt" }}' save_default_cached_venv: description: Save a venv into a cache with default keys" steps: - save_cached_venv: - venv_name: v1-pyspec-01 + venv_name: v1-pyspec-05 reqs_checksum: '{{ checksum "test_libs/pyspec/requirements.txt" }}-{{ checksum "test_libs/pyspec/requirements-testing.txt" }}--{{ checksum "deposit_contract/requirements-testing.txt" }}' venv_path: ./test_libs/pyspec/venv jobs: @@ -128,4 +128,5 @@ workflows: - test - deposit_contract: requires: + - install_env - lint From 0ec03db0fb9480e19d6b40098cf3b141fdc4ac15 Mon Sep 17 00:00:00 2001 From: Hsiao-Wei Wang Date: Mon, 27 May 2019 18:48:40 +0800 Subject: [PATCH 10/21] test --- Makefile | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index e40c7e95c9..ee648f8552 100644 --- a/Makefile +++ b/Makefile @@ -54,7 +54,9 @@ install_deposit_contract_test: test_deposit_contract: $(PY_SPEC_ALL_TARGETS) cd $(PY_SPEC_DIR); python3 -m venv venv; . venv/bin/activate; \ - cd ../.. && cd $(DEPOSIT_CONTRACT_DIR) && python -m pytest . + cd ../.. && cd $(DEPOSIT_CONTRACT_DIR); \ + pip3 install -r requirements-testing.txt; \ + python -m pytest . # "make pyspec" to create the pyspec for all phases. pyspec: $(PY_SPEC_ALL_TARGETS) From b280e0a8d45acf9e14bbfc286b7e97f9959c11f4 Mon Sep 17 00:00:00 2001 From: Hsiao-Wei Wang Date: Thu, 30 May 2019 10:08:19 +0800 Subject: [PATCH 11/21] Sync with ethereum/deposit_contract#43 --- deposit_contract/contracts/validator_registration.json | 2 +- deposit_contract/contracts/validator_registration.v.py | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/deposit_contract/contracts/validator_registration.json b/deposit_contract/contracts/validator_registration.json index afc86ec1dc..08d57f80a5 100644 --- a/deposit_contract/contracts/validator_registration.json +++ b/deposit_contract/contracts/validator_registration.json @@ -1 +1 @@ -{"abi": [{"name": "Deposit", "inputs": [{"type": "bytes", "name": "pubkey", "indexed": false}, {"type": "bytes", "name": "withdrawal_credentials", "indexed": false}, {"type": "bytes", "name": "amount", "indexed": false}, {"type": "bytes", "name": "signature", "indexed": false}, {"type": "bytes", "name": "merkle_tree_index", "indexed": false}], "anonymous": false, "type": "event"}, {"name": "Eth2Genesis", "inputs": [{"type": "bytes32", "name": "deposit_root", "indexed": false}, {"type": "bytes", "name": "deposit_count", "indexed": false}, {"type": "bytes", "name": "time", "indexed": false}], "anonymous": false, "type": "event"}, {"outputs": [], "inputs": [], "constant": false, "payable": false, "type": "constructor"}, {"name": "to_little_endian_64", "outputs": [{"type": "bytes", "name": "out"}], "inputs": [{"type": "uint256", "name": "value"}], "constant": true, "payable": false, "type": "function", "gas": 7077}, {"name": "get_deposit_root", "outputs": [{"type": "bytes32", "name": "out"}], "inputs": [], "constant": true, "payable": false, "type": "function", "gas": 79221}, {"name": "get_deposit_count", "outputs": [{"type": "bytes", "name": "out"}], "inputs": [], "constant": true, "payable": false, "type": "function", "gas": 11026}, {"name": "deposit", "outputs": [], "inputs": [{"type": "bytes", "name": "pubkey"}, {"type": "bytes", "name": "withdrawal_credentials"}, {"type": "bytes", "name": "signature"}], "constant": false, "payable": true, "type": "function", "gas": 457042}, {"name": "chainStarted", "outputs": [{"type": "bool", "name": "out"}], "inputs": [], "constant": true, "payable": false, "type": "function", "gas": 603}], "bytecode": "0x600035601c52740100000000000000000000000000000000000000006020526f7fffffffffffffffffffffffffffffff6040527fffffffffffffffffffffffffffffffff8000000000000000000000000000000060605274012a05f1fffffffffffffffffffffffffdabf41c006080527ffffffffffffffffffffffffed5fa0e000000000000000000000000000000000060a052341561009e57600080fd5b6101406000601f818352015b600061014051602081106100bd57600080fd5b600060c052602060c020015460208261016001015260208101905061014051602081106100e957600080fd5b600060c052602060c020015460208261016001015260208101905080610160526101609050602060c0825160208401600060025af161012757600080fd5b60c0519050606051600161014051018060405190131561014657600080fd5b809190121561015457600080fd5b6020811061016157600080fd5b600060c052602060c02001555b81516001018083528114156100aa575b505061142e56600035601c52740100000000000000000000000000000000000000006020526f7fffffffffffffffffffffffffffffff6040527fffffffffffffffffffffffffffffffff8000000000000000000000000000000060605274012a05f1fffffffffffffffffffffffffdabf41c006080527ffffffffffffffffffffffffed5fa0e000000000000000000000000000000000060a0526380673289600051141561026b57602060046101403734156100b457600080fd5b67ffffffffffffffff6101405111156100cc57600080fd5b60006101605261014051610180526101a060006008818352015b6101605160086000811215610103578060000360020a820461010a565b8060020a82025b905090506101605260ff61018051166101c052610160516101c0516101605101101561013557600080fd5b6101c051610160510161016052610180517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8600081121561017e578060000360020a8204610185565b8060020a82025b90509050610180525b81516001018083528114156100e6575b505060186008602082066101e001602082840111156101bc57600080fd5b60208061020082610160600060046015f15050818152809050905090508051602001806102a0828460006004600a8704601201f16101f957600080fd5b50506102a05160206001820306601f82010390506103006102a0516008818352015b8261030051111561022b57610247565b6000610300516102c001535b815160010180835281141561021b575b50505060206102805260406102a0510160206001820306601f8201039050610280f3005b63c5f2892f60005114156103c357341561028457600080fd5b6000610140526002546101605261018060006020818352015b600160016101605116141561031e57600061018051602081106102bf57600080fd5b600160c052602060c02001546020826102200101526020810190506101405160208261022001015260208101905080610220526102209050602060c0825160208401600060025af161031057600080fd5b60c05190506101405261038c565b6000610140516020826101a0010152602081019050610180516020811061034457600080fd5b600060c052602060c02001546020826101a0010152602081019050806101a0526101a09050602060c0825160208401600060025af161038257600080fd5b60c0519050610140525b610160600261039a57600080fd5b60028151048152505b815160010180835281141561029d575b50506101405160005260206000f3005b63621fd13060005114156104995734156103dc57600080fd5b60606101c060246380673289610140526002546101605261015c6000305af161040457600080fd5b6101e0805160200180610260828460006004600a8704601201f161042757600080fd5b50506102605160206001820306601f82010390506102c0610260516008818352015b826102c051111561045957610475565b60006102c05161028001535b8151600101808352811415610449575b5050506020610240526040610260510160206001820306601f8201039050610240f3005b63c47e300d600051141561127d57606060046101403760506004356004016101a03760306004356004013511156104cf57600080fd5b60406024356004016102203760206024356004013511156104ef57600080fd5b608060443560040161028037606060443560040135111561050f57600080fd5b63ffffffff6002541061052157600080fd5b60306101a0511461053157600080fd5b6020610220511461054157600080fd5b6060610280511461055157600080fd5b633b9aca00610340526103405161056757600080fd5b61034051340461032052633b9aca0061032051101561058557600080fd5b6060610440602463806732896103c052610320516103e0526103dc6000305af16105ae57600080fd5b610460805160200180610360828460006004600a8704601201f16105d157600080fd5b50506002546104a05260006104c05260026104e05261050060006020818352015b60006104e05161060157600080fd5b6104e0516104a05160016104a05101101561061b57600080fd5b60016104a051010614151561062f5761069b565b6104c060605160018251018060405190131561064a57600080fd5b809190121561065857600080fd5b8152506104e08051151561066d576000610687565b600281516002835102041461068157600080fd5b60028151025b8152505b81516001018083528114156105f2575b505060006101a06030806020846105e001018260208501600060046016f1505080518201915050600060106020820661056001602082840111156106de57600080fd5b60208061058082610520600060046015f15050818152809050905090506010806020846105e001018260208501600060046013f1505080518201915050806105e0526105e09050602060c0825160208401600060025af161073e57600080fd5b60c051905061054052600060006040602082066106800161028051828401111561076757600080fd5b6060806106a0826020602088068803016102800160006004601bf1505081815280905090509050602060c0825160208401600060025af16107a757600080fd5b60c051905060208261088001015260208101905060006040602060208206610740016102805182840111156107db57600080fd5b606080610760826020602088068803016102800160006004601bf150508181528090509050905060208060208461080001018260208501600060046015f15050805182019150506105205160208261080001015260208101905080610800526108009050602060c0825160208401600060025af161085857600080fd5b60c051905060208261088001015260208101905080610880526108809050602060c0825160208401600060025af161088f57600080fd5b60c051905061066052600060006105405160208261092001015260208101905061022060208060208461092001018260208501600060046015f150508051820191505080610920526109209050602060c0825160208401600060025af16108f557600080fd5b60c0519050602082610aa00101526020810190506000610360600880602084610a2001018260208501600060046012f150508051820191505060006018602082066109a0016020828401111561094a57600080fd5b6020806109c082610520600060046015f1505081815280905090509050601880602084610a2001018260208501600060046014f150508051820191505061066051602082610a2001015260208101905080610a2052610a209050602060c0825160208401600060025af16109bd57600080fd5b60c0519050602082610aa001015260208101905080610aa052610aa09050602060c0825160208401600060025af16109f457600080fd5b60c051905061090052610b2060006020818352015b6104c051610b20511215610a89576000610b205160208110610a2a57600080fd5b600160c052602060c0200154602082610b4001015260208101905061090051602082610b4001015260208101905080610b4052610b409050602060c0825160208401600060025af1610a7b57600080fd5b60c051905061090052610a8e565b610a9f565b5b8151600101808352811415610a09575b5050610900516104c05160208110610ab657600080fd5b600160c052602060c02001556002805460018254011015610ad657600080fd5b60018154018155506060610c4060246380673289610bc0526104a051610be052610bdc6000305af1610b0757600080fd5b610c60805160200180610ca0828460006004600a8704601201f1610b2a57600080fd5b505060a0610d2052610d2051610d60526101a0805160200180610d2051610d6001828460006004600a8704601201f1610b6257600080fd5b5050610d2051610d60015160206001820306601f8201039050610d2051610d6001610d0081516040818352015b83610d0051101515610ba057610bbd565b6000610d00516020850101535b8151600101808352811415610b8f575b505050506020610d2051610d60015160206001820306601f8201039050610d20510101610d2052610d2051610d8052610220805160200180610d2051610d6001828460006004600a8704601201f1610c1457600080fd5b5050610d2051610d60015160206001820306601f8201039050610d2051610d6001610d0081516020818352015b83610d0051101515610c5257610c6f565b6000610d00516020850101535b8151600101808352811415610c41575b505050506020610d2051610d60015160206001820306601f8201039050610d20510101610d2052610d2051610da052610360805160200180610d2051610d6001828460006004600a8704601201f1610cc657600080fd5b5050610d2051610d60015160206001820306601f8201039050610d2051610d6001610d0081516020818352015b83610d0051101515610d0457610d21565b6000610d00516020850101535b8151600101808352811415610cf3575b505050506020610d2051610d60015160206001820306601f8201039050610d20510101610d2052610d2051610dc052610280805160200180610d2051610d6001828460006004600a8704601201f1610d7857600080fd5b5050610d2051610d60015160206001820306601f8201039050610d2051610d6001610d0081516060818352015b83610d0051101515610db657610dd3565b6000610d00516020850101535b8151600101808352811415610da5575b505050506020610d2051610d60015160206001820306601f8201039050610d20510101610d2052610d2051610de052610ca0805160200180610d2051610d6001828460006004600a8704601201f1610e2a57600080fd5b5050610d2051610d60015160206001820306601f8201039050610d2051610d6001610d0081516020818352015b83610d0051101515610e6857610e85565b6000610d00516020850101535b8151600101808352811415610e57575b505050506020610d2051610d60015160206001820306601f8201039050610d20510101610d20527fdc5fc95703516abd38fa03c3737ff3b52dc52347055c8028460fdf5bbe2f12ce610d2051610d60a16407735940006103205110151561127b576003805460018254011015610efa57600080fd5b600181540181555062010000600354141561127a5742610e205242610e405262015180610f2657600080fd5b62015180610e405106610e20511015610f3e57600080fd5b42610e405262015180610f5057600080fd5b62015180610e405106610e2051036202a30042610e205242610e405262015180610f7957600080fd5b62015180610e405106610e20511015610f9157600080fd5b42610e405262015180610fa357600080fd5b62015180610e405106610e205103011015610fbd57600080fd5b6202a30042610e205242610e405262015180610fd857600080fd5b62015180610e405106610e20511015610ff057600080fd5b42610e40526201518061100257600080fd5b62015180610e405106610e20510301610e00526020610ee0600463c5f2892f610e8052610e9c6000305af161103657600080fd5b610ee051610e60526060610f8060246380673289610f0052600254610f2052610f1c6000305af161106657600080fd5b610fa0805160200180610fe0828460006004600a8704601201f161108957600080fd5b505060606110c06024638067328961104052610e00516110605261105c6000305af16110b457600080fd5b6110e0805160200180611120828460006004600a8704601201f16110d757600080fd5b5050610e60516111e05260606111a0526111a05161120052610fe08051602001806111a0516111e001828460006004600a8704601201f161111757600080fd5b50506111a0516111e0015160206001820306601f82010390506111a0516111e00161118081516020818352015b836111805110151561115557611172565b6000611180516020850101535b8151600101808352811415611144575b5050505060206111a0516111e0015160206001820306601f82010390506111a05101016111a0526111a051611220526111208051602001806111a0516111e001828460006004600a8704601201f16111c957600080fd5b50506111a0516111e0015160206001820306601f82010390506111a0516111e00161118081516020818352015b836111805110151561120757611224565b6000611180516020850101535b81516001018083528114156111f6575b5050505060206111a0516111e0015160206001820306601f82010390506111a05101016111a0527f08b71ef3f1b58f7a23ffb82e27f12f0888c8403f1ceb0ea7ea26b274e2189d4c6111a0516111e0a160016004555b5b005b63845980e860005114156112a357341561129657600080fd5b60045460005260206000f3005b60006000fd5b61018561142e0361018560003961018561142e036000f3"} \ No newline at end of file +{"abi": [{"name": "Deposit", "inputs": [{"type": "bytes", "name": "pubkey", "indexed": false}, {"type": "bytes", "name": "withdrawal_credentials", "indexed": false}, {"type": "bytes", "name": "amount", "indexed": false}, {"type": "bytes", "name": "signature", "indexed": false}, {"type": "bytes", "name": "merkle_tree_index", "indexed": false}], "anonymous": false, "type": "event"}, {"name": "Eth2Genesis", "inputs": [{"type": "bytes32", "name": "deposit_root", "indexed": false}, {"type": "bytes", "name": "deposit_count", "indexed": false}, {"type": "bytes", "name": "time", "indexed": false}], "anonymous": false, "type": "event"}, {"outputs": [], "inputs": [], "constant": false, "payable": false, "type": "constructor"}, {"name": "to_little_endian_64", "outputs": [{"type": "bytes", "name": "out"}], "inputs": [{"type": "uint256", "name": "value"}], "constant": true, "payable": false, "type": "function", "gas": 7077}, {"name": "get_deposit_root", "outputs": [{"type": "bytes32", "name": "out"}], "inputs": [], "constant": true, "payable": false, "type": "function", "gas": 79221}, {"name": "get_deposit_count", "outputs": [{"type": "bytes", "name": "out"}], "inputs": [], "constant": true, "payable": false, "type": "function", "gas": 11026}, {"name": "deposit", "outputs": [], "inputs": [{"type": "bytes", "name": "pubkey"}, {"type": "bytes", "name": "withdrawal_credentials"}, {"type": "bytes", "name": "signature"}], "constant": false, "payable": true, "type": "function", "gas": 445994}, {"name": "chainStarted", "outputs": [{"type": "bool", "name": "out"}], "inputs": [], "constant": true, "payable": false, "type": "function", "gas": 603}], "bytecode": "0x600035601c52740100000000000000000000000000000000000000006020526f7fffffffffffffffffffffffffffffff6040527fffffffffffffffffffffffffffffffff8000000000000000000000000000000060605274012a05f1fffffffffffffffffffffffffdabf41c006080527ffffffffffffffffffffffffed5fa0e000000000000000000000000000000000060a052341561009e57600080fd5b6101406000601f818352015b600061014051602081106100bd57600080fd5b600060c052602060c020015460208261016001015260208101905061014051602081106100e957600080fd5b600060c052602060c020015460208261016001015260208101905080610160526101609050602060c0825160208401600060025af161012757600080fd5b60c0519050606051600161014051018060405190131561014657600080fd5b809190121561015457600080fd5b6020811061016157600080fd5b600060c052602060c02001555b81516001018083528114156100aa575b505061140756600035601c52740100000000000000000000000000000000000000006020526f7fffffffffffffffffffffffffffffff6040527fffffffffffffffffffffffffffffffff8000000000000000000000000000000060605274012a05f1fffffffffffffffffffffffffdabf41c006080527ffffffffffffffffffffffffed5fa0e000000000000000000000000000000000060a0526380673289600051141561026b57602060046101403734156100b457600080fd5b67ffffffffffffffff6101405111156100cc57600080fd5b60006101605261014051610180526101a060006008818352015b6101605160086000811215610103578060000360020a820461010a565b8060020a82025b905090506101605260ff61018051166101c052610160516101c0516101605101101561013557600080fd5b6101c051610160510161016052610180517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8600081121561017e578060000360020a8204610185565b8060020a82025b90509050610180525b81516001018083528114156100e6575b505060186008602082066101e001602082840111156101bc57600080fd5b60208061020082610160600060046015f15050818152809050905090508051602001806102a0828460006004600a8704601201f16101f957600080fd5b50506102a05160206001820306601f82010390506103006102a0516008818352015b8261030051111561022b57610247565b6000610300516102c001535b815160010180835281141561021b575b50505060206102805260406102a0510160206001820306601f8201039050610280f3005b63c5f2892f60005114156103c357341561028457600080fd5b6000610140526002546101605261018060006020818352015b600160016101605116141561031e57600061018051602081106102bf57600080fd5b600160c052602060c02001546020826102200101526020810190506101405160208261022001015260208101905080610220526102209050602060c0825160208401600060025af161031057600080fd5b60c05190506101405261038c565b6000610140516020826101a0010152602081019050610180516020811061034457600080fd5b600060c052602060c02001546020826101a0010152602081019050806101a0526101a09050602060c0825160208401600060025af161038257600080fd5b60c0519050610140525b610160600261039a57600080fd5b60028151048152505b815160010180835281141561029d575b50506101405160005260206000f3005b63621fd13060005114156104995734156103dc57600080fd5b60606101c060246380673289610140526002546101605261015c6000305af161040457600080fd5b6101e0805160200180610260828460006004600a8704601201f161042757600080fd5b50506102605160206001820306601f82010390506102c0610260516008818352015b826102c051111561045957610475565b60006102c05161028001535b8151600101808352811415610449575b5050506020610240526040610260510160206001820306601f8201039050610240f3005b63c47e300d600051141561125657606060046101403760506004356004016101a03760306004356004013511156104cf57600080fd5b60406024356004016102203760206024356004013511156104ef57600080fd5b608060443560040161028037606060443560040135111561050f57600080fd5b63ffffffff6002541061052157600080fd5b60306101a0511461053157600080fd5b6020610220511461054157600080fd5b6060610280511461055157600080fd5b633b9aca00610340526103405161056757600080fd5b61034051340461032052633b9aca0061032051101561058557600080fd5b6060610440602463806732896103c052610320516103e0526103dc6000305af16105ae57600080fd5b610460805160200180610360828460006004600a8704601201f16105d157600080fd5b50506002546104a05260006104c0526104a05160016104a0510110156105f657600080fd5b60016104a051016104e05261050060006020818352015b600160016104e05116141561062157610674565b6104c060605160018251018060405190131561063c57600080fd5b809190121561064a57600080fd5b8152506104e0600261065b57600080fd5b60028151048152505b815160010180835281141561060d575b505060006101a06030806020846105e001018260208501600060046016f1505080518201915050600060106020820661056001602082840111156106b757600080fd5b60208061058082610520600060046015f15050818152809050905090506010806020846105e001018260208501600060046013f1505080518201915050806105e0526105e09050602060c0825160208401600060025af161071757600080fd5b60c051905061054052600060006040602082066106800161028051828401111561074057600080fd5b6060806106a0826020602088068803016102800160006004601bf1505081815280905090509050602060c0825160208401600060025af161078057600080fd5b60c051905060208261088001015260208101905060006040602060208206610740016102805182840111156107b457600080fd5b606080610760826020602088068803016102800160006004601bf150508181528090509050905060208060208461080001018260208501600060046015f15050805182019150506105205160208261080001015260208101905080610800526108009050602060c0825160208401600060025af161083157600080fd5b60c051905060208261088001015260208101905080610880526108809050602060c0825160208401600060025af161086857600080fd5b60c051905061066052600060006105405160208261092001015260208101905061022060208060208461092001018260208501600060046015f150508051820191505080610920526109209050602060c0825160208401600060025af16108ce57600080fd5b60c0519050602082610aa00101526020810190506000610360600880602084610a2001018260208501600060046012f150508051820191505060006018602082066109a0016020828401111561092357600080fd5b6020806109c082610520600060046015f1505081815280905090509050601880602084610a2001018260208501600060046014f150508051820191505061066051602082610a2001015260208101905080610a2052610a209050602060c0825160208401600060025af161099657600080fd5b60c0519050602082610aa001015260208101905080610aa052610aa09050602060c0825160208401600060025af16109cd57600080fd5b60c051905061090052610b2060006020818352015b6104c051610b20511215610a62576000610b205160208110610a0357600080fd5b600160c052602060c0200154602082610b4001015260208101905061090051602082610b4001015260208101905080610b4052610b409050602060c0825160208401600060025af1610a5457600080fd5b60c051905061090052610a67565b610a78565b5b81516001018083528114156109e2575b5050610900516104c05160208110610a8f57600080fd5b600160c052602060c02001556002805460018254011015610aaf57600080fd5b60018154018155506060610c4060246380673289610bc0526104a051610be052610bdc6000305af1610ae057600080fd5b610c60805160200180610ca0828460006004600a8704601201f1610b0357600080fd5b505060a0610d2052610d2051610d60526101a0805160200180610d2051610d6001828460006004600a8704601201f1610b3b57600080fd5b5050610d2051610d60015160206001820306601f8201039050610d2051610d6001610d0081516040818352015b83610d0051101515610b7957610b96565b6000610d00516020850101535b8151600101808352811415610b68575b505050506020610d2051610d60015160206001820306601f8201039050610d20510101610d2052610d2051610d8052610220805160200180610d2051610d6001828460006004600a8704601201f1610bed57600080fd5b5050610d2051610d60015160206001820306601f8201039050610d2051610d6001610d0081516020818352015b83610d0051101515610c2b57610c48565b6000610d00516020850101535b8151600101808352811415610c1a575b505050506020610d2051610d60015160206001820306601f8201039050610d20510101610d2052610d2051610da052610360805160200180610d2051610d6001828460006004600a8704601201f1610c9f57600080fd5b5050610d2051610d60015160206001820306601f8201039050610d2051610d6001610d0081516020818352015b83610d0051101515610cdd57610cfa565b6000610d00516020850101535b8151600101808352811415610ccc575b505050506020610d2051610d60015160206001820306601f8201039050610d20510101610d2052610d2051610dc052610280805160200180610d2051610d6001828460006004600a8704601201f1610d5157600080fd5b5050610d2051610d60015160206001820306601f8201039050610d2051610d6001610d0081516060818352015b83610d0051101515610d8f57610dac565b6000610d00516020850101535b8151600101808352811415610d7e575b505050506020610d2051610d60015160206001820306601f8201039050610d20510101610d2052610d2051610de052610ca0805160200180610d2051610d6001828460006004600a8704601201f1610e0357600080fd5b5050610d2051610d60015160206001820306601f8201039050610d2051610d6001610d0081516020818352015b83610d0051101515610e4157610e5e565b6000610d00516020850101535b8151600101808352811415610e30575b505050506020610d2051610d60015160206001820306601f8201039050610d20510101610d20527fdc5fc95703516abd38fa03c3737ff3b52dc52347055c8028460fdf5bbe2f12ce610d2051610d60a164077359400061032051101515611254576003805460018254011015610ed357600080fd5b60018154018155506201000060035414156112535742610e205242610e405262015180610eff57600080fd5b62015180610e405106610e20511015610f1757600080fd5b42610e405262015180610f2957600080fd5b62015180610e405106610e2051036202a30042610e205242610e405262015180610f5257600080fd5b62015180610e405106610e20511015610f6a57600080fd5b42610e405262015180610f7c57600080fd5b62015180610e405106610e205103011015610f9657600080fd5b6202a30042610e205242610e405262015180610fb157600080fd5b62015180610e405106610e20511015610fc957600080fd5b42610e405262015180610fdb57600080fd5b62015180610e405106610e20510301610e00526020610ee0600463c5f2892f610e8052610e9c6000305af161100f57600080fd5b610ee051610e60526060610f8060246380673289610f0052600254610f2052610f1c6000305af161103f57600080fd5b610fa0805160200180610fe0828460006004600a8704601201f161106257600080fd5b505060606110c06024638067328961104052610e00516110605261105c6000305af161108d57600080fd5b6110e0805160200180611120828460006004600a8704601201f16110b057600080fd5b5050610e60516111e05260606111a0526111a05161120052610fe08051602001806111a0516111e001828460006004600a8704601201f16110f057600080fd5b50506111a0516111e0015160206001820306601f82010390506111a0516111e00161118081516020818352015b836111805110151561112e5761114b565b6000611180516020850101535b815160010180835281141561111d575b5050505060206111a0516111e0015160206001820306601f82010390506111a05101016111a0526111a051611220526111208051602001806111a0516111e001828460006004600a8704601201f16111a257600080fd5b50506111a0516111e0015160206001820306601f82010390506111a0516111e00161118081516020818352015b83611180511015156111e0576111fd565b6000611180516020850101535b81516001018083528114156111cf575b5050505060206111a0516111e0015160206001820306601f82010390506111a05101016111a0527f08b71ef3f1b58f7a23ffb82e27f12f0888c8403f1ceb0ea7ea26b274e2189d4c6111a0516111e0a160016004555b5b005b63845980e8600051141561127c57341561126f57600080fd5b60045460005260206000f3005b60006000fd5b61018561140703610185600039610185611407036000f3"} \ No newline at end of file diff --git a/deposit_contract/contracts/validator_registration.v.py b/deposit_contract/contracts/validator_registration.v.py index 82704f59ef..1d475311ae 100644 --- a/deposit_contract/contracts/validator_registration.v.py +++ b/deposit_contract/contracts/validator_registration.v.py @@ -88,12 +88,12 @@ def deposit(pubkey: bytes[PUBKEY_LENGTH], # add deposit to merkle tree i: int128 = 0 - power_of_two: uint256 = 2 + size: uint256 = index + 1 for _ in range(DEPOSIT_CONTRACT_TREE_DEPTH): - if (index+1) % power_of_two != 0: + if bitwise_and(size, 1) == 1: break i += 1 - power_of_two *= 2 + size /= 2 zero_bytes_32: bytes32 pubkey_root: bytes32 = sha256(concat(pubkey, slice(zero_bytes_32, start=0, len=16))) From c277703423c1b8af0662ef0831fe88f4a4666f04 Mon Sep 17 00:00:00 2001 From: Hsiao-Wei Wang Date: Thu, 30 May 2019 13:26:36 +0800 Subject: [PATCH 12/21] Add `compile_deposit_contract` command --- Makefile | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Makefile b/Makefile index e80efcd7ea..47be51e0aa 100644 --- a/Makefile +++ b/Makefile @@ -47,6 +47,11 @@ lint: $(PY_SPEC_ALL_TARGETS) cd $(PY_SPEC_DIR); . venv/bin/activate; \ flake8 --max-line-length=120 ./eth2spec; +compile_deposit_contract: + cd $(PY_SPEC_DIR); python3 -m venv venv; . venv/bin/activate; \ + cd ../..; cd $(DEPOSIT_CONTRACT_DIR); \ + python tool/compile_deposit_contract.py contracts/validator_registration.v.py; + install_deposit_contract_test: cd $(PY_SPEC_DIR); python3 -m venv venv; . venv/bin/activate; \ cd ../..; cd $(DEPOSIT_CONTRACT_DIR); \ From 0424fab024a8580cd486d0708ca79d0ae7ffb889 Mon Sep 17 00:00:00 2001 From: Hsiao-Wei Wang Date: Thu, 30 May 2019 13:39:42 +0800 Subject: [PATCH 13/21] Use `eth2spec.utils.hash_function.hash` --- deposit_contract/tests/contracts/test_deposit.py | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/deposit_contract/tests/contracts/test_deposit.py b/deposit_contract/tests/contracts/test_deposit.py index 7c5b85907a..3d0b6f8453 100644 --- a/deposit_contract/tests/contracts/test_deposit.py +++ b/deposit_contract/tests/contracts/test_deposit.py @@ -13,17 +13,15 @@ FULL_DEPOSIT_AMOUNT, MIN_DEPOSIT_AMOUNT, ) + +from eth2spec.phase0.spec import ( + DepositData, +) +from eth2spec.utils.hash_function import hash from eth2spec.utils.minimal_ssz import ( SSZType, hash_tree_root, ) -from eth2spec.phase0.spec import ( - DepositData, -) - - -def hash(data): - return sha256(data).digest() def compute_merkle_root(leaf_nodes): From a81fa54c73d8b1cfcc6a96a54513c7d84e556674 Mon Sep 17 00:00:00 2001 From: Hsiao-Wei Wang Date: Thu, 30 May 2019 14:12:05 +0800 Subject: [PATCH 14/21] Add README.md --- deposit_contract/README.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 deposit_contract/README.md diff --git a/deposit_contract/README.md b/deposit_contract/README.md new file mode 100644 index 0000000000..266eb93e42 --- /dev/null +++ b/deposit_contract/README.md @@ -0,0 +1,23 @@ +# Deposit contract + +## How to compile the contract? + +Under the `eth2.0-specs` directory, execute: + +```sh +make compile_deposit_contract +``` + +The ABI and bytecode will be updated at [`contracts/validator_registration.json`](./contracts/validator_registration.json). + +## How to set up the testing environment? + +```sh +make install_deposit_contract_test +``` + +## How to run tests? + +```sh +make test_deposit_contract +``` From 6617f891462c0d0ed674585f8402d2e06778f56a Mon Sep 17 00:00:00 2001 From: Hsiao-Wei Wang Date: Sat, 1 Jun 2019 11:00:31 +0800 Subject: [PATCH 15/21] Rewrite `reqs_checksum` --- .circleci/config.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 164dc98a03..9cfc749118 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -36,13 +36,13 @@ commands: steps: - restore_cached_venv: venv_name: v1-pyspec-05 - reqs_checksum: '{{ checksum "test_libs/pyspec/requirements.txt" }}-{{ checksum "test_libs/pyspec/requirements-testing.txt" }}--{{ checksum "deposit_contract/requirements-testing.txt" }}' + reqs_checksum: cache-v1-{{ checksum "test_libs/pyspec/requirements.txt" }}-{{ checksum "test_libs/pyspec/requirements-testing.txt" }}-{{ checksum "deposit_contract/requirements-testing.txt" }} save_default_cached_venv: description: Save a venv into a cache with default keys" steps: - save_cached_venv: venv_name: v1-pyspec-05 - reqs_checksum: '{{ checksum "test_libs/pyspec/requirements.txt" }}-{{ checksum "test_libs/pyspec/requirements-testing.txt" }}--{{ checksum "deposit_contract/requirements-testing.txt" }}' + reqs_checksum: cache-v1-{{ checksum "test_libs/pyspec/requirements.txt" }}-{{ checksum "test_libs/pyspec/requirements-testing.txt" }}-{{ checksum "deposit_contract/requirements-testing.txt" }} venv_path: ./test_libs/pyspec/venv jobs: checkout_specs: From b8eddfafe77e3bcc81823afddf715534970ec540 Mon Sep 17 00:00:00 2001 From: Hsiao-Wei Wang Date: Mon, 3 Jun 2019 16:23:03 +0800 Subject: [PATCH 16/21] Remove version from `reqs_checksum` --- .circleci/config.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 9cfc749118..d4c672ca26 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -36,13 +36,13 @@ commands: steps: - restore_cached_venv: venv_name: v1-pyspec-05 - reqs_checksum: cache-v1-{{ checksum "test_libs/pyspec/requirements.txt" }}-{{ checksum "test_libs/pyspec/requirements-testing.txt" }}-{{ checksum "deposit_contract/requirements-testing.txt" }} + reqs_checksum: cache-{{ checksum "test_libs/pyspec/requirements.txt" }}-{{ checksum "test_libs/pyspec/requirements-testing.txt" }}-{{ checksum "deposit_contract/requirements-testing.txt" }} save_default_cached_venv: description: Save a venv into a cache with default keys" steps: - save_cached_venv: venv_name: v1-pyspec-05 - reqs_checksum: cache-v1-{{ checksum "test_libs/pyspec/requirements.txt" }}-{{ checksum "test_libs/pyspec/requirements-testing.txt" }}-{{ checksum "deposit_contract/requirements-testing.txt" }} + reqs_checksum: cache-{{ checksum "test_libs/pyspec/requirements.txt" }}-{{ checksum "test_libs/pyspec/requirements-testing.txt" }}-{{ checksum "deposit_contract/requirements-testing.txt" }} venv_path: ./test_libs/pyspec/venv jobs: checkout_specs: From cf23a252b4a0f96f4f313f9d2bd55160297df1f2 Mon Sep 17 00:00:00 2001 From: Hsiao-Wei Wang Date: Fri, 7 Jun 2019 15:35:52 -0400 Subject: [PATCH 17/21] fix path --- deposit_contract/tests/contracts/test_deposit.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/deposit_contract/tests/contracts/test_deposit.py b/deposit_contract/tests/contracts/test_deposit.py index 3d0b6f8453..8492d63478 100644 --- a/deposit_contract/tests/contracts/test_deposit.py +++ b/deposit_contract/tests/contracts/test_deposit.py @@ -1,6 +1,3 @@ -from hashlib import ( - sha256, -) from random import ( randint, ) @@ -18,8 +15,7 @@ DepositData, ) from eth2spec.utils.hash_function import hash -from eth2spec.utils.minimal_ssz import ( - SSZType, +from eth2spec.utils.ssz.ssz_impl import ( hash_tree_root, ) From 96237c74e1a7f687ba3fc2481ac670e3156b9e67 Mon Sep 17 00:00:00 2001 From: Hsiao-Wei Wang Date: Fri, 7 Jun 2019 15:30:27 -0400 Subject: [PATCH 18/21] two venv caches --- .circleci/config.yml | 61 ++++++++++++++++++++++++++++++++------------ 1 file changed, 44 insertions(+), 17 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 0e0fac0d40..91578f8617 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -31,18 +31,31 @@ commands: - save_cache: key: << parameters.venv_name >>-venv-<< parameters.reqs_checksum >> paths: << parameters.venv_path >> - restore_default_cached_venv: - description: "Restore the cache with default keys" + restore_pyspec_cached_venv: + description: "Restore the cache with pyspec keys" steps: - restore_cached_venv: venv_name: v2-pyspec - reqs_checksum: cache-{{ checksum "test_libs/pyspec/requirements.txt" }}-{{ checksum "test_libs/pyspec/requirements-testing.txt" }}-{{ checksum "deposit_contract/requirements-testing.txt" }} - save_default_cached_venv: - description: Save a venv into a cache with default keys" + reqs_checksum: cache-{{ checksum "test_libs/pyspec/requirements.txt" }}-{{ checksum "test_libs/pyspec/requirements-testing.txt" }} + save_pyspec_cached_venv: + description: Save a venv into a cache with pyspec keys" steps: - save_cached_venv: venv_name: v2-pyspec - reqs_checksum: cache-{{ checksum "test_libs/pyspec/requirements.txt" }}-{{ checksum "test_libs/pyspec/requirements-testing.txt" }}-{{ checksum "deposit_contract/requirements-testing.txt" }} + reqs_checksum: cache-{{ checksum "test_libs/pyspec/requirements.txt" }}-{{ checksum "test_libs/pyspec/requirements-testing.txt" }} + venv_path: ./test_libs/pyspec/venv + restore_deposit_contract_cached_venv: + description: "Restore the cache with deposit_contract keys" + steps: + - restore_cached_venv: + venv_name: v2-deposit-contract + reqs_checksum: cache-{{ checksum "test_libs/pyspec/requirements.txt" }}-{{ checksum "deposit_contract/requirements-testing.txt" }} + save_deposit_contract_cached_venv: + description: Save a venv into a cache with deposit_contract keys" + steps: + - save_cached_venv: + venv_name: v2-deposit-contract + reqs_checksum: cache-{{ checksum "test_libs/pyspec/requirements.txt" }}-{{ checksum "deposit_contract/requirements-testing.txt" }} venv_path: ./test_libs/pyspec/venv jobs: checkout_specs: @@ -65,18 +78,18 @@ jobs: key: v1-specs-repo-{{ .Branch }}-{{ .Revision }} paths: - ~/specs-repo - install_env: + install_pyspec_test: docker: - image: circleci/python:3.6 working_directory: ~/specs-repo steps: - restore_cache: key: v1-specs-repo-{{ .Branch }}-{{ .Revision }} - - restore_default_cached_venv + - restore_pyspec_cached_venv - run: name: Install pyspec requirements - command: make install_test && make install_lint && make install_deposit_contract_test - - save_default_cached_venv + command: make install_test + - save_pyspec_cached_venv test: docker: - image: circleci/python:3.6 @@ -84,7 +97,7 @@ jobs: steps: - restore_cache: key: v1-specs-repo-{{ .Branch }}-{{ .Revision }} - - restore_default_cached_venv + - restore_pyspec_cached_venv - run: name: Run py-tests command: make citest @@ -97,10 +110,22 @@ jobs: steps: - restore_cache: key: v1-specs-repo-{{ .Branch }}-{{ .Revision }} - - restore_default_cached_venv + - restore_pyspec_cached_venv - run: name: Run linter command: make lint + install_deposit_contract_test: + docker: + - image: circleci/python:3.6 + working_directory: ~/specs-repo + steps: + - restore_cache: + key: v1-specs-repo-{{ .Branch }}-{{ .Revision }} + - restore_deposit_contract_cached_venv + - run: + name: Install deposit contract requirements + command: make install_deposit_contract_test + - save_deposit_contract_cached_venv deposit_contract: docker: - image: circleci/python:3.6 @@ -108,7 +133,7 @@ jobs: steps: - restore_cache: key: v1-specs-repo-{{ .Branch }}-{{ .Revision }} - - restore_default_cached_venv + - restore_deposit_contract_cached_venv - run: name: Run deposit contract test command: make test_deposit_contract @@ -117,16 +142,18 @@ workflows: test_spec: jobs: - checkout_specs - - install_env: + - install_pyspec_test: requires: - checkout_specs - test: requires: - - install_env + - install_pyspec_test - lint: requires: - test + - install_deposit_contract_test: + requires: + - checkout_specs - deposit_contract: requires: - - install_env - - lint + - install_deposit_contract_test From 5b8cca831458be07ec8e9a0ca580d60354bfd024 Mon Sep 17 00:00:00 2001 From: Hsiao-Wei Wang Date: Fri, 7 Jun 2019 22:19:11 -0400 Subject: [PATCH 19/21] deposit_contract/venv PR feedback + bump eth-tester --- .circleci/config.yml | 6 +++--- Makefile | 15 ++++++--------- deposit_contract/README.md | 13 +++++++------ deposit_contract/requirements-testing.txt | 5 ++--- 4 files changed, 18 insertions(+), 21 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 91578f8617..6b785e6ed7 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -48,15 +48,15 @@ commands: description: "Restore the cache with deposit_contract keys" steps: - restore_cached_venv: - venv_name: v2-deposit-contract + venv_name: v3-deposit-contract reqs_checksum: cache-{{ checksum "test_libs/pyspec/requirements.txt" }}-{{ checksum "deposit_contract/requirements-testing.txt" }} save_deposit_contract_cached_venv: description: Save a venv into a cache with deposit_contract keys" steps: - save_cached_venv: - venv_name: v2-deposit-contract + venv_name: v3-deposit-contract reqs_checksum: cache-{{ checksum "test_libs/pyspec/requirements.txt" }}-{{ checksum "deposit_contract/requirements-testing.txt" }} - venv_path: ./test_libs/pyspec/venv + venv_path: ./deposit_contract/venv jobs: checkout_specs: docker: diff --git a/Makefile b/Makefile index 66c5ba3ec4..12b8d79fb9 100644 --- a/Makefile +++ b/Makefile @@ -31,6 +31,7 @@ clean: rm -rf $(GENERATOR_VENVS) rm -rf $(PY_SPEC_DIR)/venv $(PY_SPEC_DIR)/.pytest_cache rm -rf $(PY_SPEC_ALL_TARGETS) + rm -rf $(DEPOSIT_CONTRACT_DIR)/venv $(DEPOSIT_CONTRACT_DIR)/.pytest_cache # "make gen_yaml_tests" to run generators gen_yaml_tests: $(PY_SPEC_ALL_TARGETS) $(YAML_TEST_TARGETS) @@ -50,19 +51,15 @@ lint: $(PY_SPEC_ALL_TARGETS) cd $(PY_SPEC_DIR); . venv/bin/activate; \ flake8 --ignore=E252,W504,W503 --max-line-length=120 ./eth2spec; +install_deposit_contract_test: + cd $(DEPOSIT_CONTRACT_DIR); python3 -m venv venv; . venv/bin/activate; pip3 install -r requirements-testing.txt + compile_deposit_contract: - cd $(PY_SPEC_DIR); python3 -m venv venv; . venv/bin/activate; \ - cd ../..; cd $(DEPOSIT_CONTRACT_DIR); \ + cd $(DEPOSIT_CONTRACT_DIR); . venv/bin/activate; \ python tool/compile_deposit_contract.py contracts/validator_registration.v.py; -install_deposit_contract_test: - cd $(PY_SPEC_DIR); python3 -m venv venv; . venv/bin/activate; \ - cd ../..; cd $(DEPOSIT_CONTRACT_DIR); \ - pip3 install -r requirements-testing.txt - test_deposit_contract: $(PY_SPEC_ALL_TARGETS) - cd $(PY_SPEC_DIR); python3 -m venv venv; . venv/bin/activate; \ - cd ../.. && cd $(DEPOSIT_CONTRACT_DIR); \ + cd $(DEPOSIT_CONTRACT_DIR); . venv/bin/activate; \ pip3 install -r requirements-testing.txt; \ python -m pytest . diff --git a/deposit_contract/README.md b/deposit_contract/README.md index 266eb93e42..16779e7778 100644 --- a/deposit_contract/README.md +++ b/deposit_contract/README.md @@ -1,21 +1,22 @@ # Deposit contract -## How to compile the contract? +## How to set up the testing environment? Under the `eth2.0-specs` directory, execute: ```sh -make compile_deposit_contract +make install_deposit_contract_test ``` -The ABI and bytecode will be updated at [`contracts/validator_registration.json`](./contracts/validator_registration.json). - -## How to set up the testing environment? +## How to compile the contract? ```sh -make install_deposit_contract_test +make compile_deposit_contract ``` +The ABI and bytecode will be updated at [`contracts/validator_registration.json`](./contracts/validator_registration.json). + + ## How to run tests? ```sh diff --git a/deposit_contract/requirements-testing.txt b/deposit_contract/requirements-testing.txt index c1f96a0120..b3a90a88a7 100644 --- a/deposit_contract/requirements-testing.txt +++ b/deposit_contract/requirements-testing.txt @@ -1,6 +1,5 @@ -tox==3.0.0 -eth-tester[py-evm]==0.1.0b29 +eth-tester[py-evm]==0.1.0b39 vyper==0.1.0b9 -web3==4.8.3 +web3==5.0.0b2 pytest==3.6.1 ../test_libs/pyspec From e52c4a5526866deba675ef11ac6c4cf8499dba65 Mon Sep 17 00:00:00 2001 From: Hsiao-Wei Wang Date: Fri, 7 Jun 2019 23:00:28 -0400 Subject: [PATCH 20/21] fix --- .circleci/config.yml | 4 ++-- Makefile | 5 ++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 6b785e6ed7..6e9a77c49b 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -48,13 +48,13 @@ commands: description: "Restore the cache with deposit_contract keys" steps: - restore_cached_venv: - venv_name: v3-deposit-contract + venv_name: v4-deposit-contract reqs_checksum: cache-{{ checksum "test_libs/pyspec/requirements.txt" }}-{{ checksum "deposit_contract/requirements-testing.txt" }} save_deposit_contract_cached_venv: description: Save a venv into a cache with deposit_contract keys" steps: - save_cached_venv: - venv_name: v3-deposit-contract + venv_name: v4-deposit-contract reqs_checksum: cache-{{ checksum "test_libs/pyspec/requirements.txt" }}-{{ checksum "deposit_contract/requirements-testing.txt" }} venv_path: ./deposit_contract/venv jobs: diff --git a/Makefile b/Makefile index 12b8d79fb9..ab0806c246 100644 --- a/Makefile +++ b/Makefile @@ -51,16 +51,15 @@ lint: $(PY_SPEC_ALL_TARGETS) cd $(PY_SPEC_DIR); . venv/bin/activate; \ flake8 --ignore=E252,W504,W503 --max-line-length=120 ./eth2spec; -install_deposit_contract_test: +install_deposit_contract_test: $(PY_SPEC_ALL_TARGETS) cd $(DEPOSIT_CONTRACT_DIR); python3 -m venv venv; . venv/bin/activate; pip3 install -r requirements-testing.txt compile_deposit_contract: cd $(DEPOSIT_CONTRACT_DIR); . venv/bin/activate; \ python tool/compile_deposit_contract.py contracts/validator_registration.v.py; -test_deposit_contract: $(PY_SPEC_ALL_TARGETS) +test_deposit_contract: cd $(DEPOSIT_CONTRACT_DIR); . venv/bin/activate; \ - pip3 install -r requirements-testing.txt; \ python -m pytest . # "make pyspec" to create the pyspec for all phases. From bce6c899f65ad05587a1067c235251a5c3fff9fd Mon Sep 17 00:00:00 2001 From: protolambda Date: Sat, 8 Jun 2019 13:30:47 +0200 Subject: [PATCH 21/21] improve makefile: declare new targets as non-file --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index ab0806c246..f79b89dada 100644 --- a/Makefile +++ b/Makefile @@ -22,7 +22,7 @@ PY_SPEC_PHASE_1_DEPS = $(SPEC_DIR)/core/1_*.md PY_SPEC_ALL_TARGETS = $(PY_SPEC_PHASE_0_TARGETS) $(PY_SPEC_PHASE_1_TARGETS) -.PHONY: clean all test citest gen_yaml_tests pyspec phase0 phase1 install_test +.PHONY: clean all test citest lint gen_yaml_tests pyspec phase0 phase1 install_test install_deposit_contract_test test_deposit_contract compile_deposit_contract all: $(PY_SPEC_ALL_TARGETS) $(YAML_TEST_DIR) $(YAML_TEST_TARGETS)