Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Revisit todo readme #331

Merged
merged 8 commits into from
Jan 29, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 22 additions & 29 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,27 +21,21 @@ BandChain - Decentralized Data Delivery Network<br/><br/>
<p align="center">
<a href="https://docs.bandchain.org/"><strong>Documentation »</strong></a>
<br />
<br/>
<a href="http://docs.bandchain.org/whitepaper/introduction.html">Whitepaper</a>
·
<a href="http://docs.bandchain.org/technical-specifications/obi.html">Technical Specifications</a>
·
<a href="http://docs.bandchain.org/using-any-datasets/">Developer Documentation</a>
·
<a href="http://docs.bandchain.org/client-library/data.html">Client Library</a>
</p>

<br/>

## What is BandChain?

BandChain is a **cross-chain data oracle platform** that aggregates and connects real-world data and APIs to smart contracts. It is designed to be **compatible with most smart contract and blockchain development frameworks**. It does the heavy lifting jobs of pulling data from external sources, aggregating them, and packaging them into the format that’s easy to use and verified efficiently across multiple blockchains.
BandChain is a **cross-chain data oracle platform** that aggregates and connects real-world data and APIs to smart contracts. It is designed to be **compatible with most smart contract and blockchain development frameworks**. It does the heavy lifting jobs of pulling data from external sources, aggregating them, and packaging them into the format that’s easy to use and verifiable efficiently across multiple blockchains.

Band's flexible oracle design allows developers to **query any data** including real-world events, sports, weather, random numbers and more. Developers can create custom-made oracles using WebAssembly to connect smart contracts with traditional web APIs within minutes.

## Installation

### Building from source
Please refer to [this documentation](https://docs.bandchain.org/node-validators/run-node/joining-mainnet/installation) for the most up-to-date installation guide.
colmazia marked this conversation as resolved.
Show resolved Hide resolved

## Building from source

We recommend the following for running a BandChain Validator:

Expand Down Expand Up @@ -70,28 +64,27 @@ make install
Using `bandd version` command to verify that your `bandd` has been build successfully.

```
bandd version --long
name: bandchain
server_name: bandd
version: 2.3.0
commit: 4fe19638b33043eed4dec9861cda40962fb5b2a7
build_tags: ledger
go: go version go1.18.3 darwin/amd64
version: 2.5.4
commit: e6548bbf4793829bb8e711e5ed89ba4afc710ded
build_tags: netgo,ledger
go: go version go1.19.1 darwin/amd64
build_deps:
...
```

### Setting Up Yoda — The Oracle Daemon

BandChain validators are also responsible for responding to oracle data requests. Whenever someone submits a request message to BandChain, the chain will autonomously choose a subset of active oracle validators to perform the data query.

The validators are chosen submit a report message to BandChain within a given timeframe as specified by a chain parameter (100 blocks in mainnet). We provide a program called yoda to do this task for you. For more information on the data request process, please see [here](https://docs.bandchain.org/whitepaper/system-overview.html#oracle-data-request).

Yoda uses an external executor to resolve requests to data sources. Currently, it supports [AWS Lambda](https://aws.amazon.com/lambda/) and [Google Cloud Function](https://cloud.google.com/functions) (through the REST interface). In future releases, `yoda` will support more executors and allow you to specify multiple executors to add redundancy.
If you are using Mac ARM architecture (M1, M2) and face the issue of GMP library, you can run this.
```
brew update && brew install gmp
sudo ln -s /opt/homebrew/lib/libgmp.10.dylib /usr/local/lib/
```

You also need to set up `yoda` and activate oracle status. Here’s the [documentation](https://github.com/bandprotocol/bandchain/wiki/Instruction-for-apply-to-be-an-oracle-validator-on-Guanyu-mainnet) to get started.
## Useful scripts for development

That’s it! You can verify that your validator is now an oracle provider via cli by using ` bandd query oracle validator <your validator address>`. Your yoda process must be responding to oracle requests assigned to your node. If the process misses a request, your oracle provider status will automatically get deactivated and you must send MsgActivate to activate again after a 10-minute waiting period and make sure that yoda is up.
- `scripts/generate_genesis.sh` to create/reset the default genesis file
- `scripts/start_bandd.sh` to start the bandd binary
- `scripts/start_yoda.sh` to start yoda with reporter(s)

## Resources

Expand All @@ -105,19 +98,19 @@ That’s it! You can verify that your validator is now an oracle provider via cl
- [Cosmoscan Mainnet](https://cosmoscan.io)
- [Big Dipper](https://band.bigdipper.live/)
- Testnet:
- [CosmoScan Testnet](https://laozi-testnet2.cosmoscan.io)
- [CosmoScan Testnet](https://laozi-testnet6.cosmoscan.io)

## Community

- [Official Website](https://bandprotocol.com)
- [Telegram](https://100.band/tg)
- [Telegram](https://t.me/bandprotocol)
- [Twitter](https://twitter.com/bandprotocol)
- [Developer Discord](https://100x.band/discord)
- [Developer Discord](https://discord.com/invite/3t4bsY7)

## License & Contributing

BandChain is licensed under the terms of the GPL 3.0 License unless otherwise specified in the LICENSE file at module's root.

We highly encourage participation from the community to help with D3N development. If you are interested in developing with D3N or have suggestion for protocol improvements, please open an issue, submit a pull request, or [drop as a line].
We highly encourage participation from the community to help with D3N development. If you are interested in developing with D3N or have suggestions for protocol improvements, please open an issue, submit a pull request, or [drop as a line].

[drop as a line]: mailto:[email protected]
[drop us a line]: mailto:[email protected]
3 changes: 2 additions & 1 deletion app/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -605,8 +605,8 @@ func NewBandApp(
// NOTE: Oracle module must occur before distr as it takes some fee to distribute to active oracle validators.
// NOTE: During begin block slashing happens after distr.BeginBlocker so that there is nothing left
// over in the validator fee pool, so as to keep the CanWithdrawInvariant invariant.
// NOTE: capability module's beginblocker must come before any modules using capabilities (e.g. IBC)

// TODO: Recheck all Begin/End block logic order
app.mm.SetOrderBeginBlockers(
upgradetypes.ModuleName,
capabilitytypes.ModuleName,
Expand Down Expand Up @@ -657,6 +657,7 @@ func NewBandApp(
consensusparamtypes.ModuleName,
globalfeetypes.ModuleName,
)

// NOTE: The genutils module must occur after staking so that pools are
// properly initialized with tokens from genesis accounts.
// NOTE: The genutils module must also occur after auth so that it can access the params from auth.
Expand Down
3 changes: 1 addition & 2 deletions testing/chain.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// 0.47 TODO: consider importing directly from ibc instead of forking
// TODO: consider importing directly from ibc instead of forking
package ibctesting

import (
Expand Down Expand Up @@ -79,7 +79,6 @@ type TestChain struct {
// Time management is handled by the Coordinator in order to ensure synchrony between chains.
// Each update of any chain increments the block header time for all chains by 5 seconds.
func NewTestChain(t *testing.T, coord *Coordinator, chainID string) *TestChain {
// TODO: change sender
signers := make([]tmtypes.PrivValidator, valSize)
validators := make([]*tmtypes.Validator, valSize)
genesisAccount := make([]authtypes.GenesisAccount, valSize)
Expand Down
2 changes: 1 addition & 1 deletion testing/endpoint.go
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ func (endpoint *Endpoint) CreateClient() (err error) {
consensusState = endpoint.Counterparty.Chain.LastHeader.ConsensusState()
case exported.Solomachine:
// TODO
// solo := NewSolomachine(chain.t, endpoint.Chain.Codec, clientID, "", 1)
// solo := NewSolomachine(endpoint.Chain.T, endpoint.Chain.Codec, clientID, "", 1)
// clientState = solo.ClientState()
// consensusState = solo.ConsensusState()

Expand Down
2 changes: 1 addition & 1 deletion x/globalfee/README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Global fee module

This module is the fork version of globalfee module from [Gaia](https://github.com/cosmos/gaia) and [TGrade](https://github.com/confio/tgrade) with modifications to use with the Oracle module and Cosmos-SDK 0.46.x version. All credits and big thanks go to the original authors.
This module is the fork version of globalfee module from [Gaia](https://github.com/cosmos/gaia) and [TGrade](https://github.com/confio/tgrade) with modifications to use with the Oracle module and Cosmos-SDK 0.47.x version. All credits and big thanks go to the original authors.

1 change: 0 additions & 1 deletion x/oracle/client/cli/tx.go
Original file line number Diff line number Diff line change
Expand Up @@ -307,7 +307,6 @@ $ %s tx oracle edit-data-source 1 --name coingecko-price --description The scrip
return err
}

// TODO: Support do-not-modify fee
coinStr, err := cmd.Flags().GetString(flagFee)
if err != nil {
return err
Expand Down
2 changes: 1 addition & 1 deletion x/oracle/ibc_test.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// 0.47 TODO: write this test file by importing testing directly from ibc
// TODO: write this test file by importing testing directly from ibc
package oracle_test

import (
Expand Down
6 changes: 2 additions & 4 deletions x/oracle/module.go
Original file line number Diff line number Diff line change
Expand Up @@ -96,10 +96,8 @@ func NewAppModule(k keeper.Keeper, ss exported.Subspace) AppModule {
}
}

// RegisterInvariants is a noop function to satisfy SDK AppModule interface.
func (am AppModule) RegisterInvariants(ir sdk.InvariantRegistry) {
// TODO
}
// RegisterInvariants is a no-op function to satisfy SDK AppModule interface.
func (am AppModule) RegisterInvariants(_ sdk.InvariantRegistry) {}

// RegisterServices registers module services.
func (am AppModule) RegisterServices(cfg module.Configurator) {
Expand Down
49 changes: 8 additions & 41 deletions yoda/README.md
Original file line number Diff line number Diff line change
@@ -1,48 +1,15 @@
### Yoda
# Yoda

## Prepare environment
## Introduction

1. Install PostgresSQL `brew install postgresql`
2. Install Golang
3. Install Rust
4. Install Docker
5. run `cd owasm/chaintests/bitcoin_block_count/`
6. run `wasm-pack build .`
7. `make install` in chain directory
8. Open 3 tabs on cmd
9. run `docker pull bandprotocol/runtime:1.0.2`
Yoda is a program that is used by BandChain's validator nodes to automatically fulfill data for oracle requests.

## How to install and run Yoda
Since a subset of validators who are selected for a data request must return the data they received from running the specified data source(s), each of them have to send a `MsgReportData` transaction to BandChain in order to fulfill their duty.

1. Open first cmd tab for running the BandChain
2. Open second cmd tab for running the Yoda
3. Open third cmd tab for running the BandChain CLI
Although the transaction can be sent manually by user, it is not convenient, and would be rather time-consuming. Furthermore, most data providers already have APIs that can be used to query data automatically by another software. Therefore, we have developed Yoda to help validators to automatically query data from data providers by executing data source script, then submit the result to fulfill the request.

### How to run BandChain on development mode
For more detail about Yoda, please follows this [link](https://docs.bandchain.org/node-validators/yoda)

1. Go to chain directory
2. Setup your PostgresSQL user, port and database name on `start_bandd.sh`
3. run `chmod +x scripts/start_bandd.sh` to change the access permission of start_bandd.script
4. run `./scripts/start_bandd.sh` to start BandChain
5. If fail, try owasm pack build then run script again.
## Installation

```
cd ../owasm/chaintests/bitcoin_block_count/
wasm-pack build .
cd ../../../chain
```

### How to run Yoda

1. Go to chain directory
2. run `chmod +x scripts/start_yoda.sh` to change the access permission of start_yoda.script
3. run `./scripts/start_yoda.sh validator [number of reporter]` to start Yoda

### Try to request data BandChain

After we have `BandChain` and `Yoda` running, now we can request data on BandChain.
Example of requesting data on BandChain

```
bandd tx oracle request 1 -c 0000000342544300000000000003e8 1 1 --chain-id bandchain --gas 3000000 --keyring-backend test --fee-limit 10uband --from requester
```
Please refer to [this documentation](https://docs.bandchain.org/node-validators/run-node/joining-mainnet/installation#step-5-setup-yoda) for the most up-to-date installation guide.
1 change: 0 additions & 1 deletion yoda/executor/executor.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,6 @@ func NewExecutor(executor string) (exec Executor, err error) {
return nil, fmt.Errorf("Invalid executor name: %s, base: %s", name, base)
}

// TODO: Remove hardcode in test execution
res, err := exec.Exec(testProgram, "TEST_ARG", map[string]interface{}{
"BAND_CHAIN_ID": "test-chain-id",
"BAND_VALIDATOR": "test-validator",
Expand Down
1 change: 0 additions & 1 deletion yoda/gas.go
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,6 @@ func estimateAuthAnteHandlerGas(c *Context, msgs []sdk.Msg) uint64 {
}

func estimateGas(c *Context, l *Logger, msgs []sdk.Msg, feeEstimations []FeeEstimationData) uint64 {
// TODO: Add authz validation / remove check reporter base gas
gas := estimateAuthAnteHandlerGas(c, msgs)

for i, msg := range msgs {
Expand Down
Loading