From 19bf7f159972a33de08209a53b4a759ba48463ba Mon Sep 17 00:00:00 2001 From: tersec Date: Tue, 5 Jul 2022 04:13:07 +0000 Subject: [PATCH] check in MEV boost test script that payload gets unblinded (#3838) --- beacon_chain/spec/eth2_apis/rest_types.nim | 2 +- scripts/test_mev_boost.nim | 116 +++++++++++++-------- 2 files changed, 72 insertions(+), 46 deletions(-) diff --git a/beacon_chain/spec/eth2_apis/rest_types.nim b/beacon_chain/spec/eth2_apis/rest_types.nim index 68d1f64c3..8b70b6c92 100644 --- a/beacon_chain/spec/eth2_apis/rest_types.nim +++ b/beacon_chain/spec/eth2_apis/rest_types.nim @@ -568,7 +568,7 @@ type ProduceBlockResponse* = DataEnclosedObject[phase0.BeaconBlock] ProduceBlockResponseV2* = ForkedBeaconBlock ProduceSyncCommitteeContributionResponse* = DataEnclosedObject[SyncCommitteeContribution] - SubmitBlindedBlockResponse* = DataEnclosedObject[SignedBuilderBid] + SubmitBlindedBlockResponse* = DataEnclosedObject[bellatrix.ExecutionPayload] func `==`*(a, b: RestValidatorIndex): bool = uint64(a) == uint64(b) diff --git a/scripts/test_mev_boost.nim b/scripts/test_mev_boost.nim index 7b0606b00..f3b6ce1e7 100644 --- a/scripts/test_mev_boost.nim +++ b/scripts/test_mev_boost.nim @@ -1,60 +1,86 @@ import - unittest2, + std/macros, chronos, presto/client, web3/ethtypes, - ../beacon_chain/spec/mev/rest_bellatrix_mev_calls, - ../tests/testutil + ../beacon_chain/spec/mev/rest_bellatrix_mev_calls from ../beacon_chain/beacon_chain_db import DepositContractSnapshot from ../beacon_chain/eth1/eth1_monitor import Eth1Monitor, Web3DataProvider, asEth2Digest, ensureDataProvider, forkchoiceUpdated, getBlockByNumber, init, new from ../beacon_chain/networking/network_metadata import Eth1Network -from ../beacon_chain/spec/helpers import compute_signing_root +from ../beacon_chain/spec/datatypes/bellatrix import SignedBeaconBlock +from ../beacon_chain/spec/helpers import compute_domain, compute_signing_root from ../tests/testdbutil import makeTestDB -suite "MEV tests": - setup: - const - feeRecipient = - Eth1Address.fromHex("0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b") - web3Url = "http://127.0.0.1:8551" - restUrl = "http://127.0.0.1:28545" +const + feeRecipient = + Eth1Address.fromHex("0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b") + web3Url = "http://127.0.0.1:8551" + restUrl = "http://127.0.0.1:28545" - let - db = makeTestDB(64) - eth1Monitor = Eth1Monitor.init( - defaultRuntimeConfig, db, nil, @[web3Url], - none(DepositContractSnapshot), none(Eth1Network), false, none(seq[byte])) - web3Provider = (waitFor Web3DataProvider.new( - default(Eth1Address), web3Url, some(@[0xcdu8, 0xcau8, 0xe4u8, 0xecu8, 0x6au8, 0x3du8, 0x0bu8, 0x4bu8, 0x97u8, 0x00u8, 0x21u8, 0x21u8, 0xb0u8, 0x5bu8, 0x22u8, 0xe2u8, 0xd6u8, 0xd5u8, 0x7fu8, 0xaau8, 0x51u8, 0x53u8, 0x84u8, 0x5fu8, 0xe0u8, 0x4fu8, 0x06u8, 0xb5u8, 0xf3u8, 0xadu8, 0xc4u8, 0x0bu8]))).get - restClient = RestClientRef.new(restUrl).get - privKey = ValidatorPrivKey.init( - "0x066e3bdc0415530e5c7fed6382d5c822c192b620203cf669903e1810a8c67d06") - pubKey = privKey.toPubKey.toPubKey +proc main() {.async.} = + let + db = makeTestDB(64) + elMonitor = Eth1Monitor.init( + defaultRuntimeConfig, db, nil, @[web3Url], + none(DepositContractSnapshot), none(Eth1Network), false, none(seq[byte])) + web3Provider = (await Web3DataProvider.new( + default(Eth1Address), web3Url, some(@[0xcdu8, 0xcau8, 0xe4u8, 0xecu8, 0x6au8, 0x3du8, 0x0bu8, 0x4bu8, 0x97u8, 0x00u8, 0x21u8, 0x21u8, 0xb0u8, 0x5bu8, 0x22u8, 0xe2u8, 0xd6u8, 0xd5u8, 0x7fu8, 0xaau8, 0x51u8, 0x53u8, 0x84u8, 0x5fu8, 0xe0u8, 0x4fu8, 0x06u8, 0xb5u8, 0xf3u8, 0xadu8, 0xc4u8, 0x0bu8]))).get + restClient = RestClientRef.new(restUrl).get + privKey = ValidatorPrivKey.init( + "0x066e3bdc0415530e5c7fed6382d5c822c192b620203cf669903e1810a8c67d06") + pubKey = privKey.toPubKey.toPubKey - test "forkchoiceUpdated, getHeader, and submitBlindedBlock": - waitFor eth1Monitor.ensureDataProvider() - let - existingBlock = waitFor web3Provider.getBlockByNumber(0) - payloadId = waitFor eth1Monitor.forkchoiceUpdated( - existingBlock.hash.asEth2Digest, - existingBlock.hash.asEth2Digest, - existingBlock.timestamp.uint64 + 12, - ZERO_HASH.data, # Random - feeRecipient) - blindedHeader = waitFor restClient.getHeader( - 1.Slot, existingBlock.hash.asEth2Digest, pubKey) + await elMonitor.ensureDataProvider() + let + existingBlock = await web3Provider.getBlockByNumber(0) + payloadId = await elMonitor.forkchoiceUpdated( + existingBlock.hash.asEth2Digest, + existingBlock.hash.asEth2Digest, + existingBlock.timestamp.uint64 + 12, + ZERO_HASH.data, # Random + feeRecipient) + blindedHeader = await restClient.getHeader( + 1.Slot, existingBlock.hash.asEth2Digest, pubKey) - # construct block - var blck: SignedBlindedBeaconBlock - blck.message.body.execution_payload_header = blindedHeader.data.data.message.header + var blck: SignedBlindedBeaconBlock + blck.message.body.execution_payload_header = + blindedHeader.data.data.message.header - # sign block - let domain: Eth2Domain = [ - byte 0x00, 0x00, 0x00, 0x00, 0x8a, 0x02, 0x3a, 0x9e, 0x4a, 0xff, 0xbb, 0x25, 0x5a, 0x6b, 0x48, 0xae, 0x85, 0xcc, 0x4a, 0x7d, 0x1a, 0x1b, 0x9e, 0x8e, 0x68, 0x09, 0xfe, 0x9e, 0x48, 0x53, 0x5c, 0x01] - blck.signature = blsSign( - privKey, - compute_signing_root(hash_tree_root(blck.message), domain).data). - toValidatorSig + # Can't be const: + # https://github.com/nim-lang/Nim/issues/15952 + # https://github.com/nim-lang/Nim/issues/19969 + let mergeMockDomain = compute_domain( + DOMAIN_BEACON_PROPOSER, defaultRuntimeConfig.BELLATRIX_FORK_VERSION) - let signedBuilderBid = waitFor restClient.submitBlindedBlock(blck) + blck.signature = blsSign( + privKey, compute_signing_root( + hash_tree_root(blck.message), mergeMockDomain).data).toValidatorSig + + let submitBlindedBlockResponse = + await restClient.submitBlindedBlock(blck) + doAssert submitBlindedBlockResponse.status == 200 + doAssert submitBlindedBlockResponse.data.data is ExecutionPayload + + macro copyExecutionPayloadFields(a, b: untyped) = + result = newStmtList() + for name, value in fieldPairs(blck.message.body.execution_payload_header): + if name != "transactions_root": + result.add newAssignment( + newDotExpr(a, ident(name)), newDotExpr(b, ident(name))) + + var fullBlck: bellatrix.SignedBeaconBlock + fullBlck.signature = blck.signature + copyExecutionPayloadFields( + fullBlck.message.body.execution_payload, + blck.message.body.execution_payload_header) + fullBlck.message.body.execution_payload.transactions = + submitBlindedBlockResponse.data.data.transactions + + doAssert hash_tree_root(fullBlck.message.body.execution_payload) == + hash_tree_root(blck.message.body.execution_payload_header) + + echo fullBlck.message.body.execution_payload + echo submitBlindedBlockResponse.data.data + +waitFor main()