Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix #6542 #6563

Merged
merged 4 commits into from
Oct 31, 2020
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 15 additions & 10 deletions src/lib/coda_base/ledger_transfer.ml
Original file line number Diff line number Diff line change
Expand Up @@ -37,15 +37,20 @@ module From_sparse_ledger (Dest : Base_ledger_intf) : sig
src:Sparse_ledger.t -> dest:Dest.t -> Dest.t Or_error.t
end = struct
let transfer_accounts ~src ~dest =
Sparse_ledger.iteri src ~f:(fun _idx account ->
let id = Account.identifier account in
ignore (Dest.get_or_create_account_exn dest id account) ) ;
let src_hash = Sparse_ledger.merkle_root src in
let dest_hash = Dest.merkle_root dest in
if not (Ledger_hash.equal src_hash dest_hash) then
if Dest.depth dest = Sparse_ledger.depth src then (
Sparse_ledger.iteri src ~f:(fun _idx account ->
let id = Account.identifier account in
ignore (Dest.get_or_create_account_exn dest id account) ) ;
let src_hash = Sparse_ledger.merkle_root src in
let dest_hash = Dest.merkle_root dest in
if not (Ledger_hash.equal src_hash dest_hash) then
Or_error.errorf
"Merkle roots differ after transfer: expected %s, actual %s"
(Ledger_hash.to_string src_hash)
(Ledger_hash.to_string dest_hash)
else Ok dest )
else
Or_error.errorf
"Merkle roots differ after transfer: expected %s, actual %s"
(Ledger_hash.to_string src_hash)
(Ledger_hash.to_string dest_hash)
else Ok dest
"Ledger depth of src and dest doesn't match: src %d, dest %d"
(Sparse_ledger.depth src) (Dest.depth dest)
end
2 changes: 2 additions & 0 deletions src/lib/coda_base/sparse_ledger.ml
Original file line number Diff line number Diff line change
Expand Up @@ -617,6 +617,8 @@ let has_locked_tokens_exn ~global_slot ~account_id t =
let merkle_root t =
Ledger_hash.of_hash (merkle_root t :> Random_oracle.Digest.t)

let depth t = M.depth t

let handler t =
let ledger = ref t in
let path_exn idx =
Expand Down
2 changes: 2 additions & 0 deletions src/lib/coda_base/sparse_ledger.mli
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ end]

val merkle_root : t -> Ledger_hash.t

val depth : t -> int

val next_available_token : t -> Token_id.t

val get_exn : t -> int -> Account.t
Expand Down
30 changes: 22 additions & 8 deletions src/lib/consensus/proof_of_stake.ml
Original file line number Diff line number Diff line change
Expand Up @@ -419,6 +419,7 @@ module Data = struct

let reset_snapshot (t : t) id ~sparse_ledger ~ledger_depth =
let open Coda_base in
let open Or_error.Let_syntax in
let module Ledger_transfer =
Coda_base.Ledger_transfer.From_sparse_ledger (Ledger.Db) in
let delegatee_table =
Expand All @@ -434,8 +435,9 @@ module Data = struct
let ledger =
Ledger.Db.create ~directory_name:location ~depth:ledger_depth ()
in
ignore
@@ Ledger_transfer.transfer_accounts ~src:sparse_ledger ~dest:ledger ;
let%map (_ : Ledger.Db.t) =
Ledger_transfer.transfer_accounts ~src:sparse_ledger ~dest:ledger
in
!t.staking_epoch_snapshot
<- { delegatee_table
; ledger= Snapshot.Ledger_snapshot.Ledger_db ledger }
Expand All @@ -446,8 +448,9 @@ module Data = struct
let ledger =
Ledger.Db.create ~directory_name:location ~depth:ledger_depth ()
in
ignore
@@ Ledger_transfer.transfer_accounts ~src:sparse_ledger ~dest:ledger ;
let%map (_ : Ledger.Db.t) =
Ledger_transfer.transfer_accounts ~src:sparse_ledger ~dest:ledger
in
!t.next_epoch_snapshot
<- { delegatee_table
; ledger= Snapshot.Ledger_snapshot.Ledger_db ledger }
Expand Down Expand Up @@ -2657,15 +2660,26 @@ module Hooks = struct
query_peer.query peer Rpcs.Get_epoch_ledger
(Coda_base.Frozen_ledger_hash.to_ledger_hash target_ledger_hash)
with
| Connected {data= Ok (Ok sparse_ledger); _} ->
| Connected {data= Ok (Ok sparse_ledger); _} -> (
let%bind () =
Trust_system.(
record trust_system logger peer
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should we record this only if it provides a valid epoch ledger?

Actions.(Epoch_ledger_provided, None))
in
reset_snapshot local_state snapshot_id ~sparse_ledger
~ledger_depth ;
return true
match
reset_snapshot local_state snapshot_id ~sparse_ledger
~ledger_depth
with
| Ok () ->
return true
| Error e ->
[%log faulty_peer_without_punishment]
~metadata:
[ ("peer", Network_peer.Peer.to_yojson peer)
; ("error", `String (Error.to_string_hum e)) ]
"Peer $peer failed to serve requested epoch ledger: \
$error" ;
return false )
| Connected {data= Ok (Error err); _} ->
(* TODO figure out punishments here. *)
[%log faulty_peer_without_punishment]
Expand Down
4 changes: 4 additions & 0 deletions src/lib/sparse_ledger_lib/sparse_ledger.ml
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,8 @@ module type S = sig

val merkle_root : t -> hash

val depth : t -> int

val next_available_token : t -> token_id
end

Expand Down Expand Up @@ -126,6 +128,8 @@ end = struct

type index = int [@@deriving sexp, to_yojson]

let depth {T.depth; _} = depth

let merkle_root {T.tree; _} = hash tree

let next_available_token {T.next_available_token; _} = next_available_token
Expand Down