func (list *DBStateList) NewDBState(isNew bool, directoryBlock interfaces.IDirectoryBlock, adminBlock interfaces.IAdminBlock, factoidBlock interfaces.IFBlock, entryCreditBlock interfaces.IEntryCreditBlock, eBlocks []interfaces.IEntryBlock, entries []interfaces.IEBEntry) *DBState { dbState := new(DBState) dbState.DBHash = directoryBlock.DatabasePrimaryIndex() dbState.ABHash = adminBlock.DatabasePrimaryIndex() dbState.FBHash = factoidBlock.DatabasePrimaryIndex() dbState.ECHash = entryCreditBlock.DatabasePrimaryIndex() dbState.isNew = isNew dbState.DirectoryBlock = directoryBlock dbState.AdminBlock = adminBlock dbState.FactoidBlock = factoidBlock dbState.EntryCreditBlock = entryCreditBlock dbState.EntryBlocks = eBlocks dbState.Entries = entries // If we actually add this to the list, return the dbstate. if list.Put(dbState) { return dbState } // Failed, so return nil return nil }
// When we are playing catchup, adding the transaction block is a pretty // useful feature. func (fs *FactoidState) AddTransactionBlock(blk interfaces.IFBlock) error { if err := blk.Validate(); err != nil { return err } transactions := blk.GetTransactions() for _, trans := range transactions { err := fs.UpdateTransaction(false, trans) if err != nil { return err } } fs.CurrentBlock = blk //fs.State.SetFactoshisPerEC(blk.GetExchRate()) return nil }
func NewFBlock(prev interfaces.IFBlock) interfaces.IFBlock { scb := new(FBlock) scb.BodyMR = new(primitives.Hash) if prev != nil { scb.PrevKeyMR = prev.GetKeyMR() scb.PrevLedgerKeyMR = prev.GetLedgerKeyMR() scb.ExchRate = prev.GetExchRate() scb.DBHeight = prev.GetDBHeight() + 1 } else { scb.PrevKeyMR = primitives.NewZeroHash() scb.PrevLedgerKeyMR = primitives.NewZeroHash() scb.ExchRate = 1 scb.DBHeight = 0 } return scb }
func NewFBlockFromPreviousBlock(exchangeRate uint64, prev interfaces.IFBlock) interfaces.IFBlock { if prev != nil { newBlock := NewFBlock(exchangeRate, prev.GetDBHeight()+1) newBlock.SetPrevKeyMR(prev.GetKeyMR().Bytes()) newBlock.SetPrevLedgerKeyMR(prev.GetLedgerKeyMR().Bytes()) return newBlock } return NewFBlock(exchangeRate, 0) }
func createECEntriesfromBlocks(fBlock interfaces.IFBlock, eBlocks []*entryBlock.EBlock, height int) []interfaces.IECBlockEntry { ecEntries := []interfaces.IECBlockEntry{} ecEntries = append(ecEntries, entryCreditBlock.NewServerIndexNumber2(uint8(height%10+1))) ecEntries = append(ecEntries, entryCreditBlock.NewMinuteNumber(0)) ecEntries = append(ecEntries, entryCreditBlock.NewMinuteNumber(1)) ecEntries = append(ecEntries, entryCreditBlock.NewMinuteNumber(2)) ecEntries = append(ecEntries, entryCreditBlock.NewMinuteNumber(3)) ecEntries = append(ecEntries, entryCreditBlock.NewMinuteNumber(4)) ecEntries = append(ecEntries, entryCreditBlock.NewMinuteNumber(5)) ecEntries = append(ecEntries, entryCreditBlock.NewMinuteNumber(6)) ecEntries = append(ecEntries, entryCreditBlock.NewMinuteNumber(7)) ecEntries = append(ecEntries, entryCreditBlock.NewMinuteNumber(8)) ecEntries = append(ecEntries, entryCreditBlock.NewMinuteNumber(9)) trans := fBlock.GetTransactions() for _, t := range trans { ecOut := t.GetECOutputs() for i, ec := range ecOut { increase := new(entryCreditBlock.IncreaseBalance) increase.ECPubKey = primitives.Byte32ToByteSlice32(ec.GetAddress().Fixed()) increase.TXID = t.GetHash() increase.Index = uint64(i) increase.NumEC = ec.GetAmount() / fBlock.GetExchRate() ecEntries = append(ecEntries, increase) } } for _, eBlock := range eBlocks { if height == 0 { ecEntries = append(ecEntries, NewCommitChain(eBlock)) } else { ecEntries = append(ecEntries, NewCommitEntry(eBlock)) } } return ecEntries }
func (c *DirectoryBlock) SetFBlockHash(fBlock interfaces.IFBlock) error { hash := fBlock.DatabasePrimaryIndex() c.SetEntryHash(hash, fBlock.GetChainID(), 2) return nil }
func CheckBlockPairIntegrity(block interfaces.IFBlock, prev interfaces.IFBlock) error { if block == nil { return fmt.Errorf("No block specified") } if prev == nil { if block.GetPrevKeyMR().IsZero() == false { return fmt.Errorf("Invalid PrevKeyMR") } if block.GetPrevLedgerKeyMR().IsZero() == false { return fmt.Errorf("Invalid PrevLedgerKeyMR") } if block.GetDBHeight() != 0 { return fmt.Errorf("Invalid DBHeight") } } else { if block.GetPrevKeyMR().IsSameAs(prev.GetKeyMR()) == false { return fmt.Errorf("Invalid PrevKeyMR") } if block.GetPrevLedgerKeyMR().IsSameAs(prev.GetLedgerKeyMR()) == false { return fmt.Errorf("Invalid PrevLedgerKeyMR") } if block.GetDBHeight() != (prev.GetDBHeight() + 1) { return fmt.Errorf("Invalid DBHeight") } } return nil }