github.com/avahowell/sia@v0.5.1-beta.0.20160524050156-83dcc3d37c94/modules/host/consts.go (about)

     1  package host
     2  
     3  import (
     4  	"github.com/NebulousLabs/Sia/build"
     5  	"github.com/NebulousLabs/Sia/modules"
     6  	"github.com/NebulousLabs/Sia/types"
     7  
     8  	"time"
     9  )
    10  
    11  const (
    12  	// defaultMaxDuration defines the maximum number of blocks into the future
    13  	// that the host will accept for the duration of an incoming file contract
    14  	// obligation. 6 months is chosen because hosts are expected to be
    15  	// long-term entities, and because we want to have a set of hosts that
    16  	// support 6 month contracts when Sia leaves beta.
    17  	defaultMaxDuration = 144 * 30 * 6 // 6 months.
    18  
    19  	// fileContractNegotiationTimeout indicates the amount of time that a
    20  	// renter has to negotiate a file contract with the host. A timeout is
    21  	// necessary to limit the impact of DoS attacks.
    22  	fileContractNegotiationTimeout = 120 * time.Second
    23  
    24  	// iteratedConnectionTime is the amount of time that is allowed to pass
    25  	// before the host will stop accepting new iterations on an iterated
    26  	// connection.
    27  	iteratedConnectionTime = 1200 * time.Second
    28  
    29  	// resubmissionTimeout defines the number of blocks that a host will wait
    30  	// before attempting to resubmit a transaction to the blockchain.
    31  	// Typically, this transaction will contain either a file contract, a file
    32  	// contract revision, or a storage proof.
    33  	resubmissionTimeout = 3
    34  )
    35  
    36  var (
    37  	// defaultCollateral defines the amount of money that the host puts up as
    38  	// collateral per-byte by default. The collateral should be considered as
    39  	// an absolute instead of as a percentage, because low prices result in
    40  	// collaterals which may be significant by percentage, but insignificant
    41  	// overall. A default of 25 KS / TB / Month has been chosen, which is 2.5x
    42  	// the default price for storage. The host is expected to put up a
    43  	// significant amount of collateral as a commitment to faithfulness,
    44  	// because this guarantees that the incentives are aligned for the host to
    45  	// keep the data even if the price of siacoin fluctuates, the price of raw
    46  	// storage fluctuates, or the host realizes that there is unexpected
    47  	// opportunity cost in being a host.
    48  	defaultCollateral = types.SiacoinPrecision.Mul64(25e3).Div(modules.BlockBytesPerMonthTerabyte) // 25 KS / TB / Month
    49  
    50  	// defaultCollateralBudget defines the maximum number of siacoins that the
    51  	// host is going to allocate towards collateral. The number has been chosen
    52  	// as a number that is large, but not so large that someone would be
    53  	// furious for losing access to it for a few weeks.
    54  	defaultCollateralBudget = types.SiacoinPrecision.Mul64(5e6)
    55  
    56  	// defaultContractPrice defines the default price of creating a contract
    57  	// with the host. The default is set to 30 siacoins, which the file
    58  	// contract revision can have 15 siacoins put towards it, and the storage
    59  	// proof can have 15 siacoins put towards it.
    60  	defaultContractPrice = types.SiacoinPrecision.Mul64(30) // 30 siacoins
    61  
    62  	// defaultDownloadBandwidthPrice defines the default price of upload
    63  	// bandwidth. The default is set to 10 siacoins per gigabyte, because
    64  	// download bandwidth is expected to be plentiful but also in-demand.
    65  	defaultDownloadBandwidthPrice = types.SiacoinPrecision.Mul64(10e3).Div(modules.BytesPerTerabyte) // 10k SC / TB
    66  
    67  	// defaultMaxDownloadBatchSize defines the maximum number of bytes that the
    68  	// host will allow to be requested by a single download request. 17 MiB has
    69  	// been chosen because it's 4 full sectors plus some wiggle room. 17 MiB is
    70  	// a conservative default, most hosts will be fine with a number like 65
    71  	// MiB.
    72  	defaultMaxDownloadBatchSize = 17 * (1 << 20)
    73  
    74  	// defaultMaxReviseBatchSize defines the maximum number of bytes that the
    75  	// host will allow to be sent during a single batch update in a revision
    76  	// RPC. 17 MiB has been chosen because it's four full sectors, plus some
    77  	// wiggle room for the extra data or a few delete operations. The whole
    78  	// batch will be held in memory, so the batch size should only be increased
    79  	// substantially if the host has a lot of memory. Additionally, the whole
    80  	// batch is sent in one network connection. Additionally, the renter can
    81  	// steal funds for upload bandwidth all the way out to the size of a batch.
    82  	// 17 MiB is a conservative default, most hosts are likely to be just fine
    83  	// with a number like 65 MiB.
    84  	defaultMaxReviseBatchSize = 17 * (1 << 20)
    85  
    86  	// defaultMaxCollateral defines the maximum amount of collateral that the
    87  	// host is comfortable putting into a single file contract. 10e3 is a
    88  	// relatively small file contract, but millions of siacoins could be locked
    89  	// away by only a few hundred file contracts. As the ecosystem matures, it
    90  	// is expected that the safe default for this value will increase quite a
    91  	// bit.
    92  	defaultMaxCollateral = types.SiacoinPrecision.Mul64(250e3)
    93  
    94  	// defaultStoragePrice defines the starting price for hosts selling
    95  	// storage. We try to match a number that is both reasonably profitable and
    96  	// reasonably competitive.
    97  	defaultStoragePrice = types.SiacoinPrecision.Mul64(10e3).Div(modules.BlockBytesPerMonthTerabyte) // 10k SC / TB / Month
    98  
    99  	// defaultUploadBandwidthPrice defines the default price of upload
   100  	// bandwidth. The default is set to 1 siacoin per GB, because the host is
   101  	// presumed to have a large amount of downstream bandwidth. Furthermore,
   102  	// the host is typically only downloading data if it is planning to store
   103  	// the data, meaning that the host serves to profit from accepting the
   104  	// data.
   105  	defaultUploadBandwidthPrice = types.SiacoinPrecision.Mul64(1e3).Div(modules.BytesPerTerabyte) // 1 SC / TB
   106  
   107  	// defaultWindowSize is the size of the proof of storage window requested
   108  	// by the host. The host will not delete any obligations until the window
   109  	// has closed and buried under several confirmations. For release builds,
   110  	// the default is set to 144 blocks, or about 1 day. This gives the host
   111  	// flexibility to experience downtime without losing file contracts. The
   112  	// optimal default, especially as the network matures, is probably closer
   113  	// to 36 blocks. An experienced or high powered host should not be
   114  	// frustrated by lost coins due to long periods of downtime.
   115  	defaultWindowSize = func() types.BlockHeight {
   116  		if build.Release == "dev" {
   117  			return 36 // 3.6 minutes.
   118  		}
   119  		if build.Release == "standard" {
   120  			return 144 // 1 day.
   121  		}
   122  		if build.Release == "testing" {
   123  			return 5 // 5 seconds.
   124  		}
   125  		panic("unrecognized release constant in host - defaultWindowSize")
   126  	}()
   127  
   128  	// maximumLockedStorageObligations sets the maximum number of storage
   129  	// obligations that are allowed to be locked at a time. The map uses an
   130  	// in-memory lock, but also a locked storage obligation could be reading a
   131  	// whole sector into memory, which could use a bunch of system resources.
   132  	maximumLockedStorageObligations = func() uint64 {
   133  		if build.Release == "dev" {
   134  			return 20
   135  		}
   136  		if build.Release == "standard" {
   137  			return 100
   138  		}
   139  		if build.Release == "testing" {
   140  			return 5
   141  		}
   142  		panic("unrecognized release constant in host - maximumLockedStorageObligations")
   143  	}()
   144  
   145  	// revisionSubmissionBuffer describes the number of blocks ahead of time
   146  	// that the host will submit a file contract revision. The host will not
   147  	// accept any more revisions once inside the submission buffer.
   148  	revisionSubmissionBuffer = func() types.BlockHeight {
   149  		if build.Release == "dev" {
   150  			return 20 // About 2 minutes
   151  		}
   152  		if build.Release == "standard" {
   153  			return 288 // 2 days.
   154  		}
   155  		if build.Release == "testing" {
   156  			return 4
   157  		}
   158  		panic("unrecognized release constant in host - revision submission buffer")
   159  	}()
   160  )
   161  
   162  // All of the following variables define the names of buckets used by the host
   163  // in the database.
   164  var (
   165  	// bucketActionItems maps a blockchain height to a list of storage
   166  	// obligations that need to be managed in some way at that height. The
   167  	// height is stored as a big endian uint64, which means that bolt will
   168  	// store the heights sorted in numerical order. The action item itself is
   169  	// an array of file contract ids. The host is able to contextually figure
   170  	// out what the necessary actions for that item are based on the file
   171  	// contract id and the associated storage obligation that can be retrieved
   172  	// using the id.
   173  	bucketActionItems = []byte("BucketActionItems")
   174  
   175  	// bucketStorageObligations contains a set of serialized
   176  	// 'storageObligations' sorted by their file contract id.
   177  	bucketStorageObligations = []byte("BucketStorageObligations")
   178  )
   179  
   180  // init runs a series of sanity checks to verify that the constants have sane
   181  // values.
   182  func init() {
   183  	// The revision submission buffer should be greater than the resubmission
   184  	// timeout, because there should be time to perform resubmission if the
   185  	// first attempt to submit the revision fails.
   186  	if revisionSubmissionBuffer < resubmissionTimeout {
   187  		build.Critical("revision submission buffer needs to be larger than or equal to the resubmission timeout")
   188  	}
   189  }