github.com/stellar/stellar-etl@v1.0.1-0.20240312145900-4874b6bf2b89/cmd/export_account_signers.go (about)

     1  package cmd
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"github.com/sirupsen/logrus"
     7  	"github.com/spf13/cobra"
     8  
     9  	"github.com/stellar/stellar-etl/internal/input"
    10  	"github.com/stellar/stellar-etl/internal/transform"
    11  	"github.com/stellar/stellar-etl/internal/utils"
    12  
    13  	"github.com/stellar/go/xdr"
    14  )
    15  
    16  var accountSignersCmd = &cobra.Command{
    17  	Use:   "export_signers",
    18  	Short: "Exports the account signers data.",
    19  	Long: `Exports historical account signers data from the genesis ledger to the provided end-ledger to an output file. 
    20  The command reads from the bucket list, which includes the full history of the Stellar ledger. As a result, it 
    21  should be used in an initial data dump. In order to get account information within a specified ledger range, see 
    22  the export_ledger_entry_changes command.`,
    23  	Run: func(cmd *cobra.Command, args []string) {
    24  		cmdLogger.SetLevel(logrus.InfoLevel)
    25  		endNum, strictExport, isTest, isFuture, extra := utils.MustCommonFlags(cmd.Flags(), cmdLogger)
    26  		cmdLogger.StrictExport = strictExport
    27  		env := utils.GetEnvironmentDetails(isTest, isFuture)
    28  		path := utils.MustBucketFlags(cmd.Flags(), cmdLogger)
    29  		cloudStorageBucket, cloudCredentials, cloudProvider := utils.MustCloudStorageFlags(cmd.Flags(), cmdLogger)
    30  
    31  		accounts, err := input.GetEntriesFromGenesis(endNum, xdr.LedgerEntryTypeAccount, env.ArchiveURLs)
    32  		if err != nil {
    33  			cmdLogger.Fatal("could not read accounts: ", err)
    34  		}
    35  
    36  		outFile := mustOutFile(path)
    37  		numFailures := 0
    38  		totalNumBytes := 0
    39  		numSigners := 0
    40  		var header xdr.LedgerHeaderHistoryEntry
    41  		for _, acc := range accounts {
    42  			if acc.AccountSignersChanged() {
    43  				transformed, err := transform.TransformSigners(acc, header)
    44  				if err != nil {
    45  					cmdLogger.LogError(fmt.Errorf("could not json transform account signer: %v", err))
    46  					numFailures += 1
    47  					continue
    48  				}
    49  
    50  				for _, entry := range transformed {
    51  					numBytes, err := exportEntry(entry, outFile, extra)
    52  					if err != nil {
    53  						cmdLogger.LogError(fmt.Errorf("could not export entry: %v", err))
    54  						numFailures += 1
    55  						continue
    56  					}
    57  					numSigners += 1
    58  					totalNumBytes += numBytes
    59  				}
    60  			}
    61  		}
    62  
    63  		outFile.Close()
    64  		cmdLogger.Info("Number of bytes written: ", totalNumBytes)
    65  
    66  		printTransformStats(numSigners, numFailures)
    67  
    68  		maybeUpload(cloudCredentials, cloudStorageBucket, cloudProvider, path)
    69  	},
    70  }
    71  
    72  func init() {
    73  	rootCmd.AddCommand(accountSignersCmd)
    74  	utils.AddCommonFlags(accountSignersCmd.Flags())
    75  	utils.AddBucketFlags("signers", accountSignersCmd.Flags())
    76  	utils.AddCloudStorageFlags(accountSignersCmd.Flags())
    77  	accountSignersCmd.MarkFlagRequired("end-ledger")
    78  }