Context: switch to blake2B

Get rid of the old SHA1 that was used by git...
This commit is contained in:
Grégoire Henry 2017-12-05 15:17:54 +01:00 committed by Benjamin Canou
parent 61984d6edd
commit 7807f7aa4d
13 changed files with 94 additions and 46 deletions

View File

@ -301,6 +301,7 @@ module Prefix = struct
let operation_list_hash = "\133\233" (* Lo(52) *)
let operation_list_list_hash = "\029\159\109" (* LLo(53) *)
let protocol_hash = "\002\170" (* P(51) *)
let context_hash = "\079\199" (* Co(52) *)
(* 20 *)
let ed25519_public_key_hash = "\006\161\159" (* tz1(36) *)

View File

@ -16,6 +16,7 @@ module Prefix : sig
val operation_list_hash: string
val operation_list_list_hash: string
val protocol_hash: string
val context_hash: string
val ed25519_public_key_hash: string
val cryptobox_public_key_hash: string
val ed25519_public_key: string

View File

@ -209,6 +209,11 @@ module Make (R : sig
Data_encoding.(list (tup2 encoding arg_encoding))
end
let zero =
match of_hex (String.make (size * 2) '0') with
| Some c -> c
| None -> assert false
end
module Generic_Merkle_tree (H : sig

View File

@ -0,0 +1,18 @@
(**************************************************************************)
(* *)
(* Copyright (c) 2014 - 2017. *)
(* Dynamic Ledger Solutions, Inc. <contact@tezos.com> *)
(* *)
(* All rights reserved. No warranty, explicit or implicit, provided. *)
(* *)
(**************************************************************************)
include Blake2B.Make (Base58) (struct
let name = "Context_hash"
let title = "A hash of context"
let b58check_prefix = Base58.Prefix.context_hash
let size = None
end)
let () =
Base58.check_encoded_prefix b58check_encoding "Co" 52

View File

@ -0,0 +1,10 @@
(**************************************************************************)
(* *)
(* Copyright (c) 2014 - 2017. *)
(* Dynamic Ledger Solutions, Inc. <contact@tezos.com> *)
(* *)
(* All rights reserved. No warranty, explicit or implicit, provided. *)
(* *)
(**************************************************************************)
include S.INTERNAL_HASH

View File

@ -148,3 +148,8 @@ end
let () =
Base58.check_encoded_prefix b58check_encoding "Net" 15
let zero =
match of_hex (String.make (size * 2) '0') with
| Some c -> c
| None -> assert false

View File

@ -94,6 +94,7 @@ module type INTERNAL_HASH = sig
(t -> 'a, 'arg, 'ret) Cli_entries.params
val random_set_elt: Set.t -> t
module Table : Hashtbl.S with type key = t
val zero: t
end
module type INTERNAL_MERKLE_TREE = sig

View File

@ -29,13 +29,49 @@ module Metadata = struct
let merge = Irmin.Merge.default t
end
module IrminBlake2B : Irmin.Hash.S with type t = Context_hash.t = struct
type t = Context_hash.t
let digest_size = Context_hash.size
let to_raw t = Cstruct.of_bigarray (Context_hash.to_bytes t)
let of_raw t =
match Context_hash.of_bytes (Cstruct.to_bigarray t) with
| Some t -> t
| None ->
let str = Cstruct.to_string t in
Format.kasprintf invalid_arg "%s (%d)" str (String.length str)
let t = Irmin.Type.like Irmin.Type.cstruct of_raw to_raw
let digest t x =
Context_hash.hash_bytes
[Cstruct.to_bigarray (Irmin.Type.encode_cstruct t x)]
let pp = Context_hash.pp
let of_string x =
match Context_hash.of_b58check_exn x with
| exception (Invalid_argument s) -> Error (`Msg s)
| h -> Ok h
let has_kind = function
| `SHA1 -> true
| _ -> false
let to_raw_int c =
Int64.to_int @@ MBytes.get_int64 (Context_hash.to_bytes c) 0
end
module GitStore =
Irmin_leveldb.Make
(Metadata)
(MBytesContent)
(Irmin.Path.String_list)
(Irmin.Branch.String)
(Irmin.Hash.SHA1)
(IrminBlake2B)
type index = {
path: string ;
@ -50,30 +86,6 @@ and context = {
}
type t = context
type commit = GitStore.Commit.Hash.t
let dummy_commit =
match
GitStore.Commit.Hash.of_string "0000000000000000000000000000000000000000"
with
| Ok c -> c
| Error _ -> assert false
let commit_encoding : commit Data_encoding.t =
let open Data_encoding in
conv
(fun c -> Cstruct.to_bigarray (Irmin.Type.encode_cstruct GitStore.Commit.Hash.t c))
(fun c ->
match
Irmin.Type.decode_cstruct
GitStore.Commit.Hash.t
(Cstruct.of_bigarray c)
with
| Ok x -> x
| _ -> assert false
)
bytes
(*-- Version Access and Update -----------------------------------------------*)
let current_protocol_key = ["protocol"]

View File

@ -16,11 +16,6 @@ type index
type t
type context = t
type commit
val dummy_commit: commit
val commit_encoding: commit Data_encoding.t
(** Open or initialize a versioned store at a given path. *)
val init:
?patch_context:(context -> context Lwt.t) ->
@ -32,11 +27,11 @@ val commit_genesis:
net_id:Net_id.t ->
time:Time.t ->
protocol:Protocol_hash.t ->
commit Lwt.t
Context_hash.t Lwt.t
val commit_test_network_genesis:
index -> Block_hash.t -> Time.t -> context ->
(Net_id.t * Block_hash.t * commit) tzresult Lwt.t
(Net_id.t * Block_hash.t * Context_hash.t) tzresult Lwt.t
(** {2 Generic interface} ****************************************************)
@ -61,16 +56,16 @@ val fold_keys:
(** {2 Accessing and Updating Versions} **************************************)
val exists: index -> commit -> bool Lwt.t
val checkout: index -> commit -> context option Lwt.t
val checkout_exn: index -> commit -> context Lwt.t
val exists: index -> Context_hash.t -> bool Lwt.t
val checkout: index -> Context_hash.t -> context option Lwt.t
val checkout_exn: index -> Context_hash.t -> context Lwt.t
val commit:
time:Time.t ->
message:string ->
context ->
commit Lwt.t
val set_head: index -> Net_id.t -> commit -> unit Lwt.t
val set_master: index -> commit -> unit Lwt.t
Context_hash.t Lwt.t
val set_head: index -> Net_id.t -> Context_hash.t -> unit Lwt.t
val set_master: index -> Context_hash.t -> unit Lwt.t
(** {2 Predefined Fields} ****************************************************)

View File

@ -86,7 +86,7 @@ module Block = struct
max_operations_ttl: int ;
max_number_of_operations: int list;
max_operation_data_length: int;
context: Context.commit ;
context: Context_hash.t ;
}
module Contents =
@ -115,7 +115,7 @@ module Block = struct
(req "max_operations_ttl" uint16)
(req "max_number_of_operations" (list uint16))
(req "max_operation_data_length" uint16)
(req "context" Context.commit_encoding)
(req "context" Context_hash.encoding)
(req "header" Block_header.encoding))
end))

View File

@ -90,7 +90,7 @@ module Block : sig
max_operations_ttl: int ;
max_number_of_operations: int list;
max_operation_data_length: int;
context: Context.commit ;
context: Context_hash.t ;
}
module Contents : SINGLE_STORE

View File

@ -84,10 +84,10 @@ let create_block3b idx block2_commit =
type t = {
idx: Context.index ;
genesis: Context.commit ;
block2: Context.commit ;
block3a: Context.commit ;
block3b: Context.commit ;
genesis: Context_hash.t ;
block2: Context_hash.t ;
block3a: Context_hash.t ;
block3b: Context_hash.t ;
}
let wrap_context_init f base_dir =

View File

@ -88,7 +88,7 @@ let lolblock ?(operations = []) header =
} ;
max_operations_ttl = 0 ;
message = "" ;
context = Context.dummy_commit ;
context = Context_hash.zero ;
max_number_of_operations = [] ;
max_operation_data_length = 0 ;
}