RequestProcessProposal

Struct RequestProcessProposal 

Source
pub struct RequestProcessProposal {
Show 14 fields pub txs: Vec<Vec<u8>>, pub proposed_last_commit: Option<CommitInfo>, pub misbehavior: Vec<Misbehavior>, pub hash: Vec<u8>, pub height: i64, pub round: i32, pub time: Option<Timestamp>, pub next_validators_hash: Vec<u8>, pub core_chain_locked_height: u32, pub core_chain_lock_update: Option<CoreChainLock>, pub proposer_pro_tx_hash: Vec<u8>, pub proposed_app_version: u64, pub version: Option<Consensus>, pub quorum_hash: Vec<u8>,
}
Expand description

Process prepared proposal.

§Usage
  • Contains fields from the proposed block.
    • The Application may fully execute the block as though it was handling RequestFinalizeBlock. However, any resulting state changes must be kept as candidate state, and the Application should be ready to backtrack/discard it in case the decided block is different.
  • The height and timestamp values match the values from the header of the proposed block.
  • If ResponseProcessProposal.status is REJECT, Tenderdash assumes the proposal received is not valid.
  • In same-block execution mode, the Application is required to fully execute the block and provide values for parameters ResponseProcessProposal.app_hash, ResponseProcessProposal.tx_results, ResponseProcessProposal.validator_updates, and ResponseProcessProposal.consensus_param_updates, so that Tenderdash can then verify the hashes in the block’s header are correct. If the hashes mismatch, Tenderdash will reject the block even if ResponseProcessProposal.status was set to ACCEPT.
  • The implementation of ProcessProposal MUST be deterministic. Moreover, the value of ResponseProcessProposal.status MUST exclusively depend on the parameters passed in the call to RequestProcessProposal, and the last committed Application state (see Requirements section).
  • Moreover, application implementors SHOULD always set ResponseProcessProposal.status to ACCEPT, unless they really know what the potential liveness implications of returning REJECT are.
§When does Tenderdash call it?

When a validator p enters Tenderdash consensus round r, height h, in which q is the proposer (possibly p = q):

  1. p sets up timer ProposeTimeout.
  2. If p is the proposer, p executes steps 1-6 in PrepareProposal.
  3. Upon reception of Proposal message (which contains the header) for round r, height h from q, p’s Tenderdash verifies the block header.
  4. Upon reception of Proposal message, along with all the block parts, for round r, height h from q, p’s Tenderdash follows its algorithm to check whether it should prevote for the block just received, or nil
  5. If Tenderdash should prevote for the block just received
    1. Tenderdash calls RequestProcessProposal with the block. The call is synchronous.
    2. The Application checks/processes the proposed block, which is read-only, and returns true (accept) or false (reject) in ResponseProcessProposal.accept.
      • The Application, depending on its needs, may call ResponseProcessProposal
        • either after it has completely processed the block (the simpler case),
        • or immediately (after doing some basic checks), and process the block asynchronously. In this case the Application will not be able to reject the block, or force prevote/precommit nil afterwards.
    3. If the returned value is
      • accept, Tenderdash prevotes on this proposal for round r, height h.
      • reject, Tenderdash prevotes nil.

Fields§

§txs: Vec<Vec<u8>>

List of transactions that have been picked as part of the proposed

§proposed_last_commit: Option<CommitInfo>

Info about the last commit, obtained from the information in the proposed block.

§misbehavior: Vec<Misbehavior>

List of information about validators that acted incorrectly.

§hash: Vec<u8>

The block header’s hash of the proposed block. It is computed as a Merkle tree from the header fields.

§height: i64

The height of the proposed block.

§round: i32

Round number for the block

§time: Option<Timestamp>

Timestamp included in the proposed block.

§next_validators_hash: Vec<u8>

Merkle root of the next validator set.

§core_chain_locked_height: u32

Core chain lock height to be used when signing this block.

§core_chain_lock_update: Option<CoreChainLock>

Next core-chain-lock-update for validation in ABCI.

§proposer_pro_tx_hash: Vec<u8>

ProTxHash of the original proposer of the block.

§proposed_app_version: u64

Proposer’s latest available app protocol version.

§version: Option<Consensus>

App and block version used to generate the block. App version MUST be verified by the app.

§quorum_hash: Vec<u8>

quorum_hash contains hash of validator quorum that will sign the block

Trait Implementations§

Source§

impl Clone for RequestProcessProposal

Source§

fn clone(&self) -> RequestProcessProposal

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for RequestProcessProposal

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for RequestProcessProposal

Source§

fn default() -> Self

Returns the “default value” for a type. Read more
Source§

impl<'de> Deserialize<'de> for RequestProcessProposal

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl From<RequestProcessProposal> for Value

Source§

fn from(value: RequestProcessProposal) -> Self

Converts to this type from the input type.
Source§

impl Message for RequestProcessProposal

Source§

fn encoded_len(&self) -> usize

Returns the encoded length of the message without a length delimiter.
Source§

fn clear(&mut self)

Clears the message, resetting all fields to their default.
Source§

fn encode(&self, buf: &mut impl BufMut) -> Result<(), EncodeError>
where Self: Sized,

Encodes the message to a buffer. Read more
Source§

fn encode_to_vec(&self) -> Vec<u8>
where Self: Sized,

Encodes the message to a newly allocated buffer.
Source§

fn encode_length_delimited( &self, buf: &mut impl BufMut, ) -> Result<(), EncodeError>
where Self: Sized,

Encodes the message with a length-delimiter to a buffer. Read more
Source§

fn encode_length_delimited_to_vec(&self) -> Vec<u8>
where Self: Sized,

Encodes the message with a length-delimiter to a newly allocated buffer.
Source§

fn decode(buf: impl Buf) -> Result<Self, DecodeError>
where Self: Default,

Decodes an instance of the message from a buffer. Read more
Source§

fn decode_length_delimited(buf: impl Buf) -> Result<Self, DecodeError>
where Self: Default,

Decodes a length-delimited instance of the message from the buffer.
Source§

fn merge(&mut self, buf: impl Buf) -> Result<(), DecodeError>
where Self: Sized,

Decodes an instance of the message from a buffer, and merges it into self. Read more
Source§

fn merge_length_delimited(&mut self, buf: impl Buf) -> Result<(), DecodeError>
where Self: Sized,

Decodes a length-delimited instance of the message from buffer, and merges it into self.
Source§

impl PartialEq for RequestProcessProposal

Source§

fn eq(&self, other: &RequestProcessProposal) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl Serialize for RequestProcessProposal

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl StructuralPartialEq for RequestProcessProposal

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> FromRef<T> for T
where T: Clone,

§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

§

impl<T> IntoRequest<T> for T

§

fn into_request(self) -> Request<T>

Wrap the input message T in a tonic::Request
§

impl<L> LayerExt<L> for L

§

fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>
where L: Layer<S>,

Applies the layer to a service and wraps it in [Layered].
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more
Source§

impl<T> DeserializeOwned for T
where T: for<'de> Deserialize<'de>,