func (w *SCWallet) SignInputs(trans fct.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.(*fct.RCD_1) if ok { pub := rcd1.GetPublicKey() we := w.db.GetRaw([]byte(fct.W_ADDRESS_PUB_KEY), pub).(*WalletEntry) if we != nil { var pri [fct.SIGNATURE_LENGTH]byte copy(pri[:], we.private[0]) bsig := ed25519.Sign(&pri, data) sig := new(fct.Signature) sig.SetSignature(bsig[:]) sigblk := new(fct.SignatureBlock) sigblk.AddSignature(sig) trans.SetSignatureBlock(i, sigblk) numSigs += 1 } } } return numSigs == len(inputs), nil }
func (w *SCWallet) UpdateInput(trans fct.ITransaction, index int, address fct.IAddress, amount uint64) error { we, adr, err := w.getWalletEntry([]byte(fct.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 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 (w *SCWallet) SignInputs(trans fct.ITransaction) (bool, error) { data, err := trans.MarshalBinarySig() // Get the part of the transaction we sign if err != nil { return false, err } var errMsg []byte rcds := trans.GetRCDs() for i, rcd := range rcds { rcd1, ok := rcd.(*fct.RCD_1) if ok { pub := rcd1.GetPublicKey() we, ok := w.db.GetRaw([]byte(fct.W_ADDRESS_PUB_KEY), pub).(*WalletEntry) if ok { var pri [fct.SIGNATURE_LENGTH]byte copy(pri[:], we.private[0]) bsig := ed25519.Sign(&pri, data) sig := new(fct.Signature) sig.SetSignature(bsig[:]) sigblk := new(fct.SignatureBlock) sigblk.AddSignature(sig) trans.SetSignatureBlock(i, sigblk) } else { errMsg = append(errMsg, []byte("Do not have the private key for: "+ fct.ConvertFctAddressToUserStr(fct.NewAddress(pub))+"\n")...) } } } if errMsg != nil { return false, fmt.Errorf("%s", string(errMsg)) } return true, nil }