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

Feat: finished first working version of valuetransfer payloads

parent 62f5de32
No related branches found
No related tags found
No related merge requests found
......@@ -17,17 +17,18 @@ import (
type Payload struct {
objectstorage.StorableObjectFlags
id *payloadid.Id
trunkPayloadId payloadid.Id
branchPayloadId payloadid.Id
transfer *transfer.Transfer
bytes []byte
idMutex sync.RWMutex
id *payloadid.Id
idMutex sync.RWMutex
bytes []byte
bytesMutex sync.RWMutex
}
func NewPayload(trunkPayloadId, branchPayloadId payloadid.Id, valueTransfer *transfer.Transfer) *Payload {
func New(trunkPayloadId, branchPayloadId payloadid.Id, valueTransfer *transfer.Transfer) *Payload {
return &Payload{
trunkPayloadId: trunkPayloadId,
branchPayloadId: branchPayloadId,
......@@ -35,6 +36,50 @@ func NewPayload(trunkPayloadId, branchPayloadId payloadid.Id, valueTransfer *tra
}
}
func FromBytes(bytes []byte, optionalTargetObject ...*Payload) (result *Payload, err error, consumedBytes int) {
// determine the target object that will hold the unmarshaled information
switch len(optionalTargetObject) {
case 0:
result = &Payload{}
case 1:
result = optionalTargetObject[0]
default:
panic("too many arguments in call to OutputFromBytes")
}
// initialize helper
marshalUtil := marshalutil.New(bytes)
// parse trunk payload id
parsedTrunkPayloadId, err := marshalUtil.ReadBytes(payloadid.Length)
if err != nil {
return
}
result.trunkPayloadId = payloadid.New(parsedTrunkPayloadId)
// parse branch payload id
parsedBranchPayloadId, err := marshalUtil.ReadBytes(payloadid.Length)
if err != nil {
return
}
result.branchPayloadId = payloadid.New(parsedBranchPayloadId)
// parse transfer
parsedTransfer, err := marshalUtil.Parse(func(data []byte) (result interface{}, err error, consumedBytes int) { return transfer.FromBytes(data) })
if err != nil {
return
}
result.transfer = parsedTransfer.(*transfer.Transfer)
// return the number of bytes we processed
consumedBytes = marshalUtil.ReadOffset()
// store bytes, so we don't have to marshal manually
result.bytes = bytes[:consumedBytes]
return
}
func (payload *Payload) GetId() payloadid.Id {
// acquire lock for reading id
payload.idMutex.RLock()
......@@ -142,27 +187,7 @@ func (payload *Payload) MarshalBinary() (bytes []byte, err error) {
}
func (payload *Payload) UnmarshalBinary(data []byte) (err error) {
marshalUtil := marshalutil.New(data)
trunkTransactionIdBytes, err := marshalUtil.ReadBytes(payloadid.Length)
if err != nil {
return
}
branchTransactionIdBytes, err := marshalUtil.ReadBytes(payloadid.Length)
if err != nil {
return
}
valueTransfer := &transfer.Transfer{}
if err = valueTransfer.UnmarshalBinary(marshalUtil.ReadRemainingBytes()); err != nil {
return
}
payload.trunkPayloadId = payloadid.New(trunkTransactionIdBytes)
payload.branchPayloadId = payloadid.New(branchTransactionIdBytes)
payload.transfer = valueTransfer
payload.bytes = data
_, err, _ = FromBytes(data, payload)
return
}
......
......@@ -3,16 +3,17 @@ package inputs
import (
"github.com/iotaledger/goshimmer/packages/binary/datastructure/orderedmap"
"github.com/iotaledger/goshimmer/packages/binary/marshalutil"
address2 "github.com/iotaledger/goshimmer/packages/binary/valuetransfers/payload/transfer/address"
"github.com/iotaledger/goshimmer/packages/binary/valuetransfers/payload/transfer/address"
"github.com/iotaledger/goshimmer/packages/binary/valuetransfers/payload/transfer/id"
id2 "github.com/iotaledger/goshimmer/packages/binary/valuetransfers/payload/transfer/output/id"
transferid "github.com/iotaledger/goshimmer/packages/binary/valuetransfers/payload/transfer/id"
transferoutputid "github.com/iotaledger/goshimmer/packages/binary/valuetransfers/payload/transfer/output/id"
)
type Inputs struct {
*orderedmap.OrderedMap
}
func New(transferOutputIds ...id2.Id) (inputs *Inputs) {
func New(transferOutputIds ...transferoutputid.Id) (inputs *Inputs) {
inputs = &Inputs{orderedmap.New()}
for _, transferOutputId := range transferOutputIds {
inputs.Add(transferOutputId)
......@@ -31,15 +32,15 @@ func FromBytes(bytes []byte) (inputs *Inputs, err error, consumedBytes int) {
}
for i := uint32(0); i < inputCount; i++ {
addressBytes, readErr := marshalUtil.ReadBytes(address2.Length)
addressBytes, readErr := marshalUtil.ReadBytes(address.Length)
if readErr != nil {
err = readErr
return
}
readAddress := address2.New(addressBytes)
readAddress := address.New(addressBytes)
transferIdBytes, readErr := marshalUtil.ReadBytes(id2.Length)
transferIdBytes, readErr := marshalUtil.ReadBytes(transferid.Length)
if readErr != nil {
err = readErr
......@@ -53,7 +54,7 @@ func FromBytes(bytes []byte) (inputs *Inputs, err error, consumedBytes int) {
inputs.Set(readAddress, addressMap)
}
addressMap.(*orderedmap.OrderedMap).Set(transferId, id2.New(readAddress, transferId))
addressMap.(*orderedmap.OrderedMap).Set(transferId, transferoutputid.New(readAddress, transferId))
}
consumedBytes = marshalUtil.ReadOffset()
......@@ -61,7 +62,7 @@ func FromBytes(bytes []byte) (inputs *Inputs, err error, consumedBytes int) {
return
}
func (inputs *Inputs) Add(input id2.Id) *Inputs {
func (inputs *Inputs) Add(input transferoutputid.Id) *Inputs {
inputAddress := input.GetAddress()
transferId := input.GetTransferId()
......@@ -82,7 +83,7 @@ func (inputs *Inputs) ToBytes() (bytes []byte) {
marshalUtil.WriteSeek(4)
var inputCounter uint32
inputs.ForEach(func(transferOutputId id2.Id) {
inputs.ForEach(func(transferOutputId transferoutputid.Id) {
marshalUtil.WriteBytes(transferOutputId.ToBytes())
inputCounter++
......@@ -93,10 +94,10 @@ func (inputs *Inputs) ToBytes() (bytes []byte) {
return marshalUtil.Bytes()
}
func (inputs *Inputs) ForEach(consumer func(transferOutputId id2.Id)) {
func (inputs *Inputs) ForEach(consumer func(transferOutputId transferoutputid.Id)) {
inputs.OrderedMap.ForEach(func(key, value interface{}) bool {
value.(*orderedmap.OrderedMap).ForEach(func(key, value interface{}) bool {
consumer(value.(id2.Id))
consumer(value.(transferoutputid.Id))
return true
})
......@@ -105,9 +106,9 @@ func (inputs *Inputs) ForEach(consumer func(transferOutputId id2.Id)) {
})
}
func (inputs *Inputs) ForEachAddress(consumer func(currentAddress address2.Address)) {
func (inputs *Inputs) ForEachAddress(consumer func(currentAddress address.Address)) {
inputs.OrderedMap.ForEach(func(key, value interface{}) bool {
consumer(key.(address2.Address))
consumer(key.(address.Address))
return true
})
......@@ -121,7 +122,7 @@ func (inputs *Inputs) String() string {
result := "[\n"
empty := true
inputs.ForEach(func(transferOutputId id2.Id) {
inputs.ForEach(func(transferOutputId transferoutputid.Id) {
empty = false
result += " " + transferOutputId.String() + ",\n"
......
......@@ -36,7 +36,7 @@ func New(inputs *inputs.Inputs, outputs *outputs.Outputs) *Transfer {
}
}
func TransferFromBytes(bytes []byte, optionalTargetObject ...*Transfer) (result *Transfer, err error, consumedBytes int) {
func FromBytes(bytes []byte, optionalTargetObject ...*Transfer) (result *Transfer, err error, consumedBytes int) {
// determine the target object that will hold the unmarshaled information
switch len(optionalTargetObject) {
case 0:
......@@ -51,26 +51,18 @@ func TransferFromBytes(bytes []byte, optionalTargetObject ...*Transfer) (result
marshalUtil := marshalutil.New(bytes)
// unmarshal inputs
if parseResult, inputsErr := marshalUtil.Parse(func(data []byte) (result interface{}, err error, consumedBytes int) {
return inputs.FromBytes(data)
}); inputsErr != nil {
err = inputsErr
parsedInputs, err := marshalUtil.Parse(func(data []byte) (result interface{}, err error, consumedBytes int) { return inputs.FromBytes(data) })
if err != nil {
return
} else {
result.inputs = parseResult.(*inputs.Inputs)
}
result.inputs = parsedInputs.(*inputs.Inputs)
// unmarshal outputs
if parseResult, outputsErr := marshalUtil.Parse(func(data []byte) (result interface{}, err error, consumedBytes int) {
return outputs.FromBytes(data)
}); outputsErr != nil {
err = outputsErr
parsedOutputs, err := marshalUtil.Parse(func(data []byte) (result interface{}, err error, consumedBytes int) { return outputs.FromBytes(data) })
if err != nil {
return
} else {
result.outputs = parseResult.(*outputs.Outputs)
}
result.outputs = parsedOutputs.(*outputs.Outputs)
// return the number of bytes we processed
consumedBytes = marshalUtil.ReadOffset()
......@@ -189,7 +181,7 @@ func (transfer *Transfer) MarshalBinary() ([]byte, error) {
}
func (transfer *Transfer) UnmarshalBinary(bytes []byte) (err error) {
_, err, _ = TransferFromBytes(bytes, transfer)
_, err, _ = FromBytes(bytes, transfer)
return
}
......
......@@ -4,7 +4,6 @@ import (
"fmt"
"testing"
"github.com/iotaledger/goshimmer/packages/binary/valuetransfers"
"github.com/iotaledger/goshimmer/packages/binary/valuetransfers/payload"
payloadid "github.com/iotaledger/goshimmer/packages/binary/valuetransfers/payload/id"
"github.com/iotaledger/goshimmer/packages/binary/valuetransfers/payload/transfer"
......@@ -18,7 +17,7 @@ import (
)
func TestPayload(t *testing.T) {
createdPayload := payload.NewPayload(
originalPayload := payload.New(
payloadid.Empty,
payloadid.Empty,
transfer.New(
......@@ -35,18 +34,14 @@ func TestPayload(t *testing.T) {
),
)
fmt.Println(createdPayload.Bytes())
restoredTransfer, err, _ := valuetransfers.TransferFromBytes(sourceTransfer.Bytes())
clonedPayload, err, _ := payload.FromBytes(originalPayload.Bytes())
if err != nil {
t.Error(err)
return
panic(err)
}
fmt.Println(sourceTransfer)
fmt.Println(restoredTransfer)
fmt.Println(originalPayload)
fmt.Println(clonedPayload)
fmt.Println(restoredTransfer.GetId())
fmt.Println(sourceTransfer.GetId())
fmt.Println(originalPayload.GetId())
fmt.Println(clonedPayload.GetId())
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment