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

Make get_package handle Key::Hash #5051

Merged
Show file tree
Hide file tree
Changes from all 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
31 changes: 13 additions & 18 deletions node/src/components/transaction_acceptor.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ use casper_types::{
account::AccountHash, addressable_entity::AddressableEntity, system::auction::ARG_AMOUNT,
AddressableEntityHash, AddressableEntityIdentifier, BlockHeader, Chainspec, EntityAddr,
EntityKind, EntityVersion, EntityVersionKey, ExecutableDeployItem,
ExecutableDeployItemIdentifier, InitiatorAddr, Key, Package, PackageAddr, PackageHash,
ExecutableDeployItemIdentifier, InitiatorAddr, Package, PackageAddr, PackageHash,
PackageIdentifier, Timestamp, Transaction, TransactionEntryPoint, TransactionInvocationTarget,
TransactionTarget, DEFAULT_ENTRY_POINT_NAME, U512,
};
Expand Down Expand Up @@ -365,10 +365,9 @@ impl TransactionAcceptor {
ExecutableDeployItemIdentifier::Package(
ref contract_package_identifier @ PackageIdentifier::Hash { package_hash, .. },
) => {
let key = Key::from(package_hash);
let maybe_package_version = contract_package_identifier.version();
effect_builder
.get_package(*block_header.state_root_hash(), key)
.get_package(*block_header.state_root_hash(), package_hash.value())
.event(move |maybe_package| Event::GetPackageResult {
event_metadata,
block_header,
Expand Down Expand Up @@ -481,10 +480,9 @@ impl TransactionAcceptor {
ExecutableDeployItemIdentifier::Package(
ref package_identifier @ PackageIdentifier::Hash { package_hash, .. },
) => {
let key = Key::from(package_hash);
let maybe_package_version = package_identifier.version();
effect_builder
.get_package(*block_header.state_root_hash(), key)
.get_package(*block_header.state_root_hash(), package_hash.value())
.event(move |maybe_package| Event::GetPackageResult {
event_metadata,
block_header,
Expand Down Expand Up @@ -555,19 +553,16 @@ impl TransactionAcceptor {
maybe_entity: result.into_option(),
})
}
NextStep::GetPackage(package_addr, maybe_package_version) => {
let key = Key::SmartContract(package_addr);
effect_builder
.get_package(*block_header.state_root_hash(), key)
.event(move |maybe_package| Event::GetPackageResult {
event_metadata,
block_header,
is_payment: false,
package_hash: PackageHash::new(package_addr),
maybe_package_version,
maybe_package,
})
}
NextStep::GetPackage(package_addr, maybe_package_version) => effect_builder
.get_package(*block_header.state_root_hash(), package_addr)
.event(move |maybe_package| Event::GetPackageResult {
event_metadata,
block_header,
is_payment: false,
package_hash: PackageHash::new(package_addr),
maybe_package_version,
maybe_package,
}),
NextStep::CryptoValidation => {
self.validate_transaction_cryptography(effect_builder, event_metadata)
}
Expand Down
83 changes: 43 additions & 40 deletions node/src/components/transaction_acceptor/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -32,11 +32,11 @@ use casper_types::{
account::{Account, AccountHash, ActionThresholds, AssociatedKeys, Weight},
addressable_entity::AddressableEntity,
bytesrepr::Bytes,
contracts::NamedKeys,
contracts::{ContractPackage, NamedKeys},
global_state::TrieMerkleProof,
testing::TestRng,
Block, BlockV2, CLValue, Chainspec, ChainspecRawBytes, Contract, Deploy, EraId, HashAddr,
InvalidDeploy, InvalidTransaction, InvalidTransactionV1, Package, PricingHandling, PricingMode,
InvalidDeploy, InvalidTransaction, InvalidTransactionV1, Key, PricingHandling, PricingMode,
ProtocolVersion, PublicKey, SecretKey, StoredValue, TestBlockBuilder, TimeDiff, Timestamp,
Transaction, TransactionArgs, TransactionConfig, TransactionRuntimeParams, TransactionV1, URef,
U512,
Expand Down Expand Up @@ -826,44 +826,47 @@ impl reactor::Reactor for Reactor {
request: query_request,
responder,
} => {
let query_result = if let Key::SmartContract(_) = query_request.key() {
match self.test_scenario {
TestScenario::FromPeerCustomPaymentContractPackage(
ContractPackageScenario::MissingPackageAtHash,
)
| TestScenario::FromPeerSessionContractPackage(
_,
ContractPackageScenario::MissingPackageAtHash,
)
| TestScenario::FromClientCustomPaymentContractPackage(
ContractPackageScenario::MissingPackageAtHash,
)
| TestScenario::FromClientSessionContractPackage(
_,
ContractPackageScenario::MissingPackageAtHash,
) => QueryResult::ValueNotFound(String::new()),
TestScenario::FromPeerCustomPaymentContractPackage(
ContractPackageScenario::MissingContractVersion,
)
| TestScenario::FromPeerSessionContractPackage(
_,
ContractPackageScenario::MissingContractVersion,
)
| TestScenario::FromClientCustomPaymentContractPackage(
ContractPackageScenario::MissingContractVersion,
)
| TestScenario::FromClientSessionContractPackage(
_,
ContractPackageScenario::MissingContractVersion,
) => QueryResult::Success {
value: Box::new(StoredValue::SmartContract(Package::default())),
proofs: vec![],
},
_ => panic!("unexpected query: {:?}", query_request),
}
} else {
panic!("expect only queries using Key::Package variant");
};
let query_result =
if let Key::Hash(_) | Key::SmartContract(_) = query_request.key() {
match self.test_scenario {
TestScenario::FromPeerCustomPaymentContractPackage(
ContractPackageScenario::MissingPackageAtHash,
)
| TestScenario::FromPeerSessionContractPackage(
_,
ContractPackageScenario::MissingPackageAtHash,
)
| TestScenario::FromClientCustomPaymentContractPackage(
ContractPackageScenario::MissingPackageAtHash,
)
| TestScenario::FromClientSessionContractPackage(
_,
ContractPackageScenario::MissingPackageAtHash,
) => QueryResult::ValueNotFound(String::new()),
TestScenario::FromPeerCustomPaymentContractPackage(
ContractPackageScenario::MissingContractVersion,
)
| TestScenario::FromPeerSessionContractPackage(
_,
ContractPackageScenario::MissingContractVersion,
)
| TestScenario::FromClientCustomPaymentContractPackage(
ContractPackageScenario::MissingContractVersion,
)
| TestScenario::FromClientSessionContractPackage(
_,
ContractPackageScenario::MissingContractVersion,
) => QueryResult::Success {
value: Box::new(StoredValue::ContractPackage(
ContractPackage::default(),
)),
proofs: vec![],
},
_ => panic!("unexpected query: {:?}", query_request),
}
} else {
panic!("expect only queries using Key::Package variant");
};
responder.respond(query_result).ignore()
}
ContractRuntimeRequest::GetBalance {
Expand Down
33 changes: 26 additions & 7 deletions node/src/effect.rs
Original file line number Diff line number Diff line change
Expand Up @@ -134,8 +134,8 @@ use casper_types::{
Approval, AvailableBlockRange, Block, BlockHash, BlockHeader, BlockSignatures,
BlockSynchronizerStatus, BlockV2, ChainspecRawBytes, DeployHash, Digest, EntityAddr, EraId,
ExecutionInfo, FinalitySignature, FinalitySignatureId, FinalitySignatureV2, HashAddr, Key,
NextUpgrade, Package, ProtocolUpgradeConfig, PublicKey, TimeDiff, Timestamp, Transaction,
TransactionHash, TransactionId, Transfer, U512,
NextUpgrade, Package, PackageAddr, ProtocolUpgradeConfig, PublicKey, TimeDiff, Timestamp,
Transaction, TransactionHash, TransactionId, Transfer, U512,
};

use crate::{
Expand Down Expand Up @@ -2001,16 +2001,35 @@ impl<REv> EffectBuilder<REv> {
}

/// Retrieves a `Package` from under the given key in global state if present.
pub(crate) async fn get_package(self, state_root_hash: Digest, key: Key) -> Option<Box<Package>>
pub(crate) async fn get_package(
self,
state_root_hash: Digest,
package_addr: PackageAddr,
) -> Option<Box<Package>>
where
REv: From<ContractRuntimeRequest>,
{
let key = Key::Hash(package_addr);
let query_request = QueryRequest::new(state_root_hash, key, vec![]);

if let QueryResult::Success { value, .. } = self.query_global_state(query_request).await {
value.into_package().map(Box::new)
} else {
None
match self.query_global_state(query_request).await {
QueryResult::RootNotFound | QueryResult::Failure(_) => None,
QueryResult::ValueNotFound(_) => {
let query_request =
QueryRequest::new(state_root_hash, Key::SmartContract(package_addr), vec![]);
debug!("requesting under different key");
if let QueryResult::Success { value, .. } =
self.query_global_state(query_request).await
{
value.into_package().map(Box::new)
} else {
None
}
}
QueryResult::Success { value, .. } => value
.into_contract_package()
.map(Package::from)
.map(Box::new),
}
}

Expand Down
Loading