sdk/util: added block height retrieval functions and use them at appropriate places

This commit is contained in:
aggstam
2024-01-16 18:07:39 +02:00
parent e340fa6824
commit e829424a9c
8 changed files with 100 additions and 29 deletions

View File

@@ -27,7 +27,7 @@ use darkfi_sdk::{
error::{ContractError, ContractResult},
msg,
pasta::pallas,
util::get_verifying_slot,
util::get_verifying_block_height,
ContractCall,
};
use darkfi_serial::{deserialize, serialize, Encodable, WriteExt};
@@ -85,7 +85,7 @@ pub(crate) fn dao_propose_get_metadata(
}
// ANCHOR: dao-blockheight_to_day-example-usage
let current_day = blockheight_to_day(get_verifying_slot());
let current_day = blockheight_to_day(get_verifying_block_height());
// ANCHOR_END: dao-blockheight_to_day-example-usage
let total_funds_coords = total_funds_commit.to_affine().coordinates().unwrap();

View File

@@ -24,7 +24,7 @@ use darkfi_sdk::{
error::{ContractError, ContractResult},
msg,
pasta::pallas,
util::get_verifying_slot,
util::get_verifying_block_height,
ContractCall,
};
use darkfi_serial::{deserialize, serialize, Encodable, WriteExt};
@@ -81,7 +81,7 @@ pub(crate) fn dao_vote_get_metadata(
));
}
let current_day = blockheight_to_day(get_verifying_slot());
let current_day = blockheight_to_day(get_verifying_block_height());
let yes_vote_commit_coords = params.yes_vote_commit.to_affine().coordinates().unwrap();
let all_vote_commit_coords = all_vote_commit.to_affine().coordinates().unwrap();

View File

@@ -26,7 +26,7 @@ use darkfi_sdk::{
error::{ContractError, ContractResult},
merkle_add, msg,
pasta::pallas,
util::get_verifying_slot,
util::get_verifying_block_height,
ContractCall,
};
use darkfi_serial::{deserialize, serialize, Encodable, WriteExt};
@@ -83,11 +83,14 @@ pub(crate) fn money_genesis_mint_process_instruction_v1(
let self_ = &calls[call_idx as usize].data;
let params: MoneyGenesisMintParamsV1 = deserialize(&self_.data[1..])?;
// Verify this contract call is verified against on genesis slot(0).
let verifying_slot = get_verifying_slot();
if verifying_slot != 0 {
msg!("[GenesisMintV1] Error: Call is executed for slot {}, not genesis", verifying_slot);
return Err(MoneyError::GenesisCallNonGenesisSlot.into())
// Verify this contract call is verified against genesis block(0).
let verifying_block_height = get_verifying_block_height();
if verifying_block_height != 0 {
msg!(
"[GenesisMintV1] Error: Call is executed for slot {}, not genesis",
verifying_block_height
);
return Err(MoneyError::GenesisCallNonGenesisBlock.into())
}
// Only DARK_TOKEN_ID can be minted on genesis slot.

View File

@@ -27,7 +27,7 @@ use darkfi_sdk::{
error::{ContractError, ContractResult},
merkle_add, msg,
pasta::pallas,
util::{get_slot, get_verifying_slot},
util::{get_slot, get_verifying_block_height},
ContractCall,
};
use darkfi_serial::{deserialize, serialize, Encodable, WriteExt};
@@ -84,21 +84,21 @@ pub(crate) fn money_pow_reward_process_instruction_v1(
let self_ = &calls[call_idx as usize].data;
let params: MoneyPoWRewardParamsV1 = deserialize(&self_.data[1..])?;
// Verify this contract call is verified against a slot(block height) before PoS transition,
// Verify this contract call is verified against a block height(slot) before PoS transition,
// excluding genesis.
let verifying_slot = get_verifying_slot();
if verifying_slot == 0 || verifying_slot > POW_CUTOFF {
let verifying_block_height = get_verifying_block_height();
if verifying_block_height == 0 || verifying_block_height > POW_CUTOFF {
msg!(
"[PoWRewardV1] Error: Call is executed for slot {}(cutoff slot {})",
verifying_slot,
"[PoWRewardV1] Error: Call is executed for block height {}(cutoff block height {})",
verifying_block_height,
POW_CUTOFF
);
return Err(MoneyError::PoWRewardCallAfterCutoffSlot.into())
return Err(MoneyError::PoWRewardCallAfterCutoffBlockHeight.into())
}
// Grab the slot to validate consensus params against
let Some(slot) = get_slot(verifying_slot)? else {
msg!("[PoWRewardV1] Error: Missing slot {} from db", verifying_slot);
let Some(slot) = get_slot(verifying_block_height)? else {
msg!("[PoWRewardV1] Error: Missing slot {} from db", verifying_block_height);
return Err(MoneyError::PoWRewardMissingSlot.into())
};
let slot: Slot = deserialize(&slot)?;
@@ -134,13 +134,13 @@ pub(crate) fn money_pow_reward_process_instruction_v1(
return Err(MoneyError::TransferClearInputNonNativeToken.into())
}
// Verify reward value matches the expected one for this slot(block height)
let expected_reward = expected_reward(verifying_slot);
// Verify reward value matches the expected one for this block height(slot)
let expected_reward = expected_reward(verifying_block_height);
if params.input.value != expected_reward {
msg!(
"[PoWRewardV1] Error: Reward value({}) is not the block height({}) expected one: {}",
params.input.value,
verifying_slot,
verifying_block_height,
expected_reward
);
return Err(MoneyError::ValueMismatch.into())

View File

@@ -112,14 +112,14 @@ pub enum MoneyError {
#[error("Child call input mismatch")]
ChildCallInputMismatch,
#[error("Call is not executed on genesis slot")]
GenesisCallNonGenesisSlot,
#[error("Call is not executed on genesis block")]
GenesisCallNonGenesisBlock,
#[error("Missing nullifier in set")]
MissingNullifier,
#[error("Call is executed after cutoff slot")]
PoWRewardCallAfterCutoffSlot,
#[error("Call is executed after cutoff block height")]
PoWRewardCallAfterCutoffBlockHeight,
#[error("Missing slot from db")]
PoWRewardMissingSlot,
@@ -171,9 +171,9 @@ impl From<MoneyError> for ContractError {
MoneyError::ParentCallInputMismatch => Self::Custom(28),
MoneyError::ChildCallFunctionMismatch => Self::Custom(29),
MoneyError::ChildCallInputMismatch => Self::Custom(30),
MoneyError::GenesisCallNonGenesisSlot => Self::Custom(31),
MoneyError::GenesisCallNonGenesisBlock => Self::Custom(31),
MoneyError::MissingNullifier => Self::Custom(32),
MoneyError::PoWRewardCallAfterCutoffSlot => Self::Custom(33),
MoneyError::PoWRewardCallAfterCutoffBlockHeight => Self::Custom(33),
MoneyError::PoWRewardMissingSlot => Self::Custom(34),
MoneyError::PoWRewardExtendsUnknownFork => Self::Custom(35),
MoneyError::PoWRewardErroneousVrfProof => Self::Custom(36),

View File

@@ -199,16 +199,34 @@ pub(crate) fn get_current_epoch(ctx: FunctionEnvMut<Env>) -> u64 {
ctx.data().time_keeper.current_epoch()
}
/// Will return current block height number, which is equivalent
/// to current slot number.
pub(crate) fn get_current_block_height(ctx: FunctionEnvMut<Env>) -> u64 {
ctx.data().time_keeper.current_slot()
}
/// Will return current slot number.
pub(crate) fn get_current_slot(ctx: FunctionEnvMut<Env>) -> u64 {
ctx.data().time_keeper.current_slot()
}
/// Will return current runtime configured verifying block height number,
/// which is equivalent to verifying slot number.
pub(crate) fn get_verifying_block_height(ctx: FunctionEnvMut<Env>) -> u64 {
ctx.data().time_keeper.verifying_slot
}
/// Will return current runtime configured verifying slot number.
pub(crate) fn get_verifying_slot(ctx: FunctionEnvMut<Env>) -> u64 {
ctx.data().time_keeper.verifying_slot
}
/// Will return current runtime configured verifying block height epoch number,
/// which is equivalent to verifying slot epoch number.
pub(crate) fn get_verifying_block_height_epoch(ctx: FunctionEnvMut<Env>) -> u64 {
ctx.data().time_keeper.verifying_slot_epoch()
}
/// Will return current runtime configured verifying slot epoch number.
pub(crate) fn get_verifying_slot_epoch(ctx: FunctionEnvMut<Env>) -> u64 {
ctx.data().time_keeper.verifying_slot_epoch()

View File

@@ -264,18 +264,36 @@ impl Runtime {
import::util::get_current_epoch,
),
"get_current_block_height_" => Function::new_typed_with_env(
&mut store,
&ctx,
import::util::get_current_block_height,
),
"get_current_slot_" => Function::new_typed_with_env(
&mut store,
&ctx,
import::util::get_current_slot,
),
"get_verifying_block_height_" => Function::new_typed_with_env(
&mut store,
&ctx,
import::util::get_verifying_block_height,
),
"get_verifying_slot_" => Function::new_typed_with_env(
&mut store,
&ctx,
import::util::get_verifying_slot,
),
"get_verifying_block_height_epoch_" => Function::new_typed_with_env(
&mut store,
&ctx,
import::util::get_verifying_block_height_epoch,
),
"get_verifying_slot_epoch_" => Function::new_typed_with_env(
&mut store,
&ctx,

View File

@@ -86,6 +86,15 @@ pub fn get_current_epoch() -> u64 {
unsafe { get_current_epoch_() }
}
/// Everyone can call this. Will return current block height.
///
/// ```
/// block_height = get_current_block_height();
/// ```
pub fn get_current_block_height() -> u64 {
unsafe { get_current_block_height_() }
}
/// Everyone can call this. Will return current slot.
///
/// ```
@@ -95,6 +104,16 @@ pub fn get_current_slot() -> u64 {
unsafe { get_current_slot_() }
}
/// Everyone can call this. Will return runtime configured
/// verifying block height.
///
/// ```
/// block_height = get_verifying_block_height();
/// ```
pub fn get_verifying_block_height() -> u64 {
unsafe { get_verifying_block_height_() }
}
/// Everyone can call this. Will return runtime configured
/// verifying slot.
///
@@ -105,11 +124,21 @@ pub fn get_verifying_slot() -> u64 {
unsafe { get_verifying_slot_() }
}
/// Everyone can call this. Will return runtime configured
/// verifying block height epoch.
///
/// ```
/// epoch = get_verifying_block_height_epoch();
/// ```
pub fn get_verifying_block_height_epoch() -> u64 {
unsafe { get_verifying_block_height_epoch_() }
}
/// Everyone can call this. Will return runtime configured
/// verifying slot epoch.
///
/// ```
/// slot = get_verifying_slot_epoch();
/// epoch = get_verifying_slot_epoch();
/// ```
pub fn get_verifying_slot_epoch() -> u64 {
unsafe { get_verifying_slot_epoch_() }
@@ -141,8 +170,11 @@ extern "C" {
fn get_object_size_(len: u32) -> i64;
fn get_current_epoch_() -> u64;
fn get_current_block_height_() -> u64;
fn get_current_slot_() -> u64;
fn get_verifying_block_height_() -> u64;
fn get_verifying_slot_() -> u64;
fn get_verifying_block_height_epoch_() -> u64;
fn get_verifying_slot_epoch_() -> u64;
fn get_slot_(slot: u64) -> i64;
fn get_blockchain_time_() -> u64;