paritytech / substrate

Substrate: The platform for blockchain innovators
Apache License 2.0
8.39k stars 2.65k forks source link

Contracts Module Substrate V2.0 #4268

Closed justintim-es closed 4 years ago

justintim-es commented 4 years ago

Since the updrage to substrate 2.0 we have to implement some extra types with the contracts trait. Can anyone help me? the console helps me so far = help: implement the missing item: type Time = Type; = help: implement the missing item: type Randomness = Type; = help: implement the missing item: type SignedClaimHandicap = Type; = help: implement the missing item: type TombstoneDeposit = Type; = help: implement the missing item: type StorageSizeOffset = Type; = help: implement the missing item: type RentByteFee = Type; = help: implement the missing item: type RentDepositOffset = Type; = help: implement the missing item: type SurchargeReward = Type; = help: implement the missing item: type TransferFee = Type; = help: implement the missing item: type CreationFee = Type; = help: implement the missing item: type TransactionBaseFee = Type; = help: implement the missing item: type TransactionByteFee = Type; = help: implement the missing item: type ContractFee = Type; = help: implement the missing item: type CallBaseFee = Type; = help: implement the missing item: type InstantiateBaseFee = Type; = help: implement the missing item: type MaxDepth = Type; = help: implement the missing item: type MaxValueSize = Type; = help: implement the missing item: type BlockGasLimit = Type;

gui1117 commented 4 years ago

the documentation of them should in the trait documentation https://substrate.dev/rustdocs/master/pallet_contracts/trait.Trait.html

gui1117 commented 4 years ago

you can also look at one implementation in substrate node: https://github.com/paritytech/substrate/blob/8091a0e5360c7d26a03c099e703c832c81ee2e4d/bin/node/runtime/src/lib.rs#L380-L419

justintim-es commented 4 years ago

//! The Substrate Node Template runtime. This can be compiled with #[no_std], ready for Wasm.

![cfg_attr(not(feature = "std"), no_std)]

// construct_runtime! does a lot of recursion and requires us to increase the limit to 256.

![recursion_limit="256"]

// Make the WASM binary available.

[cfg(feature = "std")]

include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs"));

use rstd::prelude::*; use primitives::{OpaqueMetadata, crypto::key_types}; use sr_primitives::{ ApplyResult, transaction_validity::TransactionValidity, generic, create_runtime_str, impl_opaque_keys, AnySignature }; use sr_primitives::traits::{NumberFor, BlakeTwo256, Block as BlockT, StaticLookup, Verify, ConvertInto}; use sr_primitives::weights::Weight; use client::{ block_builder::api::{CheckInherentsResult, InherentData, self as block_builder_api}, runtime_api as client_api, impl_runtime_apis }; use aura_primitives::sr25519::AuthorityId as AuraId; use grandpa::{AuthorityId as GrandpaId, AuthorityWeight as GrandpaWeight}; use grandpa::fg_primitives; use version::RuntimeVersion;

[cfg(feature = "std")]

use version::NativeVersion;

// A few exports that help ease life for downstream crates.

[cfg(any(feature = "std", test))]

pub use sr_primitives::BuildStorage; pub use timestamp::Call as TimestampCall; pub use balances::Call as BalancesCall; pub use sr_primitives::{Permill, Perbill}; pub use support::{StorageValue, construct_runtime, parameter_types, traits::Randomness};

/// An index to a block. pub type BlockNumber = u32;

/// Alias to 512-bit hash when used in the context of a transaction signature on the chain. pub type Signature = AnySignature;

/// Some way of identifying an account on the chain. We intentionally make it equivalent /// to the public key of our transaction signing scheme. pub type AccountId = ::Signer;

/// The type for looking up accounts. We don't expect more than 4 billion of them, but you /// never know... pub type AccountIndex = u32;

/// Balance of an account. pub type Balance = u128;

/// Index of a transaction in the chain. pub type Index = u32;

/// A hash of some data used by the chain. pub type Hash = primitives::H256;

/// Digest item type. pub type DigestItem = generic::DigestItem;

/// Used for the module template in ./template.rs mod template;

/// Opaque types. These are used by the CLI to instantiate machinery that don't need to know /// the specifics of the runtime. They can then be made to be agnostic over specific formats /// of data like extrinsics, allowing for them to continue syncing the network through upgrades /// to even the core datastructures. pub mod opaque { use super::*;

pub use sr_primitives::OpaqueExtrinsic as UncheckedExtrinsic;

/// Opaque block header type.
pub type Header = generic::Header<BlockNumber, BlakeTwo256>;
/// Opaque block type.
pub type Block = generic::Block<Header, UncheckedExtrinsic>;
/// Opaque block identifier type.
pub type BlockId = generic::BlockId<Block>;

impl_opaque_keys! {
    pub struct SessionKeys {
        #[id(key_types::AURA)]
        pub aura: AuraId,
        #[id(key_types::GRANDPA)]
        pub grandpa: GrandpaId,
    }
}

}

/// This runtime version. pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("node-template"), impl_name: create_runtime_str!("node-template"), authoring_version: 3, spec_version: 4, impl_version: 4, apis: RUNTIME_API_VERSIONS, };

pub const MILLISECS_PER_BLOCK: u64 = 6000;

pub const SLOT_DURATION: u64 = MILLISECS_PER_BLOCK;

pub const EPOCH_DURATION_IN_BLOCKS: u32 = 10 * MINUTES;

// These time units are defined in number of blocks. pub const MINUTES: BlockNumber = 60_000 / (MILLISECS_PER_BLOCK as BlockNumber); pub const HOURS: BlockNumber = MINUTES 60; pub const DAYS: BlockNumber = HOURS 24;

// 1 in 4 blocks (on average, not counting collisions) will be primary babe blocks. pub const PRIMARY_PROBABILITY: (u64, u64) = (1, 4);

/// The version infromation used to identify this runtime when compiled natively.

[cfg(feature = "std")]

pub fn native_version() -> NativeVersion { NativeVersion { runtime_version: VERSION, can_author_with: Default::default(), } }

parameter_types! { pub const BlockHashCount: BlockNumber = 250; pub const MaximumBlockWeight: Weight = 1_000_000; pub const AvailableBlockRatio: Perbill = Perbill::from_percent(75); pub const MaximumBlockLength: u32 = 5 1024 1024; pub const Version: RuntimeVersion = VERSION; }

