Browse Source

PIP-0032: atomic swap bug fixes

Herman Schoenfeld 6 years ago
parent
commit
d787574032
3 changed files with 30 additions and 27 deletions
  1. 6 3
      src/core/UAccounts.pas
  2. 9 9
      src/core/UBlockChain.pas
  3. 15 15
      src/core/UOpTransaction.pas

+ 6 - 3
src/core/UAccounts.pas

@@ -1417,16 +1417,19 @@ end;
 class function TAccountComp.IsAccountForSaleOrSwapAcceptingTransactions(const account: TAccount; const APayload : TRawBytes): Boolean;
 class function TAccountComp.IsAccountForSaleOrSwapAcceptingTransactions(const account: TAccount; const APayload : TRawBytes): Boolean;
 var errors : String;
 var errors : String;
 begin
 begin
+  Result := false;
   if Not IsAccountForSaleOrSwap(account.accountInfo) then
   if Not IsAccountForSaleOrSwap(account.accountInfo) then
-    exit(false);
+    exit;
 
 
   if (account.accountInfo.state in [as_ForSale, as_ForAtomicAccountSwap]) then
   if (account.accountInfo.state in [as_ForSale, as_ForAtomicAccountSwap]) then
     if NOT IsValidAccountKey(account.accountInfo.new_publicKey,errors) then
     if NOT IsValidAccountKey(account.accountInfo.new_publicKey,errors) then
-      exit(false);
+      exit;
 
 
    if (account.accountInfo.state in [as_ForAtomicAccountSwap, as_ForAtomicCoinSwap]) then
    if (account.accountInfo.state in [as_ForAtomicAccountSwap, as_ForAtomicCoinSwap]) then
      if NOT IsValidHashLockKey(account, APayload) then
      if NOT IsValidHashLockKey(account, APayload) then
-       exit(false);
+       exit;
+
+  Result := true;
 end;
 end;
 
 
 class function TAccountComp.IsAccountLocked(const AccountInfo: TAccountInfo; blocks_count: Cardinal): Boolean;
 class function TAccountComp.IsAccountLocked(const AccountInfo: TAccountInfo; blocks_count: Cardinal): Boolean;

+ 9 - 9
src/core/UBlockChain.pas

@@ -209,9 +209,8 @@ Type
   { TPCOperation }
   { TPCOperation }
 
 
   TPCOperation = Class
   TPCOperation = Class
-  Private
   Protected
   Protected
-    FCurrentProtocol : Word;
+    FProtocolVersion : Word;
     FPrevious_Signer_updated_block: Cardinal;
     FPrevious_Signer_updated_block: Cardinal;
     FPrevious_Destination_updated_block : Cardinal;
     FPrevious_Destination_updated_block : Cardinal;
     FPrevious_Seller_updated_block : Cardinal;
     FPrevious_Seller_updated_block : Cardinal;
@@ -219,7 +218,7 @@ Type
     FUsedPubkeyForSignature : TECDSA_Public;
     FUsedPubkeyForSignature : TECDSA_Public;
     FBufferedSha256 : TRawBytes;
     FBufferedSha256 : TRawBytes;
     FBufferedRipeMD160 : TRawBytes; // OPID is a RipeMD160 of the GetBufferForOpHash(True) value, 20 bytes length
     FBufferedRipeMD160 : TRawBytes; // OPID is a RipeMD160 of the GetBufferForOpHash(True) value, 20 bytes length
-    procedure InitializeData; virtual;
+    procedure InitializeData(AProtocolVersion : Word); virtual;
     function SaveOpToStream(Stream: TStream; SaveExtendedData : Boolean): Boolean; virtual; abstract;
     function SaveOpToStream(Stream: TStream; SaveExtendedData : Boolean): Boolean; virtual; abstract;
     function LoadOpFromStream(Stream: TStream; LoadExtendedData : Boolean): Boolean; virtual; abstract;
     function LoadOpFromStream(Stream: TStream; LoadExtendedData : Boolean): Boolean; virtual; abstract;
     procedure FillOperationResume(Block : Cardinal; getInfoForAllAccounts : Boolean; Affected_account_number : Cardinal; var OperationResume : TOperationResume); virtual;
     procedure FillOperationResume(Block : Cardinal; getInfoForAllAccounts : Boolean; Affected_account_number : Cardinal; var OperationResume : TOperationResume); virtual;
@@ -229,8 +228,9 @@ Type
     function IsValidECDSASignature(const PubKey: TECDSA_Public; current_protocol : Word; const Signature: TECDSA_SIG): Boolean;
     function IsValidECDSASignature(const PubKey: TECDSA_Public; current_protocol : Word; const Signature: TECDSA_SIG): Boolean;
     procedure CopyUsedPubkeySignatureFrom(SourceOperation : TPCOperation); virtual;
     procedure CopyUsedPubkeySignatureFrom(SourceOperation : TPCOperation); virtual;
   public
   public
-    constructor Create(ACurrentProtocol : Word); virtual;
+    constructor Create(AProtocolVersion : Word); virtual;
     destructor Destroy; override;
     destructor Destroy; override;
+    property ProtocolVersion : Word read FProtocolVersion;
     function GetBufferForOpHash(UseProtocolV2 : Boolean): TRawBytes; virtual;
     function GetBufferForOpHash(UseProtocolV2 : Boolean): TRawBytes; virtual;
     function DoOperation(AccountPreviousUpdatedBlock : TAccountPreviousBlockInfo; AccountTransaction : TPCSafeBoxTransaction; var errors: String): Boolean; virtual; abstract;
     function DoOperation(AccountPreviousUpdatedBlock : TAccountPreviousBlockInfo; AccountTransaction : TPCSafeBoxTransaction; var errors: String): Boolean; virtual; abstract;
     procedure AffectedAccounts(list : TList<Cardinal>); virtual; abstract;
     procedure AffectedAccounts(list : TList<Cardinal>); virtual; abstract;
@@ -2426,7 +2426,7 @@ begin
       msCopy := TMemoryStream.Create;
       msCopy := TMemoryStream.Create;
       try
       try
         P^.Op := TPCOperation( op.NewInstance );
         P^.Op := TPCOperation( op.NewInstance );
-        P^.Op.InitializeData;
+        P^.Op.InitializeData(op.ProtocolVersion);
         op.SaveOpToStream(msCopy,true);
         op.SaveOpToStream(msCopy,true);
         msCopy.Position := 0;
         msCopy.Position := 0;
         P^.Op.LoadOpFromStream(msCopy, true);
         P^.Op.LoadOpFromStream(msCopy, true);
@@ -2871,14 +2871,13 @@ end;
 
 
 { TPCOperation }
 { TPCOperation }
 
 
-constructor TPCOperation.Create(ACurrentProtocol: word);
+constructor TPCOperation.Create(AProtocolVersion : Word);
 begin
 begin
-  FCurrentProtocol := ACurrentProtocol;
   FHasValidSignature := False;
   FHasValidSignature := False;
   FBufferedSha256:=Nil;
   FBufferedSha256:=Nil;
   FBufferedRipeMD160:=Nil;
   FBufferedRipeMD160:=Nil;
   FUsedPubkeyForSignature := CT_TECDSA_Public_Nul;
   FUsedPubkeyForSignature := CT_TECDSA_Public_Nul;
-  InitializeData;
+  InitializeData(AProtocolVersion);
 end;
 end;
 
 
 destructor TPCOperation.Destroy;
 destructor TPCOperation.Destroy;
@@ -3055,8 +3054,9 @@ begin
   Result := TCrypto.ToHexaString(operationHash);
   Result := TCrypto.ToHexaString(operationHash);
 end;
 end;
 
 
-procedure TPCOperation.InitializeData;
+procedure TPCOperation.InitializeData(AProtocolVersion : Word);
 begin
 begin
+  FProtocolVersion := AProtocolVersion;
   FPrevious_Signer_updated_block := 0;
   FPrevious_Signer_updated_block := 0;
   FPrevious_Destination_updated_block := 0;
   FPrevious_Destination_updated_block := 0;
   FPrevious_Seller_updated_block := 0;
   FPrevious_Seller_updated_block := 0;

+ 15 - 15
src/core/UOpTransaction.pas

@@ -79,7 +79,7 @@ Type
   private
   private
     FData : TOpTransactionData;
     FData : TOpTransactionData;
   protected
   protected
-    procedure InitializeData; override;
+    procedure InitializeData(AProtocolVersion : Word); override;
     function SaveOpToStream(Stream: TStream; SaveExtendedData : Boolean): Boolean; override;
     function SaveOpToStream(Stream: TStream; SaveExtendedData : Boolean): Boolean; override;
     function LoadOpFromStream(Stream: TStream; LoadExtendedData : Boolean): Boolean; override;
     function LoadOpFromStream(Stream: TStream; LoadExtendedData : Boolean): Boolean; override;
     procedure FillOperationResume(Block : Cardinal; getInfoForAllAccounts : Boolean; Affected_account_number : Cardinal; var OperationResume : TOperationResume); override;
     procedure FillOperationResume(Block : Cardinal; getInfoForAllAccounts : Boolean; Affected_account_number : Cardinal; var OperationResume : TOperationResume); override;
@@ -112,7 +112,7 @@ Type
   private
   private
     FData : TOpChangeKeyData;
     FData : TOpChangeKeyData;
   protected
   protected
