From 2bbae81498163a8b5d9f2d4c4aed2726ecb64415 Mon Sep 17 00:00:00 2001 From: hundredark Date: Wed, 23 Sep 2026 20:53:49 +0800 Subject: [PATCH 1/2] GetNonceAccountHash with finalized --- apps/solana/rpc.go | 8 ++++++-- solana/observer.go | 1 + 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/apps/solana/rpc.go b/apps/solana/rpc.go index 0df2d86..5498bb0 100644 --- a/apps/solana/rpc.go +++ b/apps/solana/rpc.go @@ -159,9 +159,13 @@ func (c *Client) RPCGetBalance(ctx context.Context, account solana.PublicKey) (u } func (c *Client) RPCGetAccount(ctx context.Context, account solana.PublicKey) (*rpc.GetAccountInfoResult, error) { + return c.rpcGetAccount(ctx, account, rpc.CommitmentProcessed) +} + +func (c *Client) rpcGetAccount(ctx context.Context, account solana.PublicKey, commitment rpc.CommitmentType) (*rpc.GetAccountInfoResult, error) { for { result, err := c.rpcClient.GetAccountInfoWithOpts(ctx, account, &rpc.GetAccountInfoOpts{ - Commitment: rpc.CommitmentProcessed, + Commitment: commitment, }) if mtg.CheckRetryableError(err) { time.Sleep(time.Millisecond * 300) @@ -262,7 +266,7 @@ func (c *Client) RPCGetTokenAccountsByOwner(ctx context.Context, owner solana.Pu } func (c *Client) GetNonceAccountHash(ctx context.Context, nonce solana.PublicKey) (*solana.Hash, error) { - account, err := c.RPCGetAccount(ctx, nonce) + account, err := c.rpcGetAccount(ctx, nonce, rpc.CommitmentFinalized) if err != nil { return nil, fmt.Errorf("solana.GetAccountInfo() => %v", err) } diff --git a/solana/observer.go b/solana/observer.go index 5b1aec5..6b9a9d2 100644 --- a/solana/observer.go +++ b/solana/observer.go @@ -488,6 +488,7 @@ func (node *Node) releaseNonceAccounts(ctx context.Context) error { continue } err = node.store.UpdateNonceAccount(ctx, nonce.Address, newNonceHash.String(), call.RequestId) + logger.Printf("store.UpdateNonceAccount(%s %s %s) => %v", nonce.Address, newNonceHash.String(), call.RequestId, err) if err != nil { panic(err) } From de3525d5897d9ff50f87a9f0872bb42d276f0110 Mon Sep 17 00:00:00 2001 From: hundredark Date: Wed, 23 Sep 2026 21:33:53 +0800 Subject: [PATCH 2/2] add migration --- store/migrate.go | 52 +++++++++++++++++++----------------------------- 1 file changed, 21 insertions(+), 31 deletions(-) diff --git a/store/migrate.go b/store/migrate.go index b5f7433..1159db2 100644 --- a/store/migrate.go +++ b/store/migrate.go @@ -3,19 +3,17 @@ package store import ( "context" "database/sql" - "errors" "fmt" + "strings" "time" - solanaApp "github.com/MixinNetwork/computer/apps/solana" - "github.com/MixinNetwork/mixin/logger" "github.com/MixinNetwork/safe/common" - "github.com/gagliardetto/solana-go" ) const ( - oversizedDepositMigrationKey = "SCHEMA:VERSION:OVERSIZED_DEPOSIT_7E823E4C" - oversizedDepositSystemCallID = "7e823e4c-b389-320a-b241-ff96c30d730b" + stalePostProcessNonceMigrationKey = "SCHEMA:VERSION:STALE_POST_PROCESS_NONCE_E3AAD597" + stalePostProcessSystemCallID = "e3aad597-2f6a-334d-b4fb-de634cfd6d81" + stalePostProcessNonceHash = "9nFUY4moFN6mEc6MhstcEeHhevziLx4kGk32sny9TitE" ) func (s *SQLite3Store) Migrate(ctx context.Context) error { @@ -28,7 +26,7 @@ func (s *SQLite3Store) Migrate(ctx context.Context) error { } defer common.Rollback(tx) - err = s.migrateOversizedDepositSystemCall(ctx, tx) + err = s.migrateStalePostProcessNonce(ctx, tx) if err != nil { return err } @@ -36,41 +34,33 @@ func (s *SQLite3Store) Migrate(ctx context.Context) error { return tx.Commit() } -func (s *SQLite3Store) migrateOversizedDepositSystemCall(ctx context.Context, tx *sql.Tx) error { - applied, err := s.checkExistence(ctx, tx, "SELECT value FROM properties WHERE key=?", oversizedDepositMigrationKey) +func (s *SQLite3Store) migrateStalePostProcessNonce(ctx context.Context, tx *sql.Tx) error { + applied, err := s.checkExistence(ctx, tx, "SELECT value FROM properties WHERE key=?", stalePostProcessNonceMigrationKey) if err != nil || applied { return err } - call, err := s.ReadSystemCallByRequestId(ctx, oversizedDepositSystemCallID, common.RequestStatePending) - if err != nil { - return fmt.Errorf("store.ReadSystemCallByRequestId(%s) => %v", oversizedDepositSystemCallID, err) - } - if call == nil { - return s.writeProperty(ctx, tx, oversizedDepositMigrationKey, "system call not found") + query := fmt.Sprintf("SELECT %s FROM system_calls WHERE id=?", strings.Join(systemCallCols, ",")) + call, err := systemCallFromRow(tx.QueryRowContext(ctx, query, stalePostProcessSystemCallID)) + if err != nil || call == nil { + return fmt.Errorf("SELECT stale post-process system call %v %v", call, err) } - if call.Type != CallTypeDeposit { - return fmt.Errorf("invalid system call type for oversized deposit migration: %s", call.Type) + if call.Type != CallTypePostProcess || call.State != common.RequestStatePending { + return fmt.Errorf("invalid system call type for stale post-process nonce migration: %s %d", call.Type, call.State) } - solanaTx, err := solana.TransactionFromBase64(call.Raw) + now := time.Now().UTC() + query = "UPDATE system_calls SET state=?, updated_at=? WHERE id=? AND call_type=? AND state=?" + err = s.execOne(ctx, tx, query, common.RequestStateFailed, now, stalePostProcessSystemCallID, CallTypePostProcess, common.RequestStatePending) if err != nil { - return fmt.Errorf("solana.TransactionFromBase64(%s) => %v", oversizedDepositSystemCallID, err) - } - sizeErr := solanaApp.ValidateTransactionSize(solanaTx) - if sizeErr == nil { - return s.writeProperty(ctx, tx, oversizedDepositMigrationKey, "transaction within size limit") - } - if !errors.Is(sizeErr, solanaApp.ErrTransactionTooLarge) { - return fmt.Errorf("solana.ValidateTransactionSize(%s) => %v", oversizedDepositSystemCallID, sizeErr) + return fmt.Errorf("UPDATE stale post-process system_calls %v", err) } - logger.Printf("store.migrateOversizedDepositSystemCall(%s) => %v", oversizedDepositSystemCallID, sizeErr) - query := "UPDATE system_calls SET state=?, updated_at=? WHERE id=? AND call_type=? AND state=?" - err = s.execOne(ctx, tx, query, common.RequestStateFailed, time.Now().UTC(), oversizedDepositSystemCallID, CallTypeDeposit, common.RequestStatePending) + query = "UPDATE nonce_accounts SET hash=?, mix=NULL, call_id=NULL, updated_at=? WHERE address=?" + err = s.execOne(ctx, tx, query, stalePostProcessNonceHash, now, call.NonceAccount) if err != nil { - return fmt.Errorf("SQLite3Store UPDATE oversized deposit system_calls %v", err) + return fmt.Errorf("UPDATE stale post-process nonce_accounts %v", err) } - return s.writeProperty(ctx, tx, oversizedDepositMigrationKey, sizeErr.Error()) + return s.writeProperty(ctx, tx, stalePostProcessNonceMigrationKey, "done") }