(*****************************************************************************) (* *) (* 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. *) (* *) (*****************************************************************************) (** Block header *) type t = {shell : Block_header.shell_header; protocol_data : protocol_data} and protocol_data = {contents : contents; signature : Signature.t} and contents = { priority : int; seed_nonce_hash : Nonce_hash.t option; proof_of_work_nonce : MBytes.t; } type block_header = t type raw = Block_header.t type shell_header = Block_header.shell_header let raw_encoding = Block_header.encoding let shell_header_encoding = Block_header.shell_header_encoding let contents_encoding = let open Data_encoding in def "block_header.alpha.unsigned_contents" @@ conv (fun {priority; seed_nonce_hash; proof_of_work_nonce} -> (priority, proof_of_work_nonce, seed_nonce_hash)) (fun (priority, proof_of_work_nonce, seed_nonce_hash) -> {priority; seed_nonce_hash; proof_of_work_nonce}) (obj3 (req "priority" uint16) (req "proof_of_work_nonce" (Fixed.bytes Constants_repr.proof_of_work_nonce_size)) (opt "seed_nonce_hash" Nonce_hash.encoding)) let protocol_data_encoding = let open Data_encoding in def "block_header.alpha.signed_contents" @@ conv (fun {contents; signature} -> (contents, signature)) (fun (contents, signature) -> {contents; signature}) (merge_objs contents_encoding (obj1 (req "signature" Signature.encoding))) let raw {shell; protocol_data} = let protocol_data = Data_encoding.Binary.to_bytes_exn protocol_data_encoding protocol_data in {Block_header.shell; protocol_data} let unsigned_encoding = let open Data_encoding in merge_objs Block_header.shell_header_encoding contents_encoding let encoding = let open Data_encoding in def "block_header.alpha.full_header" @@ conv (fun {shell; protocol_data} -> (shell, protocol_data)) (fun (shell, protocol_data) -> {shell; protocol_data}) (merge_objs Block_header.shell_header_encoding protocol_data_encoding) (** Constants *) let max_header_length = let fake_shell = { Block_header.level = 0l; proto_level = 0; predecessor = Block_hash.zero; timestamp = Time.of_seconds 0L; validation_passes = 0; operations_hash = Operation_list_list_hash.zero; fitness = Fitness_repr.from_int64 0L; context = Context_hash.zero; } and fake_contents = { priority = 0; proof_of_work_nonce = MBytes.create Constants_repr.proof_of_work_nonce_size; seed_nonce_hash = Some Nonce_hash.zero; } in Data_encoding.Binary.length encoding { shell = fake_shell; protocol_data = {contents = fake_contents; signature = Signature.zero}; } (** Header parsing entry point *) let hash_raw = Block_header.hash let hash {shell; protocol_data} = Block_header.hash { shell; protocol_data = Data_encoding.Binary.to_bytes_exn protocol_data_encoding protocol_data; }