From fd142dcf0efd95445aa5a8f65c47c16e686d7846 Mon Sep 17 00:00:00 2001
From: Hans Moog <hm@mkjc.net>
Date: Mon, 1 Jul 2019 01:12:24 +0200
Subject: [PATCH] Fix: fixed bug in tangle plugin when persisting approvers

---
 packages/curl/batch_hasher.go                 |  2 +-
 packages/model/approvers/approvers.go         |  4 ++--
 packages/model/meta_transaction/constants.go  |  2 +-
 .../meta_transaction/meta_transaction.go      |  4 ++--
 .../value_transaction/value_transaction.go    | 20 ++++++++++++++++++-
 packages/model/valuebundle/metabundle.go      |  4 ++++
 plugins/gossip/protocol_v1.go                 |  6 +++---
 plugins/gossip/transaction_processor_test.go  |  4 ++--
 plugins/tangle/approvers.go                   |  4 ++--
 plugins/tangle/solidifier.go                  |  2 +-
 plugins/tangle/transaction_metadata.go        |  3 +++
 11 files changed, 40 insertions(+), 15 deletions(-)

diff --git a/packages/curl/batch_hasher.go b/packages/curl/batch_hasher.go
index af38a90b..367ff8e0 100644
--- a/packages/curl/batch_hasher.go
+++ b/packages/curl/batch_hasher.go
@@ -117,5 +117,5 @@ func (this *BatchHasher) Hash(trits ternary.Trits) chan ternary.Trits {
 }
 
 const (
-	NUMBER_OF_WORKERS = 100
+	NUMBER_OF_WORKERS = 1000
 )
