@ -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 |
||||
|
} |
@ -0,0 +1,19 @@ |
|||||
|
package core |
||||
|
|
||||
|
import ( |
||||
|
"testing" |
||||
|
|
||||
|
"github.com/stretchr/testify/assert" |
||||
|
) |
||||
|
|
||||
|
func TestTx(t *testing.T) { |
||||
|
addr0 := Address(HashBytes([]byte("addr0"))) |
||||
|
addr1 := Address(HashBytes([]byte("addr1"))) |
||||
|
|
||||
|
tx := NewTx(addr0, addr1, []Input{}, []Output{}) |
||||
|
|
||||
|
assert.Equal(t, tx.From, addr0) |
||||
|
assert.Equal(t, tx.To, addr1) |
||||
|
|
||||
|
assert.True(t, CheckTx(tx)) |
||||
|
} |