func (w *SCWallet) UpdateInput(trans interfaces.ITransaction, index int, address interfaces.IAddress, amount uint64) error { we, adr, err := w.getWalletEntry([]byte(constants.W_RCD_ADDRESS_HASH), address) if err != nil { return err } in, err := trans.GetInput(index) if err != nil { return err } trans.GetRCDs()[index] = we.GetRCD() // The RCD must match the (possibly) new input in.SetAddress(adr) in.SetAmount(amount) return nil }
// 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 interfaces.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 (w *SCWallet) SignInputs(trans interfaces.ITransaction) (bool, error) { data, err := trans.MarshalBinarySig() // Get the part of the transaction we sign if err != nil { return false, err } var numSigs int = 0 inputs := trans.GetInputs() rcds := trans.GetRCDs() for i, rcd := range rcds { rcd1, ok := rcd.(*RCD_1) if ok { pub := rcd1.GetPublicKey() wex, err := w.db.Get([]byte(constants.W_ADDRESS_PUB_KEY), pub, new(WalletEntry)) if err != nil { return false, err } we := wex.(*WalletEntry) if we != nil { var pri [constants.SIGNATURE_LENGTH]byte copy(pri[:], we.private[0]) bsig := ed25519.Sign(&pri, data) sig := new(FactoidSignature) sig.SetSignature(bsig[:]) sigblk := new(SignatureBlock) sigblk.AddSignature(sig) trans.SetSignatureBlock(i, sigblk) numSigs += 1 } } } return numSigs == len(inputs), nil }