Skip to content

Commit

Permalink
adding resolve accounts block command
Browse files Browse the repository at this point in the history
  • Loading branch information
Eduard-Voiculescu committed Oct 25, 2023
1 parent a9bdea9 commit 103291d
Show file tree
Hide file tree
Showing 4 changed files with 374 additions and 49 deletions.
80 changes: 42 additions & 38 deletions accountresolver/processor.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,10 @@ type Stats struct {
totalAccountsResolvedByCache int
}

func NewStats() *Stats {
return &Stats{}
}

func (s *Stats) Log(logger *zap.Logger) {
lookupAvg := time.Duration(0)
if s.lookupCount > 0 {
Expand Down Expand Up @@ -240,7 +244,7 @@ func (p *Processor) ProcessBlock(ctx context.Context, stats *Stats, block *pbsol
continue
}
//p.logger.Debug("processing transaction", zap.Uint64("block_num", block.Slot), zap.String("trx_id", base58.Encode(trx.Transaction.Signatures[0])))
err := p.applyTableLookup(ctx, stats, block.Slot, trx)
err := ApplyTableLookup(ctx, stats, block.Slot, trx, p.accountsResolver, p.logger)
if err != nil {
return fmt.Errorf("applying table lookup at block %d: %w", block.Slot, err)
}
Expand All @@ -263,16 +267,49 @@ func (p *Processor) manageAddressLookup(ctx context.Context, stats *Stats, block
return nil
}

func (p *Processor) applyTableLookup(ctx context.Context, stats *Stats, blockNum uint64, trx *pbsol.ConfirmedTransaction) error {
func (p *Processor) ProcessTransaction(ctx context.Context, stats *Stats, blockNum uint64, confirmedTransaction *pbsol.ConfirmedTransaction) error {
start := time.Now()
if confirmedTransaction.Meta.Err != nil {
p.logger.Info("skipping transaction with error", zap.Uint64("block_num", blockNum), zap.String("trx_id", base58.Encode(confirmedTransaction.Transaction.Signatures[0])))
return nil
}
accountKeys := confirmedTransaction.Transaction.Message.AccountKeys
for instructionIndex, compiledInstruction := range confirmedTransaction.Transaction.Message.Instructions {
idx := compiledInstruction.ProgramIdIndex
err := p.ProcessInstruction(ctx, stats, blockNum, confirmedTransaction.Transaction.Signatures[0], fmt.Sprintf("%d", instructionIndex), confirmedTransaction.Transaction.Message.AccountKeys[idx], accountKeys, compiledInstruction)
if err != nil {
return fmt.Errorf("confirmedTransaction %s processing compiled instruction: %w", getTransactionHash(confirmedTransaction.Transaction.Signatures), err)
}
inner := GetInnerInstructions(instructionIndex, confirmedTransaction.Meta.InnerInstructions)
if inner == nil {
continue // there are no inner instructions for the CompiledInstruction
}
for i, instruction := range inner.Instructions {
index := fmt.Sprintf("%d.%d", instructionIndex, i)
if len(accountKeys) < int(instruction.ProgramIdIndex) {
return fmt.Errorf("missing account key at instructionIndex %d for transaction %s with account keys count of %d", instruction.ProgramIdIndex, getTransactionHash(confirmedTransaction.Transaction.Signatures), len(accountKeys))
}

err := p.ProcessInstruction(ctx, stats, blockNum, confirmedTransaction.Transaction.Signatures[0], index, accountKeys[instruction.ProgramIdIndex], accountKeys, instruction)
if err != nil {
return fmt.Errorf("confirmedTransaction %s processing instruxction: %w", getTransactionHash(confirmedTransaction.Transaction.Signatures), err)
}
}
}
stats.totalTransactionProcessingDuration += time.Since(start)
return nil
}

func ApplyTableLookup(ctx context.Context, stats *Stats, blockNum uint64, trx *pbsol.ConfirmedTransaction, accountsResolver AccountsResolver, logger *zap.Logger) error {
start := time.Now()
for _, addressTableLookup := range trx.Transaction.Message.AddressTableLookups {
resolvedAccounts, cached, err := p.accountsResolver.Resolve(ctx, blockNum, addressTableLookup.AccountKey)
resolvedAccounts, cached, err := accountsResolver.Resolve(ctx, blockNum, addressTableLookup.AccountKey)
if err != nil {
return fmt.Errorf("resolving address table %s at block %d: %w", base58.Encode(addressTableLookup.AccountKey), blockNum, err)
}

if len(resolvedAccounts) == 0 {
p.logger.Warn("Resolved accounts is empty", zap.Uint64("block", blockNum), zap.String("table account", base58.Encode(addressTableLookup.AccountKey)), zap.Bool("cached", cached), zap.Int("account_count", len(resolvedAccounts)))
logger.Warn("Resolved accounts is empty", zap.Uint64("block", blockNum), zap.String("table account", base58.Encode(addressTableLookup.AccountKey)), zap.Bool("cached", cached), zap.Int("account_count", len(resolvedAccounts)))
}

if cached {
Expand Down Expand Up @@ -303,7 +340,7 @@ func (p *Processor) applyTableLookup(ctx context.Context, stats *Stats, blockNum
if lookupCount > 0 {
stats.lookupCount += lookupCount
stats.totalLookupDuration += totalDuration
p.logger.Debug(
logger.Debug(
"applyTableLookup",
zap.Duration("duration", totalDuration),
zap.Int("lookup_count", lookupCount),
Expand All @@ -314,39 +351,6 @@ func (p *Processor) applyTableLookup(ctx context.Context, stats *Stats, blockNum
return nil
}

func (p *Processor) ProcessTransaction(ctx context.Context, stats *Stats, blockNum uint64, confirmedTransaction *pbsol.ConfirmedTransaction) error {
start := time.Now()
if confirmedTransaction.Meta.Err != nil {
p.logger.Info("skipping transaction with error", zap.Uint64("block_num", blockNum), zap.String("trx_id", base58.Encode(confirmedTransaction.Transaction.Signatures[0])))
return nil
}
accountKeys := confirmedTransaction.Transaction.Message.AccountKeys
for instructionIndex, compiledInstruction := range confirmedTransaction.Transaction.Message.Instructions {
idx := compiledInstruction.ProgramIdIndex
err := p.ProcessInstruction(ctx, stats, blockNum, confirmedTransaction.Transaction.Signatures[0], fmt.Sprintf("%d", instructionIndex), confirmedTransaction.Transaction.Message.AccountKeys[idx], accountKeys, compiledInstruction)
if err != nil {
return fmt.Errorf("confirmedTransaction %s processing compiled instruction: %w", getTransactionHash(confirmedTransaction.Transaction.Signatures), err)
}
inner := GetInnerInstructions(instructionIndex, confirmedTransaction.Meta.InnerInstructions)
if inner == nil {
continue // there are no inner instructions for the CompiledInstruction
}
for i, instruction := range inner.Instructions {
index := fmt.Sprintf("%d.%d", instructionIndex, i)
if len(accountKeys) < int(instruction.ProgramIdIndex) {
return fmt.Errorf("missing account key at instructionIndex %d for transaction %s with account keys count of %d", instruction.ProgramIdIndex, getTransactionHash(confirmedTransaction.Transaction.Signatures), len(accountKeys))
}

err := p.ProcessInstruction(ctx, stats, blockNum, confirmedTransaction.Transaction.Signatures[0], index, accountKeys[instruction.ProgramIdIndex], accountKeys, instruction)
if err != nil {
return fmt.Errorf("confirmedTransaction %s processing instruxction: %w", getTransactionHash(confirmedTransaction.Transaction.Signatures), err)
}
}
}
stats.totalTransactionProcessingDuration += time.Since(start)
return nil
}

func GetInnerInstructions(index int, trxMetaInnerInstructions []*pbsol.InnerInstructions) *pbsol.InnerInstructions {
for _, innerInstructions := range trxMetaInnerInstructions {
if int(innerInstructions.Index) == index {
Expand Down
21 changes: 10 additions & 11 deletions cmd/firesol/find_invalid_block.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package main
import (
"cloud.google.com/go/bigtable"
"fmt"
"github.com/gagliardetto/solana-go/rpc"
"github.com/mr-tron/base58"
"github.com/spf13/cobra"
"github.com/streamingfast/cli/sflags"
firecore "github.com/streamingfast/firehose-core"
Expand Down Expand Up @@ -35,8 +35,7 @@ func processFindInvalidBlockE(chain *firecore.Chain[*pbsolv1.Block], logger *zap
return func(cmd *cobra.Command, args []string) error {
ctx := cmd.Context()

rpcClient := rpc.New(sflags.MustGetString(cmd, "rpc-endpoint"))
_ = rpcClient
//rpcClient := rpc.New(sflags.MustGetString(cmd, "rpc-endpoint"))

startBlockNum, err := strconv.ParseUint(args[0], 10, 64)
if err != nil {
Expand Down Expand Up @@ -65,20 +64,20 @@ func processFindInvalidBlockE(chain *firecore.Chain[*pbsolv1.Block], logger *zap
btClient := bt.New(client, 10, logger, tracer)

return btClient.ReadBlocks(ctx, startBlockNum, endBlockNum, linkable, func(block *pbsolv1.Block) error {
missingLogMessagesAndInnerInstructions := 0
trxMissingLogMessagesAndInnerInstructions := 0
numberOfTransactions := len(block.Transactions)
var transactionNotMissing []string
for _, trx := range block.Transactions {
if trx.Meta.Err != nil {
continue
}

if trx.Meta.LogMessagesNone && trx.Meta.InnerInstructionsNone {
missingLogMessagesAndInnerInstructions++
trxMissingLogMessagesAndInnerInstructions++
continue
}
transactionNotMissing = append(transactionNotMissing, base58.Encode(trx.Transaction.Signatures[0]))
}

if missingLogMessagesAndInnerInstructions > 0 {
if trxMissingLogMessagesAndInnerInstructions == numberOfTransactions {
fmt.Printf("Block: %d number of transactions: %d\n", block.Slot, len(block.Transactions))
fmt.Printf("\tNumber transactions with missing log messags and inner instructions: %d\n", missingLogMessagesAndInnerInstructions)
fmt.Printf("\tTransactions containing logs: %s\n", transactionNotMissing)
}
return nil
})
Expand Down
3 changes: 3 additions & 0 deletions cmd/firesol/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,13 +44,16 @@ func main() {
RegisterExtraCmd: func(chain *firecore.Chain[*pbsol.Block], toolsCmd *cobra.Command, zlog *zap.Logger, tracer logging.Tracer) error {
toolsCmd.AddCommand(newToolsBigtableCmd(zlog, tracer))
toolsCmd.AddCommand(newToolsBatchFileCmd(zlog))

toolsCmd.AddCommand(newProcessAddressLookupCmd(zlog, tracer, chain))
toolsCmd.AddCommand(newTrxAddressesLookupCmd(zlog, tracer, chain))
toolsCmd.AddCommand(newAddressesLookupCmd(zlog, tracer, chain))

toolsCmd.AddCommand(newValidateResolvedAddresses(zlog, tracer, chain))
toolsCmd.AddCommand(newValidateAllResolvedAddresses(zlog, tracer, chain))

toolsCmd.AddCommand(newResolveAccountsBlockCmd(zlog, tracer, chain))

return nil
},
},
Expand Down
Loading

0 comments on commit 103291d

Please sign in to comment.