Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/olemis_t138_txn_sign' into stdev…
Browse files Browse the repository at this point in the history
…AlDen_t139_hardware_wallet_signer ref fibercrypto#139
  • Loading branch information
stdevAlDen committed Oct 10, 2019
2 parents 73cac14 + f8186f4 commit 55421e5
Showing 1 changed file with 116 additions and 39 deletions.
155 changes: 116 additions & 39 deletions src/coin/skycoin/models/coin.go
Original file line number Diff line number Diff line change
Expand Up @@ -63,42 +63,101 @@ func (txn *SkycoinPendingTransaction) ComputeFee(ticker string) (uint64, error)
return uint64(0), fmt.Errorf("Invalid ticker %v\n", ticker)
}

// ToSkyTxn retrieve the equivalent core.Transaction object
func (txn *SkycoinPendingTransaction) ToSkyTxn() (*coin.Transaction, error) {
sigs := append([]string{}, txn.Transaction.Transaction.Sigs...)
ins := make([]api.CreatedTransactionInput, len(txn.Transaction.Transaction.In))
outs := make([]api.CreatedTransactionOutput, len(txn.Transaction.Transaction.Out))
for i, input := range txn.Transaction.Transaction.In {
ins[i] = api.CreatedTransactionInput{
UxID: input.Hash,
Coins: input.Coins,
Hours: fmt.Sprint(input.Hours),
CalculatedHours: fmt.Sprint(input.CalculatedHours),
Time: uint64(txn.Transaction.Announced.UnixNano()),
// Unconfirmed transactions are not included in a block yet
Block: 0,
TxID: txn.Transaction.Transaction.Hash,
}
func newCreatedTransactionOutput(uxID, address, coins, hours string) api.CreatedTransactionOutput {
return api.CreatedTransactionOutput{
UxID: uxID,
Address: address,
Coins: coins,
Hours: hours,
}
for i, output := range txn.Transaction.Transaction.Out {
outs[i] = api.CreatedTransactionOutput{
UxID: output.Hash,
Address: output.Address,
Coins: output.Coins,
Hours: fmt.Sprint(output.Hours),
}
}

func newCreatedTransactionInput(uxID, address, coins, hours, calculatedHours string, time, block uint64, txID string) api.CreatedTransactionInput {
return api.CreatedTransactionInput{
UxID: uxID,
Address: address,
Coins: coins,
Hours: hours,
CalculatedHours: calculatedHours,
Time: time,
Block: block,
TxID: txID,
}
}

func newCreatedTransaction(length uint32, txnType uint8, txID string, innerHash string, fee string, ins []api.CreatedTransactionInput, outs []api.CreatedTransactionOutput, sigs []string) *api.CreatedTransaction {
rTxn := api.CreatedTransaction{
Length: txn.Transaction.Transaction.Length,
Type: txn.Transaction.Transaction.Type,
TxID: txn.Transaction.Transaction.Hash,
InnerHash: txn.Transaction.Transaction.InnerHash,
Fee: fmt.Sprint(txn.Transaction.Transaction.Fee),
Length: length,
Type: txnType,
TxID: txID,
InnerHash: innerHash,
Fee: fee,
Sigs: sigs,
In: ins,
Out: outs,
}
return rTxn.ToTransaction()
return &rTxn
}

func blockTxnToCreatedTxn(blockTxn readable.BlockTransactionVerbose, timestamp uint64) (*api.CreatedTransaction, error) {
sigs := append([]string{}, blockTxn.Sigs...)
ins := make([]api.CreatedTransactionInput, len(blockTxn.In))
outs := make([]api.CreatedTransactionOutput, len(blockTxn.Out))
for i, input := range blockTxn.In {
ins[i] = newCreatedTransactionInput(
input.Hash,
input.Address,
input.Coins,
fmt.Sprint(input.Hours),
fmt.Sprint(input.CalculatedHours),
timestamp,
// Unconfirmed transactions are not included in a block yet
0,
blockTxn.Hash,
)
}
for i, output := range blockTxn.Out {
outs[i] = newCreatedTransactionOutput(
output.Hash,
output.Address,
output.Coins,
fmt.Sprint(output.Hours),
)
}
return newCreatedTransaction(
blockTxn.Length,
blockTxn.Type,
blockTxn.Hash,
blockTxn.InnerHash,
fmt.Sprint(blockTxn.Fee),
ins, outs, sigs,
), nil
}

// ToCreatedTransaction retrieve the equivalent core.Transaction object
func (txn *SkycoinPendingTransaction) ToCreatedTransaction() (*api.CreatedTransaction, error) {
return blockTxnToCreatedTxn(txn.Transaction.Transaction, uint64(txn.Transaction.Announced.UnixNano()))
}

type readableTxn interface {
ToCreatedTransaction() (*api.CreatedTransaction, error)
}

func verifyCreatedTransaction(rTxn readableTxn, checkSigned bool) error {
var createdTxn *api.CreatedTransaction
if cTxn, err := rTxn.ToCreatedTransaction(); err != nil {
createdTxn = cTxn
} else {
return err
}
txn, err := createdTxn.ToTransaction()
if err != nil {
return err
}
if checkSigned {
return txn.Verify()
}
return txn.VerifyUnsigned()
}

// VerifyUnsigned checks for valid unsigned transaction
Expand All @@ -107,11 +166,7 @@ func (txn *SkycoinPendingTransaction) VerifyUnsigned() error {
// FIXME: Unique error object
return errors.New("Invalid unconfirmed transaction")
}
var skyTxn coin.Transaction
if skyTxn, err := txn.ToSkyTxn(); err == nil {
return err
}
return skyTxn.VerifyUnsigned()
return verifyCreatedTransaction(txn, false)
}

// VerifySigned checks for valid unsigned transaction
Expand All @@ -120,11 +175,7 @@ func (txn *SkycoinPendingTransaction) VerifySigned() error {
// FIXME: Unique error object
return errors.New("Invalid unconfirmed transaction")
}
var skyTxn coin.Transaction
if skyTxn, err := txn.ToSkyTxn(); err == nil {
return err
}
return skyTxn.Verify()
return verifyCreatedTransaction(txn, true)
}

/**
Expand Down Expand Up @@ -315,6 +366,16 @@ func (skyTxn *SkycoinUninjectedTransaction) GetId() string {
return skyTxn.txn.Hash().String()
}

// VerifyUnsigned checks for valid unsigned transaction
func (txn *SkycoinUninjectedTransaction) VerifyUnsigned() error {
return txn.txn.VerifyUnsigned()
}

// VerifySigned checks for valid unsigned transaction
func (txn *SkycoinUninjectedTransaction) VerifySigned() error {
return txn.txn.Verify()
}

/*
SkycoinTransaction
*/
Expand Down Expand Up @@ -390,6 +451,22 @@ func (txn *SkycoinTransaction) ComputeFee(ticker string) (uint64, error) {
}
return uint64(0), fmt.Errorf("Invalid ticker %v\n", ticker)
}

// ToCreatedTransaction retrieve the equivalent core.Transaction object
func (txn *SkycoinTransaction) ToCreatedTransaction() (*api.CreatedTransaction, error) {
return blockTxnToCreatedTxn(txn.skyTxn.BlockTransactionVerbose, uint64(txn.skyTxn.Timestamp))
}

// VerifyUnsigned checks for valid unsigned transaction
func (txn *SkycoinTransaction) VerifyUnsigned() error {
return verifyCreatedTransaction(txn, false)
}

// VerifySigned checks for valid unsigned transaction
func (txn *SkycoinTransaction) VerifySigned() error {
return verifyCreatedTransaction(txn, true)
}

func getSkycoinTransactionInputsFromTxnHash(hash string) ([]core.TransactionInput, error) {
c, err := NewSkycoinApiClient(PoolSection)
if err != nil {
Expand Down

0 comments on commit 55421e5

Please sign in to comment.