--axon.port INTEGER--blacklist.allow_non_registered BOOLEAN--blacklist.force_validator_permit BOOLEAN--blacklist.validator_min_stake INTEGER--logging.debug--logging.info--logging.trace--netuid INTEGER--neuron.device TEXT--neuron.dont_save_events BOOLEAN--neuron.epoch_length INTEGER--neuron.events_retention_size TEXT--neuron.name TEXT--neuron.timeout INTEGER--neuron.vpermit_tao_limit INTEGER--wallet.hotkey TEXT--wallet.name TEXT--axon.port INTEGERThe external port for the Axon component. This port is used to communicate to other neurons.
Example:
// miner.config.js
module.exports = {
apps: [
{
name: "miner",
interpreter: "python3",
script: "./neurons/miner.py",
args: "--axon.port 8091",
env: {
PYTHONPATH: ".",
},
},
],
};
Alternatively, you can add the args directly to the command:
pm2 start miner.config.js -- --axon.port 8091
--blacklist.allow_non_registered BOOLEANIf set, miners will accept queries from non-registered entities.
🚨 WARNING: Make sure you know what you are doing when setting this option.
Default: false
Example:
// miner.config.js
module.exports = {
apps: [
{
name: "miner",
interpreter: "python3",
script: "./neurons/miner.py",
args: "--blacklist.allow_non_registered true",
env: {
PYTHONPATH: ".",
},
},
],
};
Alternatively, you can add the args directly to the command:
pm2 start miner.config.js -- --blacklist.allow_non_registered true
--blacklist.force_validator_permit BOOLEANIf set, we will force incoming requests to have a permit.
Default: false
Example:
// miner.config.js
module.exports = {
apps: [
{
name: "miner",
interpreter: "python3",
script: "./neurons/miner.py",
args: "--blacklist.force_validator_permit true",
env: {
PYTHONPATH: ".",
},
},
],
};
Alternatively, you can add the args directly to the command:
pm2 start miner.config.js -- --blacklist.force_validator_permit true
--blacklist.validator_min_stake INTEGERMinimum validator stake to accept forward requests from as a miner, (e.g. 1000).
Default: 1000
Example:
// miner.config.js
module.exports = {
apps: [
{
name: "miner",
interpreter: "python3",
script: "./neurons/miner.py",
args: "--blacklist.validator_min_stake 1000",
env: {
PYTHONPATH: ".",
},
},
],
};
Alternatively, you can add the args directly to the command:
pm2 start miner.config.js -- --blacklist.validator_min_stake 1000
--logging.debugTurn on bittensor debugging information.
Example:
// miner.config.js
module.exports = {
apps: [
{
name: "miner",
interpreter: "python3",
script: "./neurons/miner.py",
args: "--logging.debug",
env: {
PYTHONPATH: ".",
},
},
],
};
Alternatively, you can add the args directly to the command:
pm2 start miner.config.js -- --logging.debug
--logging.infoTurn on bittensor info level information.
Example:
// miner.config.js
module.exports = {
apps: [
{
name: "miner",
interpreter: "python3",
script: "./neurons/miner.py",
args: "--logging.info",
env: {
PYTHONPATH: ".",
},
},
],
};
Alternatively, you can add the args directly to the command:
pm2 start miner.config.js -- --logging.info
--logging.traceTurn on bittensor trace level information.
Example:
// miner.config.js
module.exports = {
apps: [
{
name: "miner",
interpreter: "python3",
script: "./neurons/miner.py",
args: "--logging.trace",
env: {
PYTHONPATH: ".",
},
},
],
};
Alternatively, you can add the args directly to the command:
pm2 start miner.config.js -- --logging.trace
--netuid INTEGERThe netuid (network unique identifier) of the subnet within the root network, (e.g. 247).
Example:
// miner.config.js
module.exports = {
apps: [
{
name: "miner",
interpreter: "python3",
script: "./neurons/miner.py",
args: "--netuid 247",
env: {
PYTHONPATH: ".",
},
},
],
};
Alternatively, you can add the args directly to the command:
pm2 start miner.config.js -- --netuid 247
--neuron.device TEXTThe name of the device to run on.
Example:
// miner.config.js
module.exports = {
apps: [
{
name: "miner",
interpreter: "python3",
script: "./neurons/miner.py",
args: "--neuron.device cuda",
env: {
PYTHONPATH: ".",
},
},
],
};
Alternatively, you can add the args directly to the command:
pm2 start miner.config.js -- --neuron.device cuda
--neuron.dont_save_events BOOLEANWhether events are saved to a log file.
Default: false
Example:
// miner.config.js
module.exports = {
apps: [
{
name: "miner",
interpreter: "python3",
script: "./neurons/miner.py",
args: "--neuron.dont_save_events true",
env: {
PYTHONPATH: ".",
},
},
],
};
Alternatively, you can add the args directly to the command:
pm2 start miner.config.js -- --neuron.dont_save_events true
--neuron.epoch_length INTEGERThe default epoch length (how often we set weights, measured in 12 second blocks), (e.g. 100).
Example:
// miner.config.js
module.exports = {
apps: [
{
name: "miner",
interpreter: "python3",
script: "./neurons/miner.py",
args: "--neuron.epoch_length 100",
env: {
PYTHONPATH: ".",
},
},
],
};
Alternatively, you can add the args directly to the command:
pm2 start miner.config.js -- --neuron.epoch_length 100
--neuron.events_retention_size TEXTThe events retention size.
Default: 2147483648 (2GB)
Example:
// miner.config.js
module.exports = {
apps: [
{
name: "miner",
interpreter: "python3",
script: "./neurons/miner.py",
args: "--neuron.events_retention_size 2147483648",
env: {
PYTHONPATH: ".",
},
},
],
};
Alternatively, you can add the args directly to the command:
pm2 start miner.config.js -- --neuron.events_retention_size 2147483648
--neuron.name TEXTTrials for this neuron go in neuron.root / (wallet_cold - wallet_hot) / neuron.name.
Default: miner
Example:
// miner.config.js
module.exports = {
apps: [
{
name: "miner",
interpreter: "python3",
script: "./neurons/miner.py",
args: "--neuron.name miner",
env: {
PYTHONPATH: ".",
},
},
],
};
Alternatively, you can add the args directly to the command:
pm2 start miner.config.js -- --neuron.name miner
--neuron.timeout INTEGERThe maximum timeout in seconds of the miner neuron response, (e.g. 120).
Default: -
Example:
// miner.config.js
module.exports = {
apps: [
{
name: "miner",
interpreter: "python3",
script: "./neurons/miner.py",
args: "--neuron.timeout 120",
env: {
PYTHONPATH: ".",
},
},
],
};
Alternatively, you can add the args directly to the command:
pm2 start miner.config.js -- --neuron.timeout 120
--neuron.vpermit_tao_limit INTEGERThe maximum number of TAO allowed that is allowed for the validator to process miner response, (e.g. 1000).
Default: 4096
Example:
// miner.config.js
module.exports = {
apps: [
{
name: "miner",
interpreter: "python3",
script: "./neurons/miner.py",
args: "--neuron.vpermit_tao_limit 1000",
env: {
PYTHONPATH: ".",
},
},
],
};
Alternatively, you can add the args directly to the command:
pm2 start miner.config.js -- --neuron.vpermit_tao_limit 1000
--wallet.hotkey TEXTThe hotkey of the wallet.
Example:
// miner.config.js
module.exports = {
apps: [
{
name: "miner",
interpreter: "python3",
script: "./neurons/miner.py",
args: "--wallet.hotkey default",
env: {
PYTHONPATH: ".",
},
},
],
};
Alternatively, you can add the args directly to the command:
pm2 start miner.config.js -- --wallet.hotkey default
--wallet.name TEXTThe name of the wallet to use.
Example:
// miner.config.js
module.exports = {
apps: [
{
name: "miner",
interpreter: "python3",
script: "./neurons/miner.py",
args: "--wallet.name miner",
env: {
PYTHONPATH: ".",
},
},
],
};
Alternatively, you can add the args directly to the command:
pm2 start miner.config.js -- --wallet.name miner
--wandb.enabled BOOLEANBoolean toggle for wandb integration.
Default: false
Example:
// miner.config.js
module.exports = {
apps: [
{
name: "miner",
interpreter: "python3",
script: "./neurons/miner.py",
args: "--wandb.enabled true",
env: {
PYTHONPATH: ".",
},
},
],
};
Alternatively, you can add the args directly to the command:
pm2 start miner.config.js -- --wandb.enabled true
--wandb.entity TEXTThe username or team name where you want to send W&B runs.
Default: opentensor-dev
Example:
// miner.config.js
module.exports = {
apps: [
{
name: "miner",
interpreter: "python3",
script: "./neurons/miner.py",
args: "--wandb.entity opentensor-dev",
env: {
PYTHONPATH: ".",
},
},
],
};
Alternatively, you can add the args directly to the command:
pm2 start miner.config.js -- --wandb.entity opentensor-dev
--wandb.project_name TEXTThe name of the project where W&B runs.
Default: template-miners
Example:
// miner.config.js
module.exports = {
apps: [
{
name: "miner",
interpreter: "python3",
script: "./neurons/miner.py",
args: "--wandb.project_name template-miners",
env: {
PYTHONPATH: ".",
},
},
],
};
Alternatively, you can add the args directly to the command:
pm2 start miner.config.js -- --wandb.project_name template-miners
Visit the Synth Miner Dashboard: https://miners.synthdata.co.
Assuming your setup is correct, and you’re submitting predictions, it takes approximately 25–27 hours for your first score to appear. This is because the CRPS is calculated based on the actual price 24 hours after the prediction.
{"validated":false,"reason":"Number of time points is incorrect: expected 289, got 288","response_time":"4.07"}?It means your submission has the wrong number of time points. You should be submitting exactly 289 points for that prompt.
Your miner will receive a CRPS score of -1 if the prediction is not in the correct format.
A prediction is considered valid if it meets all the following conditions:
expected_time_points = (time_length / time_increment) + 1
The expected format is as follows:
[
start_timestamp, time_interval,
[path1_price_t0, path1_price_t1, path1_price_t2, ...], [path2_price_t0, path2_price_t1, path2_price_t2, ...],
...
]
An example of a valid response would be:
[
1760084861, 300,
[104856.23, 104972.01, 105354.9, ...], [104856.23, 104724.54, 104886, ...], [104856.23, 104900.12, 104950.45, ...]
...
]
where
Price format is incorrect: too many digitsYou can find the validation function here:
And an example of the prompt parameters here:
You can test your prediction format using this miner script:
python synth/miner/run.py
Expected output:
start_time 2025-11-10T13:29:00+00:00
CORRECT
Each asset has its own prompts and is scored separately: for every asset/prompt pair, the validator computes a CRPS-based prompt_score_v3 over time. These per-asset scores are then combined into a single smoothed score using a time-based moving average with asset-specific coefficients (weights). Assets with higher coefficients contribute more to the final smoothed score than lower-weighted assets.
Miner reward weights are determined by a softmax function over a smoothed average of your CRPS scores over the past 10 days, using a 5-day half-life. This is subject to future change.
Synth regularly publishes detailed miner performance reviews highlighting the strategies of top-performing miners. These reviews can help you optimize your own models.
Explore them here: https://mirror.xyz/synthdata.eth
If you’re using the same model per asset, no — rewards will be the same. If you’re using different models, then yes, it’s encouraged to experiment and find what works best.
If you miss a prompt or submit in an incorrect format, your prompt score will be penalized—set to the 90th percentile of all prompt scores, and your CRPS will be -1.
If you make the best prediction, your prompt score will be 0, and your CRPS will also be at its minimum of 0, meaning your prediction perfectly matched the realized price.
The smoothed score is calculated as the moving average of your prompt scores over time.
These rules apply across all assets.
Trust is computed based on the subnet’s scoring system, outlined here: https://docs.bittensor.com/emissions#trust
It aggregates individual miner scores into a consensus-based weighting system, which determines reward distribution based on prediction quality.
Each prompt contains a start_time, which acts as the deadline for your response. You’ll always have at least 2 minutes from when the prompt is sent. We recommend submitting your response within 40 seconds.
Yes. The testnet UID is 247, and it functions identically to mainnet.
Modify this function:
Take into account all prompt parameters except sigma, which you may ignore.
| Command | Description |
|---|---|
pm2 stop miner |
Stops the miner. |
pm2 logs miner --lines 100 |
View the logs of the miner. |
ModuleNotFoundError: No module named 'simulation'This error is due to Python unable to locate the local Python modules. To avoid this error, ensure you have created and activate the Python virtual environment from the project root and ensure the PYTHONPATH is present in the <miner|validator>.config.js file and is pointing to the project root.
An example of a config file should be:
// miner.config.js
module.exports = {
apps: [
{
name: "miner",
interpreter: "python3",
script: "./neurons/miner.py",
args: "--netuid 247 --logging.debug --logging.trace --subtensor.network test --wallet.name miner --wallet.hotkey default --axon.port 8091",
env: {
PYTHONPATH: ".",
},
},
],
};
As you can see, we are setting the PYTHONPATH environment variable that will be injected when we run pm2 start miner.