This repository contains the pre-alpha version prototype implementation of Crypto.com Chain. The current repository consists of the following Rust sub-crates:
-
chain-abci: the Tendermint ABCI application that currently does the transaction validation etc.
-
chain-core: the library that contains the main type definitions and any utility code (such as serialization), so that it can be used in chain-abci and other applications.
-
dev-utils: currently a minimal development tool for generating genesis.json
-
client-[common|index|core|rpc]: Client backend implementation for transaction creation and wallet management. Follow these links for more details:
Please abide by the Code of Conduct in all interactions, and the contributing guidelines when submitting code.
Tendermint: https://github.com/tendermint/tendermint/releases
Rust tooling (cargo + cmake): https://rustup.rs
(TODO: In the future, the build tooling may be migrated to Bazel / Nix etc. for reproducible builds.)
Before building, add the following lines to ~/.cargo/config
[build]
rustflags = ["-Ctarget-feature=+aes,+ssse3"]
Also, install ZeroMQ and pkg-config for building chain-abci
. Below are the commands for Mac OS:
$ brew install zmq
$ brew install pkg-config
Then build the executables
$ cargo build
The built executables will be put inside folder /target/debug/
by default.
$ cargo test
To measure code coverage, one can run
$ cargo tarpaulin
This only works on x86_64 processors running Linux. On different platforms,
$ docker run --security-opt seccomp=unconfined -v "$PWD:/volume" xd009642/tarpaulin
- generate address -- currently, there is a signer cli for this purpose (TODO / NOTE: signer-cli is going to be deprecated in favor of client-client )
$ signer-cli -- address generate --name <NAME>
This command will create an address with name . After entering the passphase, the address is generated.
$ signer-cli -- address get -n <NAME>
Enter passphrase:
Spend address: <ETH_ADDRESS_HEX_BYTES>
View address: <VIEW_ETH_ADDRESS_HEX_BYTES>
- generate initial state -- currently, a very naive way is in dev-utils. The
chain_id
will be used in Tendermint configuration later. At this point, just use two hex digits.
2a. prepare a "mapping" / snapshot file (each line contains the address and the amount):
0x<ETH_ADDRESS_HEX_BYTES_1> <AMOUNT_1>
0x<ETH_ADDRES_HEX_BYTES_2> <AMOUNT_2>
...
Note that the sum of amounts needs to equal to the total supply in base units.
2b. run the dev-utils command:
$ dev-utils -- genesis generate --base_fee <x.xxxx> --chain-id <CHAIN_ID> --launch_incentive_from <SOME_ETH_ADDRESS_HEX_BYTES> --launch_incentive_to <SOME_ETH_ADDRESS_HEX_BYTES> --long_term_incentive <SOME_ETH_ADDRESS_HEX_BYTES> --mapping_file_path <PATH_TO_MAPPING_FILE> --per_byte_fee <x.xxxx>
Note that launch_incentive_from, launch_incentive_to and long_term_incentive need to be present in the mapping file (their amounts will be put in the initial rewards pool).
In the end, you should get two pieces of data:
"app_hash": "<APP_HASH_HEX_BYTES>",
"app_state": {"distribution":{"0x<ETH_ADDRESS_HEX_BYTES_1>":<AMOUNT_1>,...},"launch_incentive_from":"<SOME_ETH_ADDRESS_HEX_BYTES>","launch_incentive_to":"<SOME_ETH_ADDRESS_HEX_BYTES>","long_term_incentive":"<SOME_ETH_ADDRESS_HEX_BYTES>","initial_fee_policy":{"constant":xxxx,"coefficient":xxxx}}
"app_hash" is the initial application hash -- currently, it's computed as a hash of the initial rewards pool state and a root of a merkle tree of initial transaction IDs.
- initialize a Tendermint node:
$ tendermint init
If you previously initialized a Tendermint node, you may need to run before it:
$ tendermint unsafe_reset_all
- configure a Tendermint node:
One thing to change would be the change genesis.json
to have app_hash
and app_state
obtained in step 1. Also, make sure reusing the chain_id
we come up earlier, which should ends with two hex digits (e.g. test-chain-mafL4t-AA).
- run CRO ABCI process, e.g.:
$ chain-abci -g "<APP_HASH_HEX_BYTES>" -c <FULL_CHAIN_ID>
The string passed to -g
is the genesis app_hash
obtained in step 1 and configured in the previous step. The string passed to -c
is the full_chain_id
that ends with two hex digits (e.g. test-chain-mafL4t-AA).
If you need backtraces or logging, set the environment variables before it:
RUST_BACKTRACE=1 RUST_LOG=info
- run a Tendermint process: in a different terminal:
$ tendermint node
$ tendermint lite
See Tendermint RPC documentation: https://tendermint.com/rpc/#introduction
Currently, there's a rough command-line application in signer/app
for testing purposes.
Its workflow is the following:
-
Generate a new keypair:
signer address generate -n <NAME>
(you can view hex-encoded addresses of corresponding key withsigner address get -n <NAME>
) -
Generate a signed TX with:
$ signer-cli transaction generate -n <NAME> -c <CHAIN_ID>
Right now there is no concept of fee, you must spend the whole input in the output(s).
After entering all the required data, this will print out a hex-encoded TXID (blake2s hash) and a hex-encoded SCALE-serialized TX structure / content. You can decode it and transform it as necessary, e.g. into base64.
- You can then send a TX using the
broadcast_tx
Tendermint RPC command (e.g. JSONRPC over HTTP or websockets). For example, for the URI/HTTP option, it can look like this:
http://localhost:26657/broadcast_tx_sync?tx=0xa200a30081a200982018f318bc1844182918821848188a18a51835186118f51877189c031868186618f8188a185b18cb185d18b418da18a518db18d6183f18e2185018f200184701000181a20082009418431835186b18fe18ec011858183d18fe1878187e183d181f18a3181918ae06189c181e189801185002a10018aa0181820183820298201861189718f318a518bb184918ea00187205187318ad18b6184318cd182a1841183518dc1825181a0b18ac181d184418f718a118c418680018f701829820188718d90c186d183518ee189218410f186c189118d418c418d518c5184e189a189418f7185d181a1820182b18b1181e18e618b51018e3184c1851186d982018220d18b71859183718af187018b818c8185f18731893188618e0181918e918fc18b5185718c3188c182b188b185e1882184618d7189d187218f4183d181980
- Project Website
- Community chatrooms (non-technical): Discord Telegram
- Developer community chatroom (technical):