ruby test.rb
You can pass the following options to the run
or new
methods:
:rounds
: number of rounds to run (default: 100):difficulty
: difficulty level, in mean shares per block (default: 1,500,000):miner_percent
: percentage of total hashrate owned by target miner (default: 2):average_fees
: mean amount of fees, in BTC (default: 0):withholding_percent
: percentage of pool that will withhold a found block (default: 0):hopper_percent
: percentage of base pool size that joins for the first part of the round (defualt: 0):hop_out_at
: percentage of difficulty at which hoppers jump out (default: 43.5)
Prop
: Straight proportional payoutSMPPS
: Luke-Jr's Shared-Maximum Pay-per-ShareXPPS
: Like SMPPS, but without debt memory
If you want to know the average outcome after the simulation ends, simply pass an initialized simulation object to Estimator.new, and call run. To see the results, then call analyze:
Estimator.new(Prop.new, :runs => 1000).run.analyze
Any options besides :runs
passed to new
or run
will be passed on to the
simulation object's run
method.
To create your own payout scheme, subclass PoolSim
and implement the pay_out
method.
This method should, at a minimum, update the @honest_earnings
variable, which represents
the cumulative earnings of a single miner owning miner_percent
% of the pool hashrate.
If you have other variables you want to plot other than the defaults (Round, Reward, Shares, and Difficulty), you can declare them with
class CustomPool < PoolSim
plot :myvar1, :myvar2
def pay_out
@miner_earnings += ...
end
end
The Tabulator
class can print pretty tables for you:
headers = [:name, :age, :occupation]
bob = ['mario', 54, 'Plumber']
john = ['John Smith', 216, 'Philatelist']
Tabulator.new([bob, john], :headers => headers).render_columns
would render like this:
Name | Age | Occupation
-----------+-----+------------
mario | 54 | Plumber
John Smith | 216 | Philatelist
- Parameter sweeping
- Graphs
- Hashrate profiles