https://github.com/omgnetwork/plasma-mvp
OmiseGO's research implementation of Minimal Viable Plasma
https://github.com/omgnetwork/plasma-mvp
Last synced: about 1 year ago
JSON representation
OmiseGO's research implementation of Minimal Viable Plasma
- Host: GitHub
- URL: https://github.com/omgnetwork/plasma-mvp
- Owner: omgnetwork
- License: mit
- Archived: true
- Created: 2018-01-17T15:28:47.000Z (over 8 years ago)
- Default Branch: master
- Last Pushed: 2019-03-04T13:24:28.000Z (over 7 years ago)
- Last Synced: 2025-03-13T07:02:20.267Z (over 1 year ago)
- Language: Python
- Homepage:
- Size: 394 KB
- Stars: 561
- Watchers: 95
- Forks: 159
- Open Issues: 11
-
Metadata Files:
- Readme: README.md
- Contributing: .github/CONTRIBUTING.md
- License: LICENSE
Awesome Lists containing this project
- awesome-plasma - OmiseGO's Plasma MVP
README
# Notice!
This is an old research repo. No active work is being done here. Efforts in the direction of production-ready MVP plasma chain (MoreVP, ERC20, audits) are in https://github.com/omisego/plasma-contracts.
# Plasma MVP
We're implementing [Minimum Viable Plasma](https://ethresear.ch/t/minimal-viable-plasma/426). This repository represents a work in progress and will undergo large-scale modifications as requirements change.
## Overview
Plasma MVP is split into four main parts: `root_chain`, `child_chain`, `client`, and `cli`. Below is an overview of each sub-project.
### root_chain
`root_chain` represents the Plasma contract to be deployed to the root blockchain. In our case, this contract is written in Solidity and is designed to be deployed to Ethereum. `root_chain` also includes a compilation/deployment script.
`RootChain.sol` is based off of the Plasma design specified in [Minimum Viable Plasma](https://ethresear.ch/t/minimal-viable-plasma/426). Currently, this contract allows a single authority to publish child chain blocks to the root chain. This is *not* a permanent design and is intended to simplify development of more critical components in the short term.
### child_chain
`child_chain` is a Python implementation of a Plasma MVP child chain client. It's useful to think of `child_chain` as analogous to [Parity](https://www.parity.io) or [Geth](https://geth.ethereum.org). This component manages a store of `Blocks` and `Transactions` that are updated when events are fired in the root contract.
`child_chain` also contains an RPC server that enables client interactions. By default, this server runs on port `8546`.
### client
`client` is a simple Python wrapper of the RPC API exposed by `child_chain`, similar to `Web3.py` for Ethereum. You can use this client to write Python applications that interact with this Plasma chain.
### cli
`cli` is a simple Python application that uses `client` to interact with `child_chain`, via the command line. A detailed documentation of `cli` is available [here](#cli-documentation).
## Getting Started
### Dependencies
This project has a few pre-installation dependencies.
#### [Solidity ^0.5.0](https://solidity.readthedocs.io/en/latest/installing-solidity.html)
Mac:
```sh
brew update
brew upgrade
brew tap ethereum/ethereum
brew install solidity
```
Linux:
```sh
sudo add-apt-repository ppa:ethereum/ethereum
sudo apt-get update
sudo apt-get install solc
```
Windows:
Follow [this guide](https://solidity.readthedocs.io/en/latest/installing-solidity.html#prerequisites-windows)
#### [Python 3.2+](https://www.python.org/downloads/)
Mac:
```sh
brew install python
```
Linux:
```sh
sudo apt-get install software-properties-common
sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt-get update
sudo apt-get install python3
```
Windows:
```sh
choco install python
```
#### [Ganache CLI 6.1.8+](https://github.com/trufflesuite/ganache-cli)
### Installation
Note: we optionally recommend using something like [`virtualenv`](https://pypi.python.org/pypi/virtualenv) in order to create an isolated Python environment:
```
$ virtualenv env -p python3
```
Fetch and install the project's dependencies with:
```
$ make
```
### Testing
Before you run tests, make sure you have an Ethereum client running and an JSON RPC API exposed on port `8545`. We recommend using `ganache-cli` to accomplish this when running tests. Start it with the command-line argument `-m="plasma_mvp"`.
Project tests can be found in the `tests/` folder. Run tests with:
```
$ make test
```
If you're contributing to this project, make sure you also install [`flake8`](https://pypi.org/project/flake8/) and lint your work:
```
$ make lint
```
### Starting Plasma
The fastest way to start playing with our Plasma MVP is by starting up `ganache-cli`, deploying everything locally, and running our CLI. Full documentation for the CLI is available [here](#cli-documentation).
```bash
$ ganache-cli -m=plasma_mvp # Start ganache-cli
$ make root-chain # Deploy the root chain contract
$ make child-chain # Run our child chain and server
```
## CLI Documentation
`omg` is a simple Plasma CLI that enables interactions with the child chain. Full documentation is provided below.
### `help`
#### Description
Shows a list of available commands.
#### Usage
```
--help
```
### `deposit`
#### Description
Creates a deposit transaction and submits it to the child chain.
#### Usage
```
deposit
```
#### Example
```
deposit 100 0xfd02EcEE62797e75D86BCff1642EB0844afB28c7
```
### `sendtx`
#### Description
Creates a transaction and submits it to the child chain.
#### Usage
```
sendtx []
```
#### Example
```
sendtx 1 0 0 0 0 0 0x0 0xfd02EcEE62797e75D86BCff1642EB0844afB28c7 50 0x4B3eC6c9dC67079E82152d6D55d8dd96a8e6AA26 45 3bb369fecdc16b93b99514d8ed9c2e87c5824cf4a6a98d2e8e91b7dd0c063304
```
### `submitblock`
#### Description
Signs and submits the current block to the root contract.
#### Usage
```
submitblock
```
#### Example
```
submitblock 3bb369fecdc16b93b99514d8ed9c2e87c5824cf4a6a98d2e8e91b7dd0c063304
```
### `withdraw`
#### Description
Creates an exit transaction for the given UTXO.
#### Usage
```
withdraw []
```
#### Example
```
withdraw 1000 0 0 3bb369fecdc16b93b99514d8ed9c2e87c5824cf4a6a98d2e8e91b7dd0c063304
```
### `withdrawdeposit`
#### Description
Withdraws from a deposit.
#### Usage
```
withdrawdeposit
```
#### Example
```
withdrawdeposit 0xfd02EcEE62797e75D86BCff1642EB0844afB28c7 1 100
```
## CLI Example
Let's play around a bit:
1. Deploy the root chain contract and start the child chain as per [Starting Plasma](#starting-plasma).
2. Start by depositing:
```
omg deposit 100 0xfd02EcEE62797e75D86BCff1642EB0844afB28c7
```
3. Send a transaction:
```
omg sendtx 1 0 0 0 0 0 0x0 0xfd02EcEE62797e75D86BCff1642EB0844afB28c7 50 0x4B3eC6c9dC67079E82152d6D55d8dd96a8e6AA26 45 3bb369fecdc16b93b99514d8ed9c2e87c5824cf4a6a98d2e8e91b7dd0c063304
```
4. Submit the block:
```
omg submitblock 3bb369fecdc16b93b99514d8ed9c2e87c5824cf4a6a98d2e8e91b7dd0c063304
```
5. Withdraw the original deposit (this is a double spend!):
```
omg withdrawdeposit 0xfd02EcEE62797e75D86BCff1642EB0844afB28c7 1 100
```
Note: The functionality to challenge double spends from the cli is still being worked on.