* contracts: Implement refcounting for wasm code
* contracts: Charge rent for code storage
* contracts: Fix dispatchables erroneously refunding base costs
* Fixed typos in comments.
Co-authored-by: Andrew Jones <ascjones@gmail.com>
* Remove awkward empty line
* Fix more typos in docs
* Fix typos in docs
Co-authored-by: Andrew Jones <ascjones@gmail.com>
* Split up complicated expression
Co-authored-by: Andrew Jones <ascjones@gmail.com>
* review: Remove unused return value
* Fix typos
Co-authored-by: Andrew Jones <ascjones@gmail.com>
* review: Fix refcount being reset to one on re-instrumentation
* Document evictable_code parameter
* Make Executable::execute consume and store itself
* Added comments about stale values
* Disregard struct size in occupied_storage()
Co-authored-by: Andrew Jones <ascjones@gmail.com>
* Do not evict a contract from within a call stack
We don't want to trigger contract eviction automatically when
a contract is called. This is because those changes can be
reverted due to how storage transactions are used at the moment.
More Information:
https://github.com/paritytech/substrate/issues/6439#issuecomment-648754324
It can be re-introduced once the linked issue is resolved. In the meantime
`claim_surcharge` must be called to evict a contract.
* Lazily delete storage in on_initialize instead of when removing the contract
* Add missing documentation of new error
* Make Module::claim_surcharge public
It being the only dispatchable that is private is an oversight.
* review: Add final newline
* review: Simplify assert statement
* Add test that checks that partial remove of a contract works
* Premote warning to error
* Added missing docs for seal_terminate
* Lazy deletion should only take AVERAGE_ON_INITIALIZE_RATIO of the block
* Added informational about the lazy deletion throughput
* Avoid lazy deletion in case the block is already full
* Prevent queue decoding in case of an already full block
* Add test that checks that on_initialize honors block limits
* pallet-contracts: Fix seal_restore_to to output proper module errors
Those errors where part of the decl_error for some time but where
never actually returned. This allows proper debugging of failed
restorations. Previously, any error did return the misleading
`ContractTrapped`.
* Bind UncheckedFrom<T::Hash> + AsRef<[u8]> everywhere
This allows us to make assumptions about the AccoutId
that are necessary for testing and in order to benchmark
the module properly.
This also groups free standing functions into inherent functions
in order to minimize the places where the new bounds need to
be specified.
* Rework contract address determination
* Do not allow override by runtime author
* Instantiate gained a new parameter "salt"
This change is done now in expecation of the upcoming code rent
which needs to change the instantiation dispatchable and
host function anyways.
The situation in where we have only something that is like CREATE2
makes it impossible for UIs to help the user to create an arbitrary
amount of instantiations from the same code.
With this change we have the same functionality as ethereum with
a CREATE and CREATE2 instantation semantic.
* Remove TrieIdGenerator
The new trait bounds allows us to remove this workaround
from the configuration trait.
* Remove default parameters for config trait
It should be solely the responsiblity to determine proper values for
these parameter. As a matter of fact most runtime weren't using these
values anyways.
* Fix tests for new account id type
Because of the new bounds on the trait tests can't get away by using
u64 as accound id. Replacing the 8 byte value by a 32 byte value
creates out quite a bit of code churn.
* Fix benchmarks
The benchmarks need adaption to the new instantiate semantics.
* Fix compile errors caused by adding new trait bounds
* Fix compile errors caused by renaming storage and rent functions
* Adapt host functions and dispatchables to the new salt
* Add tests for instantiate host functions (was not possible before)
* Add benchmark results
* Adapt to the new WeightInfo
The new benchmarks add a new parameter for salt "s" to the instantiate weights
that needs to be applied.
* Fix deploying_wasm_contract_should_work integration test
This test is adapted to use the new instantiate signature.
* Break overlong line
* Break more long lines
Co-authored-by: Parity Benchmarking Bot <admin@parity.io>
* contracts: Make use of existing type aliases for runtime API types
* contracts: Refactor the contracts call runtime API
* review: Fix comment typo
Co-authored-by: Andrew Jones <ascjones@gmail.com>
* Update frame/contracts/common/src/lib.rs
Co-authored-by: Nikolay Volf <nikvolf@gmail.com>
* Update frame/contracts/common/src/lib.rs
Co-authored-by: Nikolay Volf <nikvolf@gmail.com>
* Update frame/contracts/common/src/lib.rs
Co-authored-by: Nikolay Volf <nikvolf@gmail.com>
* Update frame/contracts/common/src/lib.rs
Co-authored-by: Nikolay Volf <nikvolf@gmail.com>
* Update frame/contracts/common/src/lib.rs
Co-authored-by: Nikolay Volf <nikvolf@gmail.com>
* Update lib.rs
* review: Group crate imports
Co-authored-by: Andrew Jones <ascjones@gmail.com>
Co-authored-by: Addie Wagenknecht <addie@nortd.com>
Co-authored-by: Nikolay Volf <nikvolf@gmail.com>
* seal: Add capability to put uninstrumented code (for benchmarks)
Benchmarks should only measure the overhead of the API calls itself.
For that reason we want to run them without instrumentation.
* seal: Cap the the data length for deposited events
Data used in events has storage implications for archive nodes.
Those need to keep the events in storage forever. For that reason
we want to limit the amount of storage that can be used inside events.
* seal: Fix error reporting in the case out of bound sandbox access
* seal: Refactor existing benchmarks
* seal: Convert benchmark file to tabs
* seal: Add benchmarks for functions called by contracts
* seal: Create a default schedule from benchmark generated WeightInfo
* seal: Make use of WeightInfo in extrinsic weight annotations
* seal: Replace the old schedule by the benchmark generated one
* Review: Fix copy paste typo in schedule construction
* Review: Fix stale docs
* Fix whitespace errors
Co-authored-by: Sergei Shulepov <sergei@parity.io>
* Review: Use checked_div in order to be more defensive
* Review: Rename no_charge to already_charged
* Review: Whitelist caller of extrinsics
* Review: Remove trailing whitespace
* Review: Remove confusing "self::" syntax
* Review: Add docs for the benchmark prepration submodule
* Review: Move code generation functions to own module
* Review: Refactor and document benchmark helper functions
* Remove additional empty line
* Added missing comment on caller_funding
* Update frame/contracts/src/benchmarking/code.rs
Co-authored-by: Sergei Shulepov <sergei@parity.io>
* Fix missing sp_std::prelude import in code.rs
* cargo run --release --features runtime-benchmarks --manifest-path bin/node/cli/Cargo.toml -- benchmark --chain dev --steps 50 --repeat 20 --extrinsic * --execution=wasm --wasm-execution=compiled --output ./bin/node/runtime/src/weights --header ./HEADER --pallet pallet_contracts --heap-pages 4096
* Use weights from the benchmark machine for the substrate node
* Remove prefixes from Schedule members
* Data lengths in the WeightInfo Trait are specified in kilobytes
* Rename ApiWeights to HostFunctionWeights
Co-authored-by: Sergei Shulepov <sergei@parity.io>
Co-authored-by: Shawn Tabrizi <shawntabrizi@gmail.com>
* seal: Change prefix "ext_" to "seal_" for contract callable functions
The word Ext is a overloaded term in the context of substrate. It usually
is a trait which abstracts away access to external resources usually in order
to mock them away for the purpose of tests. The contract module has its own
`Ext` trait in addition the the substrate `Ext` which makes things even more
confusing.
In order to differentiate the contract callable functions more clearly from
this `Ext` concept we rename them to use the "seal_" prefix instead.
This should change no behaviour at all. This is a pure renaming commit.
* seal: Rename import module from "env" to "seal0"
* seal: Fixup integration test
* seal: Add more tests for new import module names
* seal: Rework ext_transfer, ext_instantiate, ext_call error handling
* Deny calling plain accounts (must use transfer now)
* Return proper module error rather than ad-hoc strings
* Return the correct error codes from call,instantiate (documentation was wrong)
* Make ext_transfer fallible again to make it consistent with ext_call
* seal: Improve error messages on memory access failures
* seal: Convert contract trapped to module error
* seal: Add additional tests for transfer, call, instantiate
These tests verify that those functions return the error types
which are declared in its docs.
* Make it more pronounced that to_execution_result handles trap_reason
* Improve ReturnCode docs
* Fix whitespace issues in wat files
* Improve ReturnCode doc
* Improve ErrorOrigin doc and variant naming
* Improve docs on ExecResult and ExecError
* Encode u32 sentinel value as hex
* with_nested_context no longer accepts an Option for trie
* Fix successful typo
* Rename InvalidContractCalled to NotCallable
* seal: Fail instantiate if new contract is below subsistence threshold
We need each contract that exists to be above the subsistence threshold
in order to keep up the guarantuee that we always leave a tombstone behind
with the exception of a contract that called `ext_terminate`.
* Fixup executor test
* Bump runtime
* seal: Do not allow transfers to bring total balance below subsistence deposit
This also reworks the rent system to take the total balance into account
when evaluating whether the account is above the subsistence deposit.
* Fix nits from review
* Fix typo
* Do not enforce subsistence when called from EOA
* Rename CallOrigin to TransactorKind
* Add debug asserts to check the invariants of a plain account transactor
* Fix typo
Co-authored-by: Sergei Shulepov <sergei@parity.io>
Co-authored-by: Sergei Shulepov <sergei@parity.io>
* Transition getter functions to not use scratch buffer
* Remove scratch buffer from ext_get_storage
* Remove scratch buffer from ext_call
* Remove scratch buffer from ext_instantiate
* Add ext_input and remove scratch buffer
* Rework error handling (changes RPC exposed data)
* ext_return passes a flags field instead of a return code
* Flags is only for seal and not for the caller
* flags: u32 replaced status_code: u8 in RPC exposed type
* API functions use a unified error type (ReturnCode)
* ext_transfer now traps on error to be consistent with call and instantiate
* Remove the no longer used `Dispatched` event
* Updated inline documentation
* Prevent skipping of copying the output for getter API
* Return gas_consumed from the RPC contracts call interface
* Updated COMPLEXTITY.md
* Rename ext_gas_price to ext_weight_to_fee
* Align comments with spaces
* Removed no longer used `ExecError`
* Remove possible panic in `from_typed_value`
* Use a struct as associated data for SpecialTrap::Return
* Fix nits in COMPLEXITY.md
* Renamed SpecialTrap to TrapReason
* Fix test
* Finish renaming special_trap -> trap_reason
* Remove no longer used get_runtime_storage
* fixup! Remove no longer used get_runtime_storage
* Removed tabs for comment aligment
* seal: Refactor ext_gas_price
* Remove seals dependency on pallet_transaction_payment
* Add weight as an argument to ext_gas_price
* Fixed documentation nits from review
* Do not use unchecked math even in test code
* Add a simple direct storage access module
* WIP
* Completely migrate to the transactional system.
* Format
* Fix wasm compilation
* Get rid of account_db module
* Make deposit event eager
* Make restore_to eager
* It almost compiles.
* Make it compile.
* Make the tests compile
* Get rid of account_db
* Drop the result.
* Backport the book keeping.
* Fix all remaining tests.
* Make it compile for std
* Remove a stale TODO marker
* Remove another stale TODO
* Add proof for `terminate`
* Remove a stale comment.
* Make restoration diverging.
* Remove redudnant trait: `ComputeDispatchFee`
* Update frame/contracts/src/exec.rs
Co-authored-by: Alexander Theißen <alex.theissen@me.com>
* Introduce proper errors into the storage module.
* Adds comments for contract storage module.
* Inline `ExecutionContext::terminate`.
* Restore_to should not let sacrifice itself if the contract present on the stack.
* Inline `transfer` function
* Update doc - add "if succeeded"
* Adapt to TransactionOutcome changes
* Updates the docs for `ext_restore_to`
* Add a proper assert.
* Update frame/contracts/src/wasm/runtime.rs
Co-authored-by: Alexander Theißen <alex.theissen@me.com>
Co-authored-by: Alexander Theißen <alex.theissen@me.com>
Co-authored-by: Alexander Theißen <alexander.theissen@parity.io>
With this patch forward this will be the only way for
a contract to destroy itself. This patch therefore changes
the semantics of all other contract initiated balance
transfers to fail if they would bring the caller below the
existential deposit.
* contracts: Add ext_transfer call
This call allows contracts to send balance to any account
contract or not. Previously, the only way to do that was
though ext_call.
* Apply suggestions from code review
Co-Authored-By: Nikolay Volf <nikvolf@gmail.com>
* The define_env! macro does not allow for trailing comma
* Update frame/contracts/src/exec.rs
Co-Authored-By: Nikolay Volf <nikvolf@gmail.com>
* Bump spec version
* Do not use nested gas meter
* Use explicit 0 or 1 as return value
* Remove superflous intermediate binding
Co-authored-by: Nikolay Volf <nikvolf@gmail.com>
* Add non-zero ed check on Balances genesis
* Update ED from 0 to 1
* bump impl
* bump spec
* Found remove more ed = 0
* Fix some contract tests
* Use ctx.overlay.set_balance for contracts
* Fix staking test
* Remove obsolete logic
* Allow death of payout account in society
* Update frame/balances/src/lib.rs
Co-Authored-By: Bastian Köcher <bkchr@users.noreply.github.com>
* Dont create genesis balances if balance is zero in transaction payment pallet
Co-authored-by: Bastian Köcher <bkchr@users.noreply.github.com>
Co-authored-by: Gavin Wood <github@gavwood.com>
* Initially scoping out of the problem
* Remove need for exiry in balance locks.
* Remove expiry from locks.
* Remove supefluous balance test
* Amalgamate pieces of balance module
* Split out vesting
* Fix tests
* Fixes for vesting.
* Docs.
* Weight docs.
* Refactor things in terms of set_balances.
* Switch out ED to be free + reserved.
* Remove on_free_balance_zero and some docs.
* Build fixes
* Update frame/vesting/src/lib.rs
Co-Authored-By: Xiliang Chen <xlchen1291@gmail.com>
* Update frame/vesting/src/lib.rs
Co-Authored-By: Xiliang Chen <xlchen1291@gmail.com>
* Migration
* Remove superfluous code.
* Test fixes
* Fix some tests
* Fix repatriate reserve
* Fixes
* Add test for migration
* Final cleanups
* Fix
* Indentation.
* Undo unneeded referencing
* Bump runtime version
* Fixes
Co-authored-by: Xiliang Chen <xlchen1291@gmail.com>
* contracts: during execution -> contract trapped during execution
This message confused many people so we are improving it to make clear what happened.
* contracts: rename Event::Contract -> Event::ContractExecution
* contracts: fix tests after ContractExecution renaming
* contracts: Add Evicted and Restored events
* fix doc comment
* wrap to not go over (soft) 100 column line limit
* add event deposit for eventual eviction upon pay_rent
* contracts: adjust tests for the new events
* emit Evicted event immediately and add tombstone flag bool
* Make `decl_error!` errors usable
This pr implements support for returning errors of different pallets in
a pallet. These errors need to be declared with `decl_error!`.
The pr changes the following:
- Each dispatchable function now returns a `DispatchResult` which is an
alias for `Result<(), DispatchError>`.
- `DispatchError` is an enum that has 4 variants:
- `Other`: For storing string error messages
- `CannotLookup`: Variant that is returned when something returns a
`sp_runtime::LookupError`
- `BadOrigin`: Variant that is returned for any kind of bad origin
- `Module`: The error of a specific module. Contains the `index`,
`error` and the `message`. The index is the index of the module in
`construct_runtime!`. `error` is the index of the error in the error
enum declared by `decl_error!`. `message` is the message to the error
variant (this will not be encoded).
- `construct_runtime!` now creates a new struct `ModuleToIndex`. This
struct implements the trait `ModuleToIndex`.
- `frame_system::Trait` has a new associated type: `ModuleToIndex` that
expects the `ModuleToIndex` generated by `construct_runtime!`.
- All error strings returned in any module are being converted now to `DispatchError`.
- `BadOrigin` is the default error returned by any type that implements `EnsureOrigin`.
* Fix frame system benchmarks
* Adding script for rename, could be applicable for nodes on top of it, too
* add stderr and gitlab ci features
* apply script
* fix now minor details in expected stderr
* Update the Cargo.lock
* fix name: sc-transaction -> sc-tracing
* fix rename in script, too