Rust implementation of the Nomic Bitcoin sidechain

Overview

Nomic Bitcoin Bridge testnet v0.3.0 (codename "gucci")

Guccinet

In this testnet, we've added two core featues: staking and Bitcoin integration.

Full staking

Nomic now uses Orga's new high-performance staking module, which provides a staking experience similar to what you'd expect from a Cosmos SDK chain.

Our implementation carefully avoids iteration where possible, so paying block rewards or slashing a million delegators is an O(1) operation.

Offline validators are now automatically jailed.

The following commands are now available via the CLI:

$ nomic claim        # Claim all available rewards from your delegations          
$ nomic declare      # Declare your node as a validator
$ nomic delegate     # Delegate coins to a validator     
$ nomic delegations  # List your delegations
$ nomic unbond       # Unbond coins from a validator

Bitcoin integration

Bitcoin block headers are now tracked by our on-chain Bitcoin SPV module.

All full nodes will verify Bitcoin headers, but full nodes may optionally also run a relayer to report new Bitcoin block headers to the network:

$ nomic relayer

In the near future, we'll enable Bitcoin deposits and withdrawals in this module.

Validator setup guide

This guide will walk you through setting up a validator for the Nomic Bitcoin Bridge testnet.

If you need any help getting your node running, join the Telegram channel.

Requirements

  • >= 1GB RAM
  • >= 5GB of storage
  • Linux or macOS (Windows support coming soon)

1. Build Nomic

Start by building Nomic - for now this requires Rust nightly.

# install rustup if you haven't already
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

# nomic currently requires rust nightly
rustup default nightly

# install required dependencies (ubuntu)
sudo apt install build-essential libssl-dev pkg-config clang

# clone
git clone https://github.com/nomic-io/nomic.git nomic && cd nomic

# build and install, adding a `nomic` command to your PATH
cargo install --path .

2. Initialize and configure your node

Initialize your data directory (~/.guccinet) by running:

nomic init

Next, add a seed so your node will be able to connect to the network by editing ~/.guccinet/tendermint/config/config.toml:

# Comma separated list of seed nodes to connect to
seeds = "[email protected]:26656,[email protected]:26656"

3. Run your node

nomic start

This will run the Nomic state machine and a Tendermint process.

4. Acquiring coins and staking for voting power

First, find your address by running nomic balance (for now this must be run on a machine which has an active full node).

Ask the Nomic team for some coins in the Telegram and include your address.

Once you have received coins, you can declare your node as a validator and delegate to yourself with:

nomic declare <validator_address> <amount>

The validator address is the base64 pubkey value found under "validator_info" in the output of http://localhost:26657/status. Amount is how many coins to delegate to yourself.

5. Run the relayer (optional)

To run the Bitcoin relayer, you must first run a Bitcoin full node.

Locate your bitcoin.conf (~/.bitcoin/bitcoin.conf on Linux, or ~/Library/Application\ Support/Bitcoin/bitcoin.conf on Mac), and configure it with:

server=1
rpcuser=<PICK_A_USERNAME>
rpcpassword=<PICK_A_PASSWORD>
rpcbind=127.0.0.1
rpcport=8332

Then start your relayer:

nomic relayer <rpc_username> <rpc_pass>

Your node will now start relaying Bitcoin block headers to Nomic.

