Skip to content
This repository has been archived by the owner on Nov 15, 2023. It is now read-only.

Commit

Permalink
contracts: Release as v3.0.0 and add reserved field to `ContractInfoO…
Browse files Browse the repository at this point in the history
…f` (#8175)

* contracts: Update README

* contracts: Add CHANGELOG.md

* contracts: Bump version to v3.0.0 and allow publish

* Typos

Co-authored-by: Andrew Jones <ascjones@gmail.com>

* Improve wording in the changelog

* contracts: Add reserved field to ContractInfoOf for future proofing

* also bump frame-benchmarking

* update lockfile

Co-authored-by: Andrew Jones <ascjones@gmail.com>
Co-authored-by: Benjamin Kampmann <ben@parity.io>
  • Loading branch information
3 people authored Feb 25, 2021
1 parent f6de92e commit debec91
Show file tree
Hide file tree
Showing 17 changed files with 118 additions and 44 deletions.
10 changes: 5 additions & 5 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion bin/node/cli/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ sc-finality-grandpa-warp-sync = { version = "0.9.0", path = "../../../client/fin
# frame dependencies
pallet-indices = { version = "3.0.0", path = "../../../frame/indices" }
pallet-timestamp = { version = "3.0.0", default-features = false, path = "../../../frame/timestamp" }
pallet-contracts = { version = "2.0.0", path = "../../../frame/contracts" }
pallet-contracts = { version = "3.0.0", path = "../../../frame/contracts" }
frame-system = { version = "3.0.0", path = "../../../frame/system" }
pallet-balances = { version = "3.0.0", path = "../../../frame/balances" }
pallet-transaction-payment = { version = "3.0.0", path = "../../../frame/transaction-payment" }
Expand Down
2 changes: 1 addition & 1 deletion bin/node/executor/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ frame-support = { version = "3.0.0", path = "../../../frame/support" }
frame-system = { version = "3.0.0", path = "../../../frame/system" }
node-testing = { version = "2.0.0", path = "../testing" }
pallet-balances = { version = "3.0.0", path = "../../../frame/balances" }
pallet-contracts = { version = "2.0.0", path = "../../../frame/contracts" }
pallet-contracts = { version = "3.0.0", path = "../../../frame/contracts" }
pallet-grandpa = { version = "3.0.0", path = "../../../frame/grandpa" }
pallet-im-online = { version = "3.0.0", path = "../../../frame/im-online" }
pallet-indices = { version = "3.0.0", path = "../../../frame/indices" }
Expand Down
2 changes: 1 addition & 1 deletion bin/node/rpc/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ targets = ["x86_64-unknown-linux-gnu"]
jsonrpc-core = "15.1.0"
node-primitives = { version = "2.0.0", path = "../primitives" }
node-runtime = { version = "2.0.0", path = "../runtime" }
pallet-contracts-rpc = { version = "0.8.0", path = "../../../frame/contracts/rpc/" }
pallet-contracts-rpc = { version = "3.0.0", path = "../../../frame/contracts/rpc/" }
pallet-transaction-payment-rpc = { version = "3.0.0", path = "../../../frame/transaction-payment/rpc/" }
sc-client-api = { version = "3.0.0", path = "../../../client/api" }
sc-consensus-babe = { version = "0.9.0", path = "../../../client/consensus/babe" }
Expand Down
6 changes: 3 additions & 3 deletions bin/node/runtime/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -51,9 +51,9 @@ pallet-babe = { version = "3.0.0", default-features = false, path = "../../../fr
pallet-balances = { version = "3.0.0", default-features = false, path = "../../../frame/balances" }
pallet-bounties = { version = "3.0.0", default-features = false, path = "../../../frame/bounties" }
pallet-collective = { version = "3.0.0", default-features = false, path = "../../../frame/collective" }
pallet-contracts = { version = "2.0.0", default-features = false, path = "../../../frame/contracts" }
pallet-contracts-primitives = { version = "2.0.0", default-features = false, path = "../../../frame/contracts/common/" }
pallet-contracts-rpc-runtime-api = { version = "0.8.0", default-features = false, path = "../../../frame/contracts/rpc/runtime-api/" }
pallet-contracts = { version = "3.0.0", default-features = false, path = "../../../frame/contracts" }
pallet-contracts-primitives = { version = "3.0.0", default-features = false, path = "../../../frame/contracts/common/" }
pallet-contracts-rpc-runtime-api = { version = "3.0.0", default-features = false, path = "../../../frame/contracts/rpc/runtime-api/" }
pallet-democracy = { version = "3.0.0", default-features = false, path = "../../../frame/democracy" }
pallet-elections-phragmen = { version = "3.0.0", default-features = false, path = "../../../frame/elections-phragmen" }
pallet-election-provider-multi-phase = { version = "3.0.0", default-features = false, path = "../../../frame/election-provider-multi-phase" }
Expand Down
2 changes: 1 addition & 1 deletion bin/node/testing/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ sc-service = { version = "0.9.0", features = ["test-helpers", "db"], path = "..
sc-client-db = { version = "0.9.0", path = "../../../client/db/", features = ["kvdb-rocksdb", "parity-db"] }
sc-client-api = { version = "3.0.0", path = "../../../client/api/" }
codec = { package = "parity-scale-codec", version = "2.0.0" }
pallet-contracts = { version = "2.0.0", path = "../../../frame/contracts" }
pallet-contracts = { version = "3.0.0", path = "../../../frame/contracts" }
pallet-grandpa = { version = "3.0.0", path = "../../../frame/grandpa" }
pallet-indices = { version = "3.0.0", path = "../../../frame/indices" }
sp-keyring = { version = "3.0.0", path = "../../../primitives/keyring" }
Expand Down
78 changes: 78 additions & 0 deletions frame/contracts/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
# Changelog

All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

The semantic versioning guarantees cover the interface to the substrate runtime which
includes this pallet as a dependency. This module will also add storage migrations whenever
changes require it. Stability with regard to offchain tooling is explicitly excluded from
this guarantee: For example adding a new field to an in-storage data structure will require
changes to frontends to properly display it. However, those changes will still be regarded
as a minor version bump.

The interface provided to smart contracts will adhere to semver with one exception: Even
major version bumps will be backwards compatible with regard to already deployed contracts.
In other words: Upgrading this pallet will not break pre-existing contracts.

## [v3.0.0]

This version constitutes the first release that brings any stability guarantees (see above).

### Added

- Emit an event when a contract terminates (self-destructs).
[1](https://github.com/paritytech/substrate/pull/8014)

- Charge rent for code stored on the chain in addition to the already existing
rent that is payed for data storage.
[1](https://github.com/paritytech/substrate/pull/7935)

- Allow the runtime to configure per storage item costs in addition
to the already existing per byte costs.
[1](https://github.com/paritytech/substrate/pull/7819)

- Contracts are now deleted lazily so that the user who removes a contract
does not need to pay for the deletion of the contract storage.
[1](https://github.com/paritytech/substrate/pull/7740)

- Allow runtime authors to define chain extensions in order to provide custom
functionality to contracts.
[1](https://github.com/paritytech/substrate/pull/7548)
[2](https://github.com/paritytech/substrate/pull/8003)

- Proper weights which are fully automated by benchmarking.
[1](https://github.com/paritytech/substrate/pull/6715)
[2](https://github.com/paritytech/substrate/pull/7017)
[3](https://github.com/paritytech/substrate/pull/7361)

### Changes

- Collect the rent for one block during instantiation.
[1](https://github.com/paritytech/substrate/pull/7847)

- Instantiation takes a `salt` argument to allow for easier instantion of the
same code by the same sender.
[1](https://github.com/paritytech/substrate/pull/7482)

- Improve the information returned by the `contracts_call` RPC.
[1](https://github.com/paritytech/substrate/pull/7468)

- Simplify the node configuration necessary to add this module.
[1](https://github.com/paritytech/substrate/pull/7409)

### Fixed

- Consider the code size of a contract in the weight that is charged for
loading a contract from storage.
[1](https://github.com/paritytech/substrate/pull/8086)

- Fix possible overflow in storage size calculation
[1](https://github.com/paritytech/substrate/pull/7885)

- Cap the surcharge reward that can be claimed.
[1](https://github.com/paritytech/substrate/pull/7870)

- Fix a possible DoS vector where contracts could allocate too large buffers.
[1](https://github.com/paritytech/substrate/pull/7818)
9 changes: 3 additions & 6 deletions frame/contracts/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "pallet-contracts"
version = "2.0.1"
version = "3.0.0"
authors = ["Parity Technologies <admin@parity.io>"]
edition = "2018"
license = "Apache-2.0"
Expand All @@ -9,9 +9,6 @@ repository = "https://github.com/paritytech/substrate/"
description = "FRAME pallet for WASM contracts"
readme = "README.md"

# Prevent publish until we are ready to release 3.0.0
publish = false

[package.metadata.docs.rs]
targets = ["x86_64-unknown-linux-gnu"]

Expand All @@ -20,8 +17,8 @@ codec = { package = "parity-scale-codec", version = "2.0.0", default-features =
frame-benchmarking = { version = "3.1.0", default-features = false, path = "../benchmarking", optional = true }
frame-support = { version = "3.0.0", default-features = false, path = "../support" }
frame-system = { version = "3.0.0", default-features = false, path = "../system" }
pallet-contracts-primitives = { version = "2.0.0", default-features = false, path = "common" }
pallet-contracts-proc-macro = { version = "0.1.0", path = "proc-macro" }
pallet-contracts-primitives = { version = "3.0.0", default-features = false, path = "common" }
pallet-contracts-proc-macro = { version = "3.0.0", path = "proc-macro" }
parity-wasm = { version = "0.41.0", default-features = false }
pwasm-utils = { version = "0.16", default-features = false }
serde = { version = "1.0.101", optional = true, features = ["derive"] }
Expand Down
24 changes: 12 additions & 12 deletions frame/contracts/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@

The Contract module provides functionality for the runtime to deploy and execute WebAssembly smart-contracts.

- [`contract::Trait`](https://docs.rs/pallet-contracts/latest/pallet_contracts/trait.Trait.html)
- [`Call`](https://docs.rs/pallet-contracts/latest/pallet_contracts/enum.Call.html)
- [`Config`](https://docs.rs/pallet-contracts/latest/pallet_contracts/trait.Config.html)
- [`Error`](https://docs.rs/pallet-contracts/latest/pallet_contracts/enum.Error.html)
- [`Event`](https://docs.rs/pallet-contracts/latest/pallet_contracts/enum.Event.html)

## Overview

Expand Down Expand Up @@ -32,6 +34,9 @@ reverted at the current call's contract level. For example, if contract A calls
then all of B's calls are reverted. Assuming correct error handling by contract A, A's other calls and state
changes still persist.

One gas is equivalent to one [weight](https://substrate.dev/docs/en/knowledgebase/learn-substrate/weight)
which is defined as one picosecond of execution time on the runtime's reference machine.

### Notable Scenarios

Contract call failures are not always cascading. When failures occur in a sub-call, they do not "bubble up",
Expand All @@ -42,19 +47,14 @@ fails, A can decide how to handle that failure, either proceeding or reverting A

### Dispatchable functions

Those are documented in the reference documentation of the `Module`.
Those are documented in the [reference documentation](https://docs.rs/pallet-contracts/latest/pallet_contracts/#dispatchable-functions).

## Usage

The Contract module is a work in progress. The following examples show how this Contract module
can be used to instantiate and call contracts.

- [`ink`](https://github.com/paritytech/ink) is
an [`eDSL`](https://wiki.haskell.org/Embedded_domain_specific_language) that enables writing
WebAssembly based smart contracts in the Rust programming language. This is a work in progress.

## Related Modules

- [Balances](https://docs.rs/pallet-balances/latest/pallet_balances/)
This module executes WebAssembly smart contracts. These can potentially be written in any language
that compiles to web assembly. However, using a language that specifically targets this module
will make things a lot easier. One such language is [`ink`](https://github.com/paritytech/ink)
which is an [`eDSL`](https://wiki.haskell.org/Embedded_domain_specific_language) that enables
writing WebAssembly based smart contracts in the Rust programming language.

License: Apache-2.0
3 changes: 1 addition & 2 deletions frame/contracts/common/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
[package]
name = "pallet-contracts-primitives"
version = "2.0.1"
version = "3.0.0"
authors = ["Parity Technologies <admin@parity.io>"]
edition = "2018"
license = "Apache-2.0"
homepage = "https://substrate.dev"
repository = "https://github.com/paritytech/substrate/"
description = "A crate that hosts a common definitions that are relevant for the pallet-contracts."
readme = "README.md"
publish = false

[package.metadata.docs.rs]
targets = ["x86_64-unknown-linux-gnu"]
Expand Down
3 changes: 1 addition & 2 deletions frame/contracts/proc-macro/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
[package]
name = "pallet-contracts-proc-macro"
version = "0.1.0"
version = "3.0.0"
authors = ["Parity Technologies <admin@parity.io>"]
edition = "2018"
license = "Apache-2.0"
homepage = "https://substrate.dev"
repository = "https://github.com/paritytech/substrate/"
description = "Procedural macros used in pallet_contracts"
publish = false

[package.metadata.docs.rs]
targets = ["x86_64-unknown-linux-gnu"]
Expand Down
7 changes: 3 additions & 4 deletions frame/contracts/rpc/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
[package]
name = "pallet-contracts-rpc"
version = "0.8.1"
version = "3.0.0"
authors = ["Parity Technologies <admin@parity.io>"]
edition = "2018"
license = "Apache-2.0"
homepage = "https://substrate.dev"
repository = "https://github.com/paritytech/substrate/"
description = "Node-specific RPC methods for interaction with contracts."
readme = "README.md"
publish = false

[package.metadata.docs.rs]
targets = ["x86_64-unknown-linux-gnu"]
Expand All @@ -24,8 +23,8 @@ sp-rpc = { version = "3.0.0", path = "../../../primitives/rpc" }
serde = { version = "1.0.101", features = ["derive"] }
sp-runtime = { version = "3.0.0", path = "../../../primitives/runtime" }
sp-api = { version = "3.0.0", path = "../../../primitives/api" }
pallet-contracts-primitives = { version = "2.0.0", path = "../common" }
pallet-contracts-rpc-runtime-api = { version = "0.8.0", path = "./runtime-api" }
pallet-contracts-primitives = { version = "3.0.0", path = "../common" }
pallet-contracts-rpc-runtime-api = { version = "3.0.0", path = "./runtime-api" }

[dev-dependencies]
serde_json = "1.0.41"
5 changes: 2 additions & 3 deletions frame/contracts/rpc/runtime-api/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
[package]
name = "pallet-contracts-rpc-runtime-api"
version = "0.8.1"
version = "3.0.0"
authors = ["Parity Technologies <admin@parity.io>"]
edition = "2018"
license = "Apache-2.0"
homepage = "https://substrate.dev"
repository = "https://github.com/paritytech/substrate/"
description = "Runtime API definition required by Contracts RPC extensions."
readme = "README.md"
publish = false

[package.metadata.docs.rs]
targets = ["x86_64-unknown-linux-gnu"]
Expand All @@ -18,7 +17,7 @@ sp-api = { version = "3.0.0", default-features = false, path = "../../../../prim
codec = { package = "parity-scale-codec", version = "2.0.0", default-features = false, features = ["derive"] }
sp-std = { version = "3.0.0", default-features = false, path = "../../../../primitives/std" }
sp-runtime = { version = "3.0.0", default-features = false, path = "../../../../primitives/runtime" }
pallet-contracts-primitives = { version = "2.0.0", default-features = false, path = "../../common" }
pallet-contracts-primitives = { version = "3.0.0", default-features = false, path = "../../common" }

[features]
default = ["std"]
Expand Down
2 changes: 2 additions & 0 deletions frame/contracts/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -837,6 +837,8 @@ pub struct RawAliveContractInfo<CodeHash, Balance, BlockNumber> {
pub deduct_block: BlockNumber,
/// Last block child storage has been written.
pub last_write: Option<BlockNumber>,
/// This field is reserved for future evolution of format.
pub _reserved: Option<()>,
}

impl<CodeHash, Balance, BlockNumber> RawAliveContractInfo<CodeHash, Balance, BlockNumber> {
Expand Down
4 changes: 1 addition & 3 deletions frame/contracts/src/rent.rs
Original file line number Diff line number Diff line change
Expand Up @@ -514,14 +514,12 @@ where
<ContractInfoOf<T>>::remove(&origin);
let tombstone_code_len = E::remove_user(origin_contract.code_hash);
<ContractInfoOf<T>>::insert(&dest, ContractInfo::Alive(AliveContractInfo::<T> {
trie_id: origin_contract.trie_id,
storage_size: origin_contract.storage_size,
pair_count: origin_contract.pair_count,
code_hash,
rent_allowance,
rent_payed: <BalanceOf<T>>::zero(),
deduct_block: current_block,
last_write,
.. origin_contract
}));

let origin_free_balance = T::Currency::free_balance(&origin);
Expand Down
1 change: 1 addition & 0 deletions frame/contracts/src/storage.rs
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,7 @@ where
rent_payed: <BalanceOf<T>>::zero(),
pair_count: 0,
last_write: None,
_reserved: None,
};

*existing = Some(contract.into());
Expand Down
2 changes: 2 additions & 0 deletions frame/contracts/src/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -392,6 +392,7 @@ fn account_removal_does_not_remove_storage() {
rent_allowance: 40,
rent_payed: 0,
last_write: None,
_reserved: None,
});
let _ = Balances::deposit_creating(&ALICE, 110);
ContractInfoOf::<Test>::insert(ALICE, &alice_contract_info);
Expand All @@ -407,6 +408,7 @@ fn account_removal_does_not_remove_storage() {
rent_allowance: 40,
rent_payed: 0,
last_write: None,
_reserved: None,
});
let _ = Balances::deposit_creating(&BOB, 110);
ContractInfoOf::<Test>::insert(BOB, &bob_contract_info);
Expand Down

0 comments on commit debec91

Please sign in to comment.