1{
2 cmake,
3 fetchFromGitHub,
4 fetchurl,
5 lib,
6 lighthouse,
7 nix-update-script,
8 openssl,
9 pkg-config,
10 protobuf,
11 rustPlatform,
12 rust-jemalloc-sys,
13 sqlite,
14 stdenv,
15 testers,
16}:
17
18rustPlatform.buildRustPackage rec {
19 pname = "lighthouse";
20 version = "7.1.0";
21
22 # lighthouse/common/deposit_contract/build.rs, `TAG`
23 depositContractSpecVersion = "0.12.1";
24 # lighthouse/common/deposit_contract/build.rs, `UNSAFE_TAG`
25 testnetDepositContractSpecVersion = "0.9.2.1";
26
27 src = fetchFromGitHub {
28 owner = "sigp";
29 repo = "lighthouse";
30 tag = "v${version}";
31 hash = "sha256-+tLAuuinSaVIwO5wi1Cf+86pWj83Jj0p1ajnDdpHsyI=";
32 };
33
34 patches = [
35 ./use-system-sqlite.patch
36 ];
37
38 cargoHash = "sha256-pb44m+iWArlIim2tqbaH+pwCSqIdqzfVZJ9yj/ne1LY=";
39
40 buildFeatures = [
41 "modern"
42 "gnosis"
43 ];
44
45 nativeBuildInputs = [
46 rustPlatform.bindgenHook
47 cmake
48 pkg-config
49 protobuf
50 ];
51
52 buildInputs = [
53 rust-jemalloc-sys
54 sqlite
55 ]
56 ++ lib.optionals (!stdenv.hostPlatform.isDarwin) [
57 openssl
58 ];
59
60 depositContractSpec = fetchurl {
61 url = "https://raw.githubusercontent.com/ethereum/eth2.0-specs/v${depositContractSpecVersion}/deposit_contract/contracts/validator_registration.json";
62 hash = "sha256-ZslAe1wkmkg8Tua/AmmEfBmjqMVcGIiYHwi+WssEwa8=";
63 };
64
65 testnetDepositContractSpec = fetchurl {
66 url = "https://raw.githubusercontent.com/sigp/unsafe-eth2-deposit-contract/v${testnetDepositContractSpecVersion}/unsafe_validator_registration.json";
67 hash = "sha256-aeTeHRT3QtxBRSNMCITIWmx89vGtox2OzSff8vZ+RYY=";
68 };
69
70 LIGHTHOUSE_DEPOSIT_CONTRACT_SPEC_URL = "file://${depositContractSpec}";
71 LIGHTHOUSE_DEPOSIT_CONTRACT_TESTNET_URL = "file://${testnetDepositContractSpec}";
72
73 OPENSSL_NO_VENDOR = true;
74
75 cargoBuildFlags = [
76 "--package lighthouse"
77 ];
78
79 __darwinAllowLocalNetworking = true;
80
81 checkFeatures = [ ];
82
83 # All of these tests require network access and/or docker
84 cargoTestFlags = [
85 "--workspace"
86 "--exclude beacon_chain"
87 "--exclude beacon_node"
88 "--exclude http_api"
89 "--exclude lighthouse"
90 "--exclude lighthouse_network"
91 "--exclude network"
92 "--exclude slashing_protection"
93 "--exclude watch"
94 "--exclude web3signer_tests"
95 ];
96
97 # All of these tests require network access
98 checkFlags = [
99 "--skip tests::broadcast_should_send_to_all_bns"
100 "--skip tests::check_candidate_order"
101 "--skip tests::first_success_should_try_nodes_in_order"
102 "--skip tests::update_all_candidates_should_update_sync_status"
103 "--skip engine_api::http::test::forkchoice_updated_v1_request"
104 "--skip engine_api::http::test::forkchoice_updated_v1_with_payload_attributes_request"
105 "--skip engine_api::http::test::get_block_by_hash_request"
106 "--skip engine_api::http::test::get_block_by_number_request"
107 "--skip engine_api::http::test::get_payload_v1_request"
108 "--skip engine_api::http::test::geth_test_vectors"
109 "--skip engine_api::http::test::new_payload_v1_request"
110 "--skip test::finds_valid_terminal_block_hash"
111 "--skip test::produce_three_valid_pos_execution_blocks"
112 "--skip test::rejects_invalid_terminal_block_hash"
113 "--skip test::rejects_terminal_block_with_equal_timestamp"
114 "--skip test::rejects_unknown_terminal_block_hash"
115 "--skip test::test_forked_terminal_block"
116 "--skip test::verifies_valid_terminal_block_hash"
117 "--skip deposit_tree::cache_consistency"
118 "--skip deposit_tree::double_update"
119 "--skip deposit_tree::updating"
120 "--skip eth1_cache::big_skip"
121 "--skip eth1_cache::double_update"
122 "--skip eth1_cache::pruning"
123 "--skip eth1_cache::simple_scenario"
124 "--skip fast::deposit_cache_query"
125 "--skip http::incrementing_deposits"
126 "--skip persist::test_persist_caches"
127 "--skip can_read_finalized_block"
128 "--skip invalid_attestation_delayed_slot"
129 "--skip invalid_attestation_empty_bitfield"
130 "--skip invalid_attestation_future_block"
131 "--skip invalid_attestation_future_epoch"
132 "--skip invalid_attestation_inconsistent_ffg_vote"
133 "--skip invalid_attestation_past_epoch"
134 "--skip invalid_attestation_target_epoch"
135 "--skip invalid_attestation_unknown_beacon_block_root"
136 "--skip invalid_attestation_unknown_target_root"
137 "--skip invalid_block_finalized_descendant"
138 "--skip invalid_block_finalized_slot"
139 "--skip invalid_block_future_slot"
140 "--skip invalid_block_unknown_parent"
141 "--skip justified_and_finalized_blocks"
142 "--skip justified_balances"
143 "--skip justified_checkpoint_updates_with_descendent"
144 "--skip justified_checkpoint_updates_with_descendent_first_justification"
145 "--skip justified_checkpoint_updates_with_non_descendent"
146 "--skip progressive_balances_cache_attester_slashing"
147 "--skip progressive_balances_cache_proposer_slashing"
148 "--skip valid_attestation"
149 "--skip valid_attestation_skip_across_epoch"
150 "--skip weak_subjectivity_check_epoch_boundary_is_skip_slot"
151 "--skip weak_subjectivity_check_epoch_boundary_is_skip_slot_failure"
152 "--skip weak_subjectivity_check_fails_early_epoch"
153 "--skip weak_subjectivity_check_fails_incorrect_root"
154 "--skip weak_subjectivity_check_fails_late_epoch"
155 "--skip weak_subjectivity_check_passes"
156 "--skip weak_subjectivity_pass_on_startup"
157 "--skip basic"
158 "--skip returns_200_ok"
159 "--skip release_tests::attestation_aggregation_insert_get_prune"
160 "--skip release_tests::attestation_duplicate"
161 "--skip release_tests::attestation_get_max"
162 "--skip release_tests::attestation_pairwise_overlapping"
163 "--skip release_tests::attestation_rewards"
164 "--skip release_tests::cross_fork_attester_slashings"
165 "--skip release_tests::cross_fork_exits"
166 "--skip release_tests::cross_fork_proposer_slashings"
167 "--skip release_tests::duplicate_proposer_slashing"
168 "--skip release_tests::max_coverage_attester_proposer_slashings"
169 "--skip release_tests::max_coverage_different_indices_set"
170 "--skip release_tests::max_coverage_effective_balances"
171 "--skip release_tests::overlapping_max_cover_attester_slashing"
172 "--skip release_tests::prune_attester_slashing_noop"
173 "--skip release_tests::prune_proposer_slashing_noop"
174 "--skip release_tests::simple_max_cover_attester_slashing"
175 "--skip release_tests::sync_contribution_aggregation_insert_get_prune"
176 "--skip release_tests::sync_contribution_duplicate"
177 "--skip release_tests::sync_contribution_with_fewer_bits"
178 "--skip release_tests::sync_contribution_with_more_bits"
179 "--skip release_tests::test_earliest_attestation"
180 "--skip per_block_processing::tests::block_replayer_peeking_state_roots"
181 "--skip per_block_processing::tests::fork_spanning_exit"
182 "--skip per_block_processing::tests::invalid_attester_slashing_1_invalid"
183 "--skip per_block_processing::tests::invalid_attester_slashing_2_invalid"
184 "--skip per_block_processing::tests::invalid_attester_slashing_not_slashable"
185 "--skip per_block_processing::tests::invalid_bad_proposal_1_signature"
186 "--skip per_block_processing::tests::invalid_bad_proposal_2_signature"
187 "--skip per_block_processing::tests::invalid_block_header_state_slot"
188 "--skip per_block_processing::tests::invalid_block_signature"
189 "--skip per_block_processing::tests::invalid_deposit_bad_merkle_proof"
190 "--skip per_block_processing::tests::invalid_deposit_count_too_small"
191 "--skip per_block_processing::tests::invalid_deposit_deposit_count_too_big"
192 "--skip per_block_processing::tests::invalid_deposit_invalid_pub_key"
193 "--skip per_block_processing::tests::invalid_deposit_wrong_sig"
194 "--skip per_block_processing::tests::invalid_parent_block_root"
195 "--skip per_block_processing::tests::invalid_proposer_slashing_duplicate_slashing"
196 "--skip per_block_processing::tests::invalid_proposer_slashing_proposal_epoch_mismatch"
197 "--skip per_block_processing::tests::invalid_proposer_slashing_proposals_identical"
198 "--skip per_block_processing::tests::invalid_proposer_slashing_proposer_unknown"
199 "--skip per_block_processing::tests::invalid_randao_reveal_signature"
200 "--skip per_block_processing::tests::valid_4_deposits"
201 "--skip per_block_processing::tests::valid_block_ok"
202 "--skip per_block_processing::tests::valid_insert_attester_slashing"
203 "--skip per_block_processing::tests::valid_insert_proposer_slashing"
204 "--skip per_epoch_processing::tests::release_tests::altair_state_on_base_fork"
205 "--skip per_epoch_processing::tests::release_tests::base_state_on_altair_fork"
206 "--skip per_epoch_processing::tests::runs_without_error"
207 "--skip exit::custom_tests::valid"
208 "--skip exit::custom_tests::valid_three"
209 "--skip exit::tests::invalid_bad_signature"
210 "--skip exit::tests::invalid_duplicate"
211 "--skip exit::tests::invalid_exit_already_initiated"
212 "--skip exit::tests::invalid_future_exit_epoch"
213 "--skip exit::tests::invalid_not_active_after_exit_epoch"
214 "--skip exit::tests::invalid_not_active_before_activation_epoch"
215 "--skip exit::tests::invalid_too_young_by_a_lot"
216 "--skip exit::tests::invalid_too_young_by_one_epoch"
217 "--skip exit::tests::invalid_validator_unknown"
218 "--skip exit::tests::valid_genesis_epoch"
219 "--skip exit::tests::valid_previous_epoch"
220 "--skip exit::tests::valid_single_exit"
221 "--skip exit::tests::valid_three_exits"
222 "--skip iter::test::block_root_iter"
223 "--skip iter::test::state_root_iter"
224 "--skip beacon_state::committee_cache::tests::initializes_with_the_right_epoch"
225 "--skip beacon_state::committee_cache::tests::min_randao_epoch_correct"
226 "--skip beacon_state::committee_cache::tests::shuffles_for_the_right_epoch"
227 "--skip beacon_state::tests::beacon_proposer_index"
228 "--skip beacon_state::tests::cache_initialization"
229 "--skip beacon_state::tests::committees::current_epoch_committee_consistency"
230 "--skip beacon_state::tests::committees::next_epoch_committee_consistency"
231 "--skip beacon_state::tests::committees::previous_epoch_committee_consistency"
232 "--skip tests::hd_validator_creation"
233 "--skip tests::invalid_pubkey"
234 "--skip tests::keystore_validator_creation"
235 "--skip tests::keystores::check_get_set_fee_recipient"
236 "--skip tests::keystores::check_get_set_gas_limit"
237 "--skip tests::keystores::delete_concurrent_with_signing"
238 "--skip tests::keystores::delete_keystores_twice"
239 "--skip tests::keystores::delete_nonexistent_keystores"
240 "--skip tests::keystores::delete_nonexistent_remotekey"
241 "--skip tests::keystores::delete_remotekey_then_reimport_different_url"
242 "--skip tests::keystores::delete_remotekeys_twice"
243 "--skip tests::keystores::delete_then_reimport"
244 "--skip tests::keystores::delete_then_reimport_remotekeys"
245 "--skip tests::keystores::get_auth_no_token"
246 "--skip tests::keystores::get_empty_keystores"
247 "--skip tests::keystores::get_empty_remotekeys"
248 "--skip tests::keystores::get_web3_signer_keystores"
249 "--skip tests::keystores::import_and_delete_conflicting_web3_signer_keystores"
250 "--skip tests::keystores::import_invalid_slashing_protection"
251 "--skip tests::keystores::import_keystores_wrong_password"
252 "--skip tests::keystores::import_new_keystores"
253 "--skip tests::keystores::import_new_remotekeys"
254 "--skip tests::keystores::import_only_duplicate_keystores"
255 "--skip tests::keystores::import_only_duplicate_remotekeys"
256 "--skip tests::keystores::import_remote_and_local_keys"
257 "--skip tests::keystores::import_remotekey_web3signer"
258 "--skip tests::keystores::import_remotekey_web3signer_disabled"
259 "--skip tests::keystores::import_remotekey_web3signer_enabled"
260 "--skip tests::keystores::import_same_local_and_remote_keys"
261 "--skip tests::keystores::import_same_remote_and_local_keys"
262 "--skip tests::keystores::import_same_remotekey_different_url"
263 "--skip tests::keystores::import_some_duplicate_keystores"
264 "--skip tests::keystores::import_some_duplicate_remotekeys"
265 "--skip tests::keystores::import_wrong_number_of_passwords"
266 "--skip tests::keystores::migrate_all_with_slashing_protection"
267 "--skip tests::keystores::migrate_some_extra_slashing_protection"
268 "--skip tests::keystores::migrate_some_missing_slashing_protection"
269 "--skip tests::keystores::migrate_some_with_slashing_protection"
270 "--skip tests::prefer_builder_proposals_validator"
271 "--skip tests::routes_with_invalid_auth"
272 "--skip tests::simple_getters"
273 "--skip tests::validator_builder_boost_factor"
274 "--skip tests::validator_builder_boost_factor_global_builder_proposals_false"
275 "--skip tests::validator_builder_boost_factor_global_builder_proposals_true"
276 "--skip tests::validator_builder_boost_factor_global_prefer_builder_proposals_true"
277 "--skip tests::validator_builder_boost_factor_global_prefer_builder_proposals_true_override"
278 "--skip tests::validator_builder_proposals"
279 "--skip tests::validator_derived_builder_boost_factor_with_process_defaults"
280 "--skip tests::validator_enabling"
281 "--skip tests::validator_exit"
282 "--skip tests::validator_gas_limit"
283 "--skip tests::validator_graffiti"
284 "--skip tests::validator_graffiti_api"
285 "--skip tests::web3signer_validator_creation"
286 "--skip create_validators::tests::bogus_bn_url"
287 "--skip delete_validators::test::delete_multiple_validators"
288 "--skip import_validators::tests::create_one_validator"
289 "--skip import_validators::tests::create_one_validator_keystore_format"
290 "--skip import_validators::tests::create_one_validator_with_offset"
291 "--skip import_validators::tests::create_one_validator_with_offset_keystore_format"
292 "--skip import_validators::tests::create_three_validators"
293 "--skip import_validators::tests::create_three_validators_with_offset"
294 "--skip import_validators::tests::import_duplicates_when_allowed"
295 "--skip import_validators::tests::import_duplicates_when_allowed_keystore_format"
296 "--skip import_validators::tests::import_duplicates_when_disallowed"
297 "--skip import_validators::tests::import_duplicates_when_disallowed_keystore_format"
298 "--skip list_validators::test::list_all_validators"
299 "--skip move_validators::test::no_validators"
300 "--skip move_validators::test::one_validator_move_all"
301 "--skip move_validators::test::one_validator_move_all_with_password_files"
302 "--skip move_validators::test::one_validator_move_one"
303 "--skip move_validators::test::one_validator_to_non_empty_dest"
304 "--skip move_validators::test::one_validators_move_two_by_count"
305 "--skip move_validators::test::three_validators_move_all"
306 "--skip move_validators::test::three_validators_move_one"
307 "--skip move_validators::test::three_validators_move_one_by_count"
308 "--skip move_validators::test::three_validators_move_three"
309 "--skip move_validators::test::three_validators_move_two"
310 "--skip move_validators::test::three_validators_move_two_by_count"
311 "--skip move_validators::test::two_validator_move_all_and_back_again"
312 "--skip move_validators::test::two_validator_move_all_passwords_removed"
313 "--skip move_validators::test::two_validator_move_all_passwords_removed_failed_password_attempt"
314 "--skip move_validators::test::two_validators_move_all_where_one_is_a_duplicate"
315 "--skip move_validators::test::two_validators_move_one_where_one_is_a_duplicate"
316 "--skip move_validators::test::two_validators_move_one_with_identical_password_files"
317 ]
318 ++ lib.optionals (stdenv.hostPlatform.isAarch64 && stdenv.hostPlatform.isDarwin) [
319 "--skip subnet_service::tests::attestation_service::test_subscribe_same_subnet_several_slots_apart"
320 "--skip subnet_service::tests::sync_committee_service::same_subscription_with_lower_until_epoch"
321 "--skip subnet_service::tests::sync_committee_service::subscribe_and_unsubscribe"
322 ];
323
324 passthru = {
325 tests.version = testers.testVersion {
326 package = lighthouse;
327 command = "lighthouse --version";
328 version = "v${lighthouse.version}";
329 };
330 updateScript = nix-update-script { };
331 };
332
333 enableParallelBuilding = true;
334
335 # This is needed by the unit tests.
336 FORK_NAME = "capella";
337
338 meta = with lib; {
339 description = "Ethereum consensus client in Rust";
340 homepage = "https://lighthouse.sigmaprime.io/";
341 license = licenses.asl20;
342 maintainers = with maintainers; [
343 centromere
344 pmw
345 ];
346 mainProgram = "lighthouse";
347 # can't compile build script with host libraries
348 broken =
349 stdenv.hostPlatform.isDarwin || !lib.systems.equals stdenv.buildPlatform stdenv.hostPlatform;
350 };
351}