Compare commits

...

23 Commits

Author SHA1 Message Date
fa2cb811a8
update for slow-claps: remove companions, updgrade block range storage, new way of commission accumulation
Signed-off-by: Uncle Stinky <uncle.stinky@ghostchain.io>
2025-05-31 14:30:15 +03:00
561d4430b4
another indention fix in main Cargo.toml
Signed-off-by: Uncle Stretch <uncle.stretch@ghostchain.io>
2025-05-31 14:21:21 +03:00
b64700fb42
fix indentation in TOML files
Signed-off-by: Uncle Stretch <uncle.stretch@ghostchain.io>
2025-05-31 13:12:48 +03:00
b3f85f426c
extend pallet ghost-networks and create BridgedInflationCurve
Signed-off-by: Uncle Stinky <uncle.stinky@ghostchain.io>
2025-05-30 19:03:50 +03:00
ddec108ced
chmod 644 files in runtime
Signed-off-by: Uncle Stretch <uncle.stretch@ghostchain.io>
2025-05-29 13:09:54 +03:00
cd8ad50ac3
chmod 644 utils
Signed-off-by: Uncle Stretch <uncle.stretch@ghostchain.io>
2025-05-29 13:04:55 +03:00
e09ce03836
chmod 644 tests
Signed-off-by: Uncle Stretch <uncle.stretch@ghostchain.io>
2025-05-29 13:01:30 +03:00
9f6f4953f7
chmod 644 service
Signed-off-by: Uncle Stretch <uncle.stretch@ghostchain.io>
2025-05-29 12:59:25 +03:00
40aba0e3af
chmod 644 files in rpc
Signed-off-by: Uncle Stretch <uncle.stretch@ghostchain.io>
2025-05-29 12:58:09 +03:00
596d9a6ca7
chmod 644 files in core-primitives
Signed-off-by: Uncle Stretch <uncle.stretch@ghostchain.io>
2025-05-29 12:57:26 +03:00
39279697f2
chmod 644 files in cli
Signed-off-by: Uncle Stretch <uncle.stretch@ghostchain.io>
2025-05-29 12:56:11 +03:00
d3a18e298a
chmod 644 files in project root
Signed-off-by: Uncle Stretch <uncle.stretch@ghostchain.io>
2025-05-29 12:54:26 +03:00
aede9e6e2e
change access permissions of files in pallets folder
Signed-off-by: Uncle Stretch <uncle.stretch@ghostchain.io>
2025-05-29 12:52:37 +03:00
9ce57763cb
extened the template.service for the node and add Requires= rule
Signed-off-by: Uncle Stinky <uncle.stinky@ghostchain.io>
2025-04-29 22:02:33 +03:00
eab90d4173
adding first patch for the unit file
Signed-off-by: Uncle Stinky <uncle.stinky@ghostchain.io>
2025-04-29 21:45:01 +03:00
bdc094663d
fix for the writing to permissioned file
Signed-off-by: Uncle Stretch <uncle.stretch@ghostchain.io>
2025-03-11 15:57:11 +03:00
a22b6f92d2
pull from @doctor_whoami approved
Signed-off-by: Uncle Stretch <uncle.stretch@ghostchain.io>
2025-02-25 18:57:20 +03:00
b51c0dffc4
Update README (update testnet version, link to the bootnode list and sha256sum of genesis, small text update)
Signed-off-by: Doctor K <doctor_whoami@ghostchain.io>
2025-02-17 10:43:11 +03:00
eae752a7bf
issue with --validate flag fixed
Signed-off-by: Uncle Stinky <uncle.stinky@ghostchain.io>
2025-02-06 20:55:55 +03:00
346d629f95
validator flag added to the starter.sh script
Signed-off-by: Uncle Stinky <uncle.stinky@ghostchain.io>
2025-02-06 16:21:04 +03:00
8a0cbb94b4
update chain specs
Signed-off-by: Uncle Stretch <uncle.stretch@ghostchain.io>
2025-01-30 22:24:30 +03:00
a2afa3fbbc
bump version
Signed-off-by: Uncle Stretch <uncle.stretch@ghostchain.io>
2025-01-30 22:11:21 +03:00
885c519519
bridge slashing issue fix
Signed-off-by: Uncle Stretch <uncle.stretch@ghostchain.io>
2025-01-30 22:09:32 +03:00
69 changed files with 1014 additions and 803 deletions

18
Cargo.lock generated
View File