-    procedure InitializeData; override;
+    procedure InitializeData(AProtocolVersion : Word); override;
     function SaveOpToStream(Stream: TStream; SaveExtendedData : Boolean): Boolean; override;
     function SaveOpToStream(Stream: TStream; SaveExtendedData : Boolean): Boolean; override;
     function LoadOpFromStream(Stream: TStream; LoadExtendedData : Boolean): Boolean; override;
     function LoadOpFromStream(Stream: TStream; LoadExtendedData : Boolean): Boolean; override;
     procedure FillOperationResume(Block : Cardinal; getInfoForAllAccounts : Boolean; Affected_account_number : Cardinal; var OperationResume : TOperationResume); override;
     procedure FillOperationResume(Block : Cardinal; getInfoForAllAccounts : Boolean; Affected_account_number : Cardinal; var OperationResume : TOperationResume); override;
@@ -151,7 +151,7 @@ Type
   private
   private
     FData : TOpRecoverFoundsData;
     FData : TOpRecoverFoundsData;
   protected
   protected
-    procedure InitializeData; override;
+    procedure InitializeData(AProtocolVersion : Word); override;
     function SaveOpToStream(Stream: TStream; SaveExtendedData : Boolean): Boolean; override;
     function SaveOpToStream(Stream: TStream; SaveExtendedData : Boolean): Boolean; override;
     function LoadOpFromStream(Stream: TStream; LoadExtendedData : Boolean): Boolean; override;
     function LoadOpFromStream(Stream: TStream; LoadExtendedData : Boolean): Boolean; override;
     procedure FillOperationResume(Block : Cardinal; getInfoForAllAccounts : Boolean; Affected_account_number : Cardinal; var OperationResume : TOperationResume); override;
     procedure FillOperationResume(Block : Cardinal; getInfoForAllAccounts : Boolean; Affected_account_number : Cardinal; var OperationResume : TOperationResume); override;
@@ -222,7 +222,7 @@ Type
   private
   private
     FData : TOpListAccountData;
     FData : TOpListAccountData;
   protected
   protected
-    procedure InitializeData; override;
+    procedure InitializeData(AProtocolVersion : Word); override;
     function SaveOpToStream(Stream: TStream; SaveExtendedData : Boolean): Boolean; override;
     function SaveOpToStream(Stream: TStream; SaveExtendedData : Boolean): Boolean; override;
     function LoadOpFromStream(Stream: TStream; LoadExtendedData : Boolean): Boolean; override;
     function LoadOpFromStream(Stream: TStream; LoadExtendedData : Boolean): Boolean; override;
     procedure FillOperationResume(Block : Cardinal; getInfoForAllAccounts : Boolean; Affected_account_number : Cardinal; var OperationResume : TOperationResume); override;
     procedure FillOperationResume(Block : Cardinal; getInfoForAllAccounts : Boolean; Affected_account_number : Cardinal; var OperationResume : TOperationResume); override;
@@ -263,7 +263,7 @@ Type
 
 
   TOpBuyAccount = Class(TOpTransaction)
   TOpBuyAccount = Class(TOpTransaction)
   protected
   protected
-    procedure InitializeData; override;
+    procedure InitializeData(AProtocolVersion : Word); override;
   public
   public
     class function OpType : Byte; override;
     class function OpType : Byte; override;
     Constructor CreateBuy(ACurrentProtocol : Word; account_number, n_operation, account_to_buy, account_to_pay: Cardinal; price, amount, fee : UInt64; new_public_key:TAccountKey; key:TECPrivateKey; payload: TRawBytes);
     Constructor CreateBuy(ACurrentProtocol : Word; account_number, n_operation, account_to_buy, account_to_pay: Cardinal; price, amount, fee : UInt64; new_public_key:TAccountKey; key:TECPrivateKey; payload: TRawBytes);
@@ -275,7 +275,7 @@ Type
   private
   private
     FData : TOpChangeAccountInfoData;
     FData : TOpChangeAccountInfoData;
   protected
   protected
-    procedure InitializeData; override;
+    procedure InitializeData(AProtocolVersion : Word); override;
     function SaveOpToStream(Stream: TStream; SaveExtendedData : Boolean): Boolean; override;
     function SaveOpToStream(Stream: TStream; SaveExtendedData : Boolean): Boolean; override;
     function LoadOpFromStream(Stream: TStream; LoadExtendedData : Boolean): Boolean; override;
     function LoadOpFromStream(Stream: TStream; LoadExtendedData : Boolean): Boolean; override;
     procedure FillOperationResume(Block : Cardinal; getInfoForAllAccounts : Boolean; Affected_account_number : Cardinal; var OperationResume : TOperationResume); override;
     procedure FillOperationResume(Block : Cardinal; getInfoForAllAccounts : Boolean; Affected_account_number : Cardinal; var OperationResume : TOperationResume); override;
@@ -325,7 +325,7 @@ Type
   private
   private
     FData : TOpDataData;
     FData : TOpDataData;
   protected
   protected
-    procedure InitializeData; override;
+    procedure InitializeData(AProtocolVersion : Word); override;
     function SaveOpToStream(Stream: TStream; SaveExtendedData : Boolean): Boolean; override;
     function SaveOpToStream(Stream: TStream; SaveExtendedData : Boolean): Boolean; override;
     function LoadOpFromStream(Stream: TStream; LoadExtendedData : Boolean): Boolean; override;
     function LoadOpFromStream(Stream: TStream; LoadExtendedData : Boolean): Boolean; override;
     procedure FillOperationResume(Block : Cardinal; getInfoForAllAccounts : Boolean; Affected_account_number : Cardinal; var OperationResume : TOperationResume); override;
     procedure FillOperationResume(Block : Cardinal; getInfoForAllAccounts : Boolean; Affected_account_number : Cardinal; var OperationResume : TOperationResume); override;
@@ -375,9 +375,9 @@ End;
 
 
 { TOpChangeAccountInfo }
 { TOpChangeAccountInfo }
 
 
-procedure TOpChangeAccountInfo.InitializeData;
+procedure TOpChangeAccountInfo.InitializeData(AProtocolVersion : Word);
 begin
 begin
-  inherited InitializeData;
+  inherited InitializeData(AProtocolVersion);
   FData := CT_TOpChangeAccountInfoData_NUL;
   FData := CT_TOpChangeAccountInfoData_NUL;
 end;
 end;
 
 
@@ -1432,9 +1432,9 @@ begin
   end;
   end;
 end;
 end;
 
 
-procedure TOpChangeKey.InitializeData;
+procedure TOpChangeKey.InitializeData(AProtocolVersion : Word);
 begin
 begin
-  inherited;
+  inherited(AProtocolVersion);
   FData := CT_TOpChangeKeyData_NUL;
   FData := CT_TOpChangeKeyData_NUL;
 end;
 end;
 
 
@@ -1993,7 +1993,7 @@ begin
     FData.new_public_key := TAccountComp.RawString2Accountkey(raw);
     FData.new_public_key := TAccountComp.RawString2Accountkey(raw);
     Stream.Read(FData.locked_until_block,Sizeof(FData.locked_until_block));
     Stream.Read(FData.locked_until_block,Sizeof(FData.locked_until_block));
     // VERSION 5: read the new account state and hash-lock
     // VERSION 5: read the new account state and hash-lock
-    if FCurrentProtocol >= CT_PROTOCOL_5 then begin
+    if FProtocolVersion >= CT_PROTOCOL_5 then begin
       if Stream.Read(w, 2) < 0 then exit;  // the new account state to set
       if Stream.Read(w, 2) < 0 then exit;  // the new account state to set
       if Not (w in [Integer(as_ForSale),Integer(as_ForAtomicAccountSwap),Integer(as_ForAtomicCoinSwap)]) then begin
       if Not (w in [Integer(as_ForSale),Integer(as_ForAtomicAccountSwap),Integer(as_ForAtomicCoinSwap)]) then begin
         // Invalid value readed
         // Invalid value readed
@@ -2094,7 +2094,7 @@ begin
     TStreamOp.WriteAnsiString(Stream,TAccountComp.AccountKey2RawString(FData.new_public_key));
     TStreamOp.WriteAnsiString(Stream,TAccountComp.AccountKey2RawString(FData.new_public_key));
     Stream.Write(FData.locked_until_block,Sizeof(FData.locked_until_block));
     Stream.Write(FData.locked_until_block,Sizeof(FData.locked_until_block));
     // VERSION 5: write the new account state and hash-lock
     // VERSION 5: write the new account state and hash-lock
-    if FCurrentProtocol >= CT_PROTOCOL_5 then begin
+    if FProtocolVersion >= CT_PROTOCOL_5 then begin
       w := Word(FData.account_state);
       w := Word(FData.account_state);
       Stream.Write(w, 2);  // the new account state to set
       Stream.Write(w, 2);  // the new account state to set
       TStreamOp.WriteAnsiString(Stream, FData.hash_lock); // the hash-lock if any
       TStreamOp.WriteAnsiString(Stream, FData.hash_lock); // the hash-lock if any
@@ -2342,9 +2342,9 @@ end;
 
 
 { TOpData }
 { TOpData }
 
 
-procedure TOpData.InitializeData;
+procedure TOpData.InitializeData(AProtocolVersion : Word);
 begin
 begin
-  inherited InitializeData;
+  inherited InitializeData(AProtocolVersion);
   FData := CT_TOpDataData_NUL;
   FData := CT_TOpDataData_NUL;
 end;
 end;