Comments
  • thread 'tokio-runtime-worker' panicked at 'Could not get tendermint block header: response error

    thread 'tokio-runtime-worker' panicked at 'Could not get tendermint block header: response error

    Was trying to set up a node for testnet. This is the error i received.

    Caused by: Internal error: min height 2 can't be greater than max height 0 (code: -32603)

    Location: /home/sentinel/.cargo/registry/src/github.com-1ecc6299db9ec823/flex-error-0.4.4/src/tracer_impl/eyre.rs:10:9', src/bin/nomic.rs:316:14 note: run with RUST_BACKTRACE=1 environment variable to display a backtrace App Error: panic

    opened by Femkecl 3
  • Overflows

    Overflows

    This PR fixes issues with signatory set voting power overflows. It works by truncating in a way where the sum of the signatory set voting power is guaranteed to be at most 23 bits (chosen because it's a good enough level of precision, and will only take up 3 bytes when encoded as a Bitcoin varint - it's 23 and not 24 because Bitcoin uses the MSB as a sign bit).

    Some signatories may end up with 0 effective voting power but for now we just keep them in the script - in the future we can remove them to save space.

    opened by mappum 2
  • Non-deterministic floating point arithmetic in on-chain SPV

    Non-deterministic floating point arithmetic in on-chain SPV

    The SPV client currently stores results of floating point arithmetic in the store, causing non-determinism. The testnet produced 2 different encodings on x86-64 devices vs an ARM64 device.

    Example (note the log2work field):

    x86-64:

    '{"stored":{"header":{"version":549453824,"prev_blockhash":"0000000000005bc09e12caaa9e46d7af870d02e4ae691c210410bdaceaf566d9","merkle_root":"922a79b838e084e5663b8be5330cdc0ded713e1ed2b349416ec219e81d8eaf5e","time":1576210713,"bits":436449004,"nonce":1841051496},"height":1612364,"log2work":64.37285314603291},"id":"000000000000004267d6e454c1597e9db80b64ab2123ef0441de7892f837faed"}'
    

    arm64:

    {"stored":{"header":{"version":549453824,"prev_blockhash":"0000000000005bc09e12caaa9e46d7af870d02e4ae691c210410bdaceaf566d9","merkle_root":"922a79b838e084e5663b8be5330cdc0ded713e1ed2b349416ec219e81d8eaf5e","time":1576210713,"bits":436449004,"nonce":1841051496},"height":1612364,"log2work":64.37285314603292},"id":"000000000000004267d6e454c1597e9db80b64ab2123ef0441de7892f837faed"}
    

    This was easily tracked down because the floating point value was directly serialized in the store, but we should learn from this by never doing any floating point operations at all in on-chain logic.

    We can fix this immediate issue by either replacing that log2work field and its operations with a u64, or by implementing a simpler SPV module which is designed with determinism in mind.

    opened by mappum 2
  • delegate doesn't work

    delegate doesn't work

    This is screenshot and console error of redelegation.

    image response: {"code":1,"codespace":"","data":"","gas_used":"0","gas_wanted":"0","height":"0","info":"","logs":["Call Error: Coins Error: Insufficient balance"],"raw_log":"[]","timestamp":"","tx":null,"txhash":"41B61CCA0BF5BE9AB6A1DEB08902154B4559A8E149D1316B8D74480C3D194F27"}

    Delegate has the same error

    p.s. Build binary in release, please

    opened by Kwaskoff 1
  • `nomic init` only creates config for old stakenet

    `nomic init` only creates config for old stakenet

    On the other hand nomic start has a logic to check where the config should be created. nomic init should also check, or even better, be upgrade to only suppor tthe new stakenet.

    opened by greg-szabo 1
  • cargo build error in ubuntu

    cargo build error in ubuntu

    hey guys, I tried to build on the main branch and it throws many errors related to cpu architecture

    error: no rules expected the token aarch64_apple

    Distributor ID: Ubuntu
    Description:    Ubuntu 20.04.3 LTS
    Release:        20.04
    
    ❯ rustup -V
    rustup 1.24.3 (ce5817a94 2021-05-31)
    info: This is the version for the rustup toolchain manager, not the rustc compiler.
    info: The currently active `rustc` version is `rustc 1.61.0-nightly (d53246fed 2022-03-25)`
    
    ❯ cargo -V                                                               
    cargo 1.61.0-nightly (109bfbd 2022-03-17)
    
    
    ❯ rustup default                                                         
    nightly-x86_64-unknown-linux-gnu (default)
    
    
    error: no rules expected the token `aarch64_apple`
       --> /home/ahdee/.cargo/registry/src/github.com-1ecc6299db9ec823/ring-0.16.20/src/cpu.rs:257:13
        |
    165 |     macro_rules! features {
        |     --------------------- when calling this macro
    ...
    257 |             aarch64_apple: true,
        |             ^^^^^^^^^^^^^ no rules expected this token in macro call
    
    error[E0425]: cannot find value `AES` in module `cpu::arm`
       --> /home/ahdee/.cargo/registry/src/github.com-1ecc6299db9ec823/ring-0.16.20/src/aead/aes.rs:381:65
        |
    381 |         if cpu::intel::AES.available(cpu_features) || cpu::arm::AES.available(cpu_features) {
        |                                                                 ^^^ not found in `cpu::arm`
        |
    help: consider importing this constant
        |
    15  | use crate::cpu::intel::AES;
        |
    
    error[E0425]: cannot find value `PMULL` in module `cpu::arm`
       --> /home/ahdee/.cargo/registry/src/github.com-1ecc6299db9ec823/ring-0.16.20/src/aead/gcm.rs:315:26
        |
    315 |             || cpu::arm::PMULL.available(cpu_features)
        |                          ^^^^^ not found in `cpu::arm`
    
    error[E0425]: cannot find value `ARMCAP_STATIC` in this scope
       --> /home/ahdee/.cargo/registry/src/github.com-1ecc6299db9ec823/ring-0.16.20/src/cpu.rs:235:41
        |
    
    
    opened by ahdee 1
  • doc: add instruction to specify external_address

    doc: add instruction to specify external_address

    When no external_address or laddr is specified in config.toml, the node will not be discoverable if introspection fails, as the default laddr IP is set to 0.0.0.0:26656 - this guides a node operator to set it.

    For me, on Debian 11 without UPnP, introspection to determine my external IP either doesn't work, or doesn't persist - this probably needs to be fixed (in informalsystems/tendermint-rs?)

    Until then, this workaround seems to do it.

    opened by patricklodder 1
  • State machine error messages aren't received by RPC client

    State machine error messages aren't received by RPC client

    When a transaction fails in the ABCI state machine, its error message is not being properly passed through to Tendermint RPC clients. This is either an issue in the ABCI server or the RPC client.

    opened by mappum 1
  • Fix overflowing signatory set voting power

    Fix overflowing signatory set voting power

    We use u64's everywhere to represent voting power, but since Bitcoin only allows arithmetic on up to u32's, we must downconvert when building the signatory set.

    The absolute amount of voting power given to validators for mining has already risen very high since it is counting the probabilistic number of hashes done during mining, but even if we try to reduce the level by simply counting in a larger unit (e.g. 1 voting power equals the minimum amount of work, 1 << 20), we will overflow u32 rather quickly.

    A more scalable solution is to just calculate relative ratios between the u64 values, with some loss of precision which is low enough to be insignificant. For instance, if one validator has 1e15 voting power, and another has 2e15+100, we can safely represent these as 1 and 2, respectively.

    Using work for voting power, we will still have to consider the eventual overflow of the voting power u64's, but that belongs in a separate issue.

    opened by mappum 1
  • Fail on duplicate work proof txs

    Fail on duplicate work proof txs

    Duplicate work proofs currently pass without making any changes to the state, which means they still get relayed and take up space in a block. They should explicitly error.

    Note that this changes consensus-critical logic so it requires a soft fork. This is not a hard fork because it is a subset of previously-valid rules and does not change the calculated state.

    opened by mappum 1
  • Init Tendermint home from `nomic start`

    Init Tendermint home from `nomic start`

    The nomic start command could automatically run tendermint init if necessary, and copy in the Nomic testnet genesis to make things easier for the user.

    opened by mappum 1
  • nomic don't respect config.toml

    nomic don't respect config.toml

    Changing rpc.laddr port (or address) in config.toml

    Then nomic balance the nomic bin is trying to use 127.0.0.1:26657 which was another node and make nomic going total crazy

    If I remove the other (tendermint cosmos node)

    this error happen :

    HTTP error

    Caused by: error trying to connect: tcp connect error: Connection refused (os error 111)

    opened by ichthyx 0
  • nomic delegations is erroring on nomic testnet-4b-0

    nomic delegations is erroring on nomic testnet-4b-0

    Please see error here

    nomic delegations gives an error:

    thread 'main' panicked at 'called `Option::unwrap()` on a `None` value', src/bin/nomic.rs:451:18

    possibly related to delegation to a large number of validators

    opened by doggystylez 1
  • 'tokio-runtime-worker' panicked at 'Could not get tendermint status: serde parse error

    'tokio-runtime-worker' panicked at 'Could not get tendermint status: serde parse error

    Attempt starting new install, running latest rust nightly rustc 1.63.0-nightly (50b00252a 2022-06-06) immediately panics and fails.

    $ nomic start
    Configuring node for state sync...
    Getting bootstrap state for Tendermint light client...
    thread 'tokio-runtime-worker' panicked at 'Could not get tendermint status: serde parse error
    
    Caused by:
        expected value at line 1 column 1
    
    Location:
        /home/sv/.cargo/registry/src/github.com-1ecc6299db9ec823/flex-error-0.4.4/src/tracer_impl/eyre.rs:10:9', src/bin/nomic.rs:316:14
    note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
    App Error: panic
    

    Full Backtrace details:

    $ bash -c "RUST_BACKTRACE=full nomic start"
    Configuring node for state sync...
    Getting bootstrap state for Tendermint light client...
    thread 'tokio-runtime-worker' panicked at 'Could not get tendermint status: serde parse error
    
    Caused by:
        expected value at line 1 column 1
    
    Location:
        /home/sv/.cargo/registry/src/github.com-1ecc6299db9ec823/flex-error-0.4.4/src/tracer_impl/eyre.rs:10:9
    
    Stack backtrace:
       0: core::ops::function::Fn::call
       1: eyre::capture_handler
       2: eyre::error::<impl eyre::Report>::msg
       3: <flex_error::source::DisplayOnly<E> as flex_error::source::ErrorSource<Tracer>>::error_details
       4: tendermint_rpc::error::Error::serde
       5: tendermint_rpc::response::Response::from_string
       6: <core::future::from_generator::GenFuture<T> as core::future::future::Future>::poll
       7: <core::future::from_generator::GenFuture<T> as core::future::future::Future>::poll
       8: <core::future::from_generator::GenFuture<T> as core::future::future::Future>::poll
       9: std::thread::local::LocalKey<T>::with
      10: futures_executor::local_pool::block_on
      11: nomic::configure_for_statesync
      12: <tokio::runtime::blocking::task::BlockingTask<T> as core::future::future::Future>::poll
      13: tokio::runtime::task::core::CoreStage<T>::poll
      14: tokio::runtime::task::harness::Harness<T,S>::poll
      15: tokio::runtime::blocking::pool::Inner::run
      16: std::sys_common::backtrace::__rust_begin_short_backtrace
      17: core::ops::function::FnOnce::call_once{{vtable.shim}}
      18: <alloc::boxed::Box<F,A> as core::ops::function::FnOnce<Args>>::call_once
                 at /rustc/50b00252aeb77b10db04d65dc9e12ce758def4b5/library/alloc/src/boxed.rs:1951:9
      19: <alloc::boxed::Box<F,A> as core::ops::function::FnOnce<Args>>::call_once
                 at /rustc/50b00252aeb77b10db04d65dc9e12ce758def4b5/library/alloc/src/boxed.rs:1951:9
      20: std::sys::unix::thread::Thread::new::thread_start
                 at /rustc/50b00252aeb77b10db04d65dc9e12ce758def4b5/library/std/src/sys/unix/thread.rs:108:17
      21: start_thread
      22: clone
    ', src/bin/nomic.rs:316:14
    stack backtrace:
       0:     0x55f5efc1f75d - std::backtrace_rs::backtrace::libunwind::trace::h2a8892c156585d66
                                   at /rustc/50b00252aeb77b10db04d65dc9e12ce758def4b5/library/std/src/../../backtrace/src/backtrace/libunwind.rs:93:5
       1:     0x55f5efc1f75d - std::backtrace_rs::backtrace::trace_unsynchronized::h918c401bc86eed40
                                   at /rustc/50b00252aeb77b10db04d65dc9e12ce758def4b5/library/std/src/../../backtrace/src/backtrace/mod.rs:66:5
       2:     0x55f5efc1f75d - std::sys_common::backtrace::_print_fmt::h2a52b4cb52dc84fb
                                   at /rustc/50b00252aeb77b10db04d65dc9e12ce758def4b5/library/std/src/sys_common/backtrace.rs:66:5
       3:     0x55f5efc1f75d - <std::sys_common::backtrace::_print::DisplayBacktrace as core::fmt::Display>::fmt::h2f5ce3ea50e5b1d6
                                   at /rustc/50b00252aeb77b10db04d65dc9e12ce758def4b5/library/std/src/sys_common/backtrace.rs:45:22
       4:     0x55f5efc4696c - core::fmt::write::h48a5b18f44037270
                                   at /rustc/50b00252aeb77b10db04d65dc9e12ce758def4b5/library/core/src/fmt/mod.rs:1196:17
       5:     0x55f5efc18fe1 - std::io::Write::write_fmt::h1d1b08935a2fcf4b
                                   at /rustc/50b00252aeb77b10db04d65dc9e12ce758def4b5/library/std/src/io/mod.rs:1654:15
       6:     0x55f5efc20d95 - std::sys_common::backtrace::_print::h46d4f4f2d0dbcce0
                                   at /rustc/50b00252aeb77b10db04d65dc9e12ce758def4b5/library/std/src/sys_common/backtrace.rs:48:5
       7:     0x55f5efc20d95 - std::sys_common::backtrace::print::h8334e6fa27a1dde4
                                   at /rustc/50b00252aeb77b10db04d65dc9e12ce758def4b5/library/std/src/sys_common/backtrace.rs:35:9
       8:     0x55f5efc20d95 - std::panicking::default_hook::{{closure}}::hc13c7ff820b0fe22
                                   at /rustc/50b00252aeb77b10db04d65dc9e12ce758def4b5/library/std/src/panicking.rs:295:22
       9:     0x55f5efc20ab6 - std::panicking::default_hook::h100ba67c99329739
                                   at /rustc/50b00252aeb77b10db04d65dc9e12ce758def4b5/library/std/src/panicking.rs:314:9
      10:     0x55f5efc21326 - std::panicking::rust_panic_with_hook::h0a6a04da5fd1d45f
                                   at /rustc/50b00252aeb77b10db04d65dc9e12ce758def4b5/library/std/src/panicking.rs:698:17
      11:     0x55f5efc21217 - std::panicking::begin_panic_handler::{{closure}}::h55242fd43a581580
                                   at /rustc/50b00252aeb77b10db04d65dc9e12ce758def4b5/library/std/src/panicking.rs:588:13
      12:     0x55f5efc1fc14 - std::sys_common::backtrace::__rust_end_short_backtrace::h53771d999c075964
                                   at /rustc/50b00252aeb77b10db04d65dc9e12ce758def4b5/library/std/src/sys_common/backtrace.rs:138:18
      13:     0x55f5efc20f49 - rust_begin_unwind
                                   at /rustc/50b00252aeb77b10db04d65dc9e12ce758def4b5/library/std/src/panicking.rs:584:5
      14:     0x55f5eeb94443 - core::panicking::panic_fmt::h1a17f733294f4ffb
                                   at /rustc/50b00252aeb77b10db04d65dc9e12ce758def4b5/library/core/src/panicking.rs:142:14
      15:     0x55f5eeb94533 - core::result::unwrap_failed::hb96e0128b0d3cf3e
                                   at /rustc/50b00252aeb77b10db04d65dc9e12ce758def4b5/library/core/src/result.rs:1805:5
      16:     0x55f5eec7c115 - <core::future::from_generator::GenFuture<T> as core::future::future::Future>::poll::hbfc4ca37d2e0ea4a
      17:     0x55f5eed605c1 - std::thread::local::LocalKey<T>::with::h945f017f0fd77ee0
      18:     0x55f5eef32a6d - futures_executor::local_pool::block_on::hb7ad54143a7dd4e8
      19:     0x55f5eed11635 - nomic::configure_for_statesync::h11e4b4aded29ea15
      20:     0x55f5eeeea44f - <tokio::runtime::blocking::task::BlockingTask<T> as core::future::future::Future>::poll::h73e38f3b64471900
      21:     0x55f5eece05eb - tokio::runtime::task::core::CoreStage<T>::poll::h4f7f935d64693a23
      22:     0x55f5eede6260 - tokio::runtime::task::harness::Harness<T,S>::poll::h6bb64ff469403bed
      23:     0x55f5efb92805 - tokio::runtime::blocking::pool::Inner::run::h9653a3b10a6ee03e
      24:     0x55f5efb974c7 - std::sys_common::backtrace::__rust_begin_short_backtrace::h43b8945bc4261c99
      25:     0x55f5efb9a3ea - core::ops::function::FnOnce::call_once{{vtable.shim}}::had19396efb2580cd
      26:     0x55f5efc26e23 - <alloc::boxed::Box<F,A> as core::ops::function::FnOnce<Args>>::call_once::ha070fd431c3387e9
                                   at /rustc/50b00252aeb77b10db04d65dc9e12ce758def4b5/library/alloc/src/boxed.rs:1951:9
      27:     0x55f5efc26e23 - <alloc::boxed::Box<F,A> as core::ops::function::FnOnce<Args>>::call_once::hd87ab2d0201316b5
                                   at /rustc/50b00252aeb77b10db04d65dc9e12ce758def4b5/library/alloc/src/boxed.rs:1951:9
      28:     0x55f5efc26e23 - std::sys::unix::thread::Thread::new::thread_start::ha32118aaa6c8a9be
                                   at /rustc/50b00252aeb77b10db04d65dc9e12ce758def4b5/library/std/src/sys/unix/thread.rs:108:17
      29:     0x7fc7edb82609 - start_thread
      30:     0x7fc7ed753133 - clone
      31:                0x0 - <unknown>
    App Error: panic
    
    opened by Cordtus 3
  • Validator consensus key and identity.

    Validator consensus key and identity.

    Goodmorning. I have some issue finding the validator consensus key and the identity for my node. I have read the line from the readme doc, but i don't know how to find the validator key from the output of http://localhost:26657/status. I literally don't know what should i do in this case on ubuntu konsole. Same thing for the identity. I don't know what is a Keybase profile.

    opened by kicknoob 0
Releases(v0.2.2)
An (unofficial) open source Rust implementation of the Discord Game SDK.

⚔️ discord-sdk An (unofficial) open source Rust implementation of the Discord Game SDK. Why not use this? This project is not official and is using a

Embark 79 Oct 26, 2022
Rust implementation of Another World (aka Out of this world) game engine

RustyWorld Rust implementation of Another World (aka Out of this world) game engine. I wanted a fun project to challenge myself while learning Rust, a

Francesco Degrassi 3 Jul 1, 2021
Implementation of the great book Ray Tracing in One Weekend in Rust.

Ray Tracing in One Weekend (Rust) Implementation of the great book Ray Tracing in One Weekend in Rust. Fun easy way to pick up and learn Rust (was rou

Stanley Su 6 Dec 29, 2021
A Rust implementation of the legendary solitaire game

Freecell Yet another implementation of the legendary total information solitaire. Play patience like it's 1991, complete with sights and sounds. Build

null 15 Aug 25, 2022
Game of life implementation written in Rust.

Game of life Game of life implementation written in Rust. Part of my journey in learning Rust. Pattern files The patterns are based on the example pat

Hashem Hashem 2 Nov 17, 2022
A simple, very minimal Minecraft server implementation in Rust.

A simple, very minimal Minecraft server implementation in Rust. For a simple Minecraft server that isn't supposed to do much (for example, a limbo ser

Chris 9 Nov 10, 2022
A first-time implementation of Conway's Game of Life in Rust: Adventure and Commentary

A Commentary on Life This project documents the process and final result of my first-ever attempt at implementing Conway's Game of Life. I'll be using

Avery R. 2 Feb 25, 2022
Rust implementation of behavior trees.

Bonsai 盆栽 Rust implementation of Behavior Trees Contents Quick intro to Behavior Trees Concepts Examples Development Guide Kanban Board Honorable Ment

Kristoffer Rakstad Solberg 112 Nov 27, 2022
A Quoridor implementation in Rust, including different AIs

Quoridor in Rust Quoridor is a zero-sum strategic board game with complete information. It was initially designed by Marko Marchesi based on Blockade

canta slaus 2 Sep 8, 2022
A Rust implementation of the GMT game Battle Line.

rsbl A Rust implementation of the game Battle Line. Running Currently there is only the simplest prototype of the game: a text-based table with ⚑ char

Matan Lurey 2 Nov 6, 2022
Terminal UI implementation and types for the Dark Forest game

dark-forest.rs Terminal UI implementation and types for the Dark Forest game Development We use the standard Rust toolchain cargo check

Georgios Konstantopoulos 63 Nov 12, 2022
A simple implementation of Conway's Game of Life using Fully homomorphic Encryption

Game of life using Fully homomorphic encryption A simple implementation of Conway's Game of Life built using Zama's concrete-boolean library. Build Ju

Florent Michel 4 Oct 3, 2022
An implementation of the Game of Life

Lifeee – An implementation of the Game of Life I realized this application to keep learning Rust, discover the front-end library Yew, and because I’m

Sébastien Castiel 58 Nov 23, 2022
A wordle implementation that I made for a competition of wordle solvers

Wordle tester A wordle implementation that I made for a competition of wordle solvers. Runs tests using a list of words and outputs the total turns ta

Shantanu Deshmukh 6 Apr 11, 2022
The study of a simple path tracer implementation (image raytracing in shorts)

The study of a simple path tracer implementation (generate a raytraced image, in shorts).

Leonardo Vieira 1 Apr 2, 2022
RusTTS is an unofficial Coqui TTS implementation.

RusTTS RusTTS is an unofficial Coqui TTS implementation. Currently, only the YourTTS for [ TTS & VC ] has been implemented. So, feel free to contribut

UlagBulag Village 13 Sep 12, 2022
bevy-hikari is an implementation of voxel cone tracing global illumination with anisotropic mip-mapping in Bevy

Bevy Voxel Cone Tracing bevy-hikari is an implementation of voxel cone tracing global illumination with anisotropic mip-mapping in Bevy. Bevy Version

研究社交 184 Dec 3, 2022
An alternative ggez implementation on top of miniquad.

Good Web Game good-web-game is a wasm32-unknown-unknown implementation of a ggez subset on top of miniquad. Originally built to run Zemeroth on the we

null 291 Nov 16, 2022
An implementation of the Jump Flooding Algorithm for the Bevy engine.

bevy_jfa The Jump Flooding Algorithm (JFA) for Bevy. Features This crate provides an OutlinePlugin that can be used to add outlines to Bevy meshes. Se

null 20 Aug 19, 2022