Skip to content

Commit ed144ae

Browse files
authored
Pending code enabled (#2427)
1 parent a5c8308 commit ed144ae

18 files changed

Lines changed: 123 additions & 22 deletions

core/api/jrpc/value_converter.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,7 @@ namespace kagome::api {
204204
data["implVersion"] = makeValue(val.impl_version);
205205
data["transactionVersion"] = makeValue(val.transaction_version);
206206
data["stateVersion"] = makeValue(val.state_version);
207+
data["systemVersion"] = makeValue(val.system_version);
207208

208209
jArray apis;
209210
std::ranges::transform(

core/host_api/impl/host_api_factory_impl.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@ namespace kagome::host_api {
2222
std::shared_ptr<crypto::KeyStore> key_store,
2323
std::shared_ptr<offchain::OffchainPersistentStorage>
2424
offchain_persistent_storage,
25-
std::shared_ptr<offchain::OffchainWorkerPool> offchain_worker_pool)
25+
std::shared_ptr<offchain::OffchainWorkerPool> offchain_worker_pool,
26+
LazySPtr<api::StateApi> state_api)
2627
: offchain_config_(offchain_config),
2728
ecdsa_provider_(std::move(ecdsa_provider)),
2829
ed25519_provider_(std::move(ed25519_provider)),
@@ -35,7 +36,8 @@ namespace kagome::host_api {
3536
// because boost.di doesn't like optional<shared_ptr>
3637
key_store_(key_store ? std::optional(key_store) : std::nullopt),
3738
offchain_persistent_storage_(std::move(offchain_persistent_storage)),
38-
offchain_worker_pool_(std::move(offchain_worker_pool)) {
39+
offchain_worker_pool_(std::move(offchain_worker_pool)),
40+
state_api_(std::move(state_api)) {
3941
BOOST_ASSERT(ecdsa_provider_ != nullptr);
4042
BOOST_ASSERT(ed25519_provider_ != nullptr);
4143
BOOST_ASSERT(sr25519_provider_ != nullptr);
@@ -62,7 +64,8 @@ namespace kagome::host_api {
6264
hasher_,
6365
key_store_,
6466
offchain_persistent_storage_,
65-
offchain_worker_pool_);
67+
offchain_worker_pool_,
68+
state_api_);
6669
}
6770

6871
} // namespace kagome::host_api

core/host_api/impl/host_api_factory_impl.hpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@
88

99
#include "host_api/host_api_factory.hpp"
1010

11+
#include "api/service/state/state_api.hpp"
1112
#include "host_api/impl/offchain_extension.hpp"
13+
#include "injector/lazy.hpp"
1214

1315
namespace kagome::crypto {
1416
class EllipticCurves;
@@ -44,7 +46,8 @@ namespace kagome::host_api {
4446
std::shared_ptr<crypto::KeyStore> key_store,
4547
std::shared_ptr<offchain::OffchainPersistentStorage>
4648
offchain_persistent_storage,
47-
std::shared_ptr<offchain::OffchainWorkerPool> offchain_worker_pool);
49+
std::shared_ptr<offchain::OffchainWorkerPool> offchain_worker_pool,
50+
LazySPtr<api::StateApi> state_api);
4851

4952
std::unique_ptr<HostApi> make(
5053
std::shared_ptr<const runtime::CoreApiFactory> core_factory,
@@ -65,6 +68,7 @@ namespace kagome::host_api {
6568
std::shared_ptr<offchain::OffchainPersistentStorage>
6669
offchain_persistent_storage_;
6770
std::shared_ptr<offchain::OffchainWorkerPool> offchain_worker_pool_;
71+
LazySPtr<api::StateApi> state_api_;
6872
};
6973

7074
} // namespace kagome::host_api

core/host_api/impl/host_api_impl.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,8 @@ namespace kagome::host_api {
8484
std::optional<std::shared_ptr<crypto::KeyStore>> key_store,
8585
std::shared_ptr<offchain::OffchainPersistentStorage>
8686
offchain_persistent_storage,
87-
std::shared_ptr<offchain::OffchainWorkerPool> offchain_worker_pool)
87+
std::shared_ptr<offchain::OffchainWorkerPool> offchain_worker_pool,
88+
LazySPtr<api::StateApi> state_api)
8889
: memory_provider_([&] {
8990
BOOST_ASSERT(memory_provider);
9091
return std::move(memory_provider);
@@ -108,7 +109,8 @@ namespace kagome::host_api {
108109
memory_provider_,
109110
storage_provider_,
110111
std::move(core_provider)},
111-
storage_ext_(storage_provider_, memory_provider_, hasher),
112+
storage_ext_(
113+
storage_provider_, memory_provider_, hasher, std::move(state_api)),
112114
child_storage_ext_(storage_provider_, memory_provider_),
113115
offchain_ext_(offchain_config,
114116
memory_provider_,

core/host_api/impl/host_api_impl.hpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66

77
#pragma once
88

9+
#include "api/service/state/state_api.hpp"
910
#include "host_api/host_api.hpp"
10-
1111
#include "host_api/impl/child_storage_extension.hpp"
1212
#include "host_api/impl/crypto_extension.hpp"
1313
#include "host_api/impl/elliptic_curves_extension.hpp"
@@ -16,6 +16,7 @@
1616
#include "host_api/impl/misc_extension.hpp"
1717
#include "host_api/impl/offchain_extension.hpp"
1818
#include "host_api/impl/storage_extension.hpp"
19+
#include "injector/lazy.hpp"
1920
#include "offchain/impl/offchain_persistent_storage.hpp"
2021

2122
namespace kagome::runtime {
@@ -48,7 +49,8 @@ namespace kagome::host_api {
4849
std::optional<std::shared_ptr<crypto::KeyStore>> key_store,
4950
std::shared_ptr<offchain::OffchainPersistentStorage>
5051
offchain_persistent_storage,
51-
std::shared_ptr<offchain::OffchainWorkerPool> offchain_worker_pool);
52+
std::shared_ptr<offchain::OffchainWorkerPool> offchain_worker_pool,
53+
LazySPtr<api::StateApi> state_api);
5254

5355
~HostApiImpl() override = default;
5456

core/host_api/impl/storage_extension.cpp

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,12 @@ namespace kagome::host_api {
3535
StorageExtension::StorageExtension(
3636
std::shared_ptr<runtime::TrieStorageProvider> storage_provider,
3737
std::shared_ptr<const runtime::MemoryProvider> memory_provider,
38-
std::shared_ptr<const crypto::Hasher> hasher)
38+
std::shared_ptr<const crypto::Hasher> hasher,
39+
LazySPtr<api::StateApi> state_api)
3940
: storage_provider_(std::move(storage_provider)),
4041
memory_provider_(std::move(memory_provider)),
4142
hasher_(std::move(hasher)),
43+
state_api_(std::move(state_api)),
4244
logger_{log::createLogger("StorageExtension", "storage_extension")} {
4345
BOOST_ASSERT(storage_provider_ != nullptr);
4446
BOOST_ASSERT(memory_provider_ != nullptr);
@@ -126,6 +128,31 @@ namespace kagome::host_api {
126128
SL_TRACE_VOID_FUNC_CALL(logger_, key, value);
127129

128130
auto batch = storage_provider_->getCurrentBatch();
131+
132+
// Special handling for runtime code updates based on system version
133+
if (key == storage::kRuntimeCodeKey and state_api_.get()) {
134+
uint8_t system_version = 0;
135+
136+
const auto runtime_version_res =
137+
state_api_.get()->getRuntimeVersion(std::nullopt);
138+
if (runtime_version_res.has_value()) {
139+
system_version = runtime_version_res.value().system_version;
140+
}
141+
142+
if (system_version >= 3) {
143+
SL_INFO(logger_,
144+
"Storing runtime code in :pending_code (system_version: {})",
145+
system_version);
146+
auto put_result = batch->put(storage::kPendingRuntimeCodeKey, value);
147+
if (not put_result) {
148+
logger_->error(
149+
"ext_set_storage failed to store pending code, reason: {}",
150+
put_result.error());
151+
}
152+
return;
153+
}
154+
}
155+
129156
auto put_result = batch->put(key, value);
130157
if (not put_result) {
131158
logger_->error(

core/host_api/impl/storage_extension.hpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,14 @@
88

99
#include <cstdint>
1010

11+
#include "api/service/state/state_api.hpp"
1112
#include "common/buffer_or_view.hpp"
13+
#include "injector/lazy.hpp"
1214
#include "log/logger.hpp"
1315
#include "primitives/kill_storage_result.hpp"
1416
#include "runtime/types.hpp"
1517
#include "storage/trie/serialization/polkadot_codec.hpp"
1618
#include "storage/trie/types.hpp"
17-
1819
namespace kagome::crypto {
1920
class Hasher;
2021
}
@@ -33,7 +34,8 @@ namespace kagome::host_api {
3334
StorageExtension(
3435
std::shared_ptr<runtime::TrieStorageProvider> storage_provider,
3536
std::shared_ptr<const runtime::MemoryProvider> memory_provider,
36-
std::shared_ptr<const crypto::Hasher> hasher);
37+
std::shared_ptr<const crypto::Hasher> hasher,
38+
LazySPtr<api::StateApi> state_api);
3739

3840
void reset();
3941

@@ -177,6 +179,7 @@ namespace kagome::host_api {
177179
std::shared_ptr<runtime::TrieStorageProvider> storage_provider_;
178180
std::shared_ptr<const runtime::MemoryProvider> memory_provider_;
179181
std::shared_ptr<const crypto::Hasher> hasher_;
182+
LazySPtr<api::StateApi> state_api_;
180183
storage::trie::PolkadotCodec codec_;
181184
log::Logger logger_;
182185

core/parachain/pvf/kagome_pvf_worker_injector.hpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ namespace kagome::parachain {
9595
bind_null<crypto::KeyStore>(),
9696
bind_null<offchain::OffchainPersistentStorage>(),
9797
bind_null<offchain::OffchainWorkerPool>(),
98+
bind_null<LazySPtr<api::StateApi>>(),
9899
di::bind<runtime::CoreApiFactory>.to<runtime::CoreApiFactoryImpl>(),
99100

100101
// bound by lambda because direct binding is failing: ctor gives
@@ -112,7 +113,8 @@ namespace kagome::parachain {
112113
injector.template create<std::shared_ptr<crypto::Hasher>>(),
113114
injector.template create<std::shared_ptr<crypto::KeyStore>>(),
114115
injector.template create<std::shared_ptr<offchain::OffchainPersistentStorage>>(),
115-
injector.template create<std::shared_ptr<offchain::OffchainWorkerPool>>()
116+
injector.template create<std::shared_ptr<offchain::OffchainWorkerPool>>(),
117+
injector.template create<LazySPtr<api::StateApi>>()
116118
);
117119
}),
118120

core/primitives/version.hpp

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,8 +98,16 @@ namespace kagome::primitives {
9898
uint32_t transaction_version = 1u;
9999

100100
/// Version of the state implementation used by this runtime.
101+
/// This field is kept for backward compatibility. It always has the same
102+
/// value as system_version.
101103
uint8_t state_version = 0u;
102104

105+
/// Version of the system implementation used by this runtime.
106+
/// Originally named state_version, but renamed to system_version in newer
107+
/// versions. Both fields are maintained with identical values for
108+
/// compatibility.
109+
uint8_t system_version = 0u;
110+
103111
bool operator==(const Version &rhs) const = default;
104112

105113
/**
@@ -146,11 +154,13 @@ namespace kagome::primitives {
146154
}
147155
if (core_version and *core_version >= 4) {
148156
try {
149-
decode(v.state_version, decoder);
157+
decode(v.system_version, decoder);
158+
v.state_version = v.system_version;
150159
} catch (std::system_error &e) {
151160
return outcome::failure(e.code());
152161
}
153162
} else {
163+
v.system_version = 0;
154164
v.state_version = 0;
155165
}
156166
return v;

core/runtime/common/storage_code_provider.cpp

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,13 @@ namespace kagome::runtime {
1919
std::shared_ptr<RuntimeUpgradeTracker> runtime_upgrade_tracker,
2020
std::shared_ptr<const primitives::CodeSubstituteBlockIds>
2121
code_substitutes,
22-
std::shared_ptr<application::ChainSpec> chain_spec)
22+
std::shared_ptr<application::ChainSpec> chain_spec,
23+
LazySPtr<api::StateApi> state_api)
2324
: storage_{std::move(storage)},
2425
runtime_upgrade_tracker_{std::move(runtime_upgrade_tracker)},
2526
known_code_substitutes_{std::move(code_substitutes)},
2627
chain_spec_{std::move(chain_spec)},
28+
state_api_{std::move(state_api)},
2729
logger_{log::createLogger("StorageCodeProvider", "runtime")} {
2830
BOOST_ASSERT(storage_ != nullptr);
2931
BOOST_ASSERT(runtime_upgrade_tracker_ != nullptr);
@@ -50,4 +52,12 @@ namespace kagome::runtime {
5052
}
5153
return cached_code_;
5254
}
55+
56+
RuntimeCodeProvider::Result StorageCodeProvider::getPendingCodeAt(
57+
const storage::trie::RootHash &state) const {
58+
OUTCOME_TRY(batch, storage_->getEphemeralBatchAt(state));
59+
OUTCOME_TRY(code, batch->get(storage::kPendingRuntimeCodeKey));
60+
return std::make_shared<common::Buffer>(std::move(code));
61+
}
62+
5363
} // namespace kagome::runtime

0 commit comments

Comments
 (0)