Mina中的stake_proof

1. 引言

前序博客有:

module Block_data = struct
    type t =
      { stake_proof : Stake_proof.t
      ; global_slot : Mina_numbers.Global_slot.t
      ; global_slot_since_genesis : Mina_numbers.Global_slot.t
      ; vrf_result : Random_oracle.Digest.t
      }
      
 (* Stake_proof结构为: *)
 type t =
      { delegator : Account.Index.Stable.V1.t
      ; delegator_pk : Public_key.Compressed.Stable.V1.t
      ; coinbase_receiver_pk : Public_key.Compressed.Stable.V1.t
      ; ledger : Mina_ledger.Sparse_ledger.Stable.V2.t
      ; producer_private_key : Private_key.Stable.V1.t
      ; producer_public_key : Public_key.Stable.V1.t
      }
           
(* block_producer.ml中的block_data来源:*)
						let data =
                         Consensus.Hooks.get_block_data ~slot_won
                           ~ledger_snapshot
                           ~coinbase_receiver:!coinbase_receiver

  let get_block_data ~(slot_won : Slot_won.t) ~ledger_snapshot
      ~coinbase_receiver =
    let delegator_pk, delegator_idx = slot_won.delegator in
    let producer_public_key = slot_won.producer.public_key in
    let producer_private_key = slot_won.producer.private_key in
    let producer_pk = Public_key.compress producer_public_key in
    { Block_data.stake_proof =
        { producer_private_key
        ; producer_public_key
        ; delegator = delegator_idx
        ; delegator_pk
        ; coinbase_receiver_pk =
            Coinbase_receiver.resolve ~self:producer_pk coinbase_receiver
        ; ledger =
            Local_state.Snapshot.Ledger_snapshot.ledger_subset
              [ Mina_base.(Account_id.create producer_pk Token_id.default)
              ; Mina_base.(Account_id.create delegator_pk Token_id.default)
              ]
              ledger_snapshot
        }
    ; global_slot = slot_won.global_slot
    ; global_slot_since_genesis = slot_won.global_slot_since_genesis
    ; vrf_result = slot_won.vrf_result
    }

会调用is_satisfied函数确认产块者的质押量和其vrf结果是否符合要求:

(* Check if
     vrf_output / 2^256 <= c * (1 - (1 - f)^(amount / total_stake))
  *)
  let is_satisfied ~my_stake ~total_stake vrf_output = .......

附录1. Mina系列博客

Mina系列博客有:

猜你喜欢

转载自blog.csdn.net/mutourend/article/details/124585678