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

Feat: ledgerstate now automatically books into the correct reality

parent 070f4c32
Branches
No related tags found
No related merge requests found
package ledgerstate
import (
"fmt"
"reflect"
"sort"
......@@ -100,19 +99,13 @@ func (ledgerState *LedgerState) GetReality(id RealityId) *objectstorage.CachedOb
}
func (ledgerState *LedgerState) BookTransfer(transfer *Transfer) {
transferHash := transfer.GetHash()
inputs := ledgerState.getTransferInputs(transfer)
outputs := transfer.GetOutputs()
targetReality := ledgerState.getTargetReality(inputs)
targetReality.Get().(*Reality).bookTransfer(transfer.GetHash(), inputs, transfer.GetOutputs())
targetReality.Persist()
targetReality.Release()
for _, x := range inputs {
x.Get().(*TransferOutput).addConsumer(transferHash)
}
// mark inputs as consumed / changed spent/unspent booking
targetReality.Get().(*Reality).bookTransferOutputs(transferHash, outputs)
fmt.Println("BOOK TO: ", targetReality.Get())
}
func (ledgerState *LedgerState) MergeRealities(realityIds ...RealityId) *objectstorage.CachedObject {
......
......@@ -2,6 +2,7 @@ package ledgerstate
import (
"encoding/binary"
"fmt"
"github.com/iotaledger/goshimmer/packages/errors"
......@@ -114,17 +115,28 @@ func (reality *Reality) checkTransferBalances(inputs []*objectstorage.CachedObje
}
func (reality *Reality) BookTransfer(transfer *Transfer) error {
transferHash := transfer.GetHash()
inputs := reality.ledgerState.getTransferInputs(transfer)
outputs := transfer.GetOutputs()
return reality.bookTransfer(transfer.GetHash(), reality.ledgerState.getTransferInputs(transfer), transfer.GetOutputs())
}
func (reality *Reality) bookTransfer(transferHash TransferHash, inputs []*objectstorage.CachedObject, outputs map[AddressHash][]*ColoredBalance) error {
if err := reality.checkTransferBalances(inputs, outputs); err != nil {
return err
}
// process outputs
// 1. determine target reality
// 2. check if transfer is valid within target reality
// 3. book new transfer outputs into target reality
// 4. mark inputs as spent / trigger double spend detection
// 5. release objects
// register consumer
for _, x := range inputs {
x.Get().(*TransferOutput).addConsumer(transferHash)
}
reality.bookTransferOutputs(transferHash, outputs)
fmt.Println("BOOK TO: ", reality)
return nil
}
......
......@@ -4,6 +4,8 @@ import (
"encoding/binary"
"sync"
"github.com/iotaledger/goshimmer/packages/errors"
"github.com/iotaledger/goshimmer/packages/objectstorage"
"github.com/iotaledger/goshimmer/packages/stringify"
)
......@@ -53,26 +55,27 @@ func (transferOutput *TransferOutput) GetBalances() []*ColoredBalance {
return transferOutput.balances
}
func (transferOutput *TransferOutput) addConsumer(consumer TransferHash) bool {
func (transferOutput *TransferOutput) addConsumer(consumer TransferHash) error {
transferOutput.consumersMutex.RLock()
if _, exist := transferOutput.consumers[consumer]; exist {
transferOutput.consumersMutex.RUnlock()
return false
} else {
transferOutput.consumersMutex.RUnlock()
transferOutput.consumersMutex.Lock()
if len(transferOutput.consumers) == 0 {
transferOutput.markAsSpent()
if err := transferOutput.markAsSpent(); err != nil {
return err
}
} else {
panic("DOUBLE SPEND DETECTED")
}
transferOutput.consumers[consumer] = void
transferOutput.consumersMutex.Unlock()
return true
}
return nil
}
func (transferOutput *TransferOutput) getConsumers() (consumers map[TransferHash]empty) {
......@@ -83,13 +86,13 @@ func (transferOutput *TransferOutput) getConsumers() (consumers map[TransferHash
return
}
func (transferOutput *TransferOutput) markAsSpent() {
func (transferOutput *TransferOutput) markAsSpent() error {
currentBookingKey := generateTransferOutputBookingStorageKey(transferOutput.realityId, transferOutput.addressHash, false, transferOutput.transferHash)
if cachedTransferOutputBooking, err := transferOutput.ledgerState.transferOutputBookings.Load(currentBookingKey); err != nil {
panic(err)
return err
} else if !cachedTransferOutputBooking.Exists() {
panic("could not find TransferOutputBooking")
return errors.New("could not find TransferOutputBooking")
} else {
transferOutputBooking := cachedTransferOutputBooking.Get().(*TransferOutputBooking)
transferOutput.ledgerState.storeTransferOutputBooking(newTransferOutputBooking(transferOutputBooking.GetRealityId(), transferOutputBooking.GetAddressHash(), true, transferOutputBooking.GetTransferHash())).Release()
......@@ -97,6 +100,8 @@ func (transferOutput *TransferOutput) markAsSpent() {
cachedTransferOutputBooking.Delete()
cachedTransferOutputBooking.Release()
}
return nil
}
func (transferOutput *TransferOutput) String() string {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment