func filtertransaction(trans fct.ITransaction, addresses [][]byte) bool { if addresses == nil || len(addresses) == 0 { return true } if len(trans.GetInputs()) == 0 && len(trans.GetOutputs()) == 0 { return false } if len(addresses) == 1 && bytes.Equal(addresses[0], trans.GetSigHash().Bytes()) { return true } Search: for _, adr := range addresses { for _, in := range trans.GetInputs() { if bytes.Equal(adr, in.GetAddress().Bytes()) { continue Search } } for _, out := range trans.GetOutputs() { if bytes.Equal(adr, out.GetAddress().Bytes()) { continue Search } } for _, ec := range trans.GetECOutputs() { if bytes.Equal(adr, ec.GetAddress().Bytes()) { continue Search } } return false } return true }
// Assumes validation has already been done. func (fs *FactoidState) UpdateTransaction(trans fct.ITransaction) error { for _, input := range trans.GetInputs() { err := fs.UpdateBalance(input.GetAddress(), -int64(input.GetAmount())) if err != nil { return err } } for _, output := range trans.GetOutputs() { err := fs.UpdateBalance(output.GetAddress(), int64(output.GetAmount())) if err != nil { return err } } for _, ecoutput := range trans.GetECOutputs() { err := fs.UpdateECBalance(ecoutput.GetAddress(), int64(ecoutput.GetAmount())) if err != nil { return err } } fs.numTransactions++ cp.CP.AddUpdate( "transprocessed", // tag "status", // Category fmt.Sprintf("Factoid Transactions Processed: %d", fs.numTransactions), // Title "", // Message 0) // When to expire the message; 0 is never return nil }
func PrtTrans(t fct.ITransaction) { fmt.Println("Transaction") for _, input := range t.GetInputs() { fmt.Println("in ", input.GetAddress(), input.GetAmount(), fs.GetBalance(input.GetAddress())) } for _, output := range t.GetOutputs() { fmt.Println("out", output.GetAddress(), output.GetAmount(), fs.GetBalance(output.GetAddress())) } for _, ecoutput := range t.GetECOutputs() { fmt.Println("ec ", ecoutput.GetAddress(), ecoutput.GetAmount(), fs.GetECBalance(ecoutput.GetAddress())) } }
// Add the first transaction of a block. This transaction makes the // payout to the servers, so it has no inputs. This transaction must // be deterministic so that all servers will know and expect its output. func (b *FBlock) AddCoinbase(trans fct.ITransaction) error { b.BodyMR = nil if len(b.Transactions) != 0 { return fmt.Errorf("The coinbase transaction must be the first transaction") } if len(trans.GetInputs()) != 0 { return fmt.Errorf("The coinbase transaction cannot have any inputs") } if len(trans.GetECOutputs()) != 0 { return fmt.Errorf("The coinbase transaction cannot buy Entry Credits") } if len(trans.GetRCDs()) != 0 { return fmt.Errorf("The coinbase transaction cannot have anyRCD blocks") } if len(trans.GetSignatureBlocks()) != 0 { return fmt.Errorf("The coinbase transaction is not signed") } // TODO Add check here for the proper payouts. b.Transactions = append(b.Transactions, trans) return nil }
func FactoidAddECOutput(trans fct.ITransaction, key string, address fct.IAddress, amount uint64) error { ok := Utility.IsValidKey(key) if !ok { return fmt.Errorf("Invalid name for transaction") } // First look if this is really an update for _, ecoutput := range trans.GetECOutputs() { if ecoutput.GetAddress().IsSameAs(address) { ecoutput.SetAmount(amount) return nil } } // Add our new Entry Credit Output err := factoidState.GetWallet().AddECOutput(trans, address, uint64(amount)) if err != nil { return fmt.Errorf("Failed to add Entry Credit Output") } // Update our map with our new transaction to the same key. Otherwise, all // of our work will go away! factoidState.GetDB().PutRaw([]byte(fct.DB_BUILD_TRANS), []byte(key), trans) return nil }