tx inputs and outputs structure, add CheckTx

This commit is contained in:
arnaucube
2019-04-07 18:52:20 +02:00
parent 01963a8f41
commit 701731ea67
4 changed files with 69 additions and 35 deletions

View File

@@ -6,31 +6,6 @@ import (
"time"
)
type Input struct {
}
type Output struct {
}
// Tx holds the data structure of a transaction
type Tx struct {
From Address
To Address
InputCount uint64
Inputs []Input
Outputs []Output
}
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
}
// Block holds the data structure for the block
type Block struct {
Height uint64

View File

@@ -59,13 +59,3 @@ func TestNewBlock(t *testing.T) {
// CheckPoW
assert.True(t, CheckPoW(h, difficulty))
}
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)
}

50
core/tx.go Normal file
View File

@@ -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
}

19
core/tx_test.go Normal file
View File

@@ -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))
}