GithubHelp home page GithubHelp logo

compound-finance / gateway Goto Github PK

View Code? Open in Web Editor NEW
129.0 25.0 50.0 13.84 MB

An interest-bearing stablecoin bridge between all DeFi chains.

Rust 66.27% Shell 0.67% Solidity 3.26% JavaScript 27.64% Python 0.18% HCL 1.55% Jinja 0.11% Handlebars 0.28% Dockerfile 0.04%

gateway's Introduction

Gateway

An interest-bearing stablecoin bridge between all DeFi chains.

Gateway is built on Substrate.

Local Development

Follow these steps to prepare a local Substrate development environment πŸ› οΈ

Simple Setup

Install all the required dependencies with a single command (be patient, this can take up to 30 minutes).

curl https://getsubstrate.io -sSf | bash -s -- --fast

Manual Setup

Find manual setup instructions at the Substrate Developer Hub.

Build

Once the development environment is set up, build Gateway. This command will build the Wasm and native code:

cargo build --release

Note: that we require the rust nightly toolchain as we rely on unstable features (notably const_generics). You should make nightly your default rust toolchain.

Test

To test, run:

cargo test -- -Z unstable-options --test-threads 1

Run

Single Node Development Chain

Purge any existing dev chain state:

./target/release/gateway purge-chain --dev

If all else fails the chain state can be purged (on Mac OS X) like:

rm -rf ~/Library/Application\ Support/gateway/chains/dev

Start a dev chain:

./target/release/gateway --dev

Or, start a dev chain with detailed logging:

RUST_LOG=debug RUST_BACKTRACE=1 ./target/release/gateway -lruntime=debug --dev

Multi-Node Local Testnet

To see the multi-node consensus algorithm in action, run a local testnet with two validator nodes, Alice and Bob, that have been configured as the initial authorities of the local testnet chain and endowed with testnet units.

Note: this will require two terminal sessions (one for each node).

Start Alice's node first. The command below uses the default TCP port (30333) and specifies /tmp/alice as the chain database location. Alice's node ID will be 12D3KooWEyoppNCUx8Yx66oV9fJnriXwCcXwDDUA2kj6vnc6iDEp (legacy representation: QmRpheLN4JWdAnY7HGJfWFNbfkQCb6tFf4vvA6hgjMZKrR); this is determined by the node-key.

cargo +nightly run -- \
  --db=ParityDB \
  --base-path /tmp/alice \
  --chain=local \
  --alice \
  --node-key 0000000000000000000000000000000000000000000000000000000000000001 \
  --telemetry-url 'ws://telemetry.polkadot.io:1024 0' \
  --validator

In another terminal, use the following command to start Bob's node on a different TCP port (30334) and with a chain database location of /tmp/bob. The --bootnodes option will connect his node to Alice's on TCP port 30333:

cargo +nightly run -- \
  --db=ParityDB \
  --base-path /tmp/bob \
  --bootnodes /ip4/127.0.0.1/tcp/30333/p2p/12D3KooWEyoppNCUx8Yx66oV9fJnriXwCcXwDDUA2kj6vnc6iDEp \
  --chain=local \
  --bob \
  --port 30334 \
  --ws-port 9945 \
  --telemetry-url 'ws://telemetry.polkadot.io:1024 0' \
  --validator

Execute cargo +nightly run -- --help to learn more about the Gateway's CLI options.

Gateway Structure

A Substrate project such as this consists of a number of components that are spread across a few directories.

Node

A blockchain node is an application that allows users to participate in a blockchain network. Substrate-based blockchain nodes expose a number of capabilities:

  • Networking: Substrate nodes use the libp2p networking stack to allow the nodes in the network to communicate with one another.
  • Consensus: Blockchains must have a way to come to consensus on the state of the network. Substrate makes it possible to supply custom consensus engines and also ships with several consensus mechanisms that have been built on top of Web3 Foundation research.
  • RPC Server: A remote procedure call (RPC) server is used to interact with Substrate nodes.

