Skip to content
Snippets Groups Projects
Unverified Commit 33edf86c authored by Luca Moser's avatar Luca Moser Committed by GitHub
Browse files

Merge pull request #119 from iotaledger/feat/tx-per-address

Store transaction hashes per address
parents 4ed4f35e 05733160
No related branches found
No related tags found
No related merge requests found
package tangle
import (
"github.com/iotaledger/hive.go/typeutils"
"github.com/iotaledger/iota.go/trinary"
)
func databaseKeyForHashPrefixedHash(address trinary.Hash, transactionHash trinary.Hash) []byte {
//return append(databaseKeyForHashPrefix(address), trinary.MustTrytesToBytes(transactionHash)...)
return append(databaseKeyForHashPrefix(address), typeutils.StringToBytes(transactionHash)...)
}
func databaseKeyForHashPrefix(hash trinary.Hash) []byte {
//return trinary.MustTrytesToBytes(hash)
return typeutils.StringToBytes(hash)
}
......@@ -18,6 +18,7 @@ func configure(*node.Plugin) {
configureTransactionMetaDataDatabase()
configureApproversDatabase()
configureBundleDatabase()
configureTransactionHashesForAddressDatabase()
configureSolidifier()
}
......
......@@ -192,6 +192,17 @@ func processMetaTransaction(metaTransaction *meta_transaction.MetaTransaction) {
func processTransaction(transaction *value_transaction.ValueTransaction) {
Events.TransactionStored.Trigger(transaction)
// store transaction hash for address in DB
err := StoreTransactionHashForAddressInDatabase(
&TxHashForAddress{
Address: transaction.GetAddress(),
TxHash: transaction.GetHash(),
},
)
if err != nil {
log.Errorw(err.Error())
}
transactionHash := transaction.GetHash()
// register tx as approver for trunk
......@@ -211,7 +222,7 @@ func processTransaction(transaction *value_transaction.ValueTransaction) {
}
// update the solidity flags of this transaction and its approvers
_, err := IsSolid(transaction)
_, err = IsSolid(transaction)
if err != nil {
log.Errorf("Unable to check solidity: %s", err.Error())
return
......@@ -232,6 +243,6 @@ func requestTransaction(hash trinary.Trytes) {
return
}
log.Infow("Requesting tx", "hash", hash)
log.Debugw("Requesting tx", "hash", hash)
requester.RequestTransaction(hash)
}
......@@ -46,6 +46,7 @@ func TestSolidifier(t *testing.T) {
transaction4 := value_transaction.New()
transaction4.SetValue(4)
transaction4.SetBranchTransactionHash(transaction3.GetHash())
transaction4.SetAddress("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")
require.NoError(t, transaction4.DoProofOfWork(meta_transaction.MIN_WEIGHT_MAGNITUDE))
// setup event handlers
......@@ -72,6 +73,10 @@ func TestSolidifier(t *testing.T) {
// wait until all are solid
wg.Wait()
txAddr, err := ReadTransactionHashesForAddressFromDatabase(transaction4.GetAddress())
require.NoError(t, err)
require.Equal(t, transaction4.GetHash(), txAddr[0])
// shutdown test node
node.Shutdown()
}
package tangle
import (
"github.com/iotaledger/goshimmer/packages/database"
"github.com/iotaledger/hive.go/typeutils"
"github.com/iotaledger/iota.go/trinary"
)
var (
transactionsHashesForAddressDatabase database.Database
)
func configureTransactionHashesForAddressDatabase() {
if db, err := database.Get("transactionsHashesForAddress"); err != nil {
panic(err)
} else {
transactionsHashesForAddressDatabase = db
}
}
type TxHashForAddress struct {
Address trinary.Hash
TxHash trinary.Hash
}
func StoreTransactionHashForAddressInDatabase(address *TxHashForAddress) error {
if err := transactionsHashesForAddressDatabase.Set(
databaseKeyForHashPrefixedHash(address.Address, address.TxHash),
[]byte{},
); err != nil {
return ErrDatabaseError.Derive(err, "failed to store tx for address in database")
}
return nil
}
func DeleteTransactionHashForAddressInDatabase(address *TxHashForAddress) error {
if err := transactionsHashesForAddressDatabase.Delete(
databaseKeyForHashPrefixedHash(address.Address, address.TxHash),
); err != nil {
return ErrDatabaseError.Derive(err, "failed to delete tx for address")
}
return nil
}
func ReadTransactionHashesForAddressFromDatabase(address trinary.Hash) ([]trinary.Hash, error) {
var transactionHashes []trinary.Hash
err := transactionsHashesForAddressDatabase.ForEachWithPrefix(databaseKeyForHashPrefix(address), func(key []byte, value []byte) {
k := typeutils.BytesToString(key)
if len(k) > 81 {
transactionHashes = append(transactionHashes, k[81:])
}
})
if err != nil {
return nil, ErrDatabaseError.Derive(err, "failed to read tx per address from database")
} else {
return transactionHashes, nil
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment