mirror of
https://github.com/serai-dex/serai.git
synced 2025-12-08 12:19:24 +00:00
Remove workaround for lack of musl-dev now that musl-dev is provided in Rust Alpine images
Additionally, optimizes the build process a bit via leaving only the runtime (and `busybox`) in the final image, and additionally building the runtime without `std` (as we solely need the WASM blob from this process).
This commit is contained in:
@@ -1,28 +1,8 @@
|
|||||||
#check=skip=FromPlatformFlagConstDisallowed
|
#check=skip=FromPlatformFlagConstDisallowed
|
||||||
# We want to explicitly set the platform to ensure a constant host environment
|
# We want to explicitly set the platform to ensure a constant host environment
|
||||||
|
|
||||||
# rust:1.91.1-alpine as of November 11th, 2025 (GMT)
|
# rust:1.91.1-alpine as of December 4th, 2025 (GMT)
|
||||||
FROM --platform=linux/amd64 rust@sha256:700c0959b23445f69c82676b72caa97ca4359decd075dca55b13339df27dc4d3
|
FROM --platform=linux/amd64 rust@sha256:84f263251b0ada72c1913d82a824d47be15a607f3faf015d8bdae48db544cdf2 AS builder
|
||||||
|
|
||||||
# In order to compile the runtime, including the `proc-macro`s and build scripts, we need the
|
|
||||||
# required development libraries. These are traditionally provided by `musl-dev` which is not
|
|
||||||
# inherently included with this image (https://github.com/rust-lang/docker-rust/issues/68). While we
|
|
||||||
# could install it here, we'd be unable to pin the installed package by its hash as desired.
|
|
||||||
#
|
|
||||||
# Rust does have self-contained libraries, intended to be used when the desired development files
|
|
||||||
# are not otherwise available. These can be enabled with `link-self-contained=yes`. Unfortunately,
|
|
||||||
# this doesn't work here (https://github.com/rust-lang/rust/issues/149371).
|
|
||||||
#
|
|
||||||
# While we can't set `link-self-contained=yes`, we can install Rust's self-contained libraries onto
|
|
||||||
# our system so they're generally available.
|
|
||||||
RUN echo '#!/bin/sh' > libs.sh
|
|
||||||
RUN echo 'set -e' >> libs.sh
|
|
||||||
RUN echo 'SYSROOT=$(rustc --print sysroot)' >> libs.sh
|
|
||||||
RUN echo 'LIBS=$SYSROOT/lib/rustlib/x86_64-unknown-linux-musl/lib/self-contained' >> libs.sh
|
|
||||||
RUN echo 'ln -s $LIBS/Scrt1.o $LIBS/crti.o $LIBS/crtn.o /usr/lib' >> libs.sh
|
|
||||||
# We also need `libc.so` which is already present on the system, just not under that name
|
|
||||||
RUN echo 'ln -s /lib/libc.musl-x86_64.so.1 /usr/lib/libc.so' >> libs.sh
|
|
||||||
RUN /bin/sh ./libs.sh
|
|
||||||
|
|
||||||
# Add the WASM toolchain
|
# Add the WASM toolchain
|
||||||
RUN rustup target add wasm32v1-none
|
RUN rustup target add wasm32v1-none
|
||||||
@@ -47,11 +27,16 @@ ADD AGPL-3.0 /serai
|
|||||||
WORKDIR /serai
|
WORKDIR /serai
|
||||||
|
|
||||||
# Build the runtime
|
# Build the runtime
|
||||||
RUN cargo build --release -p serai-runtime
|
RUN cargo build --release -p serai-runtime --no-default-features
|
||||||
# Copy the artifact
|
|
||||||
RUN cp /serai/target/release/wbuild/serai-runtime/serai_runtime.wasm /serai/serai.wasm
|
|
||||||
# Clean up the build directory
|
|
||||||
RUN cargo clean
|
|
||||||
|
|
||||||
# Copy the runtime to the provided volume
|
# Copy the artifact to its own image which solely exists to further export it
|
||||||
CMD ["cp", "/serai/serai.wasm", "/volume/serai.wasm"]
|
FROM scratch
|
||||||
|
# Copy `busybox`, including the necessary shared libraries, from the builder for a functioning `cp`
|
||||||
|
COPY --from=builder /lib/ld-musl-x86_64.so.1 /lib/libc.musl-x86_64.so.1 /lib/
|
||||||
|
COPY --from=builder /bin/busybox /bin/
|
||||||
|
ENV LD_LIBRARY_PATH=/lib/
|
||||||
|
ENV PATH=/bin
|
||||||
|
# Copy the artifact itself
|
||||||
|
COPY --from=builder /serai/target/release/wbuild/serai-runtime/serai_runtime.wasm /serai.wasm
|
||||||
|
# By default, copy the artifact to `/volume`, presumably a provided volume
|
||||||
|
CMD ["busybox", "cp", "/serai.wasm", "/volume/serai.wasm"]
|
||||||
|
|||||||
@@ -17,11 +17,31 @@ ignored = ["scale"]
|
|||||||
[lints]
|
[lints]
|
||||||
workspace = true
|
workspace = true
|
||||||
|
|
||||||
[dependencies]
|
[target.'cfg(not(target_family = "wasm"))'.dependencies]
|
||||||
scale = { package = "parity-scale-codec", version = "3", default-features = false, features = ["derive"] }
|
scale = { package = "parity-scale-codec", version = "3", default-features = false, features = ["derive"], optional = true }
|
||||||
|
|
||||||
|
sp-version = { git = "https://github.com/serai-dex/patch-polkadot-sdk", default-features = false, optional = true }
|
||||||
|
sp-runtime = { git = "https://github.com/serai-dex/patch-polkadot-sdk", default-features = false, optional = true }
|
||||||
|
|
||||||
|
sp-api = { git = "https://github.com/serai-dex/patch-polkadot-sdk", default-features = false, optional = true }
|
||||||
|
sp-transaction-pool = { git = "https://github.com/serai-dex/patch-polkadot-sdk", default-features = false, optional = true }
|
||||||
|
sp-inherents = { git = "https://github.com/serai-dex/patch-polkadot-sdk", default-features = false, optional = true }
|
||||||
|
sp-block-builder = { git = "https://github.com/serai-dex/patch-polkadot-sdk", default-features = false, optional = true }
|
||||||
|
sp-consensus-babe = { git = "https://github.com/serai-dex/patch-polkadot-sdk", default-features = false, optional = true }
|
||||||
|
sp-consensus-grandpa = { git = "https://github.com/serai-dex/patch-polkadot-sdk", default-features = false, optional = true }
|
||||||
|
sp-authority-discovery = { git = "https://github.com/serai-dex/patch-polkadot-sdk", default-features = false, optional = true }
|
||||||
|
|
||||||
|
serai-abi = { path = "../abi", default-features = false, features = ["substrate"], optional = true }
|
||||||
|
|
||||||
|
[target.'cfg(target_family = "wasm")'.dependencies]
|
||||||
|
scale = { package = "parity-scale-codec", version = "3", default-features = false, features = ["derive"] }
|
||||||
|
borsh = { version = "1", default-features = false }
|
||||||
|
|
||||||
|
sp-core = { git = "https://github.com/serai-dex/patch-polkadot-sdk", default-features = false }
|
||||||
sp-version = { git = "https://github.com/serai-dex/patch-polkadot-sdk", default-features = false }
|
sp-version = { git = "https://github.com/serai-dex/patch-polkadot-sdk", default-features = false }
|
||||||
sp-runtime = { git = "https://github.com/serai-dex/patch-polkadot-sdk", default-features = false }
|
sp-runtime = { git = "https://github.com/serai-dex/patch-polkadot-sdk", default-features = false }
|
||||||
|
sp-session = { git = "https://github.com/serai-dex/patch-polkadot-sdk", default-features = false }
|
||||||
|
sp-timestamp = { git = "https://github.com/serai-dex/patch-polkadot-sdk", default-features = false }
|
||||||
|
|
||||||
sp-api = { git = "https://github.com/serai-dex/patch-polkadot-sdk", default-features = false }
|
sp-api = { git = "https://github.com/serai-dex/patch-polkadot-sdk", default-features = false }
|
||||||
sp-transaction-pool = { git = "https://github.com/serai-dex/patch-polkadot-sdk", default-features = false }
|
sp-transaction-pool = { git = "https://github.com/serai-dex/patch-polkadot-sdk", default-features = false }
|
||||||
@@ -31,15 +51,6 @@ sp-consensus-babe = { git = "https://github.com/serai-dex/patch-polkadot-sdk", d
|
|||||||
sp-consensus-grandpa = { git = "https://github.com/serai-dex/patch-polkadot-sdk", default-features = false }
|
sp-consensus-grandpa = { git = "https://github.com/serai-dex/patch-polkadot-sdk", default-features = false }
|
||||||
sp-authority-discovery = { git = "https://github.com/serai-dex/patch-polkadot-sdk", default-features = false }
|
sp-authority-discovery = { git = "https://github.com/serai-dex/patch-polkadot-sdk", default-features = false }
|
||||||
|
|
||||||
serai-abi = { path = "../abi", default-features = false, features = ["substrate"] }
|
|
||||||
|
|
||||||
[target.'cfg(target_family = "wasm")'.dependencies]
|
|
||||||
borsh = { version = "1", default-features = false }
|
|
||||||
|
|
||||||
sp-core = { git = "https://github.com/serai-dex/patch-polkadot-sdk", default-features = false }
|
|
||||||
sp-session = { git = "https://github.com/serai-dex/patch-polkadot-sdk", default-features = false }
|
|
||||||
sp-timestamp = { git = "https://github.com/serai-dex/patch-polkadot-sdk", default-features = false }
|
|
||||||
|
|
||||||
frame-system = { git = "https://github.com/serai-dex/patch-polkadot-sdk", default-features = false }
|
frame-system = { git = "https://github.com/serai-dex/patch-polkadot-sdk", default-features = false }
|
||||||
frame-support = { git = "https://github.com/serai-dex/patch-polkadot-sdk", default-features = false }
|
frame-support = { git = "https://github.com/serai-dex/patch-polkadot-sdk", default-features = false }
|
||||||
frame-executive = { git = "https://github.com/serai-dex/patch-polkadot-sdk", default-features = false }
|
frame-executive = { git = "https://github.com/serai-dex/patch-polkadot-sdk", default-features = false }
|
||||||
@@ -49,6 +60,8 @@ pallet-session = { git = "https://github.com/serai-dex/patch-polkadot-sdk", defa
|
|||||||
pallet-babe = { git = "https://github.com/serai-dex/patch-polkadot-sdk", default-features = false }
|
pallet-babe = { git = "https://github.com/serai-dex/patch-polkadot-sdk", default-features = false }
|
||||||
pallet-grandpa = { git = "https://github.com/serai-dex/patch-polkadot-sdk", default-features = false }
|
pallet-grandpa = { git = "https://github.com/serai-dex/patch-polkadot-sdk", default-features = false }
|
||||||
|
|
||||||
|
serai-abi = { path = "../abi", default-features = false, features = ["substrate"] }
|
||||||
|
|
||||||
serai-core-pallet = { path = "../core", default-features = false }
|
serai-core-pallet = { path = "../core", default-features = false }
|
||||||
serai-coins-pallet = { path = "../coins", default-features = false }
|
serai-coins-pallet = { path = "../coins", default-features = false }
|
||||||
serai-validator-sets-pallet = { path = "../validator-sets", default-features = false }
|
serai-validator-sets-pallet = { path = "../validator-sets", default-features = false }
|
||||||
@@ -72,6 +85,7 @@ std = [
|
|||||||
"sp-runtime/std",
|
"sp-runtime/std",
|
||||||
"sp-api/std",
|
"sp-api/std",
|
||||||
"sp-transaction-pool/std",
|
"sp-transaction-pool/std",
|
||||||
|
"sp-inherents/std",
|
||||||
"sp-block-builder/std",
|
"sp-block-builder/std",
|
||||||
"sp-consensus-babe/std",
|
"sp-consensus-babe/std",
|
||||||
"sp-consensus-grandpa/std",
|
"sp-consensus-grandpa/std",
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
fn main() {
|
fn main() {
|
||||||
#[cfg(feature = "std")]
|
#[cfg(not(target_family = "wasm"))]
|
||||||
substrate_wasm_builder::WasmBuilder::build_using_defaults();
|
substrate_wasm_builder::WasmBuilder::build_using_defaults();
|
||||||
}
|
}
|
||||||
|
|||||||
39
substrate/runtime/src/common.rs
Normal file
39
substrate/runtime/src/common.rs
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
use alloc::vec::Vec;
|
||||||
|
use serai_abi::{
|
||||||
|
primitives::{
|
||||||
|
crypto::{Public, EmbeddedEllipticCurveKeys, SignedEmbeddedEllipticCurveKeys, KeyPair},
|
||||||
|
network_id::{ExternalNetworkId, NetworkId},
|
||||||
|
validator_sets::{Session, ExternalValidatorSet, ValidatorSet},
|
||||||
|
balance::{Amount, Balance},
|
||||||
|
address::SeraiAddress,
|
||||||
|
},
|
||||||
|
Event,
|
||||||
|
};
|
||||||
|
|
||||||
|
/// The genesis configuration for Serai.
|
||||||
|
#[derive(scale::Encode, scale::Decode)]
|
||||||
|
pub struct GenesisConfig {
|
||||||
|
/// The genesis validators for the network.
|
||||||
|
pub validators: Vec<(Public, Vec<SignedEmbeddedEllipticCurveKeys>)>,
|
||||||
|
/// The accounts to start with balances, intended solely for testing purposes.
|
||||||
|
pub coins: Vec<(Public, Balance)>,
|
||||||
|
}
|
||||||
|
|
||||||
|
sp_api::decl_runtime_apis! {
|
||||||
|
pub trait GenesisApi {
|
||||||
|
fn build(genesis: GenesisConfig);
|
||||||
|
}
|
||||||
|
pub trait SeraiApi {
|
||||||
|
fn events() -> Vec<Vec<Vec<u8>>>;
|
||||||
|
fn validators(network: NetworkId) -> Vec<Public>;
|
||||||
|
fn current_session(network: NetworkId) -> Option<Session>;
|
||||||
|
fn current_stake(network: NetworkId) -> Option<Amount>;
|
||||||
|
fn keys(set: ExternalValidatorSet) -> Option<KeyPair>;
|
||||||
|
fn current_validators(network: NetworkId) -> Option<Vec<SeraiAddress>>;
|
||||||
|
fn pending_slash_report(network: ExternalNetworkId) -> bool;
|
||||||
|
fn embedded_elliptic_curve_keys(
|
||||||
|
validator: SeraiAddress,
|
||||||
|
network: ExternalNetworkId,
|
||||||
|
) -> Option<EmbeddedEllipticCurveKeys>;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,222 +1,24 @@
|
|||||||
#![cfg_attr(docsrs, feature(doc_cfg))]
|
#![cfg_attr(docsrs, feature(doc_cfg))]
|
||||||
#![cfg_attr(not(feature = "std"), no_std)]
|
#![cfg_attr(not(feature = "std"), no_std)]
|
||||||
|
|
||||||
|
#[cfg(any(feature = "std", target_family = "wasm"))]
|
||||||
extern crate alloc;
|
extern crate alloc;
|
||||||
|
|
||||||
use alloc::vec::Vec;
|
#[cfg(any(feature = "std", target_family = "wasm"))]
|
||||||
use serai_abi::{
|
mod common;
|
||||||
primitives::{
|
#[cfg(any(feature = "std", target_family = "wasm"))]
|
||||||
crypto::{Public, EmbeddedEllipticCurveKeys, SignedEmbeddedEllipticCurveKeys, KeyPair},
|
pub use common::*;
|
||||||
network_id::{ExternalNetworkId, NetworkId},
|
|
||||||
validator_sets::{Session, ExternalValidatorSet, ValidatorSet},
|
|
||||||
balance::{Amount, Balance},
|
|
||||||
address::SeraiAddress,
|
|
||||||
},
|
|
||||||
Event,
|
|
||||||
};
|
|
||||||
|
|
||||||
#[cfg(feature = "std")]
|
|
||||||
include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs"));
|
|
||||||
|
|
||||||
|
// If this is WASM, we build the runtime proper
|
||||||
#[cfg(target_family = "wasm")]
|
#[cfg(target_family = "wasm")]
|
||||||
mod wasm;
|
mod wasm;
|
||||||
|
|
||||||
/// The genesis configuration for Serai.
|
// If this is `std`, we solely stub with `impl_runtime_apis` for the `RuntimeApi` the node requires
|
||||||
#[derive(scale::Encode, scale::Decode)]
|
#[cfg(feature = "std")]
|
||||||
pub struct GenesisConfig {
|
mod std_runtime_api;
|
||||||
/// The genesis validators for the network.
|
#[cfg(feature = "std")]
|
||||||
pub validators: Vec<(Public, Vec<SignedEmbeddedEllipticCurveKeys>)>,
|
pub use std_runtime_api::RuntimeApi;
|
||||||
/// The accounts to start with balances, intended solely for testing purposes.
|
|
||||||
pub coins: Vec<(Public, Balance)>,
|
|
||||||
}
|
|
||||||
|
|
||||||
sp_api::decl_runtime_apis! {
|
// If this isn't WASM, regardless of what it is, we include the WASM blob from the build script
|
||||||
pub trait GenesisApi {
|
|
||||||
fn build(genesis: GenesisConfig);
|
|
||||||
}
|
|
||||||
pub trait SeraiApi {
|
|
||||||
fn events() -> Vec<Vec<Vec<u8>>>;
|
|
||||||
fn validators(network: NetworkId) -> Vec<Public>;
|
|
||||||
fn current_session(network: NetworkId) -> Option<Session>;
|
|
||||||
fn current_stake(network: NetworkId) -> Option<Amount>;
|
|
||||||
fn keys(set: ExternalValidatorSet) -> Option<KeyPair>;
|
|
||||||
fn current_validators(network: NetworkId) -> Option<Vec<SeraiAddress>>;
|
|
||||||
fn pending_slash_report(network: ExternalNetworkId) -> bool;
|
|
||||||
fn embedded_elliptic_curve_keys(
|
|
||||||
validator: SeraiAddress,
|
|
||||||
network: ExternalNetworkId,
|
|
||||||
) -> Option<EmbeddedEllipticCurveKeys>;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// We stub `impl_runtime_apis` to generate the `RuntimeApi` object the node needs
|
|
||||||
#[cfg(not(target_family = "wasm"))]
|
#[cfg(not(target_family = "wasm"))]
|
||||||
mod apis {
|
include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs"));
|
||||||
use alloc::borrow::Cow;
|
|
||||||
use serai_abi::{SubstrateHeader as Header, SubstrateBlock as Block};
|
|
||||||
|
|
||||||
use super::*;
|
|
||||||
|
|
||||||
#[sp_version::runtime_version]
|
|
||||||
pub const VERSION: sp_version::RuntimeVersion = sp_version::RuntimeVersion {
|
|
||||||
spec_name: Cow::Borrowed("serai"),
|
|
||||||
impl_name: Cow::Borrowed("core"),
|
|
||||||
authoring_version: 0,
|
|
||||||
// Use the highest possible value so the node doesn't attempt to use this in place of the WASM
|
|
||||||
spec_version: 0xffffffff,
|
|
||||||
impl_version: 0,
|
|
||||||
apis: RUNTIME_API_VERSIONS,
|
|
||||||
transaction_version: 0,
|
|
||||||
system_version: 0,
|
|
||||||
};
|
|
||||||
|
|
||||||
/// A `struct` representing the runtime as necessary to define the available APIs.
|
|
||||||
pub struct Runtime;
|
|
||||||
sp_api::impl_runtime_apis! {
|
|
||||||
impl sp_api::Core<Block> for Runtime {
|
|
||||||
fn version() -> sp_version::RuntimeVersion {
|
|
||||||
VERSION
|
|
||||||
}
|
|
||||||
fn initialize_block(header: &Header) -> sp_runtime::ExtrinsicInclusionMode {
|
|
||||||
unimplemented!("runtime is only implemented when WASM")
|
|
||||||
}
|
|
||||||
fn execute_block(block: Block) {
|
|
||||||
unimplemented!("runtime is only implemented when WASM")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl sp_block_builder::BlockBuilder<Block> for Runtime {
|
|
||||||
fn apply_extrinsic(
|
|
||||||
extrinsic: <Block as sp_runtime::traits::Block>::Extrinsic,
|
|
||||||
) -> sp_runtime::ApplyExtrinsicResult {
|
|
||||||
unimplemented!("runtime is only implemented when WASM")
|
|
||||||
}
|
|
||||||
|
|
||||||
fn finalize_block() -> Header {
|
|
||||||
unimplemented!("runtime is only implemented when WASM")
|
|
||||||
}
|
|
||||||
|
|
||||||
fn inherent_extrinsics(
|
|
||||||
data: sp_inherents::InherentData,
|
|
||||||
) -> Vec<<Block as sp_runtime::traits::Block>::Extrinsic> {
|
|
||||||
unimplemented!("runtime is only implemented when WASM")
|
|
||||||
}
|
|
||||||
|
|
||||||
fn check_inherents(
|
|
||||||
block: Block,
|
|
||||||
data: sp_inherents::InherentData,
|
|
||||||
) -> sp_inherents::CheckInherentsResult {
|
|
||||||
unimplemented!("runtime is only implemented when WASM")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl sp_transaction_pool::runtime_api::TaggedTransactionQueue<Block> for Runtime {
|
|
||||||
fn validate_transaction(
|
|
||||||
source: sp_runtime::transaction_validity::TransactionSource,
|
|
||||||
tx: <Block as sp_runtime::traits::Block>::Extrinsic,
|
|
||||||
block_hash: <Block as sp_runtime::traits::Block>::Hash,
|
|
||||||
) -> sp_runtime::transaction_validity::TransactionValidity {
|
|
||||||
unimplemented!("runtime is only implemented when WASM")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl sp_consensus_babe::BabeApi<Block> for Runtime {
|
|
||||||
fn configuration() -> sp_consensus_babe::BabeConfiguration {
|
|
||||||
unimplemented!("runtime is only implemented when WASM")
|
|
||||||
}
|
|
||||||
|
|
||||||
fn current_epoch_start() -> sp_consensus_babe::Slot {
|
|
||||||
unimplemented!("runtime is only implemented when WASM")
|
|
||||||
}
|
|
||||||
|
|
||||||
fn current_epoch() -> sp_consensus_babe::Epoch {
|
|
||||||
unimplemented!("runtime is only implemented when WASM")
|
|
||||||
}
|
|
||||||
|
|
||||||
fn next_epoch() -> sp_consensus_babe::Epoch {
|
|
||||||
unimplemented!("runtime is only implemented when WASM")
|
|
||||||
}
|
|
||||||
|
|
||||||
fn generate_key_ownership_proof(
|
|
||||||
_slot: sp_consensus_babe::Slot,
|
|
||||||
_authority_id: sp_consensus_babe::AuthorityId,
|
|
||||||
) -> Option<sp_consensus_babe::OpaqueKeyOwnershipProof> {
|
|
||||||
unimplemented!("runtime is only implemented when WASM")
|
|
||||||
}
|
|
||||||
|
|
||||||
fn submit_report_equivocation_unsigned_extrinsic(
|
|
||||||
equivocation_proof: sp_consensus_babe::EquivocationProof<Header>,
|
|
||||||
_: sp_consensus_babe::OpaqueKeyOwnershipProof,
|
|
||||||
) -> Option<()> {
|
|
||||||
unimplemented!("runtime is only implemented when WASM")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl sp_consensus_grandpa::GrandpaApi<Block> for Runtime {
|
|
||||||
fn grandpa_authorities() -> sp_consensus_grandpa::AuthorityList {
|
|
||||||
unimplemented!("runtime is only implemented when WASM")
|
|
||||||
}
|
|
||||||
|
|
||||||
fn current_set_id() -> sp_consensus_grandpa::SetId {
|
|
||||||
unimplemented!("runtime is only implemented when WASM")
|
|
||||||
}
|
|
||||||
|
|
||||||
fn generate_key_ownership_proof(
|
|
||||||
_set_id: sp_consensus_grandpa::SetId,
|
|
||||||
_authority_id: sp_consensus_grandpa::AuthorityId,
|
|
||||||
) -> Option<sp_consensus_grandpa::OpaqueKeyOwnershipProof> {
|
|
||||||
unimplemented!("runtime is only implemented when WASM")
|
|
||||||
}
|
|
||||||
|
|
||||||
fn submit_report_equivocation_unsigned_extrinsic(
|
|
||||||
equivocation_proof: sp_consensus_grandpa::EquivocationProof<
|
|
||||||
<Block as sp_runtime::traits::Block>::Hash,
|
|
||||||
u64,
|
|
||||||
>,
|
|
||||||
_: sp_consensus_grandpa::OpaqueKeyOwnershipProof,
|
|
||||||
) -> Option<()> {
|
|
||||||
unimplemented!("runtime is only implemented when WASM")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl sp_authority_discovery::AuthorityDiscoveryApi<Block> for Runtime {
|
|
||||||
fn authorities() -> Vec<sp_authority_discovery::AuthorityId> {
|
|
||||||
unimplemented!("runtime is only implemented when WASM")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl crate::SeraiApi<Block> for Runtime {
|
|
||||||
fn events() -> Vec<Vec<Vec<u8>>> {
|
|
||||||
unimplemented!("runtime is only implemented when WASM")
|
|
||||||
}
|
|
||||||
fn validators(
|
|
||||||
network: NetworkId
|
|
||||||
) -> Vec<serai_abi::primitives::crypto::Public> {
|
|
||||||
unimplemented!("runtime is only implemented when WASM")
|
|
||||||
}
|
|
||||||
fn current_session(network: NetworkId) -> Option<Session> {
|
|
||||||
unimplemented!("runtime is only implemented when WASM")
|
|
||||||
}
|
|
||||||
fn current_stake(network: NetworkId) -> Option<Amount> {
|
|
||||||
unimplemented!("runtime is only implemented when WASM")
|
|
||||||
}
|
|
||||||
fn keys(set: ExternalValidatorSet) -> Option<KeyPair> {
|
|
||||||
unimplemented!("runtime is only implemented when WASM")
|
|
||||||
}
|
|
||||||
fn current_validators(network: NetworkId) -> Option<Vec<SeraiAddress>> {
|
|
||||||
unimplemented!("runtime is only implemented when WASM")
|
|
||||||
}
|
|
||||||
fn pending_slash_report(network: ExternalNetworkId) -> bool {
|
|
||||||
unimplemented!("runtime is only implemented when WASM")
|
|
||||||
}
|
|
||||||
fn embedded_elliptic_curve_keys(
|
|
||||||
validator: SeraiAddress,
|
|
||||||
network: ExternalNetworkId,
|
|
||||||
) -> Option<EmbeddedEllipticCurveKeys> {
|
|
||||||
unimplemented!("runtime is only implemented when WASM")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#[cfg(not(target_family = "wasm"))]
|
|
||||||
pub use apis::RuntimeApi;
|
|
||||||
|
|||||||
174
substrate/runtime/src/std_runtime_api.rs
Normal file
174
substrate/runtime/src/std_runtime_api.rs
Normal file
@@ -0,0 +1,174 @@
|
|||||||
|
use alloc::borrow::Cow;
|
||||||
|
use serai_abi::{
|
||||||
|
primitives::{
|
||||||
|
crypto::{KeyPair, EmbeddedEllipticCurveKeys},
|
||||||
|
network_id::{ExternalNetworkId, NetworkId},
|
||||||
|
validator_sets::{Session, ExternalValidatorSet},
|
||||||
|
balance::Amount,
|
||||||
|
address::SeraiAddress,
|
||||||
|
},
|
||||||
|
SubstrateHeader as Header, SubstrateBlock as Block,
|
||||||
|
};
|
||||||
|
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[sp_version::runtime_version]
|
||||||
|
pub const VERSION: sp_version::RuntimeVersion = sp_version::RuntimeVersion {
|
||||||
|
spec_name: Cow::Borrowed("serai"),
|
||||||
|
impl_name: Cow::Borrowed("core"),
|
||||||
|
authoring_version: 0,
|
||||||
|
// Use the highest possible value so the node doesn't attempt to use this in place of the WASM
|
||||||
|
spec_version: 0xffffffff,
|
||||||
|
impl_version: 0,
|
||||||
|
apis: RUNTIME_API_VERSIONS,
|
||||||
|
transaction_version: 0,
|
||||||
|
system_version: 0,
|
||||||
|
};
|
||||||
|
|
||||||
|
/// A `struct` representing the runtime as necessary to define the available APIs.
|
||||||
|
pub struct Runtime;
|
||||||
|
sp_api::impl_runtime_apis! {
|
||||||
|
impl sp_api::Core<Block> for Runtime {
|
||||||
|
fn version() -> sp_version::RuntimeVersion {
|
||||||
|
VERSION
|
||||||
|
}
|
||||||
|
fn initialize_block(header: &Header) -> sp_runtime::ExtrinsicInclusionMode {
|
||||||
|
unimplemented!("runtime is only implemented when WASM")
|
||||||
|
}
|
||||||
|
fn execute_block(block: Block) {
|
||||||
|
unimplemented!("runtime is only implemented when WASM")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl sp_block_builder::BlockBuilder<Block> for Runtime {
|
||||||
|
fn apply_extrinsic(
|
||||||
|
extrinsic: <Block as sp_runtime::traits::Block>::Extrinsic,
|
||||||
|
) -> sp_runtime::ApplyExtrinsicResult {
|
||||||
|
unimplemented!("runtime is only implemented when WASM")
|
||||||
|
}
|
||||||
|
|
||||||
|
fn finalize_block() -> Header {
|
||||||
|
unimplemented!("runtime is only implemented when WASM")
|
||||||
|
}
|
||||||
|
|
||||||
|
fn inherent_extrinsics(
|
||||||
|
data: sp_inherents::InherentData,
|
||||||
|
) -> Vec<<Block as sp_runtime::traits::Block>::Extrinsic> {
|
||||||
|
unimplemented!("runtime is only implemented when WASM")
|
||||||
|
}
|
||||||
|
|
||||||
|
fn check_inherents(
|
||||||
|
block: Block,
|
||||||
|
data: sp_inherents::InherentData,
|
||||||
|
) -> sp_inherents::CheckInherentsResult {
|
||||||
|
unimplemented!("runtime is only implemented when WASM")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl sp_transaction_pool::runtime_api::TaggedTransactionQueue<Block> for Runtime {
|
||||||
|
fn validate_transaction(
|
||||||
|
source: sp_runtime::transaction_validity::TransactionSource,
|
||||||
|
tx: <Block as sp_runtime::traits::Block>::Extrinsic,
|
||||||
|
block_hash: <Block as sp_runtime::traits::Block>::Hash,
|
||||||
|
) -> sp_runtime::transaction_validity::TransactionValidity {
|
||||||
|
unimplemented!("runtime is only implemented when WASM")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl sp_consensus_babe::BabeApi<Block> for Runtime {
|
||||||
|
fn configuration() -> sp_consensus_babe::BabeConfiguration {
|
||||||
|
unimplemented!("runtime is only implemented when WASM")
|
||||||
|
}
|
||||||
|
|
||||||
|
fn current_epoch_start() -> sp_consensus_babe::Slot {
|
||||||
|
unimplemented!("runtime is only implemented when WASM")
|
||||||
|
}
|
||||||
|
|
||||||
|
fn current_epoch() -> sp_consensus_babe::Epoch {
|
||||||
|
unimplemented!("runtime is only implemented when WASM")
|
||||||
|
}
|
||||||
|
|
||||||
|
fn next_epoch() -> sp_consensus_babe::Epoch {
|
||||||
|
unimplemented!("runtime is only implemented when WASM")
|
||||||
|
}
|
||||||
|
|
||||||
|
fn generate_key_ownership_proof(
|
||||||
|
_slot: sp_consensus_babe::Slot,
|
||||||
|
_authority_id: sp_consensus_babe::AuthorityId,
|
||||||
|
) -> Option<sp_consensus_babe::OpaqueKeyOwnershipProof> {
|
||||||
|
unimplemented!("runtime is only implemented when WASM")
|
||||||
|
}
|
||||||
|
|
||||||
|
fn submit_report_equivocation_unsigned_extrinsic(
|
||||||
|
equivocation_proof: sp_consensus_babe::EquivocationProof<Header>,
|
||||||
|
_: sp_consensus_babe::OpaqueKeyOwnershipProof,
|
||||||
|
) -> Option<()> {
|
||||||
|
unimplemented!("runtime is only implemented when WASM")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl sp_consensus_grandpa::GrandpaApi<Block> for Runtime {
|
||||||
|
fn grandpa_authorities() -> sp_consensus_grandpa::AuthorityList {
|
||||||
|
unimplemented!("runtime is only implemented when WASM")
|
||||||
|
}
|
||||||
|
|
||||||
|
fn current_set_id() -> sp_consensus_grandpa::SetId {
|
||||||
|
unimplemented!("runtime is only implemented when WASM")
|
||||||
|
}
|
||||||
|
|
||||||
|
fn generate_key_ownership_proof(
|
||||||
|
_set_id: sp_consensus_grandpa::SetId,
|
||||||
|
_authority_id: sp_consensus_grandpa::AuthorityId,
|
||||||
|
) -> Option<sp_consensus_grandpa::OpaqueKeyOwnershipProof> {
|
||||||
|
unimplemented!("runtime is only implemented when WASM")
|
||||||
|
}
|
||||||
|
|
||||||
|
fn submit_report_equivocation_unsigned_extrinsic(
|
||||||
|
equivocation_proof: sp_consensus_grandpa::EquivocationProof<
|
||||||
|
<Block as sp_runtime::traits::Block>::Hash,
|
||||||
|
u64,
|
||||||
|
>,
|
||||||
|
_: sp_consensus_grandpa::OpaqueKeyOwnershipProof,
|
||||||
|
) -> Option<()> {
|
||||||
|
unimplemented!("runtime is only implemented when WASM")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl sp_authority_discovery::AuthorityDiscoveryApi<Block> for Runtime {
|
||||||
|
fn authorities() -> Vec<sp_authority_discovery::AuthorityId> {
|
||||||
|
unimplemented!("runtime is only implemented when WASM")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl crate::SeraiApi<Block> for Runtime {
|
||||||
|
fn events() -> Vec<Vec<Vec<u8>>> {
|
||||||
|
unimplemented!("runtime is only implemented when WASM")
|
||||||
|
}
|
||||||
|
fn validators(
|
||||||
|
network: NetworkId
|
||||||
|
) -> Vec<serai_abi::primitives::crypto::Public> {
|
||||||
|
unimplemented!("runtime is only implemented when WASM")
|
||||||
|
}
|
||||||
|
fn current_session(network: NetworkId) -> Option<Session> {
|
||||||
|
unimplemented!("runtime is only implemented when WASM")
|
||||||
|
}
|
||||||
|
fn current_stake(network: NetworkId) -> Option<Amount> {
|
||||||
|
unimplemented!("runtime is only implemented when WASM")
|
||||||
|
}
|
||||||
|
fn keys(set: ExternalValidatorSet) -> Option<KeyPair> {
|
||||||
|
unimplemented!("runtime is only implemented when WASM")
|
||||||
|
}
|
||||||
|
fn current_validators(network: NetworkId) -> Option<Vec<SeraiAddress>> {
|
||||||
|
unimplemented!("runtime is only implemented when WASM")
|
||||||
|
}
|
||||||
|
fn pending_slash_report(network: ExternalNetworkId) -> bool {
|
||||||
|
unimplemented!("runtime is only implemented when WASM")
|
||||||
|
}
|
||||||
|
fn embedded_elliptic_curve_keys(
|
||||||
|
validator: SeraiAddress,
|
||||||
|
network: ExternalNetworkId,
|
||||||
|
) -> Option<EmbeddedEllipticCurveKeys> {
|
||||||
|
unimplemented!("runtime is only implemented when WASM")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -54,8 +54,9 @@ pub fn reproducibly_builds() {
|
|||||||
.arg("--quiet")
|
.arg("--quiet")
|
||||||
.arg("--rm")
|
.arg("--rm")
|
||||||
.arg(&image)
|
.arg(&image)
|
||||||
|
.arg("busybox")
|
||||||
.arg("sha256sum")
|
.arg("sha256sum")
|
||||||
.arg("/serai/serai.wasm")
|
.arg("/serai.wasm")
|
||||||
.output(),
|
.output(),
|
||||||
);
|
);
|
||||||
// Attempt to clean up the image
|
// Attempt to clean up the image
|
||||||
|
|||||||
Reference in New Issue
Block a user