diff --git a/packages/ledgerstate/color.go b/packages/ledgerstate/coloredcoins/color.go similarity index 78% rename from packages/ledgerstate/color.go rename to packages/ledgerstate/coloredcoins/color.go index f358be897fe487ed2132e9517951a4b5eab177c3..9ff9559400132de925c58fcb0ccf7b40bc0b2d37 100644 --- a/packages/ledgerstate/color.go +++ b/packages/ledgerstate/coloredcoins/color.go @@ -1,4 +1,4 @@ -package ledgerstate +package coloredcoins import ( "unicode/utf8" @@ -6,7 +6,7 @@ import ( "github.com/iotaledger/goshimmer/packages/stringify" ) -type Color [colorLength]byte +type Color [ColorLength]byte func NewColor(color string) (result Color) { copy(result[:], color) @@ -15,7 +15,7 @@ func NewColor(color string) (result Color) { } func (color *Color) UnmarshalBinary(data []byte) error { - copy(color[:], data[:colorLength]) + copy(color[:], data[:ColorLength]) return nil } @@ -28,4 +28,4 @@ func (color Color) String() string { } } -const colorLength = 32 +const ColorLength = 32 diff --git a/packages/ledgerstate/colored_balance.go b/packages/ledgerstate/coloredcoins/colored_balance.go similarity index 77% rename from packages/ledgerstate/colored_balance.go rename to packages/ledgerstate/coloredcoins/colored_balance.go index 961531f7298136c20d1c00f199f2437fca87813a..898a0d9a58840220b64c0a0513925173796f0160 100644 --- a/packages/ledgerstate/colored_balance.go +++ b/packages/ledgerstate/coloredcoins/colored_balance.go @@ -1,4 +1,4 @@ -package ledgerstate +package coloredcoins import ( "encoding/binary" @@ -21,7 +21,7 @@ func (balance *ColoredBalance) GetColor() Color { return balance.color } -func (balance *ColoredBalance) GetValue() uint64 { +func (balance *ColoredBalance) GetBalance() uint64 { return balance.balance } @@ -31,7 +31,7 @@ func (balance *ColoredBalance) UnmarshalBinary(data []byte) error { return err } - balance.balance = binary.LittleEndian.Uint64(data[colorLength:]) + balance.balance = binary.LittleEndian.Uint64(data[ColorLength:]) return nil } @@ -41,5 +41,5 @@ func (coloredBalance *ColoredBalance) String() string { } const ( - coloredBalanceLength = colorLength + 8 // color + 64 Bit / 8 Byte value + BalanceLength = ColorLength + 8 // color + 64 Bit / 8 Byte value ) diff --git a/packages/ledgerstate/ledgerstate.go b/packages/ledgerstate/ledgerstate.go index b77199731ec8ee778bef5bba3174164ab845b424..0635956e1069feeef5e81f31d6b6542c091f9512 100644 --- a/packages/ledgerstate/ledgerstate.go +++ b/packages/ledgerstate/ledgerstate.go @@ -7,13 +7,13 @@ import ( "strings" "time" + "github.com/iotaledger/goshimmer/packages/ledgerstate/coloredcoins" + "github.com/iotaledger/goshimmer/packages/binary/address" + "github.com/iotaledger/goshimmer/packages/graphviz" "github.com/iotaledger/goshimmer/packages/ledgerstate/conflict" "github.com/iotaledger/goshimmer/packages/ledgerstate/reality" "github.com/iotaledger/goshimmer/packages/ledgerstate/transfer" - "github.com/iotaledger/goshimmer/packages/ledgerstate/transferoutput" - - "github.com/iotaledger/goshimmer/packages/graphviz" "golang.org/x/crypto/blake2b" @@ -48,7 +48,7 @@ func NewLedgerState(storageId string) *LedgerState { return result } -func (ledgerState *LedgerState) AddTransferOutput(transferHash transfer.Hash, addressHash address.Address, balances ...*ColoredBalance) *LedgerState { +func (ledgerState *LedgerState) AddTransferOutput(transferHash transfer.Hash, addressHash address.Address, balances ...*coloredcoins.ColoredBalance) *LedgerState { ledgerState.GetReality(MAIN_REALITY_ID).Consume(func(object objectstorage.StorableObject) { mainReality := object.(*Reality) @@ -58,7 +58,7 @@ func (ledgerState *LedgerState) AddTransferOutput(transferHash transfer.Hash, ad return ledgerState } -func (ledgerState *LedgerState) GetTransferOutput(transferOutputReference *transferoutput.Reference) *objectstorage.CachedObject { +func (ledgerState *LedgerState) GetTransferOutput(transferOutputReference *transfer.OutputReference) *objectstorage.CachedObject { if cachedTransferOutput, err := ledgerState.transferOutputs.Load(transferOutputReference.GetStorageKey()); err != nil { panic(err) } else { @@ -98,7 +98,7 @@ func (ledgerState *LedgerState) ForEachTransferOutput(callback func(object *obje booking := cachedObject.Get().(*TransferOutputBooking) cachedObject.Release() - return callback(ledgerState.GetTransferOutput(transferoutput.NewTransferOutputReference(booking.GetTransferHash(), booking.GetAddressHash()))) + return callback(ledgerState.GetTransferOutput(transfer.NewOutputReference(booking.GetTransferHash(), booking.GetAddressHash()))) }, prefix); err != nil { panic(err) } @@ -155,7 +155,7 @@ func (ledgerState *LedgerState) GetReality(id reality.Id) *objectstorage.CachedO } } -func (ledgerState *LedgerState) BookTransfer(transfer *Transfer) (err error) { +func (ledgerState *LedgerState) BookTransfer(transfer *transfer.Transfer) (err error) { inputs := ledgerState.getTransferInputs(transfer) ledgerState.getTargetReality(inputs).Consume(func(object objectstorage.StorableObject) { @@ -534,7 +534,7 @@ func (ledgerState *LedgerState) getTargetReality(inputs []*objectstorage.CachedO return ledgerState.AggregateRealities(realityIds...) } -func (ledgerState *LedgerState) getTransferInputs(transfer *Transfer) []*objectstorage.CachedObject { +func (ledgerState *LedgerState) getTransferInputs(transfer *transfer.Transfer) []*objectstorage.CachedObject { inputs := transfer.GetInputs() result := make([]*objectstorage.CachedObject, len(inputs)) diff --git a/packages/ledgerstate/ledgerstate_test.go b/packages/ledgerstate/ledgerstate_test.go index 2a06ee70554f91ffd8f08c95c7dc5dc574be2bf6..9f187dc15c6c69d4cc55d3a3e6ba26a51e01368a 100644 --- a/packages/ledgerstate/ledgerstate_test.go +++ b/packages/ledgerstate/ledgerstate_test.go @@ -6,18 +6,18 @@ import ( "testing" "time" + "github.com/iotaledger/goshimmer/packages/ledgerstate/coloredcoins" + "github.com/iotaledger/goshimmer/packages/binary/address" "github.com/iotaledger/goshimmer/packages/ledgerstate/reality" "github.com/iotaledger/goshimmer/packages/ledgerstate/transfer" - "github.com/iotaledger/goshimmer/packages/ledgerstate/transferoutput" - "github.com/iotaledger/hive.go/objectstorage" "github.com/iotaledger/hive.go/parameter" ) var ( - iota_ = NewColor("IOTA") - eth = NewColor("ETH") + iota_ = coloredcoins.NewColor("IOTA") + eth = coloredcoins.NewColor("ETH") transferHash1 = transfer.NewHash("TRANSFER1") transferHash2 = transfer.NewHash("TRANSFER2") transferHash3 = transfer.NewHash("TRANSFER3") @@ -41,7 +41,7 @@ func init() { func Benchmark(b *testing.B) { ledgerState := NewLedgerState("testLedger").Prune().AddTransferOutput( - transferHash1, addressHash1, NewColoredBalance(eth, 1024), + transferHash1, addressHash1, coloredcoins.NewColoredBalance(eth, 1024), ) b.ResetTimer() @@ -51,10 +51,10 @@ func Benchmark(b *testing.B) { for i := 0; i < b.N; i++ { newTransferHash := transfer.NewHash(strconv.Itoa(i)) - if err := ledgerState.BookTransfer(NewTransfer(newTransferHash).AddInput( - transferoutput.NewTransferOutputReference(lastTransferHash, addressHash1), + if err := ledgerState.BookTransfer(transfer.NewTransfer(newTransferHash).AddInput( + transfer.NewOutputReference(lastTransferHash, addressHash1), ).AddOutput( - addressHash1, NewColoredBalance(eth, 1024), + addressHash1, coloredcoins.NewColoredBalance(eth, 1024), )); err != nil { b.Error(err) } @@ -65,37 +65,37 @@ func Benchmark(b *testing.B) { func Test(t *testing.T) { ledgerState := NewLedgerState("testLedger").Prune().AddTransferOutput( - transferHash1, addressHash1, NewColoredBalance(eth, 1337), NewColoredBalance(iota_, 1338), + transferHash1, addressHash1, coloredcoins.NewColoredBalance(eth, 1337), coloredcoins.NewColoredBalance(iota_, 1338), ) ledgerState.CreateReality(pendingReality) - transfer := NewTransfer(transferHash2).AddInput( - transferoutput.NewTransferOutputReference(transferHash1, addressHash1), + transfer1 := transfer.NewTransfer(transferHash2).AddInput( + transfer.NewOutputReference(transferHash1, addressHash1), ).AddOutput( - addressHash3, NewColoredBalance(iota_, 338), + addressHash3, coloredcoins.NewColoredBalance(iota_, 338), ).AddOutput( - addressHash3, NewColoredBalance(eth, 337), + addressHash3, coloredcoins.NewColoredBalance(eth, 337), ).AddOutput( - addressHash4, NewColoredBalance(iota_, 1000), + addressHash4, coloredcoins.NewColoredBalance(iota_, 1000), ).AddOutput( - addressHash4, NewColoredBalance(eth, 1000), + addressHash4, coloredcoins.NewColoredBalance(eth, 1000), ) - if err := ledgerState.BookTransfer(transfer); err != nil { + if err := ledgerState.BookTransfer(transfer1); err != nil { t.Error(err) } - if err := ledgerState.BookTransfer(NewTransfer(transferHash3).AddInput( - transferoutput.NewTransferOutputReference(transferHash1, addressHash1), + if err := ledgerState.BookTransfer(transfer.NewTransfer(transferHash3).AddInput( + transfer.NewOutputReference(transferHash1, addressHash1), ).AddOutput( - addressHash3, NewColoredBalance(iota_, 338), + addressHash3, coloredcoins.NewColoredBalance(iota_, 338), ).AddOutput( - addressHash3, NewColoredBalance(eth, 337), + addressHash3, coloredcoins.NewColoredBalance(eth, 337), ).AddOutput( - addressHash4, NewColoredBalance(iota_, 1000), + addressHash4, coloredcoins.NewColoredBalance(iota_, 1000), ).AddOutput( - addressHash4, NewColoredBalance(eth, 1000), + addressHash4, coloredcoins.NewColoredBalance(eth, 1000), )); err != nil { t.Error(err) } @@ -129,22 +129,22 @@ func generateRandomAddressHash() address.Address { return address.New([]byte("ADDRESS" + strconv.Itoa(addressHashCounter))) } -func initializeLedgerStateWithBalances(numberOfBalances int) (ledgerState *LedgerState, result []*transferoutput.Reference) { +func initializeLedgerStateWithBalances(numberOfBalances int) (ledgerState *LedgerState, result []*transfer.OutputReference) { ledgerState = NewLedgerState("testLedger").Prune() for i := 0; i < numberOfBalances; i++ { transferHash := generateRandomTransferHash() addressHash := generateRandomAddressHash() - ledgerState.AddTransferOutput(transferHash, addressHash, NewColoredBalance(iota_, 1024)) + ledgerState.AddTransferOutput(transferHash, addressHash, coloredcoins.NewColoredBalance(iota_, 1024)) - result = append(result, transferoutput.NewTransferOutputReference(transferHash, addressHash)) + result = append(result, transfer.NewOutputReference(transferHash, addressHash)) } return } -func doubleSpend(ledgerState *LedgerState, transferOutputReference *transferoutput.Reference) (result []*transferoutput.Reference) { +func doubleSpend(ledgerState *LedgerState, transferOutputReference *transfer.OutputReference) (result []*transfer.OutputReference) { for i := 0; i < 2; i++ { result = append(result, spend(ledgerState, transferOutputReference)) } @@ -152,41 +152,41 @@ func doubleSpend(ledgerState *LedgerState, transferOutputReference *transferoutp return } -func spend(ledgerState *LedgerState, transferOutputReferences ...*transferoutput.Reference) (result *transferoutput.Reference) { +func spend(ledgerState *LedgerState, transferOutputReferences ...*transfer.OutputReference) (result *transfer.OutputReference) { transferHash := generateRandomTransferHash() addressHash := generateRandomAddressHash() totalInputBalance := uint64(0) - transfer := NewTransfer(transferHash) + transfer1 := transfer.NewTransfer(transferHash) for _, transferOutputReference := range transferOutputReferences { ledgerState.GetTransferOutput(transferOutputReference).Consume(func(object objectstorage.StorableObject) { transferOutput := object.(*TransferOutput) for _, coloredBalance := range transferOutput.GetBalances() { - totalInputBalance += coloredBalance.GetValue() + totalInputBalance += coloredBalance.GetBalance() } }) - transfer.AddInput(transferOutputReference) + transfer1.AddInput(transferOutputReference) } - transfer.AddOutput( - addressHash, NewColoredBalance(iota_, totalInputBalance), + transfer1.AddOutput( + addressHash, coloredcoins.NewColoredBalance(iota_, totalInputBalance), ) - if err := ledgerState.BookTransfer(transfer); err != nil { + if err := ledgerState.BookTransfer(transfer1); err != nil { panic(err) } - result = transferoutput.NewTransferOutputReference(transferHash, addressHash) + result = transfer.NewOutputReference(transferHash, addressHash) return } -func multiSpend(ledgerState *LedgerState, outputCount int, transferOutputReferences ...*transferoutput.Reference) (result []*transferoutput.Reference) { +func multiSpend(ledgerState *LedgerState, outputCount int, transferOutputReferences ...*transfer.OutputReference) (result []*transfer.OutputReference) { transferHash := generateRandomTransferHash() - transfer := NewTransfer(transferHash) + transfer1 := transfer.NewTransfer(transferHash) totalInputBalance := uint64(0) for _, transferOutputReference := range transferOutputReferences { @@ -194,24 +194,24 @@ func multiSpend(ledgerState *LedgerState, outputCount int, transferOutputReferen transferOutput := object.(*TransferOutput) for _, coloredBalance := range transferOutput.GetBalances() { - totalInputBalance += coloredBalance.GetValue() + totalInputBalance += coloredBalance.GetBalance() } }) - transfer.AddInput(transferOutputReference) + transfer1.AddInput(transferOutputReference) } for i := 0; i < outputCount; i++ { addressHash := generateRandomAddressHash() - transfer.AddOutput( - addressHash, NewColoredBalance(iota_, totalInputBalance/uint64(outputCount)), + transfer1.AddOutput( + addressHash, coloredcoins.NewColoredBalance(iota_, totalInputBalance/uint64(outputCount)), ) - result = append(result, transferoutput.NewTransferOutputReference(transferHash, addressHash)) + result = append(result, transfer.NewOutputReference(transferHash, addressHash)) } - if err := ledgerState.BookTransfer(transfer); err != nil { + if err := ledgerState.BookTransfer(transfer1); err != nil { panic(err) } @@ -291,61 +291,61 @@ func TestElevateAggregatedReality(t *testing.T) { func TestElevate(t *testing.T) { ledgerState := NewLedgerState("testLedger").Prune().AddTransferOutput( - transferHash1, addressHash1, NewColoredBalance(eth, 1337), NewColoredBalance(iota_, 1338), + transferHash1, addressHash1, coloredcoins.NewColoredBalance(eth, 1337), coloredcoins.NewColoredBalance(iota_, 1338), ) // create first legit spend - if err := ledgerState.BookTransfer(NewTransfer(transferHash2).AddInput( - transferoutput.NewTransferOutputReference(transferHash1, addressHash1), + if err := ledgerState.BookTransfer(transfer.NewTransfer(transferHash2).AddInput( + transfer.NewOutputReference(transferHash1, addressHash1), ).AddOutput( - addressHash2, NewColoredBalance(iota_, 1338), + addressHash2, coloredcoins.NewColoredBalance(iota_, 1338), ).AddOutput( - addressHash2, NewColoredBalance(eth, 1337), + addressHash2, coloredcoins.NewColoredBalance(eth, 1337), )); err != nil { t.Error(err) } // send funds further - if err := ledgerState.BookTransfer(NewTransfer(transferHash3).AddInput( - transferoutput.NewTransferOutputReference(transferHash2, addressHash2), + if err := ledgerState.BookTransfer(transfer.NewTransfer(transferHash3).AddInput( + transfer.NewOutputReference(transferHash2, addressHash2), ).AddOutput( - addressHash4, NewColoredBalance(iota_, 1338), + addressHash4, coloredcoins.NewColoredBalance(iota_, 1338), ).AddOutput( - addressHash4, NewColoredBalance(eth, 1337), + addressHash4, coloredcoins.NewColoredBalance(eth, 1337), )); err != nil { t.Error(err) } - if err := ledgerState.BookTransfer(NewTransfer(transferHash4).AddInput( - transferoutput.NewTransferOutputReference(transferHash2, addressHash2), + if err := ledgerState.BookTransfer(transfer.NewTransfer(transferHash4).AddInput( + transfer.NewOutputReference(transferHash2, addressHash2), ).AddOutput( - addressHash4, NewColoredBalance(iota_, 1338), + addressHash4, coloredcoins.NewColoredBalance(iota_, 1338), ).AddOutput( - addressHash4, NewColoredBalance(eth, 1337), + addressHash4, coloredcoins.NewColoredBalance(eth, 1337), )); err != nil { t.Error(err) } // aggregate realities - if err := ledgerState.BookTransfer(NewTransfer(transferHash6).AddInput( - transferoutput.NewTransferOutputReference(transferHash3, addressHash4), + if err := ledgerState.BookTransfer(transfer.NewTransfer(transferHash6).AddInput( + transfer.NewOutputReference(transferHash3, addressHash4), ).AddInput( - transferoutput.NewTransferOutputReference(transferHash4, addressHash4), + transfer.NewOutputReference(transferHash4, addressHash4), ).AddOutput( - addressHash6, NewColoredBalance(iota_, 2676), + addressHash6, coloredcoins.NewColoredBalance(iota_, 2676), ).AddOutput( - addressHash6, NewColoredBalance(eth, 2674), + addressHash6, coloredcoins.NewColoredBalance(eth, 2674), )); err != nil { t.Error(err) } // create double spend for first transfer - if err := ledgerState.BookTransfer(NewTransfer(transferHash5).AddInput( - transferoutput.NewTransferOutputReference(transferHash1, addressHash1), + if err := ledgerState.BookTransfer(transfer.NewTransfer(transferHash5).AddInput( + transfer.NewOutputReference(transferHash1, addressHash1), ).AddOutput( - addressHash5, NewColoredBalance(iota_, 1338), + addressHash5, coloredcoins.NewColoredBalance(iota_, 1338), ).AddOutput( - addressHash5, NewColoredBalance(eth, 1337), + addressHash5, coloredcoins.NewColoredBalance(eth, 1337), )); err != nil { t.Error(err) } diff --git a/packages/ledgerstate/outputs.png b/packages/ledgerstate/outputs.png index 4f396a60bd9ff563f8c114e18503e0e8861136c4..ce7f548b9857d355346331a8008d96e8f6de8cb7 100644 Binary files a/packages/ledgerstate/outputs.png and b/packages/ledgerstate/outputs.png differ diff --git a/packages/ledgerstate/outputs1.png b/packages/ledgerstate/outputs1.png index 32cba365ac6243874aec87794a9b37f383187ff7..a6229704104a7d5650f31e3e0cb29f9f48ae1680 100644 Binary files a/packages/ledgerstate/outputs1.png and b/packages/ledgerstate/outputs1.png differ diff --git a/packages/ledgerstate/outputs2.png b/packages/ledgerstate/outputs2.png index c899a4d0b89b37819f232d6f2bc86f1ccd9d1ab6..519d74e560be00d067d74190b6235e40afbad358 100644 Binary files a/packages/ledgerstate/outputs2.png and b/packages/ledgerstate/outputs2.png differ diff --git a/packages/ledgerstate/reality.go b/packages/ledgerstate/reality.go index d609e9e948bbac68fd6d792e4123d839fbf0f62f..de16e625c002c23cb6810d90ee9dde926e08d363 100644 --- a/packages/ledgerstate/reality.go +++ b/packages/ledgerstate/reality.go @@ -4,13 +4,14 @@ import ( "sync" "sync/atomic" + "github.com/iotaledger/goshimmer/packages/ledgerstate/coloredcoins" + "github.com/iotaledger/goshimmer/packages/binary/address" "github.com/iotaledger/goshimmer/packages/binary/types" "github.com/iotaledger/goshimmer/packages/errors" "github.com/iotaledger/goshimmer/packages/ledgerstate/conflict" "github.com/iotaledger/goshimmer/packages/ledgerstate/reality" "github.com/iotaledger/goshimmer/packages/ledgerstate/transfer" - "github.com/iotaledger/goshimmer/packages/ledgerstate/transferoutput" "github.com/iotaledger/goshimmer/packages/stringify" "github.com/iotaledger/hive.go/objectstorage" @@ -422,7 +423,7 @@ func (mreality *Reality) CreateReality(id reality.Id) *objectstorage.CachedObjec } // Books a transfer into this reality (wrapper for the private bookTransfer function). -func (mreality *Reality) BookTransfer(transfer *Transfer) (err error) { +func (mreality *Reality) BookTransfer(transfer *transfer.Transfer) (err error) { err = mreality.bookTransfer(transfer.GetHash(), mreality.ledgerState.getTransferInputs(transfer), transfer.GetOutputs()) return @@ -449,7 +450,7 @@ func (mreality *Reality) String() (result string) { } // Books a transfer into this reality (contains the dispatcher for the actual tasks). -func (mreality *Reality) bookTransfer(transferHash transfer.Hash, inputs objectstorage.CachedObjects, outputs map[address.Address][]*ColoredBalance) (err error) { +func (mreality *Reality) bookTransfer(transferHash transfer.Hash, inputs objectstorage.CachedObjects, outputs map[address.Address][]*coloredcoins.ColoredBalance) (err error) { if err = mreality.verifyTransfer(inputs, outputs); err != nil { return } @@ -470,8 +471,8 @@ func (mreality *Reality) bookTransfer(transferHash transfer.Hash, inputs objects } // Internal utility function that verifies the transfer and checks if it is valid (inputs exist + the net balance is 0). -func (mreality *Reality) verifyTransfer(inputs []*objectstorage.CachedObject, outputs map[address.Address][]*ColoredBalance) error { - totalColoredBalances := make(map[Color]uint64) +func (mreality *Reality) verifyTransfer(inputs []*objectstorage.CachedObject, outputs map[address.Address][]*coloredcoins.ColoredBalance) error { + totalColoredBalances := make(map[coloredcoins.Color]uint64) for _, cachedInput := range inputs { if !cachedInput.Exists() { @@ -484,7 +485,7 @@ func (mreality *Reality) verifyTransfer(inputs []*objectstorage.CachedObject, ou } for _, balance := range input.GetBalances() { - totalColoredBalances[balance.GetColor()] += balance.GetValue() + totalColoredBalances[balance.GetColor()] += balance.GetBalance() } } @@ -492,7 +493,7 @@ func (mreality *Reality) verifyTransfer(inputs []*objectstorage.CachedObject, ou for _, balance := range transferOutput { color := balance.GetColor() - totalColoredBalances[color] -= balance.GetValue() + totalColoredBalances[color] -= balance.GetBalance() if totalColoredBalances[color] == 0 { delete(totalColoredBalances, color) @@ -510,7 +511,7 @@ func (mreality *Reality) verifyTransfer(inputs []*objectstorage.CachedObject, ou // Internal utility function that marks the consumed inputs as spent and returns the corresponding conflicts if the // inputs have been consumed before. -func (mreality *Reality) consumeInputs(inputs objectstorage.CachedObjects, transferHash transfer.Hash, outputs map[address.Address][]*ColoredBalance) (conflicts objectstorage.CachedObjects, err error) { +func (mreality *Reality) consumeInputs(inputs objectstorage.CachedObjects, transferHash transfer.Hash, outputs map[address.Address][]*coloredcoins.ColoredBalance) (conflicts objectstorage.CachedObjects, err error) { conflicts = make(objectstorage.CachedObjects, 0) for _, input := range inputs { @@ -538,7 +539,7 @@ func (mreality *Reality) consumeInputs(inputs objectstorage.CachedObjects, trans // // If the inputs have been used before and we consequently have a non-empty list of conflicts, we first create a new // reality for the inputs and then book the transfer outputs into the correct reality. -func (mreality *Reality) createTransferOutputs(transferHash transfer.Hash, outputs map[address.Address][]*ColoredBalance, conflicts objectstorage.CachedObjects) (err error) { +func (mreality *Reality) createTransferOutputs(transferHash transfer.Hash, outputs map[address.Address][]*coloredcoins.ColoredBalance, conflicts objectstorage.CachedObjects) (err error) { if len(conflicts) >= 1 { targetRealityId := transferHash.ToRealityId() @@ -639,7 +640,7 @@ func (mreality *Reality) createRealityForPreviouslyUnconflictingConsumers(consum // Reality is created the first time). if realityIsNew { for _, addressHash := range addressHashes { - if err = mreality.elevateTransferOutput(transferoutput.NewTransferOutputReference(transferHash, addressHash), elevatedReality); err != nil { + if err = mreality.elevateTransferOutput(transfer.NewOutputReference(transferHash, addressHash), elevatedReality); err != nil { return } } @@ -652,7 +653,7 @@ func (mreality *Reality) createRealityForPreviouslyUnconflictingConsumers(consum } // Private utility function that elevates a transfer output to the given reality. -func (mreality *Reality) elevateTransferOutput(transferOutputReference *transferoutput.Reference, newReality *Reality) (err error) { +func (mreality *Reality) elevateTransferOutput(transferOutputReference *transfer.OutputReference, newReality *Reality) (err error) { if cachedTransferOutputToElevate := mreality.ledgerState.GetTransferOutput(transferOutputReference); !cachedTransferOutputToElevate.Exists() { err = errors.New("could not find TransferOutput to elevate") } else { @@ -678,7 +679,7 @@ func (mreality *Reality) elevateTransferOutput(transferOutputReference *transfer func (mreality *Reality) elevateTransferOutputOfCurrentReality(transferOutput *TransferOutput, newReality *Reality) (err error) { for transferHash, addresses := range transferOutput.GetConsumers() { for _, addressHash := range addresses { - if elevateErr := mreality.elevateTransferOutput(transferoutput.NewTransferOutputReference(transferHash, addressHash), newReality); elevateErr != nil { + if elevateErr := mreality.elevateTransferOutput(transfer.NewOutputReference(transferHash, addressHash), newReality); elevateErr != nil { err = elevateErr return diff --git a/packages/ledgerstate/transfer.go b/packages/ledgerstate/transfer.go deleted file mode 100644 index 591dc2aa143e5595b73f9605f923a3609b49cc50..0000000000000000000000000000000000000000 --- a/packages/ledgerstate/transfer.go +++ /dev/null @@ -1,57 +0,0 @@ -package ledgerstate - -import ( - "github.com/iotaledger/goshimmer/packages/binary/address" - "github.com/iotaledger/goshimmer/packages/ledgerstate/transfer" - "github.com/iotaledger/goshimmer/packages/ledgerstate/transferoutput" -) - -type Transfer struct { - hash transfer.Hash - inputs []*transferoutput.Reference - outputs map[address.Address][]*ColoredBalance -} - -func NewTransfer(transferHash transfer.Hash) *Transfer { - return &Transfer{ - hash: transferHash, - inputs: make([]*transferoutput.Reference, 0), - outputs: make(map[address.Address][]*ColoredBalance), - } -} - -func (transfer *Transfer) GetHash() transfer.Hash { - return transfer.hash -} - -func (transfer *Transfer) GetInputs() []*transferoutput.Reference { - return transfer.inputs -} - -func (transfer *Transfer) AddInput(input *transferoutput.Reference) *Transfer { - transfer.inputs = append(transfer.inputs, input) - - return transfer -} - -func (transfer *Transfer) AddOutput(address address.Address, balance *ColoredBalance) *Transfer { - if _, addressExists := transfer.outputs[address]; !addressExists { - transfer.outputs[address] = make([]*ColoredBalance, 0) - } - - transfer.outputs[address] = append(transfer.outputs[address], balance) - - return transfer -} - -func (transfer *Transfer) GetOutputs() map[address.Address][]*ColoredBalance { - return transfer.outputs -} - -func (transfer *Transfer) MarshalBinary() (data []byte, err error) { - return -} - -func (transfer *Transfer) UnmarshalBinary(data []byte) (err error) { - return -} diff --git a/packages/ledgerstate/transferoutput/reference.go b/packages/ledgerstate/transfer/output_reference.go similarity index 59% rename from packages/ledgerstate/transferoutput/reference.go rename to packages/ledgerstate/transfer/output_reference.go index 988553f7f73555640b3aed8ed8cc56bf1d35bff8..bbdcef2f5555d6717b564e700294c6ad4f00317e 100644 --- a/packages/ledgerstate/transferoutput/reference.go +++ b/packages/ledgerstate/transfer/output_reference.go @@ -1,30 +1,29 @@ -package transferoutput +package transfer import ( "github.com/iotaledger/goshimmer/packages/binary/address" - "github.com/iotaledger/goshimmer/packages/ledgerstate/transfer" "github.com/iotaledger/goshimmer/packages/stringify" ) -type Reference struct { +type OutputReference struct { storageKey []byte - transferHash transfer.Hash + transferHash Hash addressHash address.Address } -func NewTransferOutputReference(transferHash transfer.Hash, addressHash address.Address) *Reference { - return &Reference{ +func NewOutputReference(transferHash Hash, addressHash address.Address) *OutputReference { + return &OutputReference{ storageKey: append(transferHash[:], addressHash[:]...), transferHash: transferHash, addressHash: addressHash, } } -func (reference *Reference) GetStorageKey() []byte { +func (reference *OutputReference) GetStorageKey() []byte { return reference.storageKey } -func (reference *Reference) String() string { +func (reference *OutputReference) String() string { return stringify.Struct("TransferOutputReference", stringify.StructField("transferHash", reference.transferHash), stringify.StructField("addressHash", reference.addressHash), diff --git a/packages/ledgerstate/transfer/transfer.go b/packages/ledgerstate/transfer/transfer.go new file mode 100644 index 0000000000000000000000000000000000000000..ee91c1ebf67db1a3fa27172d1eb44f370ea617b7 --- /dev/null +++ b/packages/ledgerstate/transfer/transfer.go @@ -0,0 +1,56 @@ +package transfer + +import ( + "github.com/iotaledger/goshimmer/packages/binary/address" + "github.com/iotaledger/goshimmer/packages/ledgerstate/coloredcoins" +) + +type Transfer struct { + hash Hash + inputs []*OutputReference + outputs map[address.Address][]*coloredcoins.ColoredBalance +} + +func NewTransfer(transferHash Hash) *Transfer { + return &Transfer{ + hash: transferHash, + inputs: make([]*OutputReference, 0), + outputs: make(map[address.Address][]*coloredcoins.ColoredBalance), + } +} + +func (transfer *Transfer) GetHash() Hash { + return transfer.hash +} + +func (transfer *Transfer) GetInputs() []*OutputReference { + return transfer.inputs +} + +func (transfer *Transfer) AddInput(input *OutputReference) *Transfer { + transfer.inputs = append(transfer.inputs, input) + + return transfer +} + +func (transfer *Transfer) AddOutput(address address.Address, balance *coloredcoins.ColoredBalance) *Transfer { + if _, addressExists := transfer.outputs[address]; !addressExists { + transfer.outputs[address] = make([]*coloredcoins.ColoredBalance, 0) + } + + transfer.outputs[address] = append(transfer.outputs[address], balance) + + return transfer +} + +func (transfer *Transfer) GetOutputs() map[address.Address][]*coloredcoins.ColoredBalance { + return transfer.outputs +} + +func (transfer *Transfer) MarshalBinary() (data []byte, err error) { + return +} + +func (transfer *Transfer) UnmarshalBinary(data []byte) (err error) { + return +} diff --git a/packages/ledgerstate/transfer_output.go b/packages/ledgerstate/transfer_output.go index 09e3b136c47bf674b9db41e62179f9e9014f1e18..1d6cabff4458ddff0b5a7ca23c6faa5fd6d829b1 100644 --- a/packages/ledgerstate/transfer_output.go +++ b/packages/ledgerstate/transfer_output.go @@ -4,6 +4,8 @@ import ( "encoding/binary" "sync" + "github.com/iotaledger/goshimmer/packages/ledgerstate/coloredcoins" + "github.com/iotaledger/goshimmer/packages/ledgerstate/reality" "github.com/iotaledger/goshimmer/packages/ledgerstate/transfer" @@ -19,7 +21,7 @@ type TransferOutput struct { transferHash transfer.Hash addressHash address.Address - balances []*ColoredBalance + balances []*coloredcoins.ColoredBalance realityId reality.Id consumers map[transfer.Hash][]address.Address @@ -31,7 +33,7 @@ type TransferOutput struct { bookingMutex sync.Mutex } -func NewTransferOutput(ledgerState *LedgerState, realityId reality.Id, transferHash transfer.Hash, addressHash address.Address, balances ...*ColoredBalance) *TransferOutput { +func NewTransferOutput(ledgerState *LedgerState, realityId reality.Id, transferHash transfer.Hash, addressHash address.Address, balances ...*coloredcoins.ColoredBalance) *TransferOutput { return &TransferOutput{ transferHash: transferHash, addressHash: addressHash, @@ -79,7 +81,7 @@ func (transferOutput *TransferOutput) SetRealityId(realityId reality.Id) { } } -func (transferOutput *TransferOutput) GetBalances() []*ColoredBalance { +func (transferOutput *TransferOutput) GetBalances() []*coloredcoins.ColoredBalance { return transferOutput.balances } @@ -96,7 +98,7 @@ func (transferOutput *TransferOutput) GetConsumers() (consumers map[transfer.Has return } -func (transferOutput *TransferOutput) addConsumer(consumer transfer.Hash, outputs map[address.Address][]*ColoredBalance) (consumersToElevate map[transfer.Hash][]address.Address, err error) { +func (transferOutput *TransferOutput) addConsumer(consumer transfer.Hash, outputs map[address.Address][]*coloredcoins.ColoredBalance) (consumersToElevate map[transfer.Hash][]address.Address, err error) { transferOutput.consumersMutex.RLock() if _, exist := transferOutput.consumers[consumer]; exist { transferOutput.consumersMutex.RUnlock() @@ -181,7 +183,7 @@ func (transferOutput *TransferOutput) MarshalBinary() ([]byte, error) { balanceCount := len(transferOutput.balances) consumerCount := len(transferOutput.consumers) - serializedLength := reality.IdLength + 4 + balanceCount*coloredBalanceLength + 4 + consumerCount*transfer.HashLength + serializedLength := reality.IdLength + 4 + balanceCount*coloredcoins.BalanceLength + 4 + consumerCount*transfer.HashLength for _, addresses := range transferOutput.consumers { serializedLength += 4 for range addresses { @@ -195,10 +197,12 @@ func (transferOutput *TransferOutput) MarshalBinary() ([]byte, error) { binary.LittleEndian.PutUint32(result[reality.IdLength:], uint32(balanceCount)) for i := 0; i < balanceCount; i++ { - copy(result[reality.IdLength+4+i*coloredBalanceLength:], transferOutput.balances[i].color[:colorLength]) - binary.LittleEndian.PutUint64(result[reality.IdLength+4+i*coloredBalanceLength+colorLength:], transferOutput.balances[i].balance) + color := transferOutput.balances[i].GetColor() + + copy(result[reality.IdLength+4+i*coloredcoins.BalanceLength:], color[:coloredcoins.ColorLength]) + binary.LittleEndian.PutUint64(result[reality.IdLength+4+i*coloredcoins.BalanceLength+coloredcoins.ColorLength:], transferOutput.balances[i].GetBalance()) } - offset := reality.IdLength + 4 + balanceCount*coloredBalanceLength + offset := reality.IdLength + 4 + balanceCount*coloredcoins.BalanceLength binary.LittleEndian.PutUint32(result[offset:], uint32(consumerCount)) offset += 4 @@ -240,7 +244,7 @@ func (transferOutput *TransferOutput) UnmarshalBinary(serializedObject []byte) e transferOutput.balances = balances } - if consumers, err := transferOutput.unmarshalConsumers(serializedObject[reality.IdLength+4+len(transferOutput.balances)*coloredBalanceLength:]); err != nil { + if consumers, err := transferOutput.unmarshalConsumers(serializedObject[reality.IdLength+4+len(transferOutput.balances)*coloredcoins.BalanceLength:]); err != nil { return err } else { transferOutput.consumers = consumers @@ -249,13 +253,13 @@ func (transferOutput *TransferOutput) UnmarshalBinary(serializedObject []byte) e return nil } -func (transferOutput *TransferOutput) unmarshalBalances(serializedBalances []byte) ([]*ColoredBalance, error) { +func (transferOutput *TransferOutput) unmarshalBalances(serializedBalances []byte) ([]*coloredcoins.ColoredBalance, error) { balanceCount := int(binary.LittleEndian.Uint32(serializedBalances)) - balances := make([]*ColoredBalance, balanceCount) + balances := make([]*coloredcoins.ColoredBalance, balanceCount) for i := 0; i < balanceCount; i++ { - coloredBalance := ColoredBalance{} - if err := coloredBalance.UnmarshalBinary(serializedBalances[4+i*coloredBalanceLength:]); err != nil { + coloredBalance := coloredcoins.ColoredBalance{} + if err := coloredBalance.UnmarshalBinary(serializedBalances[4+i*coloredcoins.BalanceLength:]); err != nil { return nil, err } diff --git a/packages/ledgerstate/transfer_output_reference.go b/packages/ledgerstate/transfer_output_reference.go deleted file mode 100644 index cb8e885c8971415d0ee0b2ac1ead04fd6ca5db96..0000000000000000000000000000000000000000 --- a/packages/ledgerstate/transfer_output_reference.go +++ /dev/null @@ -1,35 +0,0 @@ -package ledgerstate - -/* -import ( - "github.com/iotaledger/goshimmer/packages/binary/address" - "github.com/iotaledger/goshimmer/packages/binary/transfer" - "github.com/iotaledger/goshimmer/packages/stringify" -) - -type TransferOutputReference struct { - storageKey []byte - transferHash transfer.Hash - addressHash address.Address -} - -func NewTransferOutputReference(transferHash transfer.Hash, addressHash address.Address) *TransferOutputReference { - return &TransferOutputReference{ - storageKey: append(transferHash[:], addressHash[:]...), - transferHash: transferHash, - addressHash: addressHash, - } -} - -func (transferOutputReference *TransferOutputReference) GetStorageKey() []byte { - return transferOutputReference.storageKey -} - -func (transferOutputReference *TransferOutputReference) String() string { - return stringify.Struct("TransferOutputReference", - stringify.StructField("transferHash", transferOutputReference.transferHash), - stringify.StructField("addressHash", transferOutputReference.addressHash), - ) -} - -*/ diff --git a/packages/ledgerstate/transfer_output_test.go b/packages/ledgerstate/transfer_output_test.go index ef061b0bf359bd5348cd06d21af656a61f36e8d4..c808933b83b4a87c66b3c687584822a0d71e89fa 100644 --- a/packages/ledgerstate/transfer_output_test.go +++ b/packages/ledgerstate/transfer_output_test.go @@ -3,6 +3,8 @@ package ledgerstate import ( "testing" + "github.com/iotaledger/goshimmer/packages/ledgerstate/coloredcoins" + "github.com/iotaledger/goshimmer/packages/ledgerstate/transfer" "github.com/iotaledger/goshimmer/packages/ledgerstate/reality" @@ -13,7 +15,7 @@ import ( ) func TestTransferOutput_MarshalUnmarshal(t *testing.T) { - transferOutput := NewTransferOutput(nil, reality.NewId("REALITY"), transfer.NewHash("RECEIVE"), address.New([]byte("ADDRESS1")), NewColoredBalance(NewColor("IOTA"), 44), NewColoredBalance(NewColor("BTC"), 88)) + transferOutput := NewTransferOutput(nil, reality.NewId("REALITY"), transfer.NewHash("RECEIVE"), address.New([]byte("ADDRESS1")), coloredcoins.NewColoredBalance(coloredcoins.NewColor("IOTA"), 44), coloredcoins.NewColoredBalance(coloredcoins.NewColor("BTC"), 88)) transferOutput.consumers = make(map[transfer.Hash][]address.Address) spendTransferHash := transfer.NewHash("SPEND") diff --git a/packages/ledgerstate/visualizer.go b/packages/ledgerstate/visualizer.go index ada4c919155f878197a9f52eb65532911348d6c2..b9bc8b13e8d4ab1b66ac99dc28f2c7390022f2da 100644 --- a/packages/ledgerstate/visualizer.go +++ b/packages/ledgerstate/visualizer.go @@ -3,13 +3,11 @@ package ledgerstate import ( "strings" + "github.com/emicklei/dot" "github.com/iotaledger/goshimmer/packages/binary/address" "github.com/iotaledger/goshimmer/packages/graphviz" "github.com/iotaledger/goshimmer/packages/ledgerstate/reality" "github.com/iotaledger/goshimmer/packages/ledgerstate/transfer" - "github.com/iotaledger/goshimmer/packages/ledgerstate/transferoutput" - - "github.com/emicklei/dot" "github.com/iotaledger/hive.go/objectstorage" ) @@ -64,7 +62,7 @@ func (visualizer *Visualizer) drawTransferOutput(transferOutput *TransferOutput) for transferHash, addresses := range transferOutput.GetConsumers() { for _, addressHash := range addresses { - visualizer.ledgerState.GetTransferOutput(transferoutput.NewTransferOutputReference(transferHash, addressHash)).Consume(func(object objectstorage.StorableObject) { + visualizer.ledgerState.GetTransferOutput(transfer.NewOutputReference(transferHash, addressHash)).Consume(func(object objectstorage.StorableObject) { transferOutputNode.Edge(visualizer.drawTransferOutput(object.(*TransferOutput))) }) }