Welcome to the Rust-based implementation of the Kash full-node and its ancillary libraries. Rusty Kash, a groundbreaking cryptocurrency, is developed with a focus on establishing the purest form of decentralized stablecoin payments. We are proud that Rusty Kash is developed based on Rusty Kaspa, leveraging its advanced blockchain technology. Our project is in an active development phase, ensuring continuous alignment with Rusty Kaspa's updates to guarantee state-of-the-art features and security.
We invite developers and blockchain enthusiasts to collaborate, test, and optimize our Rust implementation. Each line of code here is an opportunity to contribute to the open-source blockchain movement, shaping a platform designed for scalability and speed without compromising on decentralization.
Building on Linux
-
Install general prerequisites
sudo apt install curl git build-essential libssl-dev pkg-config
-
Install Protobuf (required for gRPC)
sudo apt install protobuf-compiler libprotobuf-dev #Required for gRPC -
Install the clang toolchain (required for RocksDB and WASM secp256k1 builds)
sudo apt-get install clang-format clang-tidy \ clang-tools clang clangd libc++-dev \ libc++1 libc++abi-dev libc++abi1 \ libclang-dev libclang1 liblldb-dev \ libllvm-ocaml-dev libomp-dev libomp5 \ lld lldb llvm-dev llvm-runtime \ llvm python3-clang
-
Install the rust toolchain
If you already have rust installed, update it by running:
rustup update -
Install wasm-pack
cargo install wasm-pack
-
Install wasm32 target
rustup target add wasm32-unknown-unknown
-
Clone the repo
git clone https://github.com/Kash-Protocol/rusty-kash cd rusty-kash
Building on Windows
-
Install Git for Windows or an alternative Git distribution.
-
Install Protocol Buffers and add the
bindirectory to yourPath -
Install LLVM-15.0.6-win64.exe
Add the
bindirectory of the LLVM installation (C:\Program Files\LLVM\bin) to PATHset
LIBCLANG_PATHenvironment variable to point to thebindirectory as wellIMPORTANT: Due to C++ dependency configuration issues, LLVM
ARinstallation on Windows may not function correctly when switching between WASM and native C++ code compilation (nativeRocksDB+secp256k1vs WASM32 builds ofsecp256k1). Unfortunately, manually settingARenvironment variable also confuses C++ build toolchain (it should not be set for native but should be set for WASM32 targets). Currently, the best way to address this, is as follows: after installing LLVM on Windows, go to the targetbininstallation directory and copy or renameLLVM_AR.exetoAR.exe. -
Install the rust toolchain
If you already have rust installed, update it by running:
rustup update -
Install wasm-pack
cargo install wasm-pack
-
Install wasm32 target
rustup target add wasm32-unknown-unknown
-
Clone the repo
git clone https://github.com/Kash-Protocol/rusty-kash cd rusty-kash
Building on Mac OS
-
Install Protobuf (required for gRPC)
brew install protobuf
-
Install llvm.
The default XCode installation of
llvmdoes not support WASM build targets. To build WASM on MacOS you need to installllvmfrom homebrew (at the time of writing, the llvm version for MacOS is 16.0.1).brew install llvm
NOTE: Homebrew can use different keg installation locations depending on your configuration. For example:
/opt/homebrew/opt/llvm->/opt/homebrew/Cellar/llvm/16.0.1/usr/local/Cellar/llvm/16.0.1
To determine the installation location you can use
brew list llvmcommand and then modify the paths below accordingly:% brew list llvm /usr/local/Cellar/llvm/16.0.1/bin/FileCheck /usr/local/Cellar/llvm/16.0.1/bin/UnicodeNameMappingGenerator ...
If you have
/opt/homebrew/Cellar, then you should be able to use/opt/homebrew/opt/llvm.Add the following to your
~/.zshrcfile:export PATH="/opt/homebrew/opt/llvm/bin:$PATH" export LDFLAGS="-L/opt/homebrew/opt/llvm/lib" export CPPFLAGS="-I/opt/homebrew/opt/llvm/include" export AR=/opt/homebrew/opt/llvm/bin/llvm-ar
Reload the
~/.zshrcfilesource ~/.zshrc
-
Install the rust toolchain
If you already have rust installed, update it by running:
rustup update -
Install wasm-pack
cargo install wasm-pack
-
Install wasm32 target
rustup target add wasm32-unknown-unknown
-
Clone the repo
git clone https://github.com/Kash-Protocol/rusty-kash cd rusty-kash
Building WASM framework
Rust WebAssembly (Wasm) refers to the use of the Rust programming language to write code that can be compiled into WebAssembly, a binary instruction format that runs in web browsers. This allows for easy development using JS/TS while retaining the benefits of Rust.
The library can be build in for NodeJS, React Native and as an ES6 Module
NodeJS
cd rusty-kash
cd wasm
./build-node
cd nodejs
npm installReact Native
cd rusty-kash
cd wasm
./build-react-nativeES6
cd rusty-kash
cd wasm
./build-webThis will produce a folder: "nodejs", "web" or "react-native" library in `/wasm` directory depending on your selection.
Wallet CLI
cd cli
cargo run --releaseWallet CLI is now available via the /cli or /kos projects.
For KOS, please see kos/README.md
Local Web Wallet
Run an http server inside of wallet/wasm/web folder. If you don't have once, you can use the following:
cd wallet/wasm/web
cargo install basic-http-server
basic-http-serverThe basic-http-server will serve on port 4000 by default, so open your web browser and load http://localhost:4000
The framework is compatible with all major desktop and mobile browsers.
Start a mainnet node
cargo run --release --bin kashdStart a testnet node
cargo run --release --bin kashd -- --testnetwRPC
wRPC subsystem is disabled by default in kashd and can be enabled via:
JSON protocol:
--rpclisten-json = <interface:port>Borsh protocol:
--rpclisten-borsh = <interface:port>Sidenote:
Rusty Kash integrates an optional wRPC subsystem. wRPC is a high-performance, platform-neutral, Rust-centric, WebSocket-framed RPC implementation that can use Borsh and JSON protocol encoding.
JSON protocol messaging is similar to JSON-RPC 1.0, but differs from the specification due to server-side notifications.
Borsh encoding is meant for inter-process communication. When using Borsh both client and server should be built from the same codebase.
JSON protocol is based on Kash data structures and is data-structure-version agnostic. You can connect to the JSON endpoint using any WebSocket library. Built-in RPC clients for JavaScript and TypeScript capable of running in web browsers and Node.js are available as a part of the Kash WASM framework.
wRPC to gRPC Proxy is deprecated and no longer supported.
Mining
Mining is currently supported only on testnet, so once you've setup a test node, follow these instructions.
-
Download and unzip the latest binaries bundle of Kash-Protocol/kashd.
-
In a separate terminal run the Kash-Protocol/kashd miner:
kashminer --testnet --miningaddr kashtest:qrcqat6l9zcjsu7swnaztqzrv0s7hu04skpaezxk43y4etj8ncwfk308jlcewThis will create and feed a DAG with the miner getting block templates from the node and submitting them back when mined. The node processes and stores the blocks while applying all currently implemented logic. Execution can be stopped and resumed, the data is persisted in a database.
You can replace the above mining address with your own address by creating one as described here.
Simulation framework (Simpa)
Logging in kashd and simpa can be filtered by either:
The current codebase supports a full in-process network simulation, building an actual DAG over virtual time with virtual delay and benchmarking validation time (following the simulation generation).
To see the available commands
cargo run --release --bin simpa -- --helpThe following command will run a simulation to produce 1000 blocks with communication delay of 2 seconds and 8 BPS (blocks per second) while attempting to fill each block with up to 200 transactions.
cargo run --release --bin simpa -- -t=200 -d=2 -b=8 -n=1000Heap Profiling
Heap-profiling in kashd and simpa can be done by enabling heap feature and profile using the --features argument
cargo run --bin kashd --profile heap --features=heapIt will produce {bin-name}-heap.json file in the root of the workdir, that can be inspected by the dhat-viewer
Tests
Run unit and most integration tests
cd rusty-kash
cargo test --release
// or install nextest and runUsing nextest
cd rusty-kash
cargo nextest run --releaseBenchmarks
cd rusty-kash
cargo benchLogging
Logging in kashd and simpa can be filtered by either:
-
Defining the environment variable
RUST_LOG -
Adding the --loglevel argument like in the following example:
(cargo run --bin kashd -- --loglevel info,kash_rpc_core=trace,kash_grpc_core=trace,consensus=trace,kash_core=trace) 2>&1 | tee ~/rusty-kash.logIn this command we set the
logleveltoINFO.