-
Notifications
You must be signed in to change notification settings - Fork 39
/
Copy pathruntime_context.hpp
144 lines (109 loc) · 4.75 KB
/
runtime_context.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
/**
* Copyright Quadrivium LLC
* All Rights Reserved
* SPDX-License-Identifier: Apache-2.0
*/
#pragma once
#include "log/logger.hpp"
#include "outcome/outcome.hpp"
#include "primitives/common.hpp"
#include "runtime/types.hpp"
#include "storage/trie/types.hpp"
namespace kagome::storage::trie {
class TrieBatch;
}
namespace kagome::blockchain {
class BlockHeaderRepository;
}
namespace kagome::storage::changes_trie {
class ChangesTracker;
}
namespace kagome::runtime {
class ModuleFactory;
class ModuleInstance;
class ModuleRepository;
class Memory;
class RuntimeContext {
public:
// should be created from runtime contex factory
RuntimeContext() = delete;
RuntimeContext(const RuntimeContext &) = delete;
RuntimeContext &operator=(const RuntimeContext &) = delete;
RuntimeContext(RuntimeContext &&) noexcept = default;
RuntimeContext &operator=(RuntimeContext &&) noexcept = delete;
~RuntimeContext();
// https://github.com/paritytech/polkadot-sdk/blob/e16ef0861f576dd260487d78b57949b18795ed77/polkadot/primitives/src/v6/executor_params.rs#L32
static constexpr size_t DEFAULT_STACK_MAX = 65536;
static constexpr bool DEFAULT_WASM_EXT_BULK_MEMORY = false;
struct ContextParams {
SCALE_TIE(2);
MemoryLimits memory_limits;
bool wasm_ext_bulk_memory = DEFAULT_WASM_EXT_BULK_MEMORY;
};
const std::shared_ptr<ModuleInstance> module_instance;
private:
friend class RuntimeContextFactoryImpl;
friend class RuntimeContextFactory;
RuntimeContext(std::shared_ptr<ModuleInstance> module_instance);
};
class RuntimeContextFactory {
public:
using ContextParams = RuntimeContext::ContextParams;
virtual ~RuntimeContextFactory() = default;
static outcome::result<RuntimeContext> stateless(
std::shared_ptr<ModuleInstance> instance);
virtual outcome::result<RuntimeContext> fromBatch(
std::shared_ptr<ModuleInstance> module_instance,
std::shared_ptr<storage::trie::TrieBatch> batch) const = 0;
virtual outcome::result<RuntimeContext> persistent(
std::shared_ptr<ModuleInstance> module_instance,
const storage::trie::RootHash &state,
std::optional<std::shared_ptr<storage::changes_trie::ChangesTracker>>
changes_tracker_opt) const = 0;
virtual outcome::result<RuntimeContext> persistentAt(
const primitives::BlockHash &block_hash,
std::optional<std::shared_ptr<storage::changes_trie::ChangesTracker>>
changes_tracker_opt) const = 0;
virtual outcome::result<RuntimeContext> ephemeral(
std::shared_ptr<ModuleInstance> module_instance,
const storage::trie::RootHash &state) const = 0;
virtual outcome::result<RuntimeContext> ephemeralAt(
const primitives::BlockHash &block_hash) const = 0;
virtual outcome::result<RuntimeContext> ephemeralAt(
const primitives::BlockHash &block_hash,
const storage::trie::RootHash &state) const = 0;
virtual outcome::result<RuntimeContext> ephemeralAtGenesis() const = 0;
};
class RuntimeContextFactoryImpl : public RuntimeContextFactory {
public:
using ContextParams = RuntimeContext::ContextParams;
explicit RuntimeContextFactoryImpl(
std::shared_ptr<ModuleRepository> module_repo,
std::shared_ptr<const blockchain::BlockHeaderRepository> header_repo);
outcome::result<RuntimeContext> fromBatch(
std::shared_ptr<ModuleInstance> module_instance,
std::shared_ptr<storage::trie::TrieBatch> batch) const override;
outcome::result<RuntimeContext> persistent(
std::shared_ptr<ModuleInstance> module_instance,
const storage::trie::RootHash &state,
std::optional<std::shared_ptr<storage::changes_trie::ChangesTracker>>
changes_tracker_opt) const override;
outcome::result<RuntimeContext> persistentAt(
const primitives::BlockHash &block_hash,
std::optional<std::shared_ptr<storage::changes_trie::ChangesTracker>>
changes_tracker_opt = {}) const override;
outcome::result<RuntimeContext> ephemeral(
std::shared_ptr<ModuleInstance> module_instance,
const storage::trie::RootHash &state) const override;
outcome::result<RuntimeContext> ephemeralAt(
const primitives::BlockHash &block_hash) const override;
outcome::result<RuntimeContext> ephemeralAt(
const primitives::BlockHash &block_hash,
const storage::trie::RootHash &state) const override;
outcome::result<RuntimeContext> ephemeralAtGenesis() const override;
private:
std::shared_ptr<class ModuleRepository> module_repo_;
std::shared_ptr<const blockchain::BlockHeaderRepository> header_repo_;
};
} // namespace kagome::runtime
SCALE_TIE_HASH_STD(kagome::runtime::RuntimeContext::ContextParams);