From c8eb1a3fa6e39e7bec8b1f740a0e1eadec9f4528 Mon Sep 17 00:00:00 2001 From: Lesenechal Remi Date: Tue, 26 Nov 2019 11:51:49 +0100 Subject: [PATCH] multisigv2 with less user uncertainty --- src/stages/ast_simplified/combinators.ml | 4 +- src/stages/ast_simplified/combinators.mli | 2 +- src/test/contracts/multisig-v2.ligo | 7 +++- src/test/multisig_v2_tests.ml | 48 ++++++++++++----------- src/test/test_helpers.ml | 4 ++ 5 files changed, 38 insertions(+), 27 deletions(-) diff --git a/src/stages/ast_simplified/combinators.ml b/src/stages/ast_simplified/combinators.ml index 4ea4e535a..95ae05e05 100644 --- a/src/stages/ast_simplified/combinators.ml +++ b/src/stages/ast_simplified/combinators.ml @@ -75,8 +75,8 @@ let e'_bytes b : expression' result = let e_bytes ?loc b : expression result = let%bind e' = e'_bytes b in ok @@ location_wrap ?loc e' -let e_bytes_ofbytes ?loc (b: bytes) : expression result = - ok @@ location_wrap ?loc @@ E_literal (Literal_bytes b) +let e_bytes_ofbytes ?loc (b: bytes) : expression = + location_wrap ?loc @@ E_literal (Literal_bytes b) let e_big_map ?loc lst : expression = location_wrap ?loc @@ E_big_map lst let e_record ?loc map : expression = location_wrap ?loc @@ E_record map let e_tuple ?loc lst : expression = location_wrap ?loc @@ E_tuple lst diff --git a/src/stages/ast_simplified/combinators.mli b/src/stages/ast_simplified/combinators.mli index cb8a27e76..4382e7da5 100644 --- a/src/stages/ast_simplified/combinators.mli +++ b/src/stages/ast_simplified/combinators.mli @@ -61,7 +61,7 @@ val e_chain_id : ?loc:Location.t -> string -> expression val e_mutez : ?loc:Location.t -> int -> expression val e'_bytes : string -> expression' result val e_bytes : ?loc:Location.t -> string -> expression result -val e_bytes_ofbytes : ?loc:Location.t -> bytes -> expression result +val e_bytes_ofbytes : ?loc:Location.t -> bytes -> expression val e_big_map : ?loc:Location.t -> ( expr * expr ) list -> expression (* val e_record : ?loc:Location.t -> ( expr * expr ) list -> expression diff --git a/src/test/contracts/multisig-v2.ligo b/src/test/contracts/multisig-v2.ligo index 027335e3c..f28d577f7 100644 --- a/src/test/contracts/multisig-v2.ligo +++ b/src/test/contracts/multisig-v2.ligo @@ -2,11 +2,13 @@ type threshold_t is nat type max_proposal_t is nat type max_message_size_t is nat +type state_hash_t is bytes type addr_set_t is set(address) type message_store_t is map(bytes,addr_set_t) type counter_store_t is map(address,nat) type storage_t is record + state_hash : state_hash_t ; threshold : threshold_t ; max_proposal : max_proposal_t ; max_message_size : max_message_size_t ; @@ -16,7 +18,7 @@ type storage_t is record end // I/O types -type message_t is (unit -> list(operation)) +type message_t is (bytes -> list(operation)) type send_pt is message_t type withdraw_pt is message_t @@ -56,7 +58,8 @@ function send (const param : send_pt; const s : storage_t) : contract_return_t i if size(new_store) >= s.threshold then block { remove packed_msg from map s.message_store ; - ret_ops := message(unit) ; + ret_ops := message(s.state_hash) ; + s.state_hash := sha_256 ( bytes_concat (s.state_hash , packed_msg) ) ; s.counter_store[sender] := abs (sender_proposal_counter - 1n) ; } else s.message_store[packed_msg] := new_store diff --git a/src/test/multisig_v2_tests.ml b/src/test/multisig_v2_tests.ml index 65ef32641..018567278 100644 --- a/src/test/multisig_v2_tests.ml +++ b/src/test/multisig_v2_tests.ml @@ -25,23 +25,24 @@ open Ast_simplified let empty_op_list = (e_typed_list [] t_operation) let empty_message = e_lambda "arguments" - (Some t_unit) (Some (t_list t_operation)) + (Some t_bytes) (Some (t_list t_operation)) empty_op_list let empty_message2 = e_lambda "arguments" - (Some t_unit) (Some (t_list t_operation)) + (Some t_bytes) (Some (t_list t_operation)) ( e_let_in ("foo",Some t_unit) (e_unit ()) empty_op_list) let send_param msg = e_constructor "Send" msg let withdraw_param = e_constructor "Withdraw" empty_message type st_type = { + state_hash : bytes ; threshold:int ; max_proposal:int ; max_msg_size:int ; id_counter_list: (int * int) list ; msg_store_list: (expression * expression) list ; } -let storage {threshold ; max_proposal ; max_msg_size ; id_counter_list ; msg_store_list} = +let storage {state_hash ; threshold ; max_proposal ; max_msg_size ; id_counter_list ; msg_store_list} = let auth_set,counter_store = List.fold_left (fun (auth_set,counter_st) (id,ctr) -> let addr_exp = e_address @@ addr id in @@ -49,11 +50,12 @@ let storage {threshold ; max_proposal ; max_msg_size ; id_counter_list ; msg_sto ([],[]) id_counter_list in e_ez_record [ + ("state_hash" , e_bytes_ofbytes state_hash ) ; ("threshold" , e_nat threshold ) ; ("max_proposal" , e_nat max_proposal ) ; ("max_message_size", e_nat max_msg_size ) ; ("auth" , e_typed_set auth_set t_address ) ; - ("message_store" , e_typed_map msg_store_list t_bytes (t_set t_address) ) ; + ("message_store" , e_typed_map msg_store_list t_bytes (t_set t_address) ) ; ("counter_store" , e_typed_map counter_store t_address t_nat ) ; ] @@ -61,7 +63,7 @@ let storage {threshold ; max_proposal ; max_msg_size ; id_counter_list ; msg_sto let wrong_addr () = let%bind program,_ = get_program () in let init_storage = storage { - threshold = 1 ; max_proposal = 1 ; max_msg_size = 1 ; + threshold = 1 ; max_proposal = 1 ; max_msg_size = 1 ; state_hash = Bytes.empty ; id_counter_list = [1,0 ; 2,0] ; msg_store_list = [] } in @@ -77,7 +79,7 @@ let wrong_addr () = let message_size_exceeded () = let%bind program,_ = get_program () in let init_storage = storage { - threshold = 1 ; max_proposal = 1 ; max_msg_size = 1 ; + threshold = 1 ; max_proposal = 1 ; max_msg_size = 1 ; state_hash = Bytes.empty ; id_counter_list = [1,0] ; msg_store_list = [] } in @@ -93,9 +95,9 @@ let message_size_exceeded () = let maximum_number_of_proposal () = let%bind program,_ = get_program () in let%bind packed_payload1 = pack_payload program (send_param empty_message) in - let%bind bytes1 = e_bytes_ofbytes packed_payload1 in + let bytes1 = e_bytes_ofbytes packed_payload1 in let init_storage = storage { - threshold = 1 ; max_proposal = 1 ; max_msg_size = 15 ; + threshold = 1 ; max_proposal = 1 ; max_msg_size = 15 ; state_hash = Bytes.empty ; id_counter_list = [1,1] ; msg_store_list = [(bytes1, e_set [e_address@@ addr 1])] } in @@ -111,9 +113,9 @@ let maximum_number_of_proposal () = let send_already_accounted () = let%bind program,_ = get_program () in let%bind packed_payload = pack_payload program empty_message in - let%bind bytes = e_bytes_ofbytes packed_payload in + let bytes = e_bytes_ofbytes packed_payload in let init_storage = storage { - threshold = 2 ; max_proposal = 1 ; max_msg_size = 15 ; + threshold = 2 ; max_proposal = 1 ; max_msg_size = 15 ; state_hash = Bytes.empty ; id_counter_list = [1,1 ; 2,0] ; msg_store_list = [(bytes, e_set [e_address@@ addr 1])] } in @@ -127,9 +129,9 @@ let send_already_accounted () = let send_never_accounted () = let%bind program,_ = get_program () in let%bind packed_payload = pack_payload program empty_message in - let%bind bytes = e_bytes_ofbytes packed_payload in + let bytes = e_bytes_ofbytes packed_payload in let init_storage' = { - threshold = 2 ; max_proposal = 1 ; max_msg_size = 15 ; + threshold = 2 ; max_proposal = 1 ; max_msg_size = 15 ; state_hash = Bytes.empty ; id_counter_list = [1,0 ; 2,0] ; msg_store_list = [] } in @@ -148,10 +150,10 @@ let send_never_accounted () = let withdraw_already_accounted_one () = let%bind program,_ = get_program () in let%bind packed_payload = pack_payload program empty_message in - let%bind bytes = e_bytes_ofbytes packed_payload in + let bytes = e_bytes_ofbytes packed_payload in let param = withdraw_param in let init_storage' = { - threshold = 2 ; max_proposal = 1 ; max_msg_size = 1 ; + threshold = 2 ; max_proposal = 1 ; max_msg_size = 1 ; state_hash = Bytes.empty ; id_counter_list = [1,1 ; 2,0] ; msg_store_list = [(bytes, e_set [e_address@@ addr 1])] ; } in @@ -169,10 +171,10 @@ let withdraw_already_accounted_one () = let withdraw_already_accounted_two () = let%bind program,_ = get_program () in let%bind packed_payload = pack_payload program empty_message in - let%bind bytes = e_bytes_ofbytes packed_payload in + let bytes = e_bytes_ofbytes packed_payload in let param = withdraw_param in let init_storage' = { - threshold = 2 ; max_proposal = 2 ; max_msg_size = 1 ; + threshold = 2 ; max_proposal = 2 ; max_msg_size = 1 ; state_hash = Bytes.empty ; id_counter_list = [1,1 ; 2,1] ; msg_store_list = [(bytes, e_set [e_address@@ addr 1; e_address@@ addr 2])] ; } in @@ -191,7 +193,7 @@ let withdraw_never_accounted () = let%bind program,_ = get_program () in let param = withdraw_param in let init_storage = storage { - threshold = 2 ; max_proposal = 1 ; max_msg_size = 1 ; + threshold = 2 ; max_proposal = 1 ; max_msg_size = 1 ; state_hash = Bytes.empty ; id_counter_list = [1,0 ; 2,0] ; msg_store_list = [] ; } in @@ -205,9 +207,9 @@ let withdraw_never_accounted () = let succeeded_storing () = let%bind program,_ = get_program () in let%bind packed_payload = pack_payload program empty_message in - let%bind bytes = e_bytes_ofbytes packed_payload in + let bytes = e_bytes_ofbytes packed_payload in let init_storage th = { - threshold = th ; max_proposal = 1 ; max_msg_size = 15 ; + threshold = th ; max_proposal = 1 ; max_msg_size = 15 ; state_hash = Bytes.empty ; id_counter_list = [1,0 ; 2,0 ; 3,0] ; msg_store_list = [(bytes, e_typed_set [] t_address)] ; } in @@ -220,11 +222,13 @@ let succeeded_storing () = ok @@ e_pair (send_param empty_message) init_storage ) (fun th -> - let final_id_counter, final_msg_store, ret = match th with - | 1 -> [1,0 ; 2,0 ; 3,0] , [] , empty_op_list - | 2 -> [1,1 ; 2,0 ; 3,0] , [(bytes, e_set [e_address@@ addr 1])] , empty_op_list + let hash_after_msg = sha_256_hash (Bytes.concat Bytes.empty [Bytes.empty ; packed_payload]) in + let final_id_counter, final_msg_store, ret, final_state_hash = match th with + | 1 -> [1,0 ; 2,0 ; 3,0] , [] , empty_op_list , hash_after_msg + | 2 -> [1,1 ; 2,0 ; 3,0] , [(bytes, e_set [e_address@@ addr 1])] , empty_op_list , (init_storage th).state_hash | _ -> assert false in let final_storage = storage { (init_storage th) with + state_hash = final_state_hash ; msg_store_list = final_msg_store ; id_counter_list = final_id_counter } in ok @@ e_pair ret final_storage diff --git a/src/test/test_helpers.ml b/src/test/test_helpers.ml index 955626dd4..9f10cce7e 100644 --- a/src/test/test_helpers.ml +++ b/src/test/test_helpers.ml @@ -70,6 +70,10 @@ let str_keys (raw_pkh, raw_pk, raw_sk) = let pkh_str = Signature.Public_key_hash.to_b58check raw_pkh in (pkh_str,pk_str,sk_str) +let sha_256_hash pl = + let open Proto_alpha_utils.Memory_proto_alpha.Alpha_environment in + Raw_hashes.sha256 pl + open Ast_simplified.Combinators let expect ?options program entry_point input expecter =