summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Lee <64482439+algojohnlee@users.noreply.github.com>2021-12-10 08:57:03 -0500
committerGitHub <noreply@github.com>2021-12-10 08:57:03 -0500
commitc4ef8181b5b3b0dca61feb2edde41dd3e414ee38 (patch)
tree198bec61bd20f2fb0f22890b610af9da32909a46
parent2baf39b72b6db24c9e0cbdecfe8325dcfffaa30c (diff)
parent3ac5e0efdc66918f5fc51478c968ff98d4e42dc4 (diff)
Merge pull request #3300 from algorand/relbeta3.2.2v3.2.2-beta
go-algorand v3.2.2-beta
-rw-r--r--buildnumber.dat2
-rw-r--r--catchup/service.go14
-rw-r--r--cmd/goal/account.go55
3 files changed, 62 insertions, 9 deletions
diff --git a/buildnumber.dat b/buildnumber.dat
index d00491fd7..0cfbf0888 100644
--- a/buildnumber.dat
+++ b/buildnumber.dat
@@ -1 +1 @@
-1
+2
diff --git a/catchup/service.go b/catchup/service.go
index 27ce957ba..de4a52a94 100644
--- a/catchup/service.go
+++ b/catchup/service.go
@@ -241,8 +241,10 @@ func (s *Service) fetchAndWrite(r basics.Round, prevFetchCompleteChan chan bool,
if err != nil {
if err == errLedgerAlreadyHasBlock {
- // ledger already has the block, no need to request this block from anyone.
- return true
+ // ledger already has the block, no need to request this block.
+ // only the agreement could have added this block into the ledger, catchup is complete
+ s.log.Infof("fetchAndWrite(%d): the block is already in the ledger. The catchup is complete", r)
+ return false
}
s.log.Debugf("fetchAndWrite(%v): Could not fetch: %v (attempt %d)", r, err, i)
peerSelector.rankPeer(psp, peerRankDownloadFailed)
@@ -353,8 +355,10 @@ func (s *Service) fetchAndWrite(r basics.Round, prevFetchCompleteChan chan bool,
s.log.Infof("fetchAndWrite(%d): no need to re-evaluate historical block", r)
return true
case ledgercore.BlockInLedgerError:
- s.log.Infof("fetchAndWrite(%d): block already in ledger", r)
- return true
+ // the block was added to the ledger from elsewhere after fetching it here
+ // only the agreement could have added this block into the ledger, catchup is complete
+ s.log.Infof("fetchAndWrite(%d): after fetching the block, it is already in the ledger. The catchup is complete", r)
+ return false
case protocol.Error:
if !s.protocolErrorLogged {
logging.Base().Errorf("fetchAndWrite(%v): unrecoverable protocol error detected: %v", r, err)
@@ -387,7 +391,7 @@ func (s *Service) pipelineCallback(r basics.Round, thisFetchComplete chan bool,
thisFetchComplete <- fetchResult
if !fetchResult {
- s.log.Infof("failed to fetch block %v", r)
+ s.log.Infof("pipelineCallback(%d): did not fetch or write the block", r)
return 0
}
return r
diff --git a/cmd/goal/account.go b/cmd/goal/account.go
index 7d20af38f..ccc37f227 100644
--- a/cmd/goal/account.go
+++ b/cmd/goal/account.go
@@ -59,7 +59,7 @@ var (
partKeyOutDir string
partKeyFile string
partKeyDeleteInput bool
- listpartkeyCompat bool
+ partkeyCompat bool
importDefault bool
mnemonic string
dumpOutFile string
@@ -167,7 +167,10 @@ func init() {
installParticipationKeyCmd.Flags().BoolVar(&partKeyDeleteInput, "delete-input", false, "Acknowledge that installpartkey will delete the input key file")
// listpartkey flags
- listParticipationKeysCmd.Flags().BoolVarP(&listpartkeyCompat, "compatibility", "c", false, "Print output in compatibility mode. This option will be removed in a future release, please use REST API for tooling.")
+ listParticipationKeysCmd.Flags().BoolVarP(&partkeyCompat, "compatibility", "c", false, "Print output in compatibility mode. This option will be removed in a future release, please use REST API for tooling.")
+
+ // partkeyinfo flags
+ partkeyInfoCmd.Flags().BoolVarP(&partkeyCompat, "compatibility", "c", false, "Print output in compatibility mode. This option will be removed in a future release, please use REST API for tooling.")
// import flags
importCmd.Flags().BoolVarP(&importDefault, "default", "f", false, "Set this account as the default one")
@@ -1069,6 +1072,7 @@ func uintToStr(number uint64) string {
// legacyListParticipationKeysCommand prints key information in the same
// format as earlier versions of goal. Some users are using this information
// in scripts and need some extra time to migrate to the REST API.
+// DEPRECATED
func legacyListParticipationKeysCommand() {
dataDir := ensureSingleDataDir()
@@ -1118,7 +1122,7 @@ var listParticipationKeysCmd = &cobra.Command{
Long: `List all participation keys tracked by algod along with summary of additional information. For detailed key information use 'partkeyinfo'.`,
Args: validateNoPosArgsFn,
Run: func(cmd *cobra.Command, args []string) {
- if listpartkeyCompat {
+ if partkeyCompat {
legacyListParticipationKeysCommand()
return
}
@@ -1364,12 +1368,57 @@ func strOrNA(value *uint64) string {
return uintToStr(*value)
}
+// legacyPartkeyInfoCommand prints key information in the same
+// format as earlier versions of goal. Some users are using this information
+// in scripts and need some extra time to migrate to alternatives.
+// DEPRECATED
+func legacyPartkeyInfoCommand() {
+ type partkeyInfo struct {
+ _struct struct{} `codec:",omitempty,omitemptyarray"`
+ Address string `codec:"acct"`
+ FirstValid basics.Round `codec:"first"`
+ LastValid basics.Round `codec:"last"`
+ VoteID crypto.OneTimeSignatureVerifier `codec:"vote"`
+ SelectionID crypto.VRFVerifier `codec:"sel"`
+ VoteKeyDilution uint64 `codec:"voteKD"`
+ }
+
+ onDataDirs(func(dataDir string) {
+ fmt.Printf("Dumping participation key info from %s...\n", dataDir)
+ client := ensureGoalClient(dataDir, libgoal.DynamicClient)
+
+ // Make sure we don't already have a partkey valid for (or after) specified roundLastValid
+ parts, err := client.ListParticipationKeyFiles()
+ if err != nil {
+ reportErrorf(errorRequestFail, err)
+ }
+
+ for filename, part := range parts {
+ fmt.Println("------------------------------------------------------------------")
+ info := partkeyInfo{
+ Address: part.Address().String(),
+ FirstValid: part.FirstValid,
+ LastValid: part.LastValid,
+ VoteID: part.VotingSecrets().OneTimeSignatureVerifier,
+ SelectionID: part.VRFSecrets().PK,
+ VoteKeyDilution: part.KeyDilution,
+ }
+ infoString := protocol.EncodeJSON(&info)
+ fmt.Printf("File: %s\n%s\n", filename, string(infoString))
+ }
+ })
+}
+
var partkeyInfoCmd = &cobra.Command{
Use: "partkeyinfo",
Short: "Output details about all available part keys",
Long: `Output details about all available part keys in the specified data directory(ies), such as key validity period.`,
Args: validateNoPosArgsFn,
Run: func(cmd *cobra.Command, args []string) {
+ if partkeyCompat {
+ legacyPartkeyInfoCommand()
+ return
+ }
onDataDirs(func(dataDir string) {
fmt.Printf("Dumping participation key info from %s...\n", dataDir)