Melodot Farmer-client includes both unit tests and e2e tests, which can be executed locally or within a Docker container.
Ensure you have the necessary environment set up for Rust.
Run all unit tests using the following command:
make test
We need to compile two projects: the melodot node and the Farmer-client.
Known issue: Unable to compile under Mac environment, we will fix this issue later.
- Build the melodot node using the following command, this may take some time:
make build-default
- Compile the farmer-client using the following command:
make build-farmer
- Compile the light client and e2e tests:
make build-meloxt
To initiate the development network, use the command below:
make run-dev
Once you observe the following output, it indicates that the development network is up and running, and blocks are being produced normally:
2023-11-09 21:36:31 Melodot Node
2023-11-09 21:36:31 ✌️ version 0.0.1-1df3a1f033a
2023-11-09 21:36:31 ❤️ by DKLee <[email protected]>, 2017-2023
2023-11-09 21:36:31 📋 Chain specification: Development
2023-11-09 21:36:31 🏷 Node name: accessible-cobweb-6597
2023-11-09 21:36:31 👤 Role: AUTHORITY
2023-11-09 21:36:31 💾 Database: RocksDb at /tmp/substrateJ6MN0y/chains/dev/db/full
2023-11-09 21:36:31 ⛓ Native runtime: melodot-1 (melodot-1.tx1.au1)
2023-11-09 21:36:32 [0] 💸 generated 1 npos voters, 1 from validators and 0 nominators
2023-11-09 21:36:32 [0] 💸 generated 1 npos targets
2023-11-09 21:36:33 🔨 Initializing Genesis block/state (state: 0x2538…5e46, header-hash: 0xac37…e2d5)
2023-11-09 21:36:33 👴 Loading GRANDPA authority set from genesis on what appears to be first startup.
2023-11-09 21:36:34 👶 Creating empty BABE epoch changes on what appears to be first startup.
2023-11-09 21:36:34 Failed to register metrics: Duplicate metrics collector registration attempted
2023-11-09 21:36:34 Using default protocol ID "sup" because none is configured in the chain specs
2023-11-09 21:36:34 🏷 Local node identity is: 12D3KooWF8kNQjNivebHiCnTvkACt2SrNW6uEkJbyxWqzu1PAbVg
2023-11-09 21:36:34 🚀 Starting transaction pool listener.
2023-11-09 21:36:34 💻 Operating system: linux
2023-11-09 21:36:34 💻 CPU architecture: x86_64
2023-11-09 21:36:34 💻 Target environment: gnu
2023-11-09 21:36:34 💻 CPU: Intel(R) Xeon(R) Platinum
2023-11-09 21:36:34 💻 CPU cores: 4
2023-11-09 21:36:34 💻 Memory: 7283MB
2023-11-09 21:36:34 💻 Kernel: 5.15.0-79-generic
2023-11-09 21:36:34 💻 Linux distribution: Ubuntu 22.04.3 LTS
2023-11-09 21:36:34 💻 Virtual machine: yes
2023-11-09 21:36:34 📦 Highest known block at #0
2023-11-09 21:36:34 〽️ Prometheus exporter started at 127.0.0.1:9615
2023-11-09 21:36:34 Running JSON-RPC HTTP server: addr=127.0.0.1:9933, allowed origins=["*"]
2023-11-09 21:36:34 Running JSON-RPC WS server: addr=0.0.0.0:9944, allowed origins=["*"]
2023-11-09 21:36:34 👶 Starting BABE Authorship worker
2023-11-09 21:36:36 🙌 Starting consensus session on top of parent 0xac37c22f067cbea3a82a9952ed61a40a0a32eabb4a46fa96ebc230e63855e2d5
2023-11-09 21:36:36 🎁 Prepared block for proposing at 1 (0 ms) [hash: 0x94cbc9ee49438476b9291ed9ea4dd722201bff89aaa61c803a6a484e218e3c82; parent_hash: 0xac37…e2d5; extrinsics (1): [0x6d27…d03d]]
2023-11-09 21:36:36 🔖 Pre-sealed block for proposal at 1. Hash now 0x0b832715fa87a6e813606832ab364150830465fae6fd43f9b740763ba0eba75a, previously 0x94cbc9ee49438476b9291ed9ea4dd722201bff89aaa61c803a6a484e218e3c82.
2023-11-09 21:36:36 👶 New epoch 0 launching at block 0x0b83…a75a (block slot 283256166 >= start slot 283256166).
2023-11-09 21:36:36 👶 Next epoch starts at slot 283256766
2023-11-09 21:36:36 😴 Block 1 has no blob
2023-11-09 21:36:36 ✨ Imported #1 (0x0b83…a75a)
2023-11-09 21:36:38 Accepting new connection 1/100
2023-11-09 21:36:39 discovered: 12D3KooW9wv5DVBvtUv9fy46PCkEDo9K1jyXzPS3SKiBbhW4rfty /ip4/172.19.0.1/tcp/4418
2023-11-09 21:36:39 discovered: 12D3KooW9wv5DVBvtUv9fy46PCkEDo9K1jyXzPS3SKiBbhW4rfty /ip4/172.16.7.77/tcp/4418
2023-11-09 21:36:39 discovered: 12D3KooW9wv5DVBvtUv9fy46PCkEDo9K1jyXzPS3SKiBbhW4rfty /ip4/172.17.0.1/tcp/4418
2023-11-09 21:36:39 💤 Idle (0 peers), best: #1 (0x0b83…a75a), finalized #0 (0xac37…e2d5), ⬇ 0 ⬆ 0
2023-11-09 21:36:42 🙌 Starting consensus session on top of parent 0x0b832715fa87a6e813606832ab364150830465fae6fd43f9b740763ba0eba75a
2023-11-09 21:36:42 🎁 Prepared block for proposing at 2 (0 ms) [hash: 0x28b41376f2b51efd8def9083bffc3e5c5f98f15d266dfb1986172de9e09e26fc; parent_hash: 0x0b83…a75a; extrinsics (1): [0x57d3…a11a]]
2023-11-09 21:36:42 🔖 Pre-sealed block for proposal at 2. Hash now 0xb0134001cfed9449650f3c8c6af26230dd2d6ac682b06391b5ec4187c4e365ff, previously 0x28b41376f2b51efd8def9083bffc3e5c5f98f15d266dfb1986172de9e09e26fc.
2023-11-09 21:36:42 😴 Block 2 has no blob
2023-11-09 21:36:42 ✨ Imported #2 (0xb013…65ff)
2023-11-09 21:36:44 💤 Idle (0 peers), best: #2 (0xb013…65ff), finalized #0 (0xac37…e2d5), ⬇ 0 ⬆ 0
2023-11-09 21:36:48 🙌 Starting consensus session on top of parent 0xb0134001cfed9449650f3c8c6af26230dd2d6ac682b06391b5ec4187c4e365ff
2023-11-09 21:36:48 🎁 Prepared block for proposing at 3 (0 ms) [hash: 0x73880cfd4f67132321ac78829d30389869c233e8ba528c6b19627ef4b7db8c48; parent_hash: 0xb013…65ff; extrinsics (1): [0xb35b…16f5]]
Open a new terminal and execute the following command to run the farmer-client:
make run-farmer
Once you observe the following output, it indicates that the farmer-client is up and running:
INFO 🚀 Melodot Farmer Client starting up
INFO creating instance on iface 172.16.7.77
INFO creating instance on iface 172.19.0.1
INFO creating instance on iface 172.17.0.1
INFO 🌐 Subscribed to best block headers
INFO ⚓ Received best block header #0
INFO ⏭️ No data in block #0
INFO discovered: 12D3KooWDA8b1nVXeU22coo6cy217DUucgF5zcTRfa7DqXRnSE9L /ip4/172.16.7.77/tcp/4417
INFO discovered: 12D3KooWDA8b1nVXeU22coo6cy217DUucgF5zcTRfa7DqXRnSE9L /ip4/172.17.0.1/tcp/4417
INFO discovered: 12D3KooWDA8b1nVXeU22coo6cy217DUucgF5zcTRfa7DqXRnSE9L /ip4/172.19.0.1/tcp/4417
INFO ⚓ Received best block header #1
INFO ⏭️ No data in block #1
If you encounter a network error, it may be because the melodot-node has not yet initialized the network. You just need to wait a few seconds and then run the farmer-client again.
Ensure the test network and farmer-client are running. Open a new terminal and execute the e2e tests using the following command:
make e2e
This will run the end-to-end (e2e) tests for melodot-node, including data upload. You will see the following output:
Running example: header
Compiling melodot-runtime v0.0.1 (/root/melodot/runtime)
Compiling melo-das-rpc v0.0.1 (/root/melodot/crates/das-rpc)
Compiling meloxt v0.0.1 (/root/melodot/crates/meloxt)
Finished release [optimized] target(s) in 3m 24s
Running `target/release/examples/header`
INFO 🌟 Start get header
INFO ✅ Success Current block_num: 35
INFO 💯 All success : Header
Running example: register_app
Compiling meloxt v0.0.1 (/root/melodot/crates/meloxt)
Finished release [optimized] target(s) in 19.50s
Running `target/release/examples/register_app`
INFO 🌟 Start register app
INFO ✅ Success Application created, block hash: 0x8032…2426
INFO 💯 All success : Register app
Running example: submit_blob_tx
Compiling meloxt v0.0.1 (/root/melodot/crates/meloxt)
Finished release [optimized] target(s) in 15.96s
Running `target/release/examples/submit_blob_tx`
INFO 🌟 Start submit blob tx
INFO ✅ Success: Commitments bytes: [171, 26, 161, 31, 215, 245, 79, 117, 106, 34, 232, 99, 28, 0, 229, 164, 6, 136, 85, 40, 22, 77, 143, 120, 175, 238, 104, 50, 7, 50, 218, 226, 191, 226, 69, 52, 179, 38, 228, 236, 179, 122, 101, 10, 130, 105, 126, 189]
INFO ✅ Success: Data submited, tx_hash: 0x6db80e4e172677cbab41c5891035b8bdef538a7b05d7f24f2e0b43197dc5bcc8
INFO ⏳ Data not verified yet, current block number: 45
INFO ⏳ Data not verified yet, current block number: 46
INFO ✅ Success Data should have been verified by the validators at: 47
INFO 💯 All success : Submit blob tx
Running example: submit_data
Compiling meloxt v0.0.1 (/root/melodot/crates/meloxt)
Finished release [optimized] target(s) in 15.55s
Running `target/release/examples/submit_data`
INFO 🌟 Start submit data
INFO ✅ Success: Data submited, block hash: 0x4c49…41fe
INFO 💯 All success : Submit data
Running example: submit_invalid_blob_tx
Compiling meloxt v0.0.1 (/root/melodot/crates/meloxt)
Finished release [optimized] target(s) in 14.24s
Running `target/release/examples/submit_invalid_blob_tx`
INFO 🌟 Start submit invalid blob tx
INFO ✅ Success: Commitments bytes: [166, 182, 73, 97, 133, 21, 86, 237, 128, 28, 102, 130, 250, 210, 22, 184, 0, 123, 104, 160, 30, 122, 92, 38, 197, 190, 67, 98, 134, 77, 243, 183, 214, 132, 242, 125, 137, 179, 229, 153, 160, 233, 193, 101, 224, 104, 102, 143]
INFO ✅ Success: Submit InvalidExtrinsic, tx failed with code: 10002
INFO ✅ Success: Submit InvalidBytesLen, tx failed with code: 10005
INFO ✅ Success: Submit invalid commitments, tx failed: "Data verification failed. Please check your data and try again."
INFO ✅ Success: Submit invalid proofs, tx failed: "Data verification failed. Please check your data and try again."
INFO 💯 All success : Submit invalid blob tx
At this point, the farmer-client should receive the data and save it locally. If successful, you should see the following output in the farmer-client:
INFO 🚩 Data rows num: 1
INFO 💾 Data saved successfully
INFO ⚓ Received best block header #48
INFO ⏭️ No data in block #48
INFO ⚓ Received best block header #49
INFO ⏭️ No data in block #49
INFO ⚓ Received best block header #50
INFO ⏭️ No data in block #50
INFO ⚓ Received best block header #51
INFO 🚩 Data rows num: 1
INFO 💾 Data saved successfully
INFO ⚓ Received best block header #52
INFO ⏭️ No data in block #52
INFO ⚓ Received best block header #53
INFO ⏭️ No data in block #53
INFO ⚓ Received best block header #54
INFO ⏭️ No data in block #54
INFO ⚓ Received best block header #55
INFO ⏭️ No data in block #55
INFO ⚓ Received best block header #56
INFO 🚩 Data rows num: 1
INFO 💾 Data saved successfully
First, install Docker and Docker Compose.
You need to run the following commands in the root directory of melodot
:
./scripts/docker_run.sh
This command will build a Docker image and start a Docker container. Within the container, you can carry out the same steps as in the previous section for unit testing, building, and running the development network.
You can then open a new Docker terminal with the following command, running the farmer-client.
./scripts/docker_run.sh new
Finally, open another new Docker terminal to run the e2e tests:
make run-farmer
Then, open another new Docker terminal to run the e2e tests:
make e2e