Using Spare Windows Machines for Chia Plotting

My Chianet farming/plotting node runs on an Intel NUC 10 Performance Kit NUC10I7FNH powered by Ubuntu. It’s a low-budget rig with a very favorable plots-per-day/price ratio.

As the Chianet is rapidly growing, filling your storage with plots as fast as possible is critical for improving the chances to earn coins. To increase the plotting throughput, I additionally started using my family member’s Windows PCs for plotting. As they have multicore CPUs, nobody notices any performance degradation when a Chia plotting process constantly runs in the background.

To get a reasonable speed, you’d need to equip the plotting machines with a NVMe SSD disk. The best option is to connect the disk directly to the M.2 connector on the motherboard. If you don’t have a free one, but have an unused PCIe slot, you can buy a PCIe to M.2 converter. Connecting the disk through an USB port is the last resort.

The following PowerShell script continuously starts a new plot as soon as the previous one completes:

while($true)
{
  & C:\Users\EnterYourUserNameHere\AppData\Local\chia-blockchain\app-1.1.5\resources\app.asar.unpacked\daemon/chia.exe plots create -k32 -n1 -tD:\plot -2D:\plot -dD:\farm -b3390 -u128 -r2 -a2552426002
}

The script plots in D:\plot and copies the finished plot to D:\farm.

I mounted the D drive on a 2TB NVMe SSD disk. The larger the disk, the more plots can you buffer until they get transferred onto the farming server.

Then, you can schedule the following PowerShell script to occasionally transfer finished plots to the farming server:

$server = "YourFarmingServer"
$user = "YourUserName"
$password = "YourPassword"
$farm_dir = "D:\farm"

$ErrorActionPreference = "Stop"

$now = (Get-Date)
$nowminus = (Get-Date).AddMinutes(-30)

ForEach ( $file in Get-ChildItem -Name -Path $farm_dir | Where-Object -FilterScript {($_.LastWriteTime -lt $nowminus)})
{
  $file
  $filePath = $farm_dir + $file
  $ftp = "ftp://" + $user + ":" + $password + "@" + $server + "/" + $file 
  $webclient = New-Object System.Net.WebClient
  $uri = New-Object System.Uri($ftp)
  $webclient.UploadFile($uri, $filePath)
  del $filePath
}

The script assumes that you configured ftp service on your farming server, and that you land straight into the target directory on the farming node after connecting (set local_root in /etc/vsftpd.conf). You’d need to replace the variables $server, $user, $password, $farm_dir with your values.

Last but not least, there are some security aspects I’d like to mention. I haven’t paid much attention to security because I run everything in my home network which is protected by firewalls. But you can harden the setup if the circumstances require. First of all, force encryption on the FTP service and connect with an SSL key instead of password. Mind not only would this increase the transfer time, but also the CPU consumption on both farming and plotting nodes. If you continue to use password based authentication, make sure that this script isn’t readable by everyone.

Thanks for sharing

Nenad Noveljic

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.