(*****************************************************************************) (* *) (* Open Source License *) (* Copyright (c) 2018 Dynamic Ledger Solutions, Inc. *) (* *) (* Permission is hereby granted, free of charge, to any person obtaining a *) (* copy of this software and associated documentation files (the "Software"),*) (* to deal in the Software without restriction, including without limitation *) (* the rights to use, copy, modify, merge, publish, distribute, sublicense, *) (* and/or sell copies of the Software, and to permit persons to whom the *) (* Software is furnished to do so, subject to the following conditions: *) (* *) (* The above copyright notice and this permission notice shall be included *) (* in all copies or substantial portions of the Software. *) (* *) (* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR*) (* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *) (* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *) (* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER*) (* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING *) (* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER *) (* DEALINGS IN THE SOFTWARE. *) (* *) (*****************************************************************************) type t = { level: Raw_level_repr.t ; level_position: int32 ; cycle: Cycle_repr.t ; cycle_position: int32 ; voting_period: Voting_period_repr.t ; voting_period_position: int32 ; expected_commitment: bool ; } include Compare.Make(struct type nonrec t = t let compare { level = l1 } { level = l2 } = Raw_level_repr.compare l1 l2 end) type level = t let pp ppf { level } = Raw_level_repr.pp ppf level let pp_full ppf l = Format.fprintf ppf "%a.%ld (cycle %a.%ld) (vote %a.%ld)" Raw_level_repr.pp l.level l.level_position Cycle_repr.pp l.cycle l.cycle_position Voting_period_repr.pp l.voting_period l.voting_period_position let encoding = let open Data_encoding in conv (fun { level ; level_position ; cycle ; cycle_position ; voting_period; voting_period_position ; expected_commitment } -> (level, level_position, cycle, cycle_position, voting_period, voting_period_position, expected_commitment)) (fun (level, level_position, cycle, cycle_position, voting_period, voting_period_position, expected_commitment) -> { level ; level_position ; cycle ; cycle_position ; voting_period ; voting_period_position ; expected_commitment }) (obj7 (req "level" ~description: "The level of the block relative to genesis. This is also \ the Shell's notion of level" Raw_level_repr.encoding) (req "level_position" ~description: "The level of the block relative to the block that starts \ protocol alpha. This is specific to the protocol \ alpha. Other protocols might or might not include a \ similar notion." int32) (req "cycle" ~description: "The current cycle's number. Note that cycles are a \ protocol-specific notion. As a result, the cycle number starts at 0 \ with the first block of protocol alpha." Cycle_repr.encoding) (req "cycle_position" ~description: "The current level of the block relative to the first \ block of the current cycle." int32) (req "voting_period" ~description: "The current voting period's index. Note that cycles are a \ protocol-specific notion. As a result, the voting period \ index starts at 0 with the first block of protocol alpha." Voting_period_repr.encoding) (req "voting_period_position" ~description: "The current level of the block relative to the first \ block of the current voting period." int32) (req "expected_commitment" ~description: "Tells wether the baker of this block has to commit a seed \ nonce hash." bool)) let root first_level = { level = first_level ; level_position = 0l ; cycle = Cycle_repr.root ; cycle_position = 0l ; voting_period = Voting_period_repr.root ; voting_period_position = 0l ; expected_commitment = false ; } let from_raw ~first_level ~blocks_per_cycle ~blocks_per_voting_period ~blocks_per_commitment level = let raw_level = Raw_level_repr.to_int32 level in let first_level = Raw_level_repr.to_int32 first_level in let level_position = Compare.Int32.max 0l (Int32.sub raw_level first_level) in let cycle = Cycle_repr.of_int32_exn (Int32.div level_position blocks_per_cycle) in let cycle_position = Int32.rem level_position blocks_per_cycle in let voting_period = Voting_period_repr.of_int32_exn (Int32.div level_position blocks_per_voting_period) in let voting_period_position = Int32.rem level_position blocks_per_voting_period in let expected_commitment = Compare.Int32.(Int32.rem cycle_position blocks_per_commitment = Int32.pred blocks_per_commitment) in { level ; level_position ; cycle ; cycle_position ; voting_period ; voting_period_position ; expected_commitment } let diff { level = l1 ; _ } { level = l2 ; _ } = Int32.sub (Raw_level_repr.to_int32 l1) (Raw_level_repr.to_int32 l2)