There are several files in the node directory - take special note of the following:

  • chain_spec.rs: A chain specification is a source code file that defines a Substrate chain's initial (genesis) state. Chain specifications are useful for development and testing, and critical when architecting the launch of a production chain. Take note of the development_config and testnet_genesis functions, which are used to define the genesis state for the local development chain configuration. These functions identify some well-known accounts and use them to configure the blockchain's initial state.
  • service.rs: This file defines the node implementation. Take note of the libraries that this file imports and the names of the functions it invokes. In particular, there are references to consensus-related topics, such as the longest chain rule, the Aura block authoring mechanism and the GRANDPA finality gadget.

After the node has been built, refer to the embedded documentation to learn more about the capabilities and configuration parameters that it exposes:

./target/release/gateway --help

Runtime

In Substrate, the terms "runtime" and "state transition function" are analogous - they refer to the core logic of the blockchain that is responsible for validating blocks and executing the state changes they define. The Substrate project in this repository uses the FRAME framework to construct a blockchain runtime. FRAME allows runtime developers to declare domain-specific logic in modules called "pallets". At the heart of FRAME is a helpful macro language that makes it easy to create pallets and flexibly compose them to create blockchains that can address a variety of needs.

Review the FRAME runtime implementation included in Gateway and note the following:

  • This file configures several pallets to include in the runtime. Each pallet configuration is defined by a code block that begins with impl $PALLET_NAME::Config for Runtime.
  • The pallets are composed into a single runtime by way of the construct_runtime! macro, which is part of the core FRAME Support library.

Pallets

The runtime in this project is constructed using many FRAME pallets that ship with the core Substrate repository and a CASH pallet that is defined in the pallets directory.

A FRAME pallet is compromised of a number of blockchain primitives:

  • Storage: FRAME defines a rich set of powerful storage abstractions that makes it easy to use Substrate's efficient key-value database to manage the evolving state of a blockchain.
  • Dispatchables: FRAME pallets define special types of functions that can be invoked (dispatched) from outside of the runtime in order to update its state.
  • Events: Substrate uses events to notify users of important changes in the runtime.
  • Errors: When a dispatchable fails, it returns an error.
  • Config: The Config configuration interface is used to define the types and parameters upon which a FRAME pallet depends.

Run in Docker

First, install Docker.

Then build the Dockerfile:

docker build -t gateway .

Next, start your chain:

docker run --rm -it gateway -- /bin/sh

Release Process

All upgrades to Gateway should happen via the release process. We need to track which features were included in the release, usually including a changelog that covers each PR that was merged.

Proper release management is important here, especially since releases include many varieties of breaking changes. A scenario test should be written to show that things work as expected after the upgrade takes place. The goal is to not break things on release.

Releases should be cut from the develop (default) branch on Github.

Bump Spec Version

First increment the spec version in runtime/src/lib.rs.

Build Your Release Version

scripts/build_release.sh m88 # replace with your milestone version

Update the Dockerfile

Replace the release in the Dockerfile, using your tag (e.g. here m88):

- RUN scripts/pull_release.sh m16
- RUN chmod +x releases/m16/gateway-linux-x86
+ RUN scripts/pull_release.sh m88
+ RUN chmod +x releases/m88/gateway-linux-x86

Update Chain Spec

Note: this is only necessary if you are deploying a new chain, the chain spec is defined at genesis.

$ gateway> chains/build_spec.js -r m88 -c stablenet # replace m88 with your version

Using Github Workflows Release Process

Github actions have been created to respond to git tags that are pushed to the repo that begin with m, followed by the spec version, e.g. m88.

This process will create a draft / pre-release that can be modified and published on github once ready.

Create a tag and push to this repo:

$ git tag -a m88 # use your milestone tag
$ git push origin m88

Contributing

Contributors are welcome, and will be held to a high standard. Please consider making an issue to discuss larger changes before making pull requests. All contributions will fall under the license on this repo, which currently does not grant open permission of use. Additionally, you agree that your code will be subject to any license which is later attached to this repository as if it had been initially licensed thusly.

gateway's People

Contributors

coburncoburn avatar hayesgm avatar jflatow avatar maxwolff avatar mykelp avatar toninorair avatar torreyatcitty avatar waynenilsen avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

gateway's Issues

How to get the docker hub image?

