A sandbox to run and debug smart contracts for FRAME Contracts pallet and also a sandbox framework for Substrate runtime.
Europa
Europa is a private test blockchain based on Substrate to help Runtime Pallet andpallet-contracts development. It modifies the native Substrate chain by removing unnecessary components such as Wasm execution and p2p while adding some great features to help developers get more insights of the contract execution details. Europa supports all programming languages that compiles to WASM such as ink!, ask! and Solang.
- As a framework for Substrate runtime development
Europa sandbox framework also provides a local database storing the blockchain state changes,workspaces to isolate different developing environments.
- As a sandbox for
pallet-contractsmodule to debug and test contracts
- As a one-click blockchain with UI
Riot Group for discussion: https://app.element.io/#/room/#PatractLabsDev:matrix.org
**Note: Currently, FRAME Contracts pallet(pallet-contract) is under developments, which may contain some breaking changes. Thus we use different branch to differentiate FRAME Contracts pallet version.**
Note: We name FRAME Contracts pallet as pallet-contract in following doc.
We provide three main branches now:
master: runs latestpallet-contracts.substrate/v3.0.0: runspallet-contractsbased on v3.0.0 substrate dependencies.substrate/v2.0.0: runspallet-contractsbased on v2.0.0 substrate dependencies.
masterbranch is our default branch, which provides our forkedpallet-contractscrate that tracks the newest substratepallet-contractsmodule.
master branch, Europa use vender/substrate's pallet-contracts as dependency. This forked pallet-contracts is from
the branch europa-contracts in our vendor/substrate repo. In this forked pallet-contracts Europa provides
many self test features.
More information about this forked substrate refers to this repo
Currently, the tracked substrate commit is deac6324a16fc4128b94a7b4c3826eebcb86917f
substrate/v3.0.0branch is fixed in v3.0.0 substrate:
pallet-contracts in vendor.
substrate/v2.0.0branch is fixed in v2.0.0 substrate and does not contain vendor:
For master, Europa is tracking newest substrate (deac6324) now. Thus, pallet-contracts can use the newest features.
Note: The database format of Europa v0.3 and v0.2 is not compatible, please do not use the database directory generated by v0.2 for v0.3 (-d/--database parameter or use default data path).
You should delete old database or use a new version.
Documentation
Europa OverviewExtending types
When using Substrate Portal, @polkadot/api and Redspot or other 3rd parties clients to connect Europapallet-contracts node, please remember to add "extending types" for Europa requirements.
Europa current "extending types" is (This may be changed for different Europa version):
{ "LookupSource": "MultiAddress", "Address": "MultiAddress", "AliveContractInfo": { "trieId": "TrieId", "storageSize": "u32", "pairCount": "u32", "codeHash": "CodeHash", "rentAllowance": "Balance", "rentPaid": "Balance", "deductBlock": "BlockNumber", "lastWrite": "Option<BlockNumber>", "_reserved": "Option<Null>" } }
Features
- Europa is another implementation for substrate client.
ec-, for Substrate client crates are named sc-. Thus, Europa sandbox framework can be used by any blockchain projects based on Substrate.
The directory bin/europa is the implementation example for Europa like bin/node, bin/node-template in Substrate. Other Substrate based blockchain could integrate Europa's framework for the following features.
- Producing a block only when receiving new extrinsics.
- Removing related parts for WASM runtime.
- Providing another database called
state-kvto record blockchain's state changes when a new block gets mined. - Providing custom RPCs to tweak the blockchain.
europa_forwardToHeight: produce empty blocks to reach to the designated height
* europa_backwardToHeight: revert the blockchain to designated height and remove states
* ...
- Use workspace to isolate different node environments.
pallet-contracts sandbox, we split into two parts:
pallet-contracts modifications:
- [x] Using
ep-sandboxinstead ofsp-sandboxinpallet-contracts.
forked wasmi to support WASM panic backtrace.
- [X] Using wasmtime as WASM JIT-executor
- [ ] Support gdb/lldb debug. (developing)
- [ ] Using wasm3 as a more faster WASM interpreter. (not in plan)
- [x] Supporting
NestedRuntimeevent track feature to record all useful thing inpallet-contracts.
cargo-contract now), Europa would print:
1: NestedRuntime {
ext_result: [success] ExecReturnValue { flags: 0, data: 01 },
caller: 0000000000000000000000000000000000000000000000000000000000000000 (5C4hrfjw...),
self_account: 3790ddf4d8c63d559b3b46b96ca9b7b5f07b772c9ad4587eca6c0738e5d48422 (5DKZXRQN...),
selector: 0x1e5ca456,
args: None,
value: 0,
gas_limit: 4999999999999,
gas_left: 4998334662707,
env_trace: [
sealvaluetransferred(Some(0x00000000000000000000000000000000)),
seal_input(Some(0x1e5ca456)),
sealgetstorage((Some(0x0000000000000000000000000000000000000000000000000000000000000000), Some(0x01))),
seal_return((0, Some(0x01))),
],
trap_reason: TrapReason::Return(ReturnData { flags: 0, data: 01 }),
nest: [],
}
- [ ]
pallet-contractssupport.
chain extensions
- [x] Contract Logger support, refer to this link PIP-102
- [x] Zero-Knowledge support, refer to this link PIP-101
For details of Europa's pallet-contracts extensions, please refer to Europa's pallet-contracts implementation
Build and run
Build
clone this repo
> git clone --recurse-submodules https://github.com/patractlabs/europa.git
or do following commands
> git clone https://github.com/patractlabs/europa.git
> cd europa/vendor
> git submodule update --init --recursive
compile
The compilation for this project is same as substrate.Once compilation is finished, current executable file is named europa in target directory.
Run
Run Europa
Following example are built in debug mode. If you build with release mode, usingrelease replace debug in following commands.
$ ./target/debug/europa
if you what to specify a directory, add -d or --base-path
$ ./target/debug/europa -d database
if you just want to test without storing the actual blockchain database, add --tmp
$ ./target/debug/europa --tmp
then, the Europa will start:
Nov 12 17:10:14.524 INFO Europa Dev Node
Nov 12 17:10:14.524 INFO ✌️ version 0.1.0-7b4463c-x86_64-linux-gnu
Nov 12 17:10:14.524 INFO ❤️ by patract labs <https://github.com/patractlabs>, 2020-2020
Nov 12 17:10:14.524 INFO 📋 Chain specification: Development
Nov 12 17:10:14.524 INFO 💾 Database: RocksDb at .sub/default/chains/dev/db
Nov 12 17:10:14.524 INFO 📖 Workspace: default | Current workspace list: ["default"]
Nov 12 17:10:14.524 INFO ⛓ Native runtime: europa-1 (europa-1.tx1.au1)
Nov 12 17:10:14.986 INFO 🔨 Initializing Genesis block/state (state: 0x8fc7…d968, header-hash: 0xc7e1…7529)
Nov 12 17:10:14.988 INFO 📦 Highest known block at #0
Nov 12 17:10:14.991 INFO Listening for new connections on 127.0.0.1:9944.
Access Europa
now, you could use apps(https://polkadot.js.org/apps/) to access Europa:- click left tab to switch
DEVELOPMENT-Local Node. - click
Settings-Developer, and paste "extending types"(see above) to here: - click "save"
Nov 12 17:21:23.544 INFO Accepted a new tcp connection from 127.0.0.1:44210.
Nov 12 17:21:32.238 INFO 🙌 Starting consensus session on top of parent 0xc7e1ce585807b34b7fecabe1242cafb2628c958b984ec0aee7727cdd34117529
Nov 12 17:21:32.252 INFO 🎁 Prepared block for proposing at 1 [hash: 0x0109608217316a298c88135cf39a87cc31c37729fbe567b4a1a9f8dcdb81ebeb; parent_hash: 0xc7e1…7529; extrinsics (2): [0x2194…baf8, 0x0931…58bb]]
Nov 12 17:21:32.267 INFO Instant Seal success: CreatedBlock { hash: 0x0109608217316a298c88135cf39a87cc31c37729fbe567b4a1a9f8dcdb81ebeb, aux: ImportedAux { headeronly: false, clearjustificationrequests: false, needsjustification: false, badjustification: false, needsfinalityproof: false, isnew_best: true } }
More operations please refers to the doc Europa-CLI
Plan/Reports
- v0.1: An independent runtime environment as the foundation for future developments (finished)
- v0.2:
pallet-contractmodification to provide more information. (finish)
pallet-contracts module for the part of the error logging for contract developers, such as :
* WASM back trace, the function call stack during WASM contract execution;
* Contracts stack traces, the call stack of a contract calling another contract;
* Console.log, provides libraries and methods to print command lines during contract development;
* Strengthen the error type and error display of the contract module;
* Integration with Redspot;
- v0.3: Improve the development experience, better integration with other tools, and extend the sandbox to be compatible with other runtime modules. (under development)