nimbus-eth2/beacon_chain/spec/eth2_apis/rest_nimbus_calls.nim
Eugene Kabanov fcf72a6e8e
VC: Electra fixes. (#6631)
* Initial commit.

* Add aggregated attestation processing.

* Add missing presets file.

* Fix compilation error.

* Fix post-rebase compilation error.

* Satisfy push raises requirement.

* Fix sync committee duties retrieval process.

* Fix forks configuration management.

* Fix deposits to use new fork configuration scheme.

* Fix /eth/v2/validator/aggregate_attestation implementation.

* Fix RANDAO preparation loop to handle blocks at epoch boundary properly.

* Simplification of RANDAO fix.

* Fix typo.

* Address review comments and fix tests.

* Fix incorrect status codes in REST test.

* Rework attestation and aggregated attestations processing code.

* Address review comments.

* Fill committee_index in RegisteredAttestation construction code.

* Address review comments part 2.

* Address review comments part 3.

* use Deneb fork epoch

* Add transition from Deneb to Electra into CI finalization test.

---------

Co-authored-by: tersec <tersec@users.noreply.github.com>
2024-10-16 17:20:39 +00:00

79 lines
3.2 KiB
Nim

# beacon_chain
# Copyright (c) 2018-2024 Status Research & Development GmbH
# Licensed and distributed under either of
# * MIT license (license terms in the root directory or at https://opensource.org/licenses/MIT).
# * Apache v2 license (license terms in the root directory or at https://www.apache.org/licenses/LICENSE-2.0).
# at your option. This file may not be copied, modified, or distributed except according to those terms.
{.push raises: [].}
import
chronicles, presto/client,
"."/[rest_types, eth2_rest_serialization, rest_common]
proc getValidatorsActivity*(epoch: Epoch,
body: seq[ValidatorIndex]
): RestPlainResponse {.
rest, endpoint: "/nimbus/v1/validator/activity/{epoch}",
meth: MethodPost.}
proc getTimesyncInifo*(body: RestNimbusTimestamp1): RestPlainResponse {.
rest, endpoint: "/nimbus/v1/timesync", meth: MethodPost.}
proc getTimeOffset*(client: RestClientRef,
delay: Duration): Future[int64] {.
async: (raises: [RestError, RestResponseError, CancelledError]).} =
let
timestamp1 = getTimestamp()
data = RestNimbusTimestamp1(timestamp1: timestamp1)
resp = await client.getTimesyncInifo(data)
timestamp4 = getTimestamp()
case resp.status
of 200:
if resp.contentType.isNone() or
isWildCard(resp.contentType.get().mediaType) or
resp.contentType.get().mediaType != ApplicationJsonMediaType:
raise newException(RestError, "Missing or incorrect Content-Type")
let stamps = decodeBytes(RestNimbusTimestamp2, resp.data,
resp.contentType).valueOr:
raise newException(RestError, $error)
trace "Time offset data",
timestamp1 = timestamp1,
timestamp2 = stamps.timestamp2,
timestamp3 = stamps.timestamp3,
timestamp4 = timestamp4,
delay14 = delay.nanoseconds,
delay23 = stamps.delay
# t1 - time when we sent request.
# t2 - time when remote server received request.
# t3 - time when remote server sent response.
# t4 - time when we received response.
# delay14 = validator client processing delay.
# delay23 = beacon node processing delay.
#
# Round-trip network delay `delta` = (t4 - t1) - (t3 - t2)
# but with delays this will be:
# `delta` = (t4 - t1 + delay14) - (t3 - t2 + delay23)
# Estimated server time is t3 + (delta div 2)
# Estimated clock skew `theta` = t3 + (delta div 2) - t4
let
delay14 = delay.nanoseconds
delay23 = int64(stamps.delay)
offset = (int64(stamps.timestamp2) - int64(timestamp1) +
int64(stamps.timestamp3) - int64(timestamp4) +
delay14 - delay23) div 2
offset
else:
let error = decodeBytes(RestErrorMessage, resp.data,
resp.contentType).valueOr:
let msg = "Incorrect response error format (" & $resp.status &
") [" & $error & "]"
raise (ref RestResponseError)(msg: msg, status: resp.status)
let msg = "Error response (" & $resp.status & ") [" & error.message & "]"
raise (ref RestResponseError)(
msg: msg, status: error.code, message: error.message)