Hi, I want to startup the image. but I do not have permission to pull.
Error response from daemon: Get https://docker.pkg.github.com/v2/compound-finance/gateway/run-on-arch-compound-finance-compound-chain-upload-release-asset-aarch64-ubuntu18-04/manifests/latest: no basic auth credentials.
Can you upload it to docker hub?

Unreachable remote host using provided ansible setup

Issue Description

Following the README instructions in gateway/ops I cannot seem to setup and run the gateway application using the provided Ansible chain playbook. The terraform setup correctly creates the described infrastructure on aws, and it correctly generates a hosts and ssh_config file. However the below mentioned command fails due to an ssh/key issue.

I am not too familiar with Ansible so any help would be appreciated!

Expected Behavior

  • Successfully sets up and starts the Gateway application on remote instances

Current Behavior

Setting up Gateway application

ansible-playbook -i hosts --ssh-extra-args "-F ./ssh_config" ansible/playbooks/chain.yml

Upon running the above command I get the below error message. I am able to ssh into the instances which is why this error confuses me.

PLAY [full_node,authority_node] **************************************************************************************************************************************************

TASK [Gathering Facts] ***********************************************************************************************************************************************************
fatal: [xxxx]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: kex_exchange_identification: Connection closed by remote host", "unreachable": true}
fatal: [xxx]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: kex_exchange_identification: Connection closed by remote host", "unreachable": true}
fatal: [xxxx]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: kex_exchange_identification: Connection closed by remote host", "unreachable": true}

PLAY RECAP ***********************************************************************************************************************************************************************
xxxxxxxx                : ok=0    changed=0    unreachable=1    failed=0    skipped=0    rescued=0    ignored=0
xxxxxxxx                : ok=0    changed=0    unreachable=1    failed=0    skipped=0    rescued=0    ignored=0
xxxxxxxx                : ok=0    changed=0    unreachable=1    failed=0    skipped=0    rescued=0    ignored=0

To Reproduce

Steps to reproduce the behavior:

  1. Follow instructions outlined in gateway/ops

Specification

  • commit tag: m8
  • operating system: macos

additional links:

I have reviewed this issue on stackoverflow but with no luck. I am not really sure this is an Ansible issue but any direction/guidance would be appreciated. Thanks.

Request for Post Mortem

It would be nice to understand what were the challenges that prevented Compound from taking this to production. Maybe just lack of in house Rust expertise, or probably that plust a combination of other things I'd imagine.

Thanks

What happen to error "missing expected key: 0x010857706a549e9ad50300cd01a0dba453baee88eea91e5414ca76020"

53: start_thread β”‚ β”‚ 54: clone β”‚ β”‚ Thread β€˜tokio-runtime-worker’ panicked at β€˜Externalities not allowed to fail within runtime: β€œTrie lookup error: Database missing expected key: 0x010857706a549e9ad50300cd01a0dba453baee88eea91e5414ca76020 β”‚ β”‚ ee54800”’, /usr/local/cargo/git/checkouts/substrate-29da8db4e7371a0e/3bb13fd/primitives/state-machine/src/ext.rs:224 β”‚ β”‚ This is a bug. Please report it at: β”‚ β”‚ https://help.compound.cash

Verification failed for block

Hi Team,

I try to start gateway and see it

output:

2021-03-19 12:28:11  Gateway
2021-03-19 12:28:11  ✌️  version 1.0.0-1ecad6c-x86_64-linux-gnu
2021-03-19 12:28:11  ❀️  by Compound <https://compound.finance>, 2021-2021
2021-03-19 12:28:11  πŸ“‹ Chain specification: Local Testnet
2021-03-19 12:28:11  🏷 Node name: horrible-tree-8673
2021-03-19 12:28:11  πŸ‘€ Role: FULL
2021-03-19 12:28:11  πŸ’Ύ Database: ParityDb at /home/luna/.local/share/gateway/chains/local_testnet/paritydb
2021-03-19 12:28:11  β›“  Native runtime: gateway-7 (gateway-1.tx1.au1)
2021-03-19 12:28:11  🏷 Local node identity is: 12D3KooWMZoS8MF3khq2pNhTGZatS6TqYS3fJJ7o9vZtPr34rGeN
2021-03-19 12:28:11  πŸ“¦ Highest known block at #17410
2021-03-19 12:28:11  〽️ Prometheus server started at 127.0.0.1:9615
2021-03-19 12:28:11  Listening for new connections on 127.0.0.1:9944.

