diff --git a/packages/binary/spammer/spammer.go b/packages/binary/spammer/spammer.go index f41499e28aaae3c84f06b3249d7a0a1efe1e8fba..e59cf9df343a5d1451a3625c3cc846834ffb7fc1 100644 --- a/packages/binary/spammer/spammer.go +++ b/packages/binary/spammer/spammer.go @@ -53,7 +53,7 @@ func (spammer *Spammer) run(tps int, processId int64) { trunkTransactionId, branchTransactionId := spammer.tipSelector.GetTips() spammer.transactionParser.Parse( - transaction.New(trunkTransactionId, branchTransactionId, spammingIdentity, data.New([]byte("SPAM"))).Bytes(), + transaction.New(trunkTransactionId, branchTransactionId, spammingIdentity, time.Now(), 0, data.New([]byte("SPAM"))).Bytes(), nil, ) @@ -83,7 +83,7 @@ func (spammer *Spammer) sendBurst(transactions int, processId int64) { return } - spamTransaction := transaction.New(previousTransactionId, previousTransactionId, spammingIdentity, data.New([]byte("SPAM"))) + spamTransaction := transaction.New(previousTransactionId, previousTransactionId, spammingIdentity, time.Now(), 0, data.New([]byte("SPAM"))) previousTransactionId = spamTransaction.GetId() burstBuffer[i] = spamTransaction.Bytes() } diff --git a/packages/binary/tangle/model/transaction/test/transaction_test.go b/packages/binary/tangle/model/transaction/test/transaction_test.go index 0d88e5d6954c6b3de751016bcd89d8e927f8661c..172e6509428b25e2803ebe9f738153b5b4772221 100644 --- a/packages/binary/tangle/model/transaction/test/transaction_test.go +++ b/packages/binary/tangle/model/transaction/test/transaction_test.go @@ -4,6 +4,7 @@ import ( "runtime" "sync" "testing" + "time" "github.com/iotaledger/hive.go/async" @@ -20,7 +21,7 @@ func BenchmarkVerifyDataTransactions(b *testing.B) { transactions := make([][]byte, b.N) for i := 0; i < b.N; i++ { - tx := transaction.New(transaction.EmptyId, transaction.EmptyId, ed25119.GenerateKeyPair(), data.New([]byte("some data"))) + tx := transaction.New(transaction.EmptyId, transaction.EmptyId, ed25119.GenerateKeyPair(), time.Now(), 0, data.New([]byte("some data"))) if marshaledTransaction, err := tx.MarshalBinary(); err != nil { b.Error(err) @@ -50,7 +51,7 @@ func BenchmarkVerifySignature(b *testing.B) { transactions := make([]*transaction.Transaction, b.N) for i := 0; i < b.N; i++ { - transactions[i] = transaction.New(transaction.EmptyId, transaction.EmptyId, ed25119.GenerateKeyPair(), data.New([]byte("test"))) + transactions[i] = transaction.New(transaction.EmptyId, transaction.EmptyId, ed25119.GenerateKeyPair(), time.Now(), 0, data.New([]byte("test"))) transactions[i].Bytes() } diff --git a/packages/binary/tangle/model/transaction/transaction.go b/packages/binary/tangle/model/transaction/transaction.go index 4abed904ff65a5cdea8e5bec1017ca1a69d2452a..d24202247602394f82ddf028ba65bc452384f723 100644 --- a/packages/binary/tangle/model/transaction/transaction.go +++ b/packages/binary/tangle/model/transaction/transaction.go @@ -2,6 +2,7 @@ package transaction import ( "sync" + "time" "github.com/iotaledger/hive.go/stringify" @@ -24,6 +25,8 @@ type Transaction struct { trunkTransactionId Id branchTransactionId Id issuerPublicKey ed25119.PublicKey + issuingTime time.Time + sequenceNumber uint64 payload payload.Payload bytes []byte bytesMutex sync.RWMutex @@ -40,14 +43,17 @@ type Transaction struct { issuerPrivateKey ed25119.PrivateKey } -// Allows us to "issue" a transaction. -func New(trunkTransactionId Id, branchTransactionId Id, issuerKeyPair ed25119.KeyPair, payload payload.Payload) (result *Transaction) { +// New creates a new transaction with the details provided by the issuer. +func New(trunkTransactionId Id, branchTransactionId Id, issuerKeyPair ed25119.KeyPair, issuingTime time.Time, sequenceNumber uint64, payload payload.Payload) (result *Transaction) { return &Transaction{ trunkTransactionId: trunkTransactionId, branchTransactionId: branchTransactionId, issuerPublicKey: issuerKeyPair.PublicKey, - issuerPrivateKey: issuerKeyPair.PrivateKey, + issuingTime: issuingTime, + sequenceNumber: sequenceNumber, payload: payload, + + issuerPrivateKey: issuerKeyPair.PrivateKey, } } @@ -88,6 +94,12 @@ func FromBytes(bytes []byte, optionalTargetObject ...*Transaction) (result *Tran if result.issuerPublicKey, err = ed25119.ParsePublicKey(marshalUtil); err != nil { return } + if result.issuingTime, err = marshalUtil.ReadTime(); err != nil { + return + } + if result.sequenceNumber, err = marshalUtil.ReadUint64(); err != nil { + return + } if result.payload, err = payload.Parse(marshalUtil); err != nil { return } @@ -146,6 +158,16 @@ func (transaction *Transaction) GetBranchTransactionId() Id { return transaction.branchTransactionId } +// IssuingTime returns the time when the transaction was created. +func (transaction *Transaction) IssuingTime() time.Time { + return transaction.issuingTime +} + +// SequenceNumber returns the sequence number of this transaction. +func (transaction *Transaction) SequenceNumber() uint64 { + return transaction.sequenceNumber +} + func (transaction *Transaction) GetPayload() payload.Payload { return transaction.payload } @@ -218,6 +240,8 @@ func (transaction *Transaction) Bytes() []byte { marshalUtil.WriteBytes(transaction.trunkTransactionId.Bytes()) marshalUtil.WriteBytes(transaction.branchTransactionId.Bytes()) marshalUtil.WriteBytes(transaction.issuerPublicKey.Bytes()) + marshalUtil.WriteTime(transaction.issuingTime) + marshalUtil.WriteUint64(transaction.sequenceNumber) marshalUtil.WriteBytes(transaction.payload.Bytes()) marshalUtil.WriteBytes(transaction.issuerPrivateKey.Sign(marshalUtil.Bytes()).Bytes()) diff --git a/packages/binary/tangle/tangle_test.go b/packages/binary/tangle/tangle_test.go index be15e7e3b701e1385ba71d15399c6e9659f8c5eb..6ba20cc720c737df8127ccf2322ec1a9599ea4dc 100644 --- a/packages/binary/tangle/tangle_test.go +++ b/packages/binary/tangle/tangle_test.go @@ -36,7 +36,7 @@ func BenchmarkTangle_AttachTransaction(b *testing.B) { transactionBytes := make([]*transaction.Transaction, b.N) for i := 0; i < b.N; i++ { - transactionBytes[i] = transaction.New(transaction.EmptyId, transaction.EmptyId, testIdentity, data.New([]byte("some data"))) + transactionBytes[i] = transaction.New(transaction.EmptyId, transaction.EmptyId, testIdentity, time.Now(), 0, data.New([]byte("some data"))) transactionBytes[i].Bytes() } @@ -91,8 +91,8 @@ func TestTangle_AttachTransaction(t *testing.T) { fmt.Println("REMOVED:", transactionId) })) - newTransaction1 := transaction.New(transaction.EmptyId, transaction.EmptyId, ed25119.GenerateKeyPair(), data.New([]byte("some data"))) - newTransaction2 := transaction.New(newTransaction1.GetId(), newTransaction1.GetId(), ed25119.GenerateKeyPair(), data.New([]byte("some other data"))) + newTransaction1 := transaction.New(transaction.EmptyId, transaction.EmptyId, ed25119.GenerateKeyPair(), time.Now(), 0, data.New([]byte("some data"))) + newTransaction2 := transaction.New(newTransaction1.GetId(), newTransaction1.GetId(), ed25119.GenerateKeyPair(), time.Now(), 0, data.New([]byte("some other data"))) tangle.AttachTransaction(newTransaction2) diff --git a/packages/binary/tangle/tipselector/tipselector_test.go b/packages/binary/tangle/tipselector/tipselector_test.go index 05329cc3e71770858f8606ca19554db4d8c653ae..fe565bd18ec900d3de305abcc849cb91258e3d09 100644 --- a/packages/binary/tangle/tipselector/tipselector_test.go +++ b/packages/binary/tangle/tipselector/tipselector_test.go @@ -2,6 +2,7 @@ package tipselector import ( "testing" + "time" "github.com/stretchr/testify/assert" @@ -20,7 +21,7 @@ func Test(t *testing.T) { assert.Equal(t, transaction.EmptyId, branch1) // create a transaction and attach it - transaction1 := transaction.New(trunk1, branch1, ed25119.GenerateKeyPair(), data.New([]byte("testtransaction"))) + transaction1 := transaction.New(trunk1, branch1, ed25119.GenerateKeyPair(), time.Now(), 0, data.New([]byte("testtransaction"))) tipSelector.AddTip(transaction1) // check if the tip shows up in the tip count @@ -32,7 +33,7 @@ func Test(t *testing.T) { assert.Equal(t, transaction1.GetId(), branch2) // create a 2nd transaction and attach it - transaction2 := transaction.New(transaction.EmptyId, transaction.EmptyId, ed25119.GenerateKeyPair(), data.New([]byte("testtransaction"))) + transaction2 := transaction.New(transaction.EmptyId, transaction.EmptyId, ed25119.GenerateKeyPair(), time.Now(), 0, data.New([]byte("testtransaction"))) tipSelector.AddTip(transaction2) // check if the tip shows up in the tip count @@ -40,7 +41,7 @@ func Test(t *testing.T) { // attach a transaction to our two tips trunk3, branch3 := tipSelector.GetTips() - transaction3 := transaction.New(trunk3, branch3, ed25119.GenerateKeyPair(), data.New([]byte("testtransaction"))) + transaction3 := transaction.New(trunk3, branch3, ed25119.GenerateKeyPair(), time.Now(), 0, data.New([]byte("testtransaction"))) tipSelector.AddTip(transaction3) // check if the tip shows replaces the current tips diff --git a/packages/binary/tangle/transactionparser/transactionparser_test.go b/packages/binary/tangle/transactionparser/transactionparser_test.go index 8f31c0e9d101fd2fa03e3ef821ad84de5dc2da9e..85309414cc9643750348e7657098e22e29bc88d2 100644 --- a/packages/binary/tangle/transactionparser/transactionparser_test.go +++ b/packages/binary/tangle/transactionparser/transactionparser_test.go @@ -4,6 +4,7 @@ import ( "fmt" "strconv" "testing" + "time" "github.com/iotaledger/hive.go/events" @@ -13,7 +14,7 @@ import ( ) func BenchmarkTransactionParser_ParseBytesSame(b *testing.B) { - txBytes := transaction.New(transaction.EmptyId, transaction.EmptyId, ed25119.GenerateKeyPair(), data.New([]byte("Test"))).Bytes() + txBytes := transaction.New(transaction.EmptyId, transaction.EmptyId, ed25119.GenerateKeyPair(), time.Now(), 0, data.New([]byte("Test"))).Bytes() txParser := New() b.ResetTimer() @@ -28,7 +29,7 @@ func BenchmarkTransactionParser_ParseBytesSame(b *testing.B) { func BenchmarkTransactionParser_ParseBytesDifferent(b *testing.B) { transactionBytes := make([][]byte, b.N) for i := 0; i < b.N; i++ { - transactionBytes[i] = transaction.New(transaction.EmptyId, transaction.EmptyId, ed25119.GenerateKeyPair(), data.New([]byte("Test"+strconv.Itoa(i)))).Bytes() + transactionBytes[i] = transaction.New(transaction.EmptyId, transaction.EmptyId, ed25119.GenerateKeyPair(), time.Now(), 0, data.New([]byte("Test"+strconv.Itoa(i)))).Bytes() } txParser := New() @@ -43,7 +44,7 @@ func BenchmarkTransactionParser_ParseBytesDifferent(b *testing.B) { } func TestTransactionParser_ParseTransaction(t *testing.T) { - tx := transaction.New(transaction.EmptyId, transaction.EmptyId, ed25119.GenerateKeyPair(), data.New([]byte("Test"))) + tx := transaction.New(transaction.EmptyId, transaction.EmptyId, ed25119.GenerateKeyPair(), time.Now(), 0, data.New([]byte("Test"))) txParser := New() txParser.Parse(tx.Bytes(), nil) diff --git a/packages/binary/valuetransfer/test/payload_test.go b/packages/binary/valuetransfer/test/payload_test.go index 11b8e1454c34d50be8a0037aca9a3a26947fbfcf..f5e9f9d1dd5c4eab2378087849de3d7a3dd22aba 100644 --- a/packages/binary/valuetransfer/test/payload_test.go +++ b/packages/binary/valuetransfer/test/payload_test.go @@ -3,6 +3,7 @@ package test import ( "fmt" "testing" + "time" "github.com/stretchr/testify/assert" @@ -61,6 +62,12 @@ func ExamplePayload() { // issuer of the transaction (signs automatically) ed25119.GenerateKeyPair(), + // the time when the transaction was created + time.Now(), + + // the ever increasing sequence number of this transaction + 0, + // payload valuePayload, )