@ -3528,7 +3528,7 @@ dependencies = [
[[package]] [[package]]
name = "ghost-cli" name = "ghost-cli"
version = "0.7.196" version = "0.7.197"
dependencies = [ dependencies = [
"cfg-if", "cfg-if",
"clap 4.5.4", "clap 4.5.4",
@ -3584,7 +3584,7 @@ dependencies = [
[[package]] [[package]]
name = "ghost-machine-primitives" name = "ghost-machine-primitives"
version = "0.7.196" version = "0.7.197"
dependencies = [ dependencies = [
"lazy_static", "lazy_static",
"sc-sysinfo", "sc-sysinfo",
@ -3593,7 +3593,7 @@ dependencies = [
[[package]] [[package]]
name = "ghost-metrics" name = "ghost-metrics"
version = "0.7.196" version = "0.7.197"
dependencies = [ dependencies = [
"assert_cmd", "assert_cmd",
"bs58 0.5.1", "bs58 0.5.1",
@ -3648,7 +3648,7 @@ dependencies = [
[[package]] [[package]]
name = "ghost-networks" name = "ghost-networks"
version = "0.7.196" version = "0.1.2"
dependencies = [ dependencies = [
"frame-benchmarking", "frame-benchmarking",
"frame-support", "frame-support",
@ -3656,6 +3656,8 @@ dependencies = [
"ghost-core-primitives", "ghost-core-primitives",
"ghost-traits", "ghost-traits",
"pallet-balances", "pallet-balances",
"pallet-staking",
"pallet-staking-reward-curve",
"parity-scale-codec", "parity-scale-codec",
"scale-info", "scale-info",
"sp-io 30.0.0", "sp-io 30.0.0",
@ -3665,7 +3667,7 @@ dependencies = [
[[package]] [[package]]
name = "ghost-node" name = "ghost-node"
version = "0.7.196" version = "0.7.197"
dependencies = [ dependencies = [
"assert_cmd", "assert_cmd",
"color-eyre", "color-eyre",
@ -3696,7 +3698,7 @@ dependencies = [
[[package]] [[package]]
name = "ghost-rpc" name = "ghost-rpc"
version = "0.7.196" version = "0.7.197"
dependencies = [ dependencies = [
"ghost-core-primitives", "ghost-core-primitives",
"jsonrpsee", "jsonrpsee",
@ -3748,7 +3750,7 @@ dependencies = [
[[package]] [[package]]
name = "ghost-service" name = "ghost-service"
version = "0.7.196" version = "0.7.197"
dependencies = [ dependencies = [
"assert_matches", "assert_matches",
"async-trait", "async-trait",
@ -3832,7 +3834,7 @@ dependencies = [
[[package]] [[package]]
name = "ghost-slow-clap" name = "ghost-slow-clap"
version = "0.3.15" version = "0.3.16"
dependencies = [ dependencies = [
"frame-benchmarking", "frame-benchmarking",
"frame-support", "frame-support",

View File

@ -17,7 +17,7 @@ homepage.workspace = true
[workspace.package] [workspace.package]
license = "GPL-3.0-only" license = "GPL-3.0-only"
authors = ["571nky", "57r37ch", "f4750"] authors = ["571nky", "57r37ch", "f4750"]
version = "0.7.196" version = "0.7.197"
edition = "2021" edition = "2021"
homepage = "https://ghostchain.io" homepage = "https://ghostchain.io"
repository = "https://git.ghostchain.io/ghostchain/ghost-node" repository = "https://git.ghostchain.io/ghostchain/ghost-node"
@ -258,24 +258,24 @@ substrate-build-script-utils = { workspace = true }
resolver = "2" resolver = "2"
members = [ members = [
"core-primitives", "core-primitives",
"cli", "cli",
"rpc", "rpc",
"service", "service",
"metrics", "metrics",
"client/cli", "client/cli",
"primitives/machine", "primitives/machine",
"runtime/common", "runtime/common",
"runtime/casper", "runtime/casper",
"runtime/casper/constants", "runtime/casper/constants",
"pallets/networks", "pallets/networks",
"pallets/claims", "pallets/claims",
"pallets/slow-clap", "pallets/slow-clap",
"utils/bags-list", "utils/bags-list",
"utils/chain-spec-builder", "utils/chain-spec-builder",
"utils/generate-bags", "utils/generate-bags",
"utils/ghostkey", "utils/ghostkey",
"utils/staking-miner", "utils/staking-miner",
] ]
[badges] [badges]

0
LICENSE.md Executable file → Normal file
View File

9
README.md Executable file → Normal file
View File

@ -320,7 +320,7 @@ Only `port 30333` should be opened.
Press _CTRL+C_ to stop the node. Press _CTRL+C_ to stop the node.
# Launching GHOST TestNet 2.0 # Launching GHOST TestNet 3.1
Switch to main GIT branch: Switch to main GIT branch:
```bash ```bash
@ -437,9 +437,8 @@ sha256sum /etc/ghost/casper.json
You should see: You should see:
``` ```
5aeb6fd5b9b14bdbc1a61600655b5217ded7c1b7cb05bd32929354e88935ae97 ad653233c978bfd00c5e4525b17628632bc4319c5f5f4b4dcc2f050ef3c3d145
``` ```
![images/img_29.png](images/img_29.png)
Create running `ghost-node` service that starts on system boot using `--unit-file` flag. Create running `ghost-node` service that starts on system boot using `--unit-file` flag.
And we must set up the `ghost-node` launch command by setting arguments using And we must set up the `ghost-node` launch command by setting arguments using
@ -492,7 +491,7 @@ Official **Boot Node** addresses:
/dns/bootnode70.chain.ghostchain.io/tcp/30333/p2p/12D3KooWP3h5dSdqcpvsCr7fp1jyfqDj291QDZ68a4gY6VQ8T1nW /dns/bootnode70.chain.ghostchain.io/tcp/30333/p2p/12D3KooWP3h5dSdqcpvsCr7fp1jyfqDj291QDZ68a4gY6VQ8T1nW
``` ```
A full list of available **Boot Nodes** can be found on [the guide page](https://blog.ghostchain.io/launching-ghost-testnet-2-0/#Boot_Node). A full list of available **Boot Nodes** can be found on [the guide page](https://blog.ghostchain.io/launching-ghost-testnet-3-1/#Boot_Node).
![images/img_33.png](images/img_33.png) ![images/img_33.png](images/img_33.png)
@ -508,7 +507,7 @@ Type `y` and press _Enter_ for create dedicated user for running `ghost-node`:
![images/img_36.png](images/img_36.png) ![images/img_36.png](images/img_36.png)
**DO NOT start and enable** `ghost-node.service` press _Enter_: **DO NOT start and DO NOT enable** `ghost-node.service` (press _Enter_):
![images/img_37.png](images/img_37.png) ![images/img_37.png](images/img_37.png)

14
cli/Cargo.toml Executable file → Normal file
View File

@ -52,14 +52,14 @@ substrate-build-script-utils = { workspace = true }
default = ["cli", "db", "full-node"] default = ["cli", "db", "full-node"]
db = ["service/db"] db = ["service/db"]
cli = [ cli = [
"clap", "clap",
"frame-benchmarking-cli", "frame-benchmarking-cli",
"sc-cli", "sc-cli",
"sc-service", "sc-service",
"sc-tracing", "sc-tracing",
"service", "service",
"ghost-client-cli", "ghost-client-cli",
"ghost-machine-primitives", "ghost-machine-primitives",
] ]
runtime-benchmarks = [ runtime-benchmarks = [
"frame-benchmarking-cli?/runtime-benchmarks", "frame-benchmarking-cli?/runtime-benchmarks",

0
cli/build.rs Executable file → Normal file
View File

0
cli/src/cli.rs Executable file → Normal file
View File

0
cli/src/command.rs Executable file → Normal file
View File

0
cli/src/error.rs Executable file → Normal file
View File

0
cli/src/lib.rs Executable file → Normal file
View File

6
core-primitives/Cargo.toml Executable file → Normal file
View File

@ -15,7 +15,7 @@ sp-runtime = { workspace = true }
[features] [features]
default = ["std"] default = ["std"]
std = [ std = [
"sp-core/std", "sp-core/std",
"sp-runtime/std", "sp-runtime/std",
"sp-std/std", "sp-std/std",
] ]

0
core-primitives/src/lib.rs Executable file → Normal file
View File

0
file_header.txt Executable file → Normal file
View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.1 KiB

View File

@ -37,17 +37,17 @@ serde_json = { workspace = true, default-features = true }
[features] [features]
default = ["std"] default = ["std"]
std = [ std = [
"frame-benchmarking?/std", "frame-benchmarking?/std",
"serde/std", "serde/std",
"codec/std", "codec/std",
"scale-info/std", "scale-info/std",
"libsecp256k1/std", "libsecp256k1/std",
"frame-support/std", "frame-support/std",
"frame-system/std", "frame-system/std",
"sp-core/std", "sp-core/std",
"sp-runtime/std", "sp-runtime/std",
"sp-io/std", "sp-io/std",
"sp-std/std", "sp-std/std",
"pallet-ranked-collective/std", "pallet-ranked-collective/std",
"pallet-vesting/std", "pallet-vesting/std",
"pallet-balances/std", "pallet-balances/std",
@ -56,19 +56,19 @@ std = [
runtime-benchmarks = [ runtime-benchmarks = [
"libsecp256k1/hmac", "libsecp256k1/hmac",
"libsecp256k1/static-context", "libsecp256k1/static-context",
"frame-benchmarking/runtime-benchmarks", "frame-benchmarking/runtime-benchmarks",
"frame-support/runtime-benchmarks", "frame-support/runtime-benchmarks",
"frame-system/runtime-benchmarks", "frame-system/runtime-benchmarks",
"pallet-ranked-collective/runtime-benchmarks", "pallet-ranked-collective/runtime-benchmarks",
"pallet-vesting/runtime-benchmarks", "pallet-vesting/runtime-benchmarks",
"pallet-balances/runtime-benchmarks", "pallet-balances/runtime-benchmarks",
"sp-runtime/runtime-benchmarks", "sp-runtime/runtime-benchmarks",
] ]
try-runtime = [ try-runtime = [
"frame-support/try-runtime", "frame-support/try-runtime",
"frame-system/try-runtime", "frame-system/try-runtime",
"pallet-ranked-collective/try-runtime", "pallet-ranked-collective/try-runtime",
"pallet-vesting/try-runtime", "pallet-vesting/try-runtime",
"pallet-balances/try-runtime", "pallet-balances/try-runtime",
"sp-runtime/try-runtime", "sp-runtime/try-runtime",
] ]

40
pallets/networks/Cargo.toml Executable file → Normal file
View File

@ -1,8 +1,8 @@
[package] [package]
name = "ghost-networks" name = "ghost-networks"
version = "0.1.2"
license.workspace = true license.workspace = true
authors.workspace = true authors.workspace = true
version.workspace = true
edition.workspace = true edition.workspace = true
homepage.workspace = true homepage.workspace = true
repository.workspace = true repository.workspace = true
@ -14,36 +14,40 @@ codec = { workspace = true, features = ["max-encoded-len"] }
frame-benchmarking = { workspace = true, optional = true } frame-benchmarking = { workspace = true, optional = true }
frame-support = { workspace = true } frame-support = { workspace = true }
frame-system = { workspace = true } frame-system = { workspace = true }
pallet-staking = { workspace = true }
sp-runtime = { workspace = true } sp-runtime = { workspace = true }
sp-std = { workspace = true } sp-std = { workspace = true }
ghost-traits = { workspace = true } ghost-traits = { workspace = true }
[dev-dependencies] [dev-dependencies]
primitives = { workspace = true } primitives = { workspace = true }
pallet-balances = { workspace = true }
sp-io = { workspace = true } sp-io = { workspace = true }
pallet-balances = { workspace = true }
pallet-staking-reward-curve = { workspace = true }
[features] [features]
default = ["std"] default = ["std"]
std = [ std = [
"scale-info/std", "scale-info/std",
"codec/std", "codec/std",
"frame-support/std", "frame-support/std",
"frame-system/std", "frame-system/std",
"frame-benchmarking?/std", "frame-benchmarking?/std",
"sp-runtime/std", "sp-runtime/std",
"sp-std/std", "sp-std/std",
"sp-io/std", "sp-io/std",
"ghost-traits/std", "ghost-traits/std",
"pallet-balances/std", "pallet-staking/std",
"pallet-balances/std",
] ]
runtime-benchmarks = [ runtime-benchmarks = [
"frame-benchmarking/runtime-benchmarks", "frame-benchmarking/runtime-benchmarks",
"frame-support/runtime-benchmarks", "frame-support/runtime-benchmarks",
"frame-system/runtime-benchmarks", "frame-system/runtime-benchmarks",
"sp-runtime/runtime-benchmarks", "sp-runtime/runtime-benchmarks",
"pallet-staking/runtime-benchmarks",
] ]
try-runtime = [ try-runtime = [
"frame-support/try-runtime", "frame-support/try-runtime",
"frame-system/try-runtime", "frame-system/try-runtime",
] ]

0
pallets/networks/src/benchmarking.rs Executable file → Normal file
View File

147
pallets/networks/src/lib.rs Executable file → Normal file
View File

@ -4,15 +4,17 @@
use frame_support::{ use frame_support::{
pallet_prelude::*, pallet_prelude::*,
storage::PrefixIterator, traits::EnsureOrigin, storage::PrefixIterator, traits::{tokens::fungible::Inspect, EnsureOrigin},
}; };
use frame_system::pallet_prelude::*; use frame_system::pallet_prelude::*;
use scale_info::TypeInfo; use scale_info::TypeInfo;
use sp_runtime::{ use sp_runtime::{
traits::{AtLeast32BitUnsigned, Member}, traits::{CheckedSub, CheckedAdd, AtLeast32BitUnsigned, Member},
curve::PiecewiseLinear,
DispatchResult, DispatchResult,
}; };
use sp_std::prelude::*; use sp_std::prelude::*;
use sp_std::convert::TryInto;
pub use ghost_traits::networks::{ pub use ghost_traits::networks::{
NetworkDataBasicHandler, NetworkDataInspectHandler, NetworkDataBasicHandler, NetworkDataInspectHandler,
@ -31,6 +33,10 @@ mod mock;
#[cfg(all(feature = "std", test))] #[cfg(all(feature = "std", test))]
mod tests; mod tests;
pub type BalanceOf<T> = <<T as Config>::Currency as Inspect<
<T as frame_system::Config>::AccountId,
>>::Balance;
#[derive(Encode, Decode, Clone, PartialEq, Eq, RuntimeDebug, TypeInfo)] #[derive(Encode, Decode, Clone, PartialEq, Eq, RuntimeDebug, TypeInfo)]
pub enum NetworkType { pub enum NetworkType {
Evm = 0, Evm = 0,
@ -55,6 +61,48 @@ pub struct NetworkData {
pub outgoing_fee: u32, pub outgoing_fee: u32,
} }
#[derive(Default, Encode, Decode, Clone, PartialEq, Eq, RuntimeDebug, TypeInfo)]
pub struct BridgeAdjustment<Balance> {
bridged_out: Balance,
bridged_in: Balance,
}
pub struct BridgedInflationCurve<RewardCurve, T>(core::marker::PhantomData<(RewardCurve, T)>);
impl<Balance, RewardCurve, T> pallet_staking::EraPayout<Balance> for BridgedInflationCurve<RewardCurve, T>
where
Balance: Default + AtLeast32BitUnsigned + Clone + Copy + From<u128>,
RewardCurve: Get<&'static PiecewiseLinear<'static>>,
T: Config,
{
fn era_payout(
total_staked: Balance,
total_issuance: Balance,
_era_duration_in_millis: u64,
) -> (Balance, Balance) {
let piecewise_linear = RewardCurve::get();
let bridge_adjustment = BridgedImbalance::<T>::get();
let accumulated_commission = AccumulatedCommission::<T>::get();
let bridged_out: u128 = bridge_adjustment.bridged_out.try_into().unwrap_or_default();
let bridged_in: u128 = bridge_adjustment.bridged_in.try_into().unwrap_or_default();
let accumulated_commission: u128 = accumulated_commission.try_into().unwrap_or_default();
let accumulated_balance = Balance::from(accumulated_commission);
let adjusted_issuance = match bridged_out > bridged_in {
true => total_issuance.saturating_add(Balance::from(bridged_out - bridged_in)),
false => total_issuance.saturating_sub(Balance::from(bridged_in - bridged_out)),
};
match piecewise_linear
.calculate_for_fraction_times_denominator(total_staked, adjusted_issuance)
.checked_mul(&accumulated_balance)
.and_then(|product| product.checked_div(&adjusted_issuance)) {
Some(payout) => (payout, accumulated_balance.saturating_sub(payout)),
None => (Balance::default(), Balance::default()),
}
}
}
#[frame_support::pallet] #[frame_support::pallet]
pub mod module { pub mod module {
use super::*; use super::*;
@ -63,6 +111,9 @@ pub mod module {
pub trait Config: frame_system::Config { pub trait Config: frame_system::Config {
type RuntimeEvent: From<Event<Self>> + IsType<<Self as frame_system::Config>::RuntimeEvent>; type RuntimeEvent: From<Event<Self>> + IsType<<Self as frame_system::Config>::RuntimeEvent>;
/// The type used for the internal balance storage.
type Currency: Inspect<Self::AccountId>;
/// The type used as a unique network id. /// The type used as a unique network id.
type NetworkId: Parameter type NetworkId: Parameter
+ Member + Member
@ -114,11 +165,31 @@ pub mod module {
NetworkRemoved { chain_id: T::NetworkId }, NetworkRemoved { chain_id: T::NetworkId },
} }
#[pallet::storage]
#[pallet::getter(fn bridged_imbalance)]
pub type BridgedImbalance<T: Config> =
StorageValue<_, BridgeAdjustment<BalanceOf<T>>, ValueQuery>;
#[pallet::storage]
#[pallet::getter(fn accumulated_commission)]
pub type AccumulatedCommission<T: Config> =
StorageValue<_, BalanceOf<T>, ValueQuery>;
#[pallet::storage] #[pallet::storage]
#[pallet::getter(fn networks)] #[pallet::getter(fn networks)]
pub type Networks<T: Config> = pub type Networks<T: Config> =
StorageMap<_, Twox64Concat, T::NetworkId, NetworkData, OptionQuery>; StorageMap<_, Twox64Concat, T::NetworkId, NetworkData, OptionQuery>;
#[pallet::storage]
#[pallet::getter(fn gatekeeper_amount)]
pub type GatekeeperAmount<T: Config> = StorageMap<
_,
Twox64Concat,
T::NetworkId,
BalanceOf<T>,
ValueQuery,
>;
#[pallet::genesis_config] #[pallet::genesis_config]
pub struct GenesisConfig<T: Config> { pub struct GenesisConfig<T: Config> {
pub networks: Vec<(T::NetworkId, Vec<u8>)>, pub networks: Vec<(T::NetworkId, Vec<u8>)>,
@ -527,7 +598,7 @@ impl<T: Config> NetworkDataInspectHandler<NetworkData> for Pallet<T> {
} }
} }
impl<T: Config> NetworkDataMutateHandler<NetworkData> for Pallet<T> { impl<T: Config> NetworkDataMutateHandler<NetworkData, BalanceOf<T>> for Pallet<T> {
fn register(chain_id: Self::NetworkId, network: NetworkData) -> DispatchResult { fn register(chain_id: Self::NetworkId, network: NetworkData) -> DispatchResult {
Self::do_register_network(chain_id, network) Self::do_register_network(chain_id, network)
} }
@ -535,4 +606,74 @@ impl<T: Config> NetworkDataMutateHandler<NetworkData> for Pallet<T> {
fn remove(chain_id: Self::NetworkId) -> DispatchResult { fn remove(chain_id: Self::NetworkId) -> DispatchResult {
Self::do_remove_network(chain_id) Self::do_remove_network(chain_id)
} }
fn increase_gatekeeper_amount(
network_id: &T::NetworkId,
amount: &BalanceOf<T>,
) -> Result<(BalanceOf<T>, BalanceOf<T>), ()> {
let new_bridged_in_amount = BridgedImbalance::<T>::mutate(|bridged_imbalance| {
match bridged_imbalance.bridged_in.checked_add(amount) {
Some(value) => {
(*bridged_imbalance).bridged_in = value;
Ok(value)
},
None => Err(())
}
})?;
let new_gatekeeper_amount = GatekeeperAmount::<T>::mutate(network_id, |gatekeeper_amount| {
match gatekeeper_amount.checked_add(amount) {
Some(value) => {
*gatekeeper_amount = value;
Ok(value)
},
None => Err(())
}
})?;
Ok((new_gatekeeper_amount, new_bridged_in_amount))
}
fn decrease_gatekeeper_amount(
network_id: &T::NetworkId,
amount: &BalanceOf<T>,
) -> Result<(BalanceOf<T>, BalanceOf<T>), ()> {
let new_gatekeeper_amount = GatekeeperAmount::<T>::mutate(network_id, |gatekeeper_amount| {
match gatekeeper_amount.checked_sub(amount) {
Some(value) => {
*gatekeeper_amount = value;
Ok(value)
},
None => Err(())
}
})?;
let new_bridged_out_amount = BridgedImbalance::<T>::mutate(|bridged_imbalance| {
match bridged_imbalance.bridged_out.checked_add(amount) {
Some(value) => {
(*bridged_imbalance).bridged_out = value;
Ok(value)
},
None => Err(())
}
})?;
Ok((new_gatekeeper_amount, new_bridged_out_amount))
}
fn accumulate_commission(commission: &BalanceOf<T>) -> Result<BalanceOf<T>, ()> {
AccumulatedCommission::<T>::mutate(|accumulated| {
match accumulated.checked_add(commission) {
Some(value) => {
*accumulated = value;
Ok(value)
},
None => Err(()),
}
})
}
fn nullify_commission() {
AccumulatedCommission::<T>::set(Default::default());
}
} }

32
pallets/networks/src/mock.rs Executable file → Normal file
View File

@ -1,19 +1,25 @@
use crate as ghost_networks; use crate::{self as ghost_networks};
use frame_system::EnsureSignedBy; use frame_system::EnsureSignedBy;
use frame_support::{ use frame_support::{
construct_runtime, ord_parameter_types, parameter_types, traits::{ConstU128, ConstU32, Everything} construct_runtime, ord_parameter_types, parameter_types,
traits::{ConstU128, ConstU32, Everything},
}; };
pub use primitives::{ pub use primitives::{
AccountId, Balance, Nonce, BlockNumber, Hash, AccountId, Balance, Nonce, BlockNumber, Hash,
ReserveIdentifier, FreezeIdentifier, ReserveIdentifier, FreezeIdentifier,
}; };
use sp_runtime::{ use sp_runtime::{
traits::{BlakeTwo256, AccountIdLookup}, curve::PiecewiseLinear,
BuildStorage, traits::{AccountIdLookup, BlakeTwo256},
BuildStorage
}; };
parameter_types! { parameter_types! {
pub const BlockHashCount: BlockNumber = 250; pub const BlockHashCount: BlockNumber = 250;
pub static SlashDeferDuration: u32 = 0;
pub static Period: BlockNumber = 5;
pub static Offset: BlockNumber = 0;
pub static MaxControllersInDeprecationBatch: u32 = 5_000;
} }
impl frame_system::Config for Test { impl frame_system::Config for Test {
@ -64,6 +70,21 @@ impl pallet_balances::Config for Test {
type MaxFreezes = ConstU32<50>; type MaxFreezes = ConstU32<50>;
} }
pallet_staking_reward_curve::build! {
const REWARD_CURVE: PiecewiseLinear<'static> = curve!(
min_inflation: 0_006_900,
max_inflation: 1_000_000,
ideal_stake: 0_690_000,
falloff: 0_050_000,
max_piece_count: 100,
test_precision: 0_005_000,
);
}
parameter_types! {
pub const RewardCurve: &'static PiecewiseLinear<'static> = &REWARD_CURVE;
}
ord_parameter_types! { ord_parameter_types! {
pub const RegistererAccount: AccountId = AccountId::from([1u8; 32]); pub const RegistererAccount: AccountId = AccountId::from([1u8; 32]);
pub const UpdaterAccount: AccountId = AccountId::from([2u8; 32]); pub const UpdaterAccount: AccountId = AccountId::from([2u8; 32]);
@ -73,6 +94,7 @@ ord_parameter_types! {
impl ghost_networks::Config for Test { impl ghost_networks::Config for Test {
type RuntimeEvent = RuntimeEvent; type RuntimeEvent = RuntimeEvent;
type Currency = Balances;
type NetworkId = u32; type NetworkId = u32;
type RegisterOrigin = EnsureSignedBy::<RegistererAccount, AccountId>; type RegisterOrigin = EnsureSignedBy::<RegistererAccount, AccountId>;
type UpdateOrigin = EnsureSignedBy::<UpdaterAccount, AccountId>; type UpdateOrigin = EnsureSignedBy::<UpdaterAccount, AccountId>;
@ -80,7 +102,7 @@ impl ghost_networks::Config for Test {
type WeightInfo = crate::weights::SubstrateWeight<Test>; type WeightInfo = crate::weights::SubstrateWeight<Test>;
} }
type Block = frame_system::mocking::MockBlockU32<Test>; type Block = frame_system::mocking::MockBlock<Test>;
construct_runtime!( construct_runtime!(
pub enum Test { pub enum Test {

284
pallets/networks/src/tests.rs Executable file → Normal file
View File

@ -1,16 +1,16 @@
use mock::{ use mock::{
ExtBuilder, System, RegistererAccount, UpdaterAccount, RemoverAccount, ExtBuilder, System, RegistererAccount, UpdaterAccount, RemoverAccount,
RandomAccount, GhostNetworks, Test, RuntimeEvent, RuntimeOrigin, RandomAccount, GhostNetworks, Test, RuntimeEvent, RuntimeOrigin, RewardCurve,
}; };
use frame_support::{assert_err, assert_ok}; use frame_support::{assert_err, assert_ok};
use sp_runtime::DispatchError; use sp_runtime::DispatchError;
use pallet_staking::EraPayout;
use super::*; use super::*;
fn prepare_network_data() -> (u32, NetworkData) { fn prepare_network_data() -> (u32, NetworkData) {
(1u32, NetworkData { (1u32, NetworkData {
chain_name: "Ethereum".into(), chain_name: "Ethereum".into(),
default_endpoint: default_endpoint: "https:://some-endpoint.my-server.com/v1/my-super-secret-key".into(),
"https:://some-endpoint.my-server.com/v1/my-super-secret-key".into(),
finality_delay: Some(69), finality_delay: Some(69),
release_delay: Some(69), release_delay: Some(69),
network_type: NetworkType::Evm, network_type: NetworkType::Evm,
@ -635,3 +635,281 @@ fn could_not_remove_non_existent_network() {
assert_eq!(Networks::<Test>::get(chain_id), None); assert_eq!(Networks::<Test>::get(chain_id), None);
}); });
} }
#[test]
fn bridge_storage_is_empty_by_default() {
ExtBuilder::build()
.execute_with(|| {
assert_eq!(AccumulatedCommission::<Test>::get(), 0);
assert_eq!(BridgedImbalance::<Test>::get(),
BridgeAdjustment::default());
});
}
#[test]
fn gatekeeper_amount_changes_correctly() {
ExtBuilder::build()
.execute_with(|| {
let chain_id: u32 = 1;
let amount_in: u128 = 420;
let amount_out: u128 = 69;
let result = amount_in - 3 * amount_out;
assert_eq!(GatekeeperAmount::<Test>::get(&chain_id), 0);
assert_eq!(BridgedImbalance::<Test>::get(),
BridgeAdjustment::default());
assert_ok!(GhostNetworks::increase_gatekeeper_amount(&chain_id, &amount_in));
assert_ok!(GhostNetworks::decrease_gatekeeper_amount(&chain_id, &amount_out));
assert_ok!(GhostNetworks::decrease_gatekeeper_amount(&chain_id, &amount_out));
assert_ok!(GhostNetworks::decrease_gatekeeper_amount(&chain_id, &amount_out));
assert_eq!(GatekeeperAmount::<Test>::get(&chain_id), result);
assert_eq!(BridgedImbalance::<Test>::get(), BridgeAdjustment {
bridged_out: 3 * amount_out,
bridged_in: amount_in });
});
}
#[test]
fn commission_accumulation_is_correct() {
ExtBuilder::build()
.execute_with(|| {
let commission_first: u128 = 420;
let commission_second: u128 = 69;
let result = commission_first + commission_second;
assert_eq!(AccumulatedCommission::<Test>::get(), 0);
assert_ok!(GhostNetworks::accumulate_commission(&commission_first));
assert_ok!(GhostNetworks::accumulate_commission(&commission_second));
assert_eq!(AccumulatedCommission::<Test>::get(), result);
});
}
#[test]
fn commission_overflow_and_underflow_emits_error() {
ExtBuilder::build()
.execute_with(|| {
let commission: u128 = u128::MAX - 69;
assert_eq!(AccumulatedCommission::<Test>::get(), 0);
assert_ok!(GhostNetworks::accumulate_commission(&commission));
assert_err!(GhostNetworks::accumulate_commission(&commission), ());
assert_eq!(AccumulatedCommission::<Test>::get(), commission);
});
}
#[test]
fn gatekeeper_amount_overflow_and_underflow_emits_error() {
ExtBuilder::build()
.execute_with(|| {
let chain_id: u32 = 1;
let commission: u128 = u128::MAX - 69;
assert_eq!(GatekeeperAmount::<Test>::get(&chain_id), 0);
assert_ok!(GhostNetworks::increase_gatekeeper_amount(
&chain_id,
&commission,
), (commission, commission));
assert_err!(GhostNetworks::increase_gatekeeper_amount(
&chain_id,
&commission,
), ());
assert_eq!(GatekeeperAmount::<Test>::get(&chain_id), commission);
assert_ok!(GhostNetworks::decrease_gatekeeper_amount(
&chain_id,
&commission,
), (0, commission));
assert_err!(GhostNetworks::decrease_gatekeeper_amount(
&chain_id,
&commission,
), ());
assert_eq!(GatekeeperAmount::<Test>::get(&chain_id), 0);
assert_eq!(BridgedImbalance::<Test>::get(), BridgeAdjustment {
bridged_out: commission,
bridged_in: commission,
});
});
}
#[test]
fn bridged_amount_overflow_and_underflow_emits_error() {
ExtBuilder::build()
.execute_with(|| {
let chain_id_first: u32 = 1;
let chain_id_second: u32 = 2;
let commission: u128 = u128::MAX - 69;
assert_eq!(BridgedImbalance::<Test>::get(), BridgeAdjustment {
bridged_out: 0,
bridged_in: 0,
});
assert_ok!(GhostNetworks::increase_gatekeeper_amount(
&chain_id_first,
&commission,
), (commission, commission));
assert_err!(GhostNetworks::increase_gatekeeper_amount(
&chain_id_second,
&commission,
), ());
assert_err!(GhostNetworks::increase_gatekeeper_amount(
&chain_id_first,
&u128::MAX,
), ());
assert_err!(GhostNetworks::increase_gatekeeper_amount(
&chain_id_first,
&commission,
), ());
assert_eq!(GatekeeperAmount::<Test>::get(&chain_id_first), commission);
assert_eq!(GatekeeperAmount::<Test>::get(&chain_id_second), 0);
assert_err!(GhostNetworks::decrease_gatekeeper_amount(
&chain_id_second,
&commission,
), ());
});
}
#[test]
fn accumulated_commission_could_be_nullified() {
ExtBuilder::build()
.execute_with(|| {
let commission_first: u128 = 420;
let commission_second: u128 = 69;
assert_eq!(AccumulatedCommission::<Test>::get(), 0);
assert_ok!(GhostNetworks::accumulate_commission(
&commission_first
), commission_first);
assert_ok!(GhostNetworks::accumulate_commission(
&commission_second,
), commission_first + commission_second);
assert_eq!(AccumulatedCommission::<Test>::get(),
commission_first + commission_second);
GhostNetworks::nullify_commission();
assert_eq!(AccumulatedCommission::<Test>::get(), 0);
});
}
#[test]
fn bridged_inlation_reward_works() {
ExtBuilder::build()
.execute_with(|| {
let chain_id: u32 = 1;
let amount: u128 = 1337 * 1_000_000_000;
let commission: u128 = amount / 100; // 1% commission
let total_staked_ideal: u128 = 69;
let total_staked_not_ideal: u128 = 68;
let total_issuance: u128 = 100;
assert_eq!(BridgedInflationCurve::<RewardCurve, Test>::era_payout(
total_staked_ideal * 1_000,
total_issuance * 1_000,
0), (0, 0));
assert_eq!(BridgedInflationCurve::<RewardCurve, Test>::era_payout(
total_staked_ideal * 1_000_000_000_000,
total_issuance * 1_000_000_000_000,
0), (0, 0));
assert_eq!(BridgedInflationCurve::<RewardCurve, Test>::era_payout(
total_staked_ideal * 1_000_000_000_000_000_000_000_000,
total_issuance * 1_000_000_000_000_000_000_000_000,
0), (0, 0));
assert_eq!(BridgedInflationCurve::<RewardCurve, Test>::era_payout(
total_staked_not_ideal * 1_000,
total_issuance * 1_000,
0), (0, 0));
assert_eq!(BridgedInflationCurve::<RewardCurve, Test>::era_payout(
total_staked_not_ideal * 1_000_000_000_000,
total_issuance * 1_000_000_000_000,
0), (0, 0));
assert_eq!(BridgedInflationCurve::<RewardCurve, Test>::era_payout(
total_staked_not_ideal * 1_000_000_000_000_000_000_000_000,
total_issuance * 1_000_000_000_000_000_000_000_000,
0), (0, 0));
assert_eq!(BridgedInflationCurve::<RewardCurve, Test>::era_payout(
1, total_issuance * 1_000, 0), (0, 0));
assert_eq!(BridgedInflationCurve::<RewardCurve, Test>::era_payout(
1, total_issuance * 1_000_000_000_000, 0), (0, 0));
assert_eq!(BridgedInflationCurve::<RewardCurve, Test>::era_payout(
1, total_issuance * 1_000_000_000_000_000_000_000_000, 0), (0, 0));
assert_ok!(GhostNetworks::accumulate_commission(&commission));
assert_ok!(GhostNetworks::increase_gatekeeper_amount(&chain_id, &amount));
assert_eq!(BridgedInflationCurve::<RewardCurve, Test>::era_payout(
total_staked_ideal * 1_000,
total_issuance * 1_000 + amount,
0), (commission, 0));
assert_eq!(BridgedInflationCurve::<RewardCurve, Test>::era_payout(
total_staked_ideal * 1_000_000_000_000,
total_issuance * 1_000_000_000_000 + amount,
0), (commission, 0));
assert_eq!(BridgedInflationCurve::<RewardCurve, Test>::era_payout(
total_staked_ideal * 1_000_000_000_000_000_000_000_000,
total_issuance * 1_000_000_000_000_000_000_000_000 + amount,
0), (commission, 0));
assert_eq!(BridgedInflationCurve::<RewardCurve, Test>::era_payout(
total_staked_not_ideal * 1_000,
total_issuance * 1_000 + amount,
0), (13177472000, 192528000));
assert_eq!(13177472000 + 192528000, commission);
assert_eq!(BridgedInflationCurve::<RewardCurve, Test>::era_payout(
total_staked_not_ideal * 1_000_000_000_000,
total_issuance * 1_000_000_000_000 + amount,
0), (13177568884, 192431116));
assert_eq!(13177568884 + 192431116, commission);
assert_eq!(BridgedInflationCurve::<RewardCurve, Test>::era_payout(
total_staked_not_ideal * 1_000_000_000_000_000_000_000_000,
total_issuance * 1_000_000_000_000_000_000_000_000 + amount,
0), (13177568884, 192431116));
assert_eq!(13177568884 + 192431116, commission);
assert_eq!(BridgedInflationCurve::<RewardCurve, Test>::era_payout(
1, total_issuance * 1_000 + amount, 0),
(92386700, 13277613300));
assert_eq!(92386700 + 13277613300, commission);
assert_eq!(BridgedInflationCurve::<RewardCurve, Test>::era_payout(
1, total_issuance * 1_000_000_000_000 + amount, 0),
(92253000, 13277747000));
assert_eq!(92253000 + 13277747000, commission);
assert_eq!(BridgedInflationCurve::<RewardCurve, Test>::era_payout(
1, total_issuance * 1_000_000_000_000_000_000_000_000 + amount, 0),
(92253000, 13277747000));
assert_eq!(92253000 + 13277747000, commission);
GhostNetworks::nullify_commission();
assert_eq!(BridgedInflationCurve::<RewardCurve, Test>::era_payout(
total_staked_ideal * 1_000,
total_issuance * 1_000 + amount,
0), (0, 0));
assert_eq!(BridgedInflationCurve::<RewardCurve, Test>::era_payout(
total_staked_ideal * 1_000_000_000_000,
total_issuance * 1_000_000_000_000 + amount,
0), (0, 0));
assert_eq!(BridgedInflationCurve::<RewardCurve, Test>::era_payout(
total_staked_ideal * 1_000_000_000_000_000_000_000_000,
total_issuance * 1_000_000_000_000_000_000_000_000 + amount,
0), (0, 0));
assert_eq!(BridgedInflationCurve::<RewardCurve, Test>::era_payout(
total_staked_not_ideal * 1_000,
total_issuance * 1_000 + amount,
0), (0, 0));
assert_eq!(BridgedInflationCurve::<RewardCurve, Test>::era_payout(
total_staked_not_ideal * 1_000_000_000_000,
total_issuance * 1_000_000_000_000 + amount,
0), (0, 0));
assert_eq!(BridgedInflationCurve::<RewardCurve, Test>::era_payout(
total_staked_not_ideal * 1_000_000_000_000_000_000_000_000,
total_issuance * 1_000_000_000_000_000_000_000_000 + amount,
0), (0, 0));
assert_eq!(BridgedInflationCurve::<RewardCurve, Test>::era_payout(
1, total_issuance * 1_000 + amount, 0), (0, 0));
assert_eq!(BridgedInflationCurve::<RewardCurve, Test>::era_payout(
1, total_issuance * 1_000_000_000_000 + amount, 0), (0, 0));
assert_eq!(BridgedInflationCurve::<RewardCurve, Test>::era_payout(
1, total_issuance * 1_000_000_000_000_000_000_000_000 + amount, 0), (0, 0));
});
}

0
pallets/networks/src/weights.rs Executable file → Normal file
View File

View File

@ -1,6 +1,6 @@
[package] [package]
name = "ghost-slow-clap" name = "ghost-slow-clap"
version = "0.3.15" version = "0.3.16"
description = "Applause protocol for the EVM bridge" description = "Applause protocol for the EVM bridge"
license.workspace = true license.workspace = true
authors.workspace = true authors.workspace = true

1023
pallets/slow-clap/src/lib.rs Executable file → Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1,18 +1,11 @@
use frame_support::weights::Weight; use frame_support::weights::Weight;
pub trait WeightInfo { pub trait WeightInfo {
fn slow_clap(claps_len: u32, companions_len: u32) -> Weight; fn slow_clap() -> Weight;
fn propose_companion() -> Weight; fn applause()-> Weight;
fn release_companion() -> Weight;
fn kill_companion() -> Weight;
} }
impl WeightInfo for () { impl WeightInfo for () {
fn slow_clap( fn slow_clap()-> Weight { Weight::zero() }
_claps_len: u32, fn applause()-> Weight { Weight::zero() }
_companions_len: u32,
) -> Weight { Weight::zero() }
fn propose_companion() -> Weight { Weight::zero() }
fn release_companion() -> Weight { Weight::zero() }
fn kill_companion() -> Weight { Weight::zero() }
} }

4
pallets/traits/Cargo.toml Executable file → Normal file
View File

@ -14,6 +14,6 @@ sp-runtime = { workspace = true }
[features] [features]
default = ["std"] default = ["std"]
std = [ std = [
"frame-support/std", "frame-support/std",
"sp-runtime/std", "sp-runtime/std",
] ]

0
pallets/traits/src/lib.rs Executable file → Normal file
View File

13
pallets/traits/src/networks.rs Executable file → Normal file
View File

@ -23,7 +23,18 @@ pub trait NetworkDataInspectHandler<Network>: NetworkDataBasicHandler {
fn iter() -> PrefixIterator<(Self::NetworkId, Network)>; fn iter() -> PrefixIterator<(Self::NetworkId, Network)>;
} }
pub trait NetworkDataMutateHandler<Network>: NetworkDataInspectHandler<Network> { pub trait NetworkDataMutateHandler<Network, Balance>: NetworkDataInspectHandler<Network> {
fn register(chain_id: Self::NetworkId, network: Network) -> DispatchResult; fn register(chain_id: Self::NetworkId, network: Network) -> DispatchResult;
fn remove(chain_id: Self::NetworkId) -> DispatchResult; fn remove(chain_id: Self::NetworkId) -> DispatchResult;
fn increase_gatekeeper_amount(
chain_id: &Self::NetworkId,
amount: &Balance,
) -> Result<(Balance, Balance), ()>;
fn decrease_gatekeeper_amount(
chain_id: &Self::NetworkId,
amount: &Balance,
) -> Result<(Balance, Balance), ()>;
fn accumulate_commission(commission: &Balance) -> Result<Balance, ()>;
fn nullify_commission();
} }

0
rpc/Cargo.toml Executable file → Normal file
View File

0
rpc/src/lib.rs Executable file → Normal file
View File

0
runtime/casper/Cargo.toml Executable file → Normal file
View File

0
runtime/casper/build.rs Executable file → Normal file
View File

0
runtime/casper/constants/Cargo.toml Executable file → Normal file
View File

0
runtime/casper/constants/src/lib.rs Executable file → Normal file
View File

0
runtime/casper/src/cult/mod.rs Executable file → Normal file
View File

0
runtime/casper/src/cult/origins.rs Executable file → Normal file
View File

0
runtime/casper/src/cult/tracks.rs Executable file → Normal file
View File

0
runtime/casper/src/lib.rs Executable file → Normal file
View File

48
runtime/common/Cargo.toml Executable file → Normal file
View File

@ -31,21 +31,21 @@ primitives = { workspace = true }
default = ["std"] default = ["std"]
no_std = [] no_std = []
std = [ std = [
"sp-core/std", "sp-core/std",
"sp-std/std", "sp-std/std",
"sp-io/std", "sp-io/std",
"sp-runtime/std", "sp-runtime/std",
"sp-staking/std", "sp-staking/std",
"frame-support/std", "frame-support/std",
"frame-system/std", "frame-system/std",
"pallet-authorship/std", "pallet-authorship/std",
"pallet-balances/std", "pallet-balances/std",
"pallet-staking/std", "pallet-staking/std",
"pallet-staking-reward-fn/std", "pallet-staking-reward-fn/std",
"pallet-timestamp/std", "pallet-timestamp/std",
"pallet-transaction-payment/std", "pallet-transaction-payment/std",
"pallet-treasury/std", "pallet-treasury/std",
"pallet-election-provider-multi-phase/std", "pallet-election-provider-multi-phase/std",
"primitives/std", "primitives/std",
] ]
runtime-benchmarks = [ runtime-benchmarks = [
@ -53,21 +53,21 @@ runtime-benchmarks = [
"sp-staking/runtime-benchmarks", "sp-staking/runtime-benchmarks",
"frame-support/runtime-benchmarks", "frame-support/runtime-benchmarks",
"frame-system/runtime-benchmarks", "frame-system/runtime-benchmarks",
"pallet-balances/runtime-benchmarks", "pallet-balances/runtime-benchmarks",
"pallet-staking/runtime-benchmarks", "pallet-staking/runtime-benchmarks",
"pallet-timestamp/runtime-benchmarks", "pallet-timestamp/runtime-benchmarks",
"pallet-treasury/runtime-benchmarks", "pallet-treasury/runtime-benchmarks",
"pallet-election-provider-multi-phase/runtime-benchmarks", "pallet-election-provider-multi-phase/runtime-benchmarks",
] ]
try-runtime = [ try-runtime = [
"sp-runtime/try-runtime", "sp-runtime/try-runtime",
"frame-support/try-runtime", "frame-support/try-runtime",
"frame-system/try-runtime", "frame-system/try-runtime",
"pallet-authorship/try-runtime", "pallet-authorship/try-runtime",
"pallet-balances/try-runtime", "pallet-balances/try-runtime",
"pallet-staking/try-runtime", "pallet-staking/try-runtime",
"pallet-timestamp/try-runtime", "pallet-timestamp/try-runtime",
"pallet-transaction-payment/try-runtime", "pallet-transaction-payment/try-runtime",
"pallet-treasury/try-runtime", "pallet-treasury/try-runtime",
"pallet-election-provider-multi-phase/try-runtime", "pallet-election-provider-multi-phase/try-runtime",
] ]

0
runtime/common/src/impls.rs Executable file → Normal file
View File

0
runtime/common/src/lib.rs Executable file → Normal file
View File

0
runtime/common/src/weights/block_weights.rs Executable file → Normal file
View File

0
runtime/common/src/weights/extrinsic.rs Executable file → Normal file
View File

0
runtime/common/src/weights/mod.rs Executable file → Normal file
View File

View File

@ -1,6 +1,7 @@
[Unit] [Unit]
Description=Ghost Node Description=Ghost Node
After=network.target After=network-online.target
Requires=network-online.target
Documentation=https://git.ghostchain.io/ghostchain/ghost-node Documentation=https://git.ghostchain.io/ghostchain/ghost-node
[Service] [Service]

2
scripts/patch.sh Executable file
View File

@ -0,0 +1,2 @@
SCRIPT_DIR=$(dirname "$0")
bash "$SCRIPT_DIR/patches/patch-1.sh"

32
scripts/patches/patch-1.sh Executable file
View File

@ -0,0 +1,32 @@
DEFAULT_SERVICE_NAME="ghost-node.service"
check_unit_file_validity() {
SERVICE_NAME=$1
if [[ "$SERVICE_NAME" != *.service ]]; then
SERVICE_NAME="${SERVICE_NAME}.service"
fi
SERVICE_FULL_PATH="/etc/systemd/system/$SERVICE_NAME"
if [[ -e "$SERVICE_FULL_PATH" ]]; then
NETWORK_ONLINE_EXISTS=$(grep -Fx "After=network-online.target" "$SERVICE_FULL_PATH")
NETWORK_EXISTS=$(grep -Fx "After=network.target" "$SERVICE_FULL_PATH")
if [[ -z "$NETWORK_ONLINE_EXISTS" && -n "$NETWORK_EXISTS" ]]
then
echo "[-] WARNING: missing network-online.target dependency in $SERVICE_FULL_PATH, trying to replace"
sudo sed -i "s/After=network.target/After=network-online.target\nRequires=network-online.target/g" "$SERVICE_FULL_PATH"
else
echo "[+] INFO: network-online.target is set correctly for $SERVICE_FULL_PATH"
fi
else
echo "[-] No serivce found at $SERVICE_FULL_PATH"
fi
}
check_unit_file_validity $DEFAULT_SERVICE_NAME
read -p "[?] Enter names for the node service, separated by commas (default: ghost-node): " -a SERVICE_NAMES
for NAME in "${SERVICE_NAMES[@]}"; do
check_unit_file_validity $NAME
done
sudo systemctl daemon-reload

View File

@ -7,6 +7,7 @@ INSERT_KEYS=false
UNIT_FILE=false UNIT_FILE=false
SKIP_BUILD=false SKIP_BUILD=false
SET_ENVIRONMENT=false SET_ENVIRONMENT=false
VALIDATE=false
EXECUTABLE_PATH="/usr/bin/" EXECUTABLE_PATH="/usr/bin/"
SPECIFICATION_PATH="/etc/ghost/" SPECIFICATION_PATH="/etc/ghost/"
BASE_PATH="/var/lib/ghost" BASE_PATH="/var/lib/ghost"
@ -88,6 +89,7 @@ help() {
echo -e "-k, --check-keys\n\tCheck if your keys are already included in 'ghosties' file." echo -e "-k, --check-keys\n\tCheck if your keys are already included in 'ghosties' file."
echo -e "-y, --insert-keys\n\tInsert session keys to the keystore via JSON RPC." echo -e "-y, --insert-keys\n\tInsert session keys to the keystore via JSON RPC."
echo -e "-r, --release\n\tCompile node with '--release' flag." echo -e "-r, --release\n\tCompile node with '--release' flag."
echo -e "-v, --validate\n\tManipulate '--validate' flag in CLI_ARGS."
echo -e "-p, --profile\n\tCompile node with '--profile [PROFILE]' flag." echo -e "-p, --profile\n\tCompile node with '--profile [PROFILE]' flag."
echo -e "-f, --features\n\tCompilation features '--features=\"FEATURE1,FEATURE2\"'" echo -e "-f, --features\n\tCompilation features '--features=\"FEATURE1,FEATURE2\"'"
echo -e "-e, --executable-path\n\tPath to the executable ('/usr/lib/' is default)." echo -e "-e, --executable-path\n\tPath to the executable ('/usr/lib/' is default)."
@ -133,6 +135,9 @@ while [ $# -gt 0 ]; do
RELEASE="--release" RELEASE="--release"
TARGET="release" TARGET="release"
;; ;;
--validate|-v)
VALIDATE=true
;;
--profile*|-p*) --profile*|-p*)
if [[ "$1" != *=* ]]; then shift; fi if [[ "$1" != *=* ]]; then shift; fi
RELEASE="--profile=${1#*=}" RELEASE="--profile=${1#*=}"
@ -263,6 +268,32 @@ if [[ ! -z $RELEASE ]]; then
fi fi
fi fi
if [[ $VALIDATE = true ]]; then
cli_args=$(cat /etc/default/ghost)
if prompt "[?] turn on validator mode?"; then
if [[ $cli_args == *"--validator"* ]]; then
echo "[+] '--validator' flag already exists in CLI_ARGS, check /etc/default/ghost"
else
cli_args="${cli_args%?} --validator\""
echo "[+] '--validator' flag inserted to CLI_ARGS, check /etc/default/ghost"
fi
else
cli_args=${cli_args// --validator/}
echo "[+] '--validator' flag removed"
fi
echo "[+] trying to store CLI updated arguments to '/etc/default/ghost'"
echo "$cli_args" | sudo tee /etc/default/ghost > /dev/null
echo "[+] updated CLI arguments stored in '/etc/default/ghost'"
if prompt "[?] do you want to restart 'ghost-node.service' now?"; then
sudo systemctl status ghost-node.service
echo "[+] 'ghost-node.service' succefully restarted, new CLI_ARGS applied"
else
echo "[+] don't forget to restart ghost node service manually"
fi
fi
if [[ $MAKE_GLOBAL = true ]]; then if [[ $MAKE_GLOBAL = true ]]; then
cd $PROJECT_FOLDER cd $PROJECT_FOLDER
echo "[+] trying to copy executable to '$EXECUTABLE_PATH'" echo "[+] trying to copy executable to '$EXECUTABLE_PATH'"

20
service/Cargo.toml Executable file → Normal file
View File

@ -107,16 +107,16 @@ default = ["db", "full-node"]
db = ["sc-service/rocksdb"] db = ["sc-service/rocksdb"]
full-node = ["kvdb-rocksdb", "parity-db"] full-node = ["kvdb-rocksdb", "parity-db"]
runtime-benchmarks = [ runtime-benchmarks = [
"frame-benchmarking-cli/runtime-benchmarks", "frame-benchmarking-cli/runtime-benchmarks",
"frame-benchmarking/runtime-benchmarks", "frame-benchmarking/runtime-benchmarks",
"frame-support/runtime-benchmarks", "frame-support/runtime-benchmarks",
"frame-system/runtime-benchmarks", "frame-system/runtime-benchmarks",
"pallet-babe/runtime-benchmarks", "pallet-babe/runtime-benchmarks",
"pallet-staking/runtime-benchmarks", "pallet-staking/runtime-benchmarks",
"casper-runtime?/runtime-benchmarks", "casper-runtime?/runtime-benchmarks",
"sc-client-db/runtime-benchmarks", "sc-client-db/runtime-benchmarks",
"sc-service/runtime-benchmarks", "sc-service/runtime-benchmarks",
"sp-runtime/runtime-benchmarks", "sp-runtime/runtime-benchmarks",
] ]
try-runtime = [ try-runtime = [
"frame-support/try-runtime", "frame-support/try-runtime",

File diff suppressed because one or more lines are too long

0
service/src/chain_spec.rs Executable file → Normal file
View File

0
service/src/lib.rs Executable file → Normal file
View File

0
src/main.rs Executable file → Normal file
View File

0
tests/benchmark_block.rs Executable file → Normal file
View File

0
tests/benchmark_extrinsic.rs Executable file → Normal file
View File

0
tests/benchmark_overhead.rs Executable file → Normal file
View File

0
tests/benchmark_storage_works.rs Executable file → Normal file
View File

0
tests/common.rs Executable file → Normal file
View File

0
tests/invalid_order_arguments.rs Executable file → Normal file
View File

0
tests/purge_chain_works.rs Executable file → Normal file
View File

0
tests/running_the_node_and_interrupt.rs Executable file → Normal file
View File

0
utils/generate-bags/Cargo.toml Executable file → Normal file
View File

0
utils/generate-bags/src/main.rs Executable file → Normal file
View File

0
utils/ghostkey/Cargo.toml Executable file → Normal file
View File

0
utils/ghostkey/src/lib.rs Executable file → Normal file
View File

0
utils/ghostkey/src/main.rs Executable file → Normal file
View File

0
utils/staking-miner/Cargo.toml Executable file → Normal file
View File

View File

0
utils/staking-miner/src/main.rs Executable file → Normal file
View File

0
utils/staking-miner/tests/cli.rs Executable file → Normal file
View File