本文整理匯總了Golang中github.com/NebulousLabs/Sia/types.NewCurrency64函數的典型用法代碼示例。如果您正苦於以下問題:Golang NewCurrency64函數的具體用法?Golang NewCurrency64怎麽用?Golang NewCurrency64使用的例子?那麽, 這裏精選的函數代碼示例或許可以為您提供幫助。
在下文中一共展示了NewCurrency64函數的15個代碼示例,這些例子默認根據受歡迎程度排序。您可以為喜歡或者感覺有用的代碼點讚,您的評價將有助於係統推薦出更棒的Golang代碼示例。
示例1: createContractTransaction
// createContractTransaction takes contract terms and a merkle root and uses
// them to build a transaction containing a file contract that satisfies the
// terms, including providing an input balance. The transaction does not get
// signed.
func (r *Renter) createContractTransaction(terms modules.ContractTerms, merkleRoot crypto.Hash) (txn types.Transaction, txnBuilder modules.TransactionBuilder, err error) {
// Get the payout as set by the missed proofs, and the client fund as determined by the terms.
sizeCurrency := types.NewCurrency64(terms.FileSize)
durationCurrency := types.NewCurrency64(uint64(terms.Duration))
clientCost := terms.Price.Mul(sizeCurrency).Mul(durationCurrency)
hostCollateral := terms.Collateral.Mul(sizeCurrency).Mul(durationCurrency)
payout := clientCost.Add(hostCollateral)
// Fill out the contract.
contract := types.FileContract{
FileMerkleRoot: merkleRoot,
FileSize: terms.FileSize,
WindowStart: terms.DurationStart + terms.Duration,
WindowEnd: terms.DurationStart + terms.Duration + terms.WindowSize,
Payout: payout,
ValidProofOutputs: terms.ValidProofOutputs,
MissedProofOutputs: terms.MissedProofOutputs,
}
// Create the transaction.
txnBuilder = r.wallet.RegisterTransaction(txn, nil)
err = txnBuilder.FundSiacoins(clientCost)
if err != nil {
return
}
txnBuilder.AddFileContract(contract)
txn, _ = txnBuilder.View()
return
}
示例2: StoragePriceToConsensus
// StoragePriceToConsensus converts a human storage price, having the unit
// 'Siacoins Per Month Per Terabyte', to a consensus storage price, having the
// unit 'Hastings Per Block Per Byte'.
func StoragePriceToConsensus(siacoinsMonthTB uint64) (hastingsBlockByte types.Currency) {
// Perform multiplication first to preserve precision.
hastingsMonthTB := types.NewCurrency64(siacoinsMonthTB).Mul(types.SiacoinPrecision)
hastingsBlockTB := hastingsMonthTB.Div(types.NewCurrency64(4320))
hastingsBlockByte = hastingsBlockTB.Div(types.NewCurrency64(1e12))
return hastingsBlockByte
}
示例3: TestApplySiacoinOutputs
// TestApplySiacoinOutputs probes the applySiacoinOutput method of the
// consensus set.
func TestApplySiacoinOutputs(t *testing.T) {
if testing.Short() {
t.SkipNow()
}
cst, err := createConsensusSetTester("TestApplySiacoinOutputs")
if err != nil {
t.Fatal(err)
}
// Create a block node to use with application.
bn := new(blockNode)
// Apply a transaction with a single siacoin output.
txn := types.Transaction{
SiacoinOutputs: []types.SiacoinOutput{{}},
}
cst.cs.applySiacoinOutputs(bn, txn)
scoid := txn.SiacoinOutputID(0)
_, exists := cst.cs.siacoinOutputs[scoid]
if !exists {
t.Error("Failed to create siacoin output")
}
if len(cst.cs.siacoinOutputs) != 3 { // 3 because createConsensusSetTester has 2 initially.
t.Error("siacoin outputs not correctly updated")
}
if len(bn.siacoinOutputDiffs) != 1 {
t.Error("block node was not updated for single element transaction")
}
if bn.siacoinOutputDiffs[0].Direction != modules.DiffApply {
t.Error("wrong diff direction applied when creating a siacoin output")
}
if bn.siacoinOutputDiffs[0].ID != scoid {
t.Error("wrong id used when creating a siacoin output")
}
// Apply a transaction with 2 siacoin outputs.
txn = types.Transaction{
SiacoinOutputs: []types.SiacoinOutput{
{Value: types.NewCurrency64(1)},
{Value: types.NewCurrency64(2)},
},
}
cst.cs.applySiacoinOutputs(bn, txn)
scoid0 := txn.SiacoinOutputID(0)
scoid1 := txn.SiacoinOutputID(1)
_, exists = cst.cs.siacoinOutputs[scoid0]
if !exists {
t.Error("Failed to create siacoin output")
}
_, exists = cst.cs.siacoinOutputs[scoid1]
if !exists {
t.Error("Failed to create siacoin output")
}
if len(cst.cs.siacoinOutputs) != 5 { // 5 because createConsensusSetTester has 2 initially.
t.Error("siacoin outputs not correctly updated")
}
if len(bn.siacoinOutputDiffs) != 3 {
t.Error("block node was not updated correctly")
}
}
示例4: TestWeightedList
// TestWeightedList inserts and removes nodes in a semi-random manner and
// verifies that the tree stays consistent through the adjustments.
func TestWeightedList(t *testing.T) {
// Create a hostdb and 3 equal entries to insert.
hdbt := newHDBTester("TestWeightedList", t)
// Create a bunch of host entries of equal weight.
firstInsertions := 64
for i := 0; i < firstInsertions; i++ {
entry := hostEntry{
HostSettings: modules.HostSettings{IPAddress: fakeAddr(uint8(i))},
weight: types.NewCurrency64(10),
}
hdbt.hostdb.insertNode(&entry)
}
err := hdbt.uniformTreeVerification(firstInsertions)
if err != nil {
t.Error(err)
}
// Remove a few hosts and check that the tree is still in order.
removals := 12
// Keep a map of what we've removed so far.
removedMap := make(map[uint8]struct{})
for i := 0; i < removals; i++ {
// Try numbers until we roll a number that's not been removed yet.
var randInt uint8
for {
randBig, err := rand.Int(rand.Reader, big.NewInt(int64(firstInsertions)))
if err != nil {
t.Fatal(err)
}
randInt = uint8(randBig.Int64())
_, exists := removedMap[randInt]
if !exists {
break
}
}
// Remove the entry and add it to the list of removed entries
err := hdbt.hostdb.RemoveHost(fakeAddr(randInt))
if err != nil {
t.Fatal(err)
}
removedMap[randInt] = struct{}{}
}
err = hdbt.uniformTreeVerification(firstInsertions - removals)
if err != nil {
t.Error(err)
}
// Do some more insertions.
secondInsertions := 64
for i := firstInsertions; i < firstInsertions+secondInsertions; i++ {
entry := hostEntry{
HostSettings: modules.HostSettings{IPAddress: fakeAddr(uint8(i))},
weight: types.NewCurrency64(10),
}
hdbt.hostdb.insertNode(&entry)
}
hdbt.uniformTreeVerification(firstInsertions - removals + secondInsertions)
}
示例5: TestActiveHosts
// TestActiveHosts tests the ActiveHosts method.
func TestActiveHosts(t *testing.T) {
hdb := bareHostDB()
// empty
if hosts := hdb.ActiveHosts(); len(hosts) != 0 {
t.Errorf("wrong number of hosts: expected %v, got %v", 0, len(hosts))
}
// with one host
h1 := new(hostEntry)
h1.NetAddress = "foo"
h1.Weight = types.NewCurrency64(1)
h1.AcceptingContracts = true
hdb.insertNode(h1)
if hosts := hdb.ActiveHosts(); len(hosts) != 1 {
t.Errorf("wrong number of hosts: expected %v, got %v", 1, len(hosts))
} else if hosts[0].NetAddress != h1.NetAddress {
t.Errorf("ActiveHosts returned wrong host: expected %v, got %v", h1.NetAddress, hosts[0].NetAddress)
}
// with multiple hosts
h2 := new(hostEntry)
h2.NetAddress = "bar"
h2.Weight = types.NewCurrency64(1)
h2.AcceptingContracts = true
hdb.insertNode(h2)
if hosts := hdb.ActiveHosts(); len(hosts) != 2 {
t.Errorf("wrong number of hosts: expected %v, got %v", 2, len(hosts))
} else if hosts[0].NetAddress != h1.NetAddress && hosts[1].NetAddress != h1.NetAddress {
t.Errorf("ActiveHosts did not contain an inserted host: %v (missing %v)", hosts, h1.NetAddress)
} else if hosts[0].NetAddress != h2.NetAddress && hosts[1].NetAddress != h2.NetAddress {
t.Errorf("ActiveHosts did not contain an inserted host: %v (missing %v)", hosts, h2.NetAddress)
}
}
示例6: checkSiacoins
// checkSiacoins counts the number of siacoins in the database and verifies
// that it matches the sum of all the coinbases.
func (cs *ConsensusSet) checkSiacoins() error {
// Calculate the number of expected coins in constant time.
deflationBlocks := types.InitialCoinbase - types.MinimumCoinbase
expectedSiacoins := types.CalculateCoinbase(0).Add(types.CalculateCoinbase(cs.height())).Div(types.NewCurrency64(2))
if cs.height() < types.BlockHeight(deflationBlocks) {
expectedSiacoins = expectedSiacoins.Mul(types.NewCurrency64(uint64(cs.height()) + 1))
} else {
expectedSiacoins = expectedSiacoins.Mul(types.NewCurrency64(deflationBlocks + 1))
trailingSiacoins := types.NewCurrency64(uint64(cs.height()) - deflationBlocks).Mul(types.CalculateCoinbase(cs.height()))
expectedSiacoins = expectedSiacoins.Add(trailingSiacoins)
}
totalSiacoins := types.ZeroCurrency
cs.db.forEachSiacoinOutputs(func(scoid types.SiacoinOutputID, sco types.SiacoinOutput) {
totalSiacoins = totalSiacoins.Add(sco.Value)
})
cs.db.forEachFileContracts(func(fcid types.FileContractID, fc types.FileContract) {
var payout types.Currency
for _, output := range fc.ValidProofOutputs {
payout = payout.Add(output.Value)
}
totalSiacoins = totalSiacoins.Add(payout)
})
cs.db.forEachDelayedSiacoinOutputs(func(v types.SiacoinOutputID, dso types.SiacoinOutput) {
totalSiacoins = totalSiacoins.Add(dso.Value)
})
cs.db.forEachSiafundOutputs(func(sfoid types.SiafundOutputID, sfo types.SiafundOutput) {
sfoSiacoins := cs.siafundPool.Sub(sfo.ClaimStart).Div(types.SiafundCount).Mul(sfo.Value)
totalSiacoins = totalSiacoins.Add(sfoSiacoins)
})
if expectedSiacoins.Cmp(totalSiacoins) != 0 {
return errSiacoinMiscount
}
return nil
}
示例7: TestRepeatInsert
// TestRepeatInsert inserts 2 hosts with the same address.
func TestRepeatInsert(t *testing.T) {
if testing.Short() {
t.SkipNow()
}
hdb := &HostDB{
activeHosts: make(map[modules.NetAddress]*hostNode),
allHosts: make(map[modules.NetAddress]*hostEntry),
scanPool: make(chan *hostEntry, scanPoolSize),
}
var dbe modules.HostDBEntry
dbe.NetAddress = fakeAddr(0)
entry1 := hostEntry{
HostDBEntry: dbe,
Weight: types.NewCurrency64(1),
}
entry2 := entry1
hdb.insertNode(&entry1)
entry2.Weight = types.NewCurrency64(100)
hdb.insertNode(&entry2)
if len(hdb.activeHosts) != 1 {
t.Error("insterting the same entry twice should result in only 1 entry in the hostdb")
}
}
示例8: checkWalletBalance
// checkWalletBalance looks at an upload and determines if there is enough
// money in the wallet to support such an upload. An error is returned if it is
// determined that there is not enough money.
func (r *Renter) checkWalletBalance(up modules.FileUploadParams) error {
// Get the size of the file.
fileInfo, err := os.Stat(up.Filename)
if err != nil {
return err
}
curSize := types.NewCurrency64(uint64(fileInfo.Size()))
var averagePrice types.Currency
sampleSize := up.ErasureCode.NumPieces() * 3 / 2
hosts := r.hostDB.RandomHosts(sampleSize)
for _, host := range hosts {
averagePrice = averagePrice.Add(host.Price)
}
if len(hosts) == 0 {
return errors.New("no hosts!")
}
averagePrice = averagePrice.Div(types.NewCurrency64(uint64(len(hosts))))
estimatedCost := averagePrice.Mul(types.NewCurrency64(uint64(up.Duration))).Mul(curSize)
bufferedCost := estimatedCost.Mul(types.NewCurrency64(2))
siacoinBalance, _, _ := r.wallet.ConfirmedBalance()
if bufferedCost.Cmp(siacoinBalance) > 0 {
return errors.New("insufficient balance for upload")
}
return nil
}
示例9: TestAveragePrice
// TestAveragePrice tests the AveragePrice method, which also depends on the
// randomHosts method.
func TestAveragePrice(t *testing.T) {
hdb := bareHostDB()
// empty
if avg := hdb.AveragePrice(); !avg.IsZero() {
t.Error("average of empty hostdb should be zero:", avg)
}
// with one host
h1 := new(hostEntry)
h1.NetAddress = "foo"
h1.Price = types.NewCurrency64(100)
h1.weight = baseWeight
hdb.insertNode(h1)
if avg := hdb.AveragePrice(); avg.Cmp(h1.Price) != 0 {
t.Error("average of one host should be that host's price:", avg)
}
// with two hosts
h2 := new(hostEntry)
h2.NetAddress = "bar"
h2.Price = types.NewCurrency64(300)
h2.weight = baseWeight
hdb.insertNode(h2)
if len(hdb.activeHosts) != 2 {
t.Error("host was not added:", hdb.activeHosts)
}
if avg := hdb.AveragePrice(); avg.Cmp(types.NewCurrency64(200)) != 0 {
t.Error("average of two hosts should be their sum/2:", avg)
}
}
示例10: TestRepeatInsert
// TestRepeatInsert inserts 2 hosts with the same address.
func TestRepeatInsert(t *testing.T) {
if testing.Short() {
t.SkipNow()
}
hdb := &HostDB{
activeHosts: make(map[modules.NetAddress]*hostNode),
allHosts: make(map[modules.NetAddress]*hostEntry),
scanPool: make(chan *hostEntry, scanPoolSize),
mu: sync.New(modules.SafeMutexDelay, 1),
}
entry1 := hostEntry{
HostSettings: modules.HostSettings{IPAddress: fakeAddr(0)},
weight: types.NewCurrency64(1),
}
entry2 := entry1
hdb.insertNode(&entry1)
entry2.weight = types.NewCurrency64(100)
hdb.insertNode(&entry2)
if len(hdb.activeHosts) != 1 {
t.Error("insterting the same entry twice should result in only 1 entry in the hostdb")
}
}
示例11: Info
// Info returns generic information about the renter and the files that are
// being rented.
func (r *Renter) Info() (ri modules.RentInfo) {
lockID := r.mu.RLock()
defer r.mu.RUnlock(lockID)
// Include the list of files the renter knows about.
for filename := range r.files {
ri.Files = append(ri.Files, filename)
}
// Calculate the average cost of a file.
var totalPrice types.Currency
redundancy := 6 // reasonable estimate until we come up with an alternative
sampleSize := redundancy * 3
hosts := r.hostDB.RandomHosts(sampleSize)
for _, host := range hosts {
totalPrice = totalPrice.Add(host.Price)
}
if len(hosts) == 0 {
return
}
averagePrice := totalPrice.Div(types.NewCurrency64(uint64(len(hosts)))).Mul(types.NewCurrency64(uint64(redundancy)))
// HACK: 6000 is the duration (set by the API), and 1024^3 is a GB. Price
// is reported as per GB, no timeframe is given.
estimatedCost := averagePrice.Mul(types.NewCurrency64(6000)).Mul(types.NewCurrency64(1024 * 1024 * 1024))
bufferedCost := estimatedCost.Mul(types.NewCurrency64(3)) // For some reason, this estimate can still be off by a large factor.
ri.Price = bufferedCost
// Report the number of known hosts.
ri.KnownHosts = len(r.hostDB.ActiveHosts())
return
}
示例12: Info
// Info returns generic information about the renter and the files that are
// being rented.
func (r *Renter) Info() (ri modules.RentInfo) {
lockID := r.mu.RLock()
// Include the list of files the renter knows about.
for filename := range r.files {
ri.Files = append(ri.Files, filename)
}
r.mu.RUnlock(lockID)
// Calculate the average cost of a file.
var totalPrice types.Currency
sampleSize := defaultParityPieces + defaultDataPieces
hosts := r.hostDB.RandomHosts(sampleSize)
for _, host := range hosts {
totalPrice = totalPrice.Add(host.Price)
}
if len(hosts) == 0 {
return
}
averagePrice := totalPrice.Div(types.NewCurrency64(uint64(len(hosts))))
estimatedCost := averagePrice.Mul(types.NewCurrency64(defaultDuration)).Mul(types.NewCurrency64(1e9)).Mul(types.NewCurrency64(defaultParityPieces + defaultDataPieces))
// this also accounts for the buffering in the contract negotiation
bufferedCost := estimatedCost.Mul(types.NewCurrency64(5)).Div(types.NewCurrency64(2))
ri.Price = bufferedCost
// Report the number of known hosts.
ri.KnownHosts = len(r.hostDB.ActiveHosts())
return
}
示例13: TestDecrementReliability
// TestDecrementReliability tests the decrementReliability method.
func TestDecrementReliability(t *testing.T) {
hdb := bareHostDB()
// Decrementing a non-existent host should be a no-op.
// NOTE: can't check any post-conditions here; only indication of correct
// behavior is that the test doesn't panic.
hdb.decrementReliability("foo", types.NewCurrency64(0))
// Add a host to allHosts and activeHosts. Decrementing it should remove it
// from activeHosts.
h := new(hostEntry)
h.NetAddress = "foo"
h.reliability = types.NewCurrency64(1)
hdb.allHosts[h.NetAddress] = h
hdb.activeHosts[h.NetAddress] = &hostNode{hostEntry: h}
hdb.decrementReliability(h.NetAddress, types.NewCurrency64(0))
if len(hdb.ActiveHosts()) != 0 {
t.Error("decrementing did not remove host from activeHosts")
}
// Decrement reliability to 0. This should remove the host from allHosts.
hdb.decrementReliability(h.NetAddress, h.reliability)
if len(hdb.AllHosts()) != 0 {
t.Error("decrementing did not remove host from allHosts")
}
}
示例14: Upload
// Upload revises an existing file contract with a host, and then uploads a
// piece to it.
func (hu *hostUploader) Upload(data []byte) (uint64, error) {
// offset is old filesize
offset := hu.contract.LastRevision.NewFileSize
// calculate price
hu.hdb.mu.RLock()
height := hu.hdb.blockHeight
hu.hdb.mu.RUnlock()
if height > hu.contract.FileContract.WindowStart {
return 0, errors.New("contract has already ended")
}
piecePrice := types.NewCurrency64(uint64(len(data))).Mul(types.NewCurrency64(uint64(hu.contract.FileContract.WindowStart - height))).Mul(hu.price)
piecePrice = piecePrice.MulFloat(1.02) // COMPATv0.4.8 -- hosts reject exact prices
// calculate new merkle root (no error possible with bytes.Reader)
_ = hu.tree.ReadSegments(bytes.NewReader(data))
merkleRoot := hu.tree.Root()
// revise the file contract
rev := newRevision(hu.contract.LastRevision, uint64(len(data)), merkleRoot, piecePrice)
signedTxn, err := negotiateRevision(hu.conn, rev, data, hu.contract.SecretKey)
if err != nil {
return 0, err
}
// update host contract
hu.contract.LastRevision = rev
hu.contract.LastRevisionTxn = signedTxn
hu.hdb.mu.Lock()
hu.hdb.contracts[hu.contract.ID] = hu.contract
hu.hdb.save()
hu.hdb.mu.Unlock()
return offset, nil
}
示例15: TestHostWeight
// TestHostWeight probes the hostWeight function.
func TestHostWeight(t *testing.T) {
hdbt := newHDBTester("TestHostWeight", t)
// Create two identical entries, except that one has a price that is 2x the
// other. The weight returned by hostWeight should be 1/8 for the more
// expensive host.
entry1 := hostEntry{
HostSettings: modules.HostSettings{
Price: types.NewCurrency64(3),
},
}
entry2 := hostEntry{
HostSettings: modules.HostSettings{
Price: types.NewCurrency64(6),
},
}
weight1 := hdbt.hostdb.hostWeight(entry1)
weight2 := hdbt.hostdb.hostWeight(entry2)
expectedWeight := weight1.Div(types.NewCurrency64(8))
if weight2.Cmp(expectedWeight) != 0 {
t.Error("Weight of expensive host is not the correct value.")
}
// Try a 0 price.
entry3 := hostEntry{
HostSettings: modules.HostSettings{
Price: types.NewCurrency64(0),
},
}
weight3 := hdbt.hostdb.hostWeight(entry3)
if weight3.Cmp(weight1) <= 0 {
t.Error("Free host not weighing fairly")
}
}