|
|
@ -0,0 +1,50 @@ |
|
|
|
package core |
|
|
|
|
|
|
|
type Input struct { |
|
|
|
TxId Hash |
|
|
|
Vout int // index of the output from the TxId
|
|
|
|
Value uint64 |
|
|
|
} |
|
|
|
type Output struct { |
|
|
|
Value uint64 |
|
|
|
} |
|
|
|
|
|
|
|
// Tx holds the data structure of a transaction
|
|
|
|
type Tx struct { |
|
|
|
From Address |
|
|
|
To Address |
|
|
|
InputCount uint64 |
|
|
|
Inputs []Input |
|
|
|
Outputs []Output |
|
|
|
Signature []byte |
|
|
|
} |
|
|
|
|
|
|
|
func NewTx(from, to Address, in []Input, out []Output) *Tx { |
|
|
|
tx := &Tx{ |
|
|
|
From: from, |
|
|
|
To: to, |
|
|
|
InputCount: uint64(len(in)), |
|
|
|
Inputs: in, |
|
|
|
Outputs: out, |
|
|
|
} |
|
|
|
return tx |
|
|
|
} |
|
|
|
|
|
|
|
// CheckTx checks if the transaction is consistent
|
|
|
|
func CheckTx(tx *Tx) bool { |
|
|
|
// TODO check that inputs and outputs are not empty
|
|
|
|
|
|
|
|
// check that inputs == outputs
|
|
|
|
totalIn := 0 |
|
|
|
for _, in := range tx.Inputs { |
|
|
|
totalIn = totalIn + int(in.Value) |
|
|
|
} |
|
|
|
totalOut := 0 |
|
|
|
for _, out := range tx.Outputs { |
|
|
|
totalOut = totalOut + int(out.Value) |
|
|
|
} |
|
|
|
if totalIn < totalOut { |
|
|
|
return false |
|
|
|
} |
|
|
|
return true |
|
|
|
} |