arnaucube
arnaucube/slowlorisdbPublic Self-hosted repository
tx inputs and outputs structure, add CheckTx
arnaucube arnaucube@gmail.com
Sun, 07 Apr 2019 18:52:20 +0200
commit

701731ea679ac33c13dfbd1b9e88ed7c9fbb09c3

parent

01963a8f413af3151955edc97de5be59d45f159a

4 files changed, 69 insertions(+), 35 deletions(-)

jump to
M core/block.go → core/block.go

@@ -6,31 +6,6 @@ "encoding/json"

"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
M core/block_test.go → core/block_test.go

@@ -59,13 +59,3 @@

// 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) -}
A core/tx.go

@@ -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 +}
A core/tx_test.go

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