2021-03-19 12:23:30 Verification failed for block 0x8a75a00971ffda9666cf074c9e0476bd9b798bbdc5bc55cd2baa477840e0d4e8 received from peer: 12D3KooWGCC28bMhxMEMqxpLT8S7X6cX5soVkUu66sVRW1DBzMXi, "Error for [109, 105, 110, 101, 114, 48, 48, 48]: Error(\"invalid miner address\")

script :

export MINER="0x10A4723D6E11184941f95451bea04613011fbfCF"
export KEYRING_TYPE=IN_MEMORY
export ETH_KEY="*** *** ***"
export ETH_KEY_ID="SPUTNIK"
./target/release/gateway \
--chain ./chains/testnet/chain-spec.json \
--pruning=archive \
--rpc-methods Unsafe \
--bootnodes /dns/brr-alice.compound.cash/tcp/30333/p2p/12D3KooWCdDZiHogARXgUTce1BCdg26dog6kvPaBSW6293cYdz4b

Please Help
Thx

Comp gateway fails to compile with latest rust nightly release (rustc 1.54.0-nightly)

Error Details

Context: booting up a validator node on local machine. The latest rust nightly release seems to cause issues with COMP Gateway compilation. Tried with two separate local machines, and an AWS instance. Error arose when building the compound chain release binary when running command:

cargo +nightly build --release

Error that Arises:

error[E0557]: feature has been removed
   --> /Users/steve/.cargo/registry/src/github.com-1ecc6299db9ec823/environmental-1.1.2/src/lib.rs:42:43
    |
 42 | #![cfg_attr(not(feature = "std"), feature(const_fn))]
    |                                           ^^^^^^^^ feature has been removed
    |
    = note: split into finer-grained feature gates

 error: aborting due to previous error

 For more information about this error, try `rustc --explain E0557`.
 error: could not compile `environmental`

 To learn more, run the command again with --verbose.
warning: build failed, waiting for other jobs to finish...
error: build failed

I believe compilation works if you downgrade to a lesser rust version currently.

Awesome job with everything your team is working on here! πŸ˜„

Get startup error base on m10 branch How to solve?

Startup parameters:

--name=compound-node  
--pruning=archive 
--rpc-methods Unsafe  
--chain /chains/testnet/chain-spec-raw.json  
--bootnodes /dns/brr-alice.compound.cash/tcp/30333/p2p/12D3KooWCdDZiHogARXgUTce1BCdg26dog6kvPaBSW6293cYdz4b`

Error:

2021-05-24 01:17:37  Gateway    
2021-05-24 01:17:37  ✌️  version 1.0.0-74cb019-x86_64-linux-gnu    
2021-05-24 01:17:37  ❀️  by Compound <https://compound.finance>, 2021-2021    
2021-05-24 01:17:37  πŸ“‹ Chain specification: Local Testnet    
2021-05-24 01:17:37  🏷 Node name: compound-node    
2021-05-24 01:17:37  πŸ‘€ Role: FULL    
2021-05-24 01:17:37  πŸ’Ύ Database: ParityDb at /node/.local/share/gateway/chains/local_testnet/paritydb    
2021-05-24 01:17:37  β›“  Native runtime: gateway-10 (gateway-1.tx1.au1)    
2021-05-24 01:17:39  πŸ”¨ Initializing Genesis block/state (state: 0x0357…0c8c, header-hash: 0xa8e9…d3e9)    
2021-05-24 01:17:39  πŸ‘΄ Loading GRANDPA authority set from genesis on what appears to be first startup.    
2021-05-24 01:17:39  Cannot create a runtime: Instantiation("Instantiation: Export ext_config_interface_get_version_1 not found")    
Error: Service(Client(Execution(RuntimeConstruction(Instantiation("Instantiation: Export ext_config_interface_get_version_1 not found")))))

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    πŸ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. πŸ“ŠπŸ“ˆπŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❀️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.