diff --git a/plugins/tangle/misc.go b/plugins/tangle/misc.go new file mode 100644 index 0000000000000000000000000000000000000000..08fc8de9334f214beebda36ba810fdd7a6961027 --- /dev/null +++ b/plugins/tangle/misc.go @@ -0,0 +1,11 @@ +package tangle + +import "github.com/iotaledger/iota.go/trinary" + +func databaseKeyForHashPrefixedHash(address trinary.Hash, transactionHash trinary.Hash) []byte { + return append(databaseKeyForHashPrefix(address), trinary.MustTrytesToBytes(transactionHash)...) +} + +func databaseKeyForHashPrefix(hash trinary.Hash) []byte { + return trinary.MustTrytesToBytes(hash) +} diff --git a/plugins/tangle/tx_per_address.go b/plugins/tangle/tx_per_address.go new file mode 100644 index 0000000000000000000000000000000000000000..87a568284b8f6bd770392dcf509cd40b3e69688f --- /dev/null +++ b/plugins/tangle/tx_per_address.go @@ -0,0 +1,62 @@ +package tangle + +import ( + "github.com/iotaledger/goshimmer/packages/database" + "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") + } + log.Info("Stored Address:", address.Address) + log.Info("TxHash:", address.TxHash) + log.Info("txForAddr: ", trinary.MustBytesToTrytes(databaseKeyForHashPrefixedHash(address.Address, address.TxHash), 81)) + 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) { + log.Info("Len key:", len(key)) + txHash := trinary.MustBytesToTrytes(key)[81:] + log.Info("Len ALL:", len(txHash)) + transactionHashes = append(transactionHashes, txHash) + }) + + if err != nil { + return nil, ErrDatabaseError.Derive(err, "failed to read tx per address from database") + } else { + return transactionHashes, nil + } +}