impl system::Trait for Runtime { /// The identifier used to distinguish between accounts. type AccountId = AccountId; /// The aggregated dispatch type that is available for extrinsics. type Call = Call; /// The lookup mechanism to get account ID from whatever is passed in dispatchers. type Lookup = Indices; /// The index type for storing how many extrinsics an account has signed. type Index = Index; /// The index type for blocks. type BlockNumber = BlockNumber; /// The type for hashing blocks and tries. type Hash = Hash; /// The hashing algorithm used. type Hashing = BlakeTwo256; /// The header type. type Header = generic::Header<BlockNumber, BlakeTwo256>; /// The ubiquitous event type. type Event = Event; /// The ubiquitous origin type. type Origin = Origin; /// Maximum number of block number to block hash mappings to keep (oldest pruned first). type BlockHashCount = BlockHashCount; /// Maximum weight of each block. type MaximumBlockWeight = MaximumBlockWeight; /// Maximum size of all encoded transactions (in bytes) that are allowed in one block. type MaximumBlockLength = MaximumBlockLength; /// Portion of the block weight that is available to all normal transactions. type AvailableBlockRatio = AvailableBlockRatio; /// Version of the runtime. type Version = Version; }

impl aura::Trait for Runtime { type AuthorityId = AuraId; }

impl grandpa::Trait for Runtime { type Event = Event; }

impl indices::Trait for Runtime { /// The type for recording indexing into the account enumeration. If this ever overflows, there /// will be problems! type AccountIndex = u32; /// Use the standard means of resolving an index hint from an id. type ResolveHint = indices::SimpleResolveHint<Self::AccountId, Self::AccountIndex>; /// Determine whether an account is dead. type IsDeadAccount = Balances; /// The ubiquitous event type. type Event = Event; }

parameter_types! { pub const MinimumPeriod: u64 = SLOT_DURATION / 2; }

impl timestamp::Trait for Runtime { /// A timestamp: milliseconds since the unix epoch. type Moment = u64; type OnTimestampSet = Aura; type MinimumPeriod = MinimumPeriod; }

parameter_types! { pub const ExistentialDeposit: u128 = 500; pub const TransferFee: u128 = 0; pub const CreationFee: u128 = 0; }

impl balances::Trait for Runtime { /// The type for recording an account's balance. type Balance = Balance; /// What to do if an account's free balance gets zeroed. type OnFreeBalanceZero = (Contract); /// What to do if a new account is created. type OnNewAccount = Indices; /// The ubiquitous event type. type Event = Event; type DustRemoval = (); type TransferPayment = (); type ExistentialDeposit = ExistentialDeposit; type TransferFee = TransferFee; type CreationFee = CreationFee; }

parameter_types! { pub const TransactionBaseFee: Balance = 0; pub const TransactionByteFee: Balance = 1; }

impl transaction_payment::Trait for Runtime { type Currency = balances::Module; type OnTransactionPayment = (); type TransactionBaseFee = TransactionBaseFee; type TransactionByteFee = TransactionByteFee; type WeightToFee = ConvertInto; type FeeMultiplierUpdate = (); }

impl sudo::Trait for Runtime { type Event = Event; type Proposal = Call; }

/// Used for the module template in ./template.rs impl template::Trait for Runtime { type Event = Event; } impl contract::Trait for Runtime { type Currency = Balances; type Time = Timestamp; type Randomness = RandomnessCollectiveFlip; type Call = Call; type Event = Event; type DetermineContractAddress = contract::SimpleAddressDeterminator; type ComputeDispatchFee = contract::DefaultDispatchFeeComputor; type TrieIdGenerator = contract::TrieIdFromParentCounter; type GasPayment = (); type RentPayment = (); type SignedClaimHandicap = contracts::DefaultSignedClaimHandicap; type TombstoneDeposit = TombstoneDeposit; type StorageSizeOffset = contracts::DefaultStorageSizeOffset; type RentByteFee = RentByteFee; type RentDepositOffset = RentDepositOffset; type SurchargeReward = SurchargeReward; type TransferFee = ContractTransferFee; type CreationFee = ContractCreationFee; type TransactionBaseFee = ContractTransactionBaseFee; type TransactionByteFee = ContractTransactionByteFee; type ContractFee = ContractFee; type CallBaseFee = contract::DefaultCallBaseFee; type InstantiateBaseFee = contract::DefaultInstantiateBaseFee; type MaxDepth = contract::DefaultMaxDepth; type MaxValueSize = contract::DefaultMaxValueSize; type BlockGasLimit = contract::DefaultBlockGasLimit; }

construct_runtime!( pub enum Runtime where Block = Block, NodeBlock = opaque::Block, UncheckedExtrinsic = UncheckedExtrinsic { System: system::{Module, Call, Storage, Config, Event}, Timestamp: timestamp::{Module, Call, Storage, Inherent}, Aura: aura::{Module, Config, Inherent(Timestamp)}, Grandpa: grandpa::{Module, Call, Storage, Config, Event}, Indices: indices::{default, Config}, Balances: balances::{default, Error}, TransactionPayment: transaction_payment::{Module, Storage}, Sudo: sudo, Contract: contract::{Module, Call, Storage, Event, Config}, // Used for the module template in ./template.rs TemplateModule: template::{Module, Call, Storage, Event}, RandomnessCollectiveFlip: randomness_collective_flip::{Module, Call, Storage}, } );

/// The address format for describing accounts. pub type Address = ::Source; /// Block header type as expected by this runtime. pub type Header = generic::Header<BlockNumber, BlakeTwo256>; /// Block type as expected by this runtime. pub type Block = generic::Block<Header, UncheckedExtrinsic>; /// A Block signed with a Justification pub type SignedBlock = generic::SignedBlock; /// BlockId type as expected by this runtime. pub type BlockId = generic::BlockId; /// The SignedExtension to the basic transaction logic. pub type SignedExtra = ( system::CheckVersion, system::CheckGenesis, system::CheckEra, system::CheckNonce, system::CheckWeight, transaction_payment::ChargeTransactionPayment ); /// Unchecked extrinsic type as expected by this runtime. pub type UncheckedExtrinsic = generic::UncheckedExtrinsic<Address, Call, Signature, SignedExtra>; /// Extrinsic type that has already been checked. pub type CheckedExtrinsic = generic::CheckedExtrinsic<AccountId, Call, SignedExtra>; /// Executive: handles dispatch to the various modules. pub type Executive = executive::Executive<Runtime, Block, system::ChainContext, Runtime, AllModules>;

impl_runtime_apis! { impl client_api::Core for Runtime { fn version() -> RuntimeVersion { VERSION }

    fn execute_block(block: Block) {
        Executive::execute_block(block)
    }

    fn initialize_block(header: &<Block as BlockT>::Header) {
        Executive::initialize_block(header)
    }
}

impl client_api::Metadata<Block> for Runtime {
    fn metadata() -> OpaqueMetadata {
        Runtime::metadata().into()
    }
}

impl block_builder_api::BlockBuilder<Block> for Runtime {
    fn apply_extrinsic(extrinsic: <Block as BlockT>::Extrinsic) -> ApplyResult {
        Executive::apply_extrinsic(extrinsic)
    }

    fn finalize_block() -> <Block as BlockT>::Header {
        Executive::finalize_block()
    }

    fn inherent_extrinsics(data: InherentData) -> Vec<<Block as BlockT>::Extrinsic> {
        data.create_extrinsics()
    }

    fn check_inherents(block: Block, data: InherentData) -> CheckInherentsResult {
        data.check_extrinsics(&block)
    }

    fn random_seed() -> <Block as BlockT>::Hash {
        RandomnessCollectiveFlip::random_seed()
    }
}

impl client_api::TaggedTransactionQueue<Block> for Runtime {
    fn validate_transaction(tx: <Block as BlockT>::Extrinsic) -> TransactionValidity {
        Executive::validate_transaction(tx)
    }
}

impl offchain_primitives::OffchainWorkerApi<Block> for Runtime {
    fn offchain_worker(number: NumberFor<Block>) {
        Executive::offchain_worker(number)
    }
}

impl aura_primitives::AuraApi<Block, AuraId> for Runtime {
    fn slot_duration() -> u64 {
        Aura::slot_duration()
    }

    fn authorities() -> Vec<AuraId> {
        Aura::authorities()
    }
}

impl substrate_session::SessionKeys<Block> for Runtime {
    fn generate_session_keys(seed: Option<Vec<u8>>) -> Vec<u8> {
        let seed = seed.as_ref().map(|s| rstd::str::from_utf8(&s).expect("Seed is an utf8 string"));
        opaque::SessionKeys::generate(seed)
    }
}

impl fg_primitives::GrandpaApi<Block> for Runtime {
    fn grandpa_authorities() -> Vec<(GrandpaId, GrandpaWeight)> {
        Grandpa::grandpa_authorities()
    }
}

}

error: failed to run custom build command for node-template-runtime v2.0.0 (/home/noone/subnodewithcontract/substrate-node-template/runtime)

Caused by: process didn't exit successfully: /home/noone/subnodewithcontract/substrate-node-template/target/release/build/node-template-runtime-63f84f0f85d169bf/build-script-build (exit code: 1) --- stdout Executing build command: "rustup" "run" "nightly" "cargo" "build" "--target=wasm32-unknown-unknown" "--manifest-path=/home/noone/subnodewithcontract/substrate-node-template/target/release/wbuild/node-template-runtime/Cargo.toml" "--release"

--- stderr Compiling wasm-build-runner-impl v1.0.0 (/home/noone/subnodewithcontract/substrate-node-template/target/release/wbuild-runner/node-template-runtime) Finished release [optimized] target(s) in 0.72s Running /home/noone/subnodewithcontract/substrate-node-template/target/release/wbuild-runner/node-template-runtime/target/release/wasm-build-runner-impl Compiling node-template-runtime v2.0.0 (/home/noone/subnodewithcontract/substrate-node-template/runtime) error[E0437]: type RentPayment is not a member of trait contract::Trait --> /home/noone/subnodewithcontract/substrate-node-template/runtime/src/lib.rs:253:2 | 253 | type RentPayment = (); | ^^^^^^^^^^^^^^^^^^^^^^ not a member of trait contract::Trait

error[E0433]: failed to resolve: use of undeclared type or module contracts --> /home/noone/subnodewithcontract/substrate-node-template/runtime/src/lib.rs:254:29 | 254 | type SignedClaimHandicap = contracts::DefaultSignedClaimHandicap; | ^^^^^^^^^ use of undeclared type or module contracts

error[E0433]: failed to resolve: use of undeclared type or module contracts --> /home/noone/subnodewithcontract/substrate-node-template/runtime/src/lib.rs:256:27 | 256 | type StorageSizeOffset = contracts::DefaultStorageSizeOffset; | ^^^^^^^^^ use of undeclared type or module contracts

error[E0412]: cannot find type TombstoneDeposit in this scope --> /home/noone/subnodewithcontract/substrate-node-template/runtime/src/lib.rs:255:26 | 255 | type TombstoneDeposit = TombstoneDeposit; | ^^^^^^^^^^^^^^^^ help: try: Self::TombstoneDeposit

error[E0412]: cannot find type RentByteFee in this scope --> /home/noone/subnodewithcontract/substrate-node-template/runtime/src/lib.rs:257:21 | 257 | type RentByteFee = RentByteFee; | ^^^^^^^^^^^ help: try: Self::RentByteFee

error[E0412]: cannot find type RentDepositOffset in this scope --> /home/noone/subnodewithcontract/substrate-node-template/runtime/src/lib.rs:258:27 | 258 | type RentDepositOffset = RentDepositOffset; | ^^^^^^^^^^^^^^^^^ help: try: Self::RentDepositOffset

error[E0412]: cannot find type SurchargeReward in this scope --> /home/noone/subnodewithcontract/substrate-node-template/runtime/src/lib.rs:259:25 | 259 | type SurchargeReward = SurchargeReward; | ^^^^^^^^^^^^^^^ help: try: Self::SurchargeReward

error[E0412]: cannot find type ContractTransferFee in this scope --> /home/noone/subnodewithcontract/substrate-node-template/runtime/src/lib.rs:260:21 | 260 | type TransferFee = ContractTransferFee; | ^^^^^^^^^^^^^^^^^^^ not found in this scope

error[E0412]: cannot find type ContractCreationFee in this scope --> /home/noone/subnodewithcontract/substrate-node-template/runtime/src/lib.rs:261:21 | 261 | type CreationFee = ContractCreationFee; | ^^^^^^^^^^^^^^^^^^^ not found in this scope

error[E0412]: cannot find type ContractTransactionBaseFee in this scope --> /home/noone/subnodewithcontract/substrate-node-template/runtime/src/lib.rs:262:28 220 / parameter_types! { 221 pub const TransactionBaseFee: Balance = 0; 222 pub const TransactionByteFee: Balance = 1; 223 } _- similarly named struct TransactionBaseFee defined here ... 262 type TransactionBaseFee = ContractTransactionBaseFee; ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: a struct with a similar name exists: TransactionBaseFee
= note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info)
error[E0412]: cannot find type ContractTransactionByteFee in this scope --> /home/noone/subnodewithcontract/substrate-node-template/runtime/src/lib.rs:263:28 220 / parameter_types! { 221 pub const TransactionBaseFee: Balance = 0; 222 pub const TransactionByteFee: Balance = 1; 223 } _- similarly named struct TransactionByteFee defined here ... 263 type TransactionByteFee = ContractTransactionByteFee; ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: a struct with a similar name exists: TransactionByteFee
= note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info)

error[E0412]: cannot find type ContractFee in this scope --> /home/noone/subnodewithcontract/substrate-node-template/runtime/src/lib.rs:264:21 | 264 | type ContractFee = ContractFee; | ^^^^^^^^^^^ help: try: Self::ContractFee

warning: unnecessary parentheses around type --> /home/noone/subnodewithcontract/substrate-node-template/runtime/src/lib.rs:208:27 208 type OnFreeBalanceZero = (Contract); ^^^^^^^^^^ help: remove these parentheses
= note: `#[warn(unused_parens)]` on by default

error: aborting due to 12 previous errors

Some errors have detailed explanations: E0412, E0433, E0437. For more information about an error, try rustc --explain E0412. error: could not compile node-template-runtime.

To learn more, run the command again with --verbose.

gui1117 commented 4 years ago

you probably mixed formatting, files should be linked or put in gist, what is your issue ?

justintim-es commented 4 years ago

thanks for your help!

gui1117 commented 4 years ago

Do you mean it is fixed ? If documentation is not helpful enough feel free to ask in riot substrate technical channels or reopen this issue or open a new one.

ccyanxyz commented 4 years ago

I got the same error trying to add contracts pallet follow this tutorial: https://substrate.dev/docs/en/tutorials/add-a-pallet-to-your-runtime/

Fix: Add the following lines to parameter_types! in substrate-node-template/runtime/src/lib.rs:

parameter_types! {
     // ...
     pub const TombstoneDeposit: Balance = 1 * DOLLARS;
     pub const RentByteFee: Balance = 1 * DOLLARS;
     pub const RentDepositOffset: Balance = 1000 * DOLLARS;
     pub const SurchargeReward: Balance = 150 * DOLLARS;
}