diff --git a/packages/model/approvers/approvers.go b/packages/model/approvers/approvers.go
index cd7e66c4..a733922a 100644
--- a/packages/model/approvers/approvers.go
+++ b/packages/model/approvers/approvers.go
@@ -63,10 +63,10 @@ func (approvers *Approvers) SetModified(modified bool) {
 }
 
 func (approvers *Approvers) Marshal() (result []byte) {
-	result = make([]byte, MARSHALED_APPROVERS_MIN_SIZE+len(approvers.hashes)*MARSHALED_APPROVERS_HASH_SIZE)
-
 	approvers.hashesMutex.RLock()
 
+	result = make([]byte, MARSHALED_APPROVERS_MIN_SIZE+len(approvers.hashes)*MARSHALED_APPROVERS_HASH_SIZE)
+
 	binary.BigEndian.PutUint64(result[MARSHALED_APPROVERS_HASHES_COUNT_START:MARSHALED_APPROVERS_HASHES_COUNT_END], uint64(len(approvers.hashes)))
 
 	copy(result[MARSHALED_APPROVERS_HASH_START:MARSHALED_APPROVERS_HASH_END], approvers.hash.CastToBytes())
diff --git a/packages/model/meta_transaction/constants.go b/packages/model/meta_transaction/constants.go
index 48fe6869..8676b4c9 100644
--- a/packages/model/meta_transaction/constants.go
+++ b/packages/model/meta_transaction/constants.go
@@ -29,7 +29,7 @@ const (
 	TRANSACTION_TYPE_END        = TRANSACTION_TYPE_OFFSET + TRANSACTION_TYPE_SIZE
 	DATA_END                    = DATA_OFFSET + DATA_SIZE
 
-	MARSHALLED_TOTAL_SIZE = DATA_END
+	MARSHALED_TOTAL_SIZE = DATA_END
 
 	BRANCH_NULL_HASH = ternary.Trytes("999999999999999999999999999999999999999999999999999999999999999999999999999999999")
 )
diff --git a/packages/model/meta_transaction/meta_transaction.go b/packages/model/meta_transaction/meta_transaction.go
index 82bb790c..f949915e 100644
--- a/packages/model/meta_transaction/meta_transaction.go
+++ b/packages/model/meta_transaction/meta_transaction.go
@@ -37,7 +37,7 @@ type MetaTransaction struct {
 }
 
 func New() *MetaTransaction {
-	return FromTrits(make(ternary.Trits, MARSHALLED_TOTAL_SIZE))
+	return FromTrits(make(ternary.Trits, MARSHALED_TOTAL_SIZE))
 }
 
 func FromTrits(trits ternary.Trits) *MetaTransaction {
@@ -47,7 +47,7 @@ func FromTrits(trits ternary.Trits) *MetaTransaction {
 }
 
 func FromBytes(bytes []byte) (result *MetaTransaction) {
-	result = FromTrits(ternary.BytesToTrits(bytes)[:MARSHALLED_TOTAL_SIZE])
+	result = FromTrits(ternary.BytesToTrits(bytes)[:MARSHALED_TOTAL_SIZE])
 	result.bytes = bytes
 
 	return
diff --git a/packages/model/value_transaction/value_transaction.go b/packages/model/value_transaction/value_transaction.go
index 2d9b0cd8..b014d3ce 100644
--- a/packages/model/value_transaction/value_transaction.go
+++ b/packages/model/value_transaction/value_transaction.go
@@ -43,7 +43,7 @@ func FromMetaTransaction(metaTransaction *meta_transaction.MetaTransaction) *Val
 
 func FromBytes(bytes []byte) (result *ValueTransaction) {
 	result = &ValueTransaction{
-		MetaTransaction: meta_transaction.FromTrits(ternary.BytesToTrits(bytes)[:meta_transaction.MARSHALLED_TOTAL_SIZE]),
+		MetaTransaction: meta_transaction.FromTrits(ternary.BytesToTrits(bytes)[:meta_transaction.MARSHALED_TOTAL_SIZE]),
 	}
 
 	result.trits = result.MetaTransaction.GetData()
@@ -192,6 +192,24 @@ func (this *ValueTransaction) SetTimestamp(timestamp uint) bool {
 	return false
 }
 
+func (this *ValueTransaction) GetBundleEssence() (result ternary.Trytes) {
+	this.addressMutex.RLock()
+	this.valueMutex.RLock()
+	this.signatureMessageFragmentMutex.RLock()
+
+	if this.GetValue() < 0 {
+		result = this.trits[ADDRESS_OFFSET:VALUE_END].ToTrytes() + this.trits[SIGNATURE_MESSAGE_FRAGMENT_OFFSET:SIGNATURE_MESSAGE_FRAGMENT_END].ToTrytes()
+	} else {
+		result = this.trits[ADDRESS_OFFSET:VALUE_END].ToTrytes()
+	}
+
+	this.signatureMessageFragmentMutex.RUnlock()
+	this.valueMutex.RUnlock()
+	this.addressMutex.RUnlock()
+
+	return
+}
+
 // getter for the nonce (supports concurrency)
 func (this *ValueTransaction) GetNonce() (result ternary.Trytes) {
 	this.nonceMutex.RLock()
diff --git a/packages/model/valuebundle/metabundle.go b/packages/model/valuebundle/metabundle.go
index 18d78f6a..a5714d89 100644
--- a/packages/model/valuebundle/metabundle.go
+++ b/packages/model/valuebundle/metabundle.go
@@ -27,6 +27,10 @@ func (bundle *MetaBundle) GetHash() ternary.Trytes {
 }
 
 func CalculateBundleHash(transactions []*value_transaction.ValueTransaction) ternary.Trytes {
+	transactions[0].GetAddress()
+	transactions[0].GetSignatureMessageFragment()
+	transactions[0].GetTimestamp()
+	transactions[0].GetValue()
 	//transactions[0].GetData()[value_transaction.SIGNATURE_MESSAGE_FRAGMENT_OFFSET]
 	return ternary.Trytes("A")
 }
diff --git a/plugins/gossip/protocol_v1.go b/plugins/gossip/protocol_v1.go
index b0adc6ad..ac5939a6 100644
--- a/plugins/gossip/protocol_v1.go
+++ b/plugins/gossip/protocol_v1.go
@@ -303,7 +303,7 @@ type transactionStateV1 struct {
 func newTransactionStateV1(protocol *protocol) *transactionStateV1 {
 	return &transactionStateV1{
 		protocol: protocol,
-		buffer:   make([]byte, meta_transaction.MARSHALLED_TOTAL_SIZE/ternary.NUMBER_OF_TRITS_IN_A_BYTE),
+		buffer:   make([]byte, meta_transaction.MARSHALED_TOTAL_SIZE/ternary.NUMBER_OF_TRITS_IN_A_BYTE),
 		offset:   0,
 	}
 }
@@ -312,10 +312,10 @@ func (state *transactionStateV1) Receive(data []byte, offset int, length int) (i
 	bytesRead := byteutils.ReadAvailableBytesToBuffer(state.buffer, state.offset, data, offset, length)
 
 	state.offset += bytesRead
-	if state.offset == meta_transaction.MARSHALLED_TOTAL_SIZE/ternary.NUMBER_OF_TRITS_IN_A_BYTE {
+	if state.offset == meta_transaction.MARSHALED_TOTAL_SIZE/ternary.NUMBER_OF_TRITS_IN_A_BYTE {
 		protocol := state.protocol
 
-		transactionData := make([]byte, meta_transaction.MARSHALLED_TOTAL_SIZE/ternary.NUMBER_OF_TRITS_IN_A_BYTE)
+		transactionData := make([]byte, meta_transaction.MARSHALED_TOTAL_SIZE/ternary.NUMBER_OF_TRITS_IN_A_BYTE)
 		copy(transactionData, state.buffer)
 
 		protocol.Events.ReceiveTransactionData.Trigger(transactionData)
diff --git a/plugins/gossip/transaction_processor_test.go b/plugins/gossip/transaction_processor_test.go
index c07602df..9c7e8bdf 100644
--- a/plugins/gossip/transaction_processor_test.go
+++ b/plugins/gossip/transaction_processor_test.go
@@ -9,7 +9,7 @@ import (
 )
 
 func BenchmarkProcessSimilarTransactionsFiltered(b *testing.B) {
-	byteArray := setupTransaction(meta_transaction.MARSHALLED_TOTAL_SIZE / ternary.NUMBER_OF_TRITS_IN_A_BYTE)
+	byteArray := setupTransaction(meta_transaction.MARSHALED_TOTAL_SIZE / ternary.NUMBER_OF_TRITS_IN_A_BYTE)
 
 	b.ResetTimer()
 
@@ -19,7 +19,7 @@ func BenchmarkProcessSimilarTransactionsFiltered(b *testing.B) {
 }
 
 func BenchmarkProcessSimilarTransactionsUnfiltered(b *testing.B) {
-	byteArray := setupTransaction(meta_transaction.MARSHALLED_TOTAL_SIZE / ternary.NUMBER_OF_TRITS_IN_A_BYTE)
+	byteArray := setupTransaction(meta_transaction.MARSHALED_TOTAL_SIZE / ternary.NUMBER_OF_TRITS_IN_A_BYTE)
 
 	b.ResetTimer()
 
diff --git a/plugins/tangle/approvers.go b/plugins/tangle/approvers.go
index 2e54e11d..a5648c8f 100644
--- a/plugins/tangle/approvers.go
+++ b/plugins/tangle/approvers.go
@@ -85,8 +85,8 @@ func configureApproversDatabase(plugin *node.Plugin) {
 
 func storeApproversInDatabase(approvers *approvers.Approvers) errors.IdentifiableError {
 	if approvers.GetModified() {
-		if err := transactionMetadataDatabase.Set(approvers.GetHash().CastToBytes(), approvers.Marshal()); err != nil {
-			return ErrDatabaseError.Derive(err, "failed to store transaction metadata")
+		if err := approversDatabase.Set(approvers.GetHash().CastToBytes(), approvers.Marshal()); err != nil {
+			return ErrDatabaseError.Derive(err, "failed to store approvers")
 		}
 
 		approvers.SetModified(false)
diff --git a/plugins/tangle/solidifier.go b/plugins/tangle/solidifier.go
index edf28844..ce66662a 100644
--- a/plugins/tangle/solidifier.go
+++ b/plugins/tangle/solidifier.go
@@ -17,7 +17,7 @@ import (
 
 //var solidifierChan = make(chan *value_transaction.ValueTransaction, 1000)
 
-const NUMBER_OF_WORKERS = 300
+const NUMBER_OF_WORKERS = 3000
 
 var tasksChan = make(chan *meta_transaction.MetaTransaction, NUMBER_OF_WORKERS)
 
diff --git a/plugins/tangle/transaction_metadata.go b/plugins/tangle/transaction_metadata.go
index 82a3b8fd..6548346b 100644
--- a/plugins/tangle/transaction_metadata.go
+++ b/plugins/tangle/transaction_metadata.go
@@ -90,6 +90,9 @@ func storeTransactionMetadataInDatabase(metadata *transactionmetadata.Transactio
 		if marshaledMetadata, err := metadata.Marshal(); err != nil {
 			return err
 		} else {
+			if len(marshaledMetadata) != 97 {
+				panic("WATT")
+			}
 			if err := transactionMetadataDatabase.Set(metadata.GetHash().CastToBytes(), marshaledMetadata); err != nil {
 				return ErrDatabaseError.Derive(err, "failed to store transaction metadata")
 			}
-- 
GitLab