Skip to content
Snippets Groups Projects
Commit 48538f23 authored by Hans Moog's avatar Hans Moog
Browse files

Feat: hello git; I have no idea what I did - but here are files

parent 9655ec6d
Branches
No related tags found
No related merge requests found
......@@ -67,6 +67,7 @@ func (ledgerState *LedgerState) ForEachTransferOutput(callback func(object *obje
}
}
} else {
if len(prefixes) >= 1 {
for _, prefix := range prefixes {
if err := ledgerState.transferOutputs.ForEach(func(key []byte, cachedObject *objectstorage.CachedObject) bool {
return callback(cachedObject)
......@@ -74,6 +75,13 @@ func (ledgerState *LedgerState) ForEachTransferOutput(callback func(object *obje
panic(err)
}
}
} else {
if err := ledgerState.transferOutputs.ForEach(func(key []byte, cachedObject *objectstorage.CachedObject) bool {
return callback(cachedObject)
}); err != nil {
panic(err)
}
}
}
}
......@@ -98,16 +106,21 @@ func (ledgerState *LedgerState) GetReality(id RealityId) *objectstorage.CachedOb
}
}
func (ledgerState *LedgerState) BookTransfer(transfer *Transfer) {
func (ledgerState *LedgerState) BookTransfer(transfer *Transfer) error {
inputs := ledgerState.getTransferInputs(transfer)
targetReality := ledgerState.getTargetReality(inputs)
targetReality.Get().(*Reality).bookTransfer(transfer.GetHash(), inputs, transfer.GetOutputs())
defer targetReality.Release()
if bookingErr := targetReality.Get().(*Reality).bookTransfer(transfer.GetHash(), inputs, transfer.GetOutputs()); bookingErr != nil {
return bookingErr
}
if !targetReality.IsStored() {
targetReality.Store()
}
targetReality.Release()
return nil
}
func (ledgerState *LedgerState) MergeRealities(realityIds ...RealityId) *objectstorage.CachedObject {
......
......@@ -78,5 +78,5 @@ func Test(t *testing.T) {
})
return true
}, MAIN_REALITY_ID, addressHash1)
})
}
......@@ -2,6 +2,7 @@ package ledgerstate
import (
"encoding/binary"
"fmt"
"github.com/iotaledger/goshimmer/packages/errors"
......@@ -118,6 +119,13 @@ func (reality *Reality) checkTransferBalances(inputs []*objectstorage.CachedObje
return nil
}
func (reality *Reality) CreateReality(id RealityId) *objectstorage.CachedObject {
newReality := newReality(id, reality.id)
newReality.ledgerState = reality.ledgerState
return reality.ledgerState.realities.Store(newReality)
}
func (reality *Reality) BookTransfer(transfer *Transfer) error {
return reality.bookTransfer(transfer.GetHash(), reality.ledgerState.getTransferInputs(transfer), transfer.GetOutputs())
}
......@@ -128,12 +136,32 @@ func (reality *Reality) bookTransfer(transferHash TransferHash, inputs []*object
return err
}
// mark inputs as spent / trigger double spend detection
conflicting := false
for _, input := range inputs {
consumedTransferOutput := input.Get().(*TransferOutput)
inputConflicting, err := consumedTransferOutput.addConsumer(transferHash)
if err != nil {
return err
}
conflicting = conflicting || inputConflicting
}
if conflicting {
fmt.Println("CONFLICT DETECTED")
var targetRealityId RealityId
copy(targetRealityId[:], transferHash[:])
cachedTargetReality := reality.CreateReality(targetRealityId)
cachedTargetReality.Store()
cachedTargetReality.Get().(*Reality).bookTransferOutputs(transferHash, outputs)
cachedTargetReality.Release()
} else {
// book new transfer outputs into target reality
reality.bookTransferOutputs(transferHash, outputs)
// mark inputs as spent / trigger double spend detection
for _, x := range inputs {
x.Get().(*TransferOutput).addConsumer(transferHash)
}
// 5. release objects
......
......@@ -55,7 +55,7 @@ func (transferOutput *TransferOutput) GetBalances() []*ColoredBalance {
return transferOutput.balances
}
func (transferOutput *TransferOutput) addConsumer(consumer TransferHash) error {
func (transferOutput *TransferOutput) addConsumer(consumer TransferHash) (conflicting bool, err error) {
transferOutput.consumersMutex.RLock()
if _, exist := transferOutput.consumers[consumer]; exist {
transferOutput.consumersMutex.RUnlock()
......@@ -63,19 +63,17 @@ func (transferOutput *TransferOutput) addConsumer(consumer TransferHash) error {
transferOutput.consumersMutex.RUnlock()
transferOutput.consumersMutex.Lock()
if len(transferOutput.consumers) == 0 {
if err := transferOutput.markAsSpent(); err != nil {
return err
if conflicting = len(transferOutput.consumers) != 0; !conflicting {
if markAsSpentErr := transferOutput.markAsSpent(); markAsSpentErr != nil {
err = markAsSpentErr
}
} else {
//return errors.New("DOUBLE SPEND DETECTED")
}
transferOutput.consumers[consumer] = void
transferOutput.consumersMutex.Unlock()
}
return nil
return
}
func (transferOutput *TransferOutput) getConsumers() (consumers map[TransferHash]empty) {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment