|
@@ -535,10 +535,10 @@ Type
|
|
End;
|
|
End;
|
|
|
|
|
|
Const
|
|
Const
|
|
- CT_TOperationResume_NUL : TOperationResume = (valid:false;Block:0;NOpInsideBlock:-1;OpType:0;OpSubtype:0;time:0;AffectedAccount:0;SignerAccount:-1;n_operation:0;DestAccount:-1;SellerAccount:-1;newKey:(EC_OpenSSL_NID:0;x:'';y:'');OperationTxt:'';Amount:0;Fee:0;Balance:0;OriginalPayload:'';PrintablePayload:'';OperationHash:'';OperationHash_OLD:'';errors:'';isMultiOperation:False;Senders:Nil;Receivers:Nil;changers:Nil);
|
|
|
|
- CT_TMultiOpSender_NUL : TMultiOpSender = (Account:0;Amount:0;N_Operation:0;Payload:'';Signature:(r:'';s:''));
|
|
|
|
- CT_TMultiOpReceiver_NUL : TMultiOpReceiver = (Account:0;Amount:0;Payload:'');
|
|
|
|
- CT_TMultiOpChangeInfo_NUL : TMultiOpChangeInfo = (Account:0;N_Operation:0;Changes_type:[];New_Accountkey:(EC_OpenSSL_NID:0;x:'';y:'');New_Name:'';New_Type:0;Seller_Account:-1;Account_Price:-1;Locked_Until_Block:0;Fee:0;Signature:(r:'';s:''));
|
|
|
|
|
|
+ CT_TOperationResume_NUL : TOperationResume = (valid:false;Block:0;NOpInsideBlock:-1;OpType:0;OpSubtype:0;time:0;AffectedAccount:0;SignerAccount:-1;n_operation:0;DestAccount:-1;SellerAccount:-1;newKey:(EC_OpenSSL_NID:0;x:Nil;y:Nil);OperationTxt:'';Amount:0;Fee:0;Balance:0;OriginalPayload:Nil;PrintablePayload:'';OperationHash:Nil;OperationHash_OLD:Nil;errors:'';isMultiOperation:False;Senders:Nil;Receivers:Nil;changers:Nil);
|
|
|
|
+ CT_TMultiOpSender_NUL : TMultiOpSender = (Account:0;Amount:0;N_Operation:0;Payload:Nil;Signature:(r:Nil;s:Nil));
|
|
|
|
+ CT_TMultiOpReceiver_NUL : TMultiOpReceiver = (Account:0;Amount:0;Payload:Nil);
|
|
|
|
+ CT_TMultiOpChangeInfo_NUL : TMultiOpChangeInfo = (Account:0;N_Operation:0;Changes_type:[];New_Accountkey:(EC_OpenSSL_NID:0;x:Nil;y:Nil);New_Name:Nil;New_Type:0;Seller_Account:-1;Account_Price:-1;Locked_Until_Block:0;Fee:0;Signature:(r:Nil;s:Nil));
|
|
CT_TOpChangeAccountInfoType_Txt : Array[Low(TOpChangeAccountInfoType)..High(TOpChangeAccountInfoType)] of AnsiString = ('public_key','account_name','account_type','list_for_public_sale','list_for_private_sale','delist');
|
|
CT_TOpChangeAccountInfoType_Txt : Array[Low(TOpChangeAccountInfoType)..High(TOpChangeAccountInfoType)] of AnsiString = ('public_key','account_name','account_type','list_for_public_sale','list_for_private_sale','delist');
|
|
|
|
|
|
implementation
|
|
implementation
|
|
@@ -840,7 +840,7 @@ procedure TPCBank.Clear;
|
|
begin
|
|
begin
|
|
SafeBox.Clear;
|
|
SafeBox.Clear;
|
|
FLastOperationBlock := TPCOperationsComp.GetFirstBlock;
|
|
FLastOperationBlock := TPCOperationsComp.GetFirstBlock;
|
|
- FLastOperationBlock.initial_safe_box_hash := TCrypto.DoSha256(CT_Genesis_Magic_String_For_Old_Block_Hash); // Genesis hash
|
|
|
|
|
|
+ FLastOperationBlock.initial_safe_box_hash := TCrypto.DoSha256(TEncoding.ASCII.GetBytes(CT_Genesis_Magic_String_For_Old_Block_Hash)); // Genesis hash
|
|
FLastBlockCache.Clear(true);
|
|
FLastBlockCache.Clear(true);
|
|
{$IFDEF HIGHLOG}NewLog(Nil, ltdebug, 'Clear Bank');{$ENDIF}
|
|
{$IFDEF HIGHLOG}NewLog(Nil, ltdebug, 'Clear Bank');{$ENDIF}
|
|
end;
|
|
end;
|
|
@@ -969,7 +969,7 @@ begin
|
|
try
|
|
try
|
|
FLastBlockCache.Clear(True);
|
|
FLastBlockCache.Clear(True);
|
|
FLastOperationBlock := TPCOperationsComp.GetFirstBlock;
|
|
FLastOperationBlock := TPCOperationsComp.GetFirstBlock;
|
|
- FLastOperationBlock.initial_safe_box_hash := TCrypto.DoSha256(CT_Genesis_Magic_String_For_Old_Block_Hash); // Genesis hash
|
|
|
|
|
|
+ FLastOperationBlock.initial_safe_box_hash := TCrypto.DoSha256(TEncoding.ASCII.GetBytes(CT_Genesis_Magic_String_For_Old_Block_Hash)); // Genesis hash
|
|
If FSafeBox.BlocksCount>0 then begin
|
|
If FSafeBox.BlocksCount>0 then begin
|
|
Storage.Initialize;
|
|
Storage.Initialize;
|
|
If Storage.LoadBlockChainBlock(FLastBlockCache,FSafeBox.BlocksCount-1) then begin
|
|
If Storage.LoadBlockChainBlock(FLastBlockCache,FSafeBox.BlocksCount-1) then begin
|
|
@@ -1075,7 +1075,7 @@ begin
|
|
If SafeBox.BlocksCount>0 then FLastOperationBlock := SafeBox.Block(SafeBox.BlocksCount-1).blockchainInfo
|
|
If SafeBox.BlocksCount>0 then FLastOperationBlock := SafeBox.Block(SafeBox.BlocksCount-1).blockchainInfo
|
|
else begin
|
|
else begin
|
|
FLastOperationBlock := TPCOperationsComp.GetFirstBlock;
|
|
FLastOperationBlock := TPCOperationsComp.GetFirstBlock;
|
|
- FLastOperationBlock.initial_safe_box_hash := TCrypto.DoSha256(CT_Genesis_Magic_String_For_Old_Block_Hash); // Genesis hash
|
|
|
|
|
|
+ FLastOperationBlock.initial_safe_box_hash := TCrypto.DoSha256(TEncoding.ASCII.GetBytes(CT_Genesis_Magic_String_For_Old_Block_Hash)); // Genesis hash
|
|
end;
|
|
end;
|
|
finally
|
|
finally
|
|
FBankLock.Release;
|
|
FBankLock.Release;
|
|
@@ -1281,14 +1281,14 @@ begin
|
|
FOperationBlock.block := 0;
|
|
FOperationBlock.block := 0;
|
|
FOperationBlock.reward := TPascalCoinProtocol.GetRewardForNewLine(0);
|
|
FOperationBlock.reward := TPascalCoinProtocol.GetRewardForNewLine(0);
|
|
FOperationBlock.compact_target := CT_MinCompactTarget_v1;
|
|
FOperationBlock.compact_target := CT_MinCompactTarget_v1;
|
|
- FOperationBlock.initial_safe_box_hash := TCrypto.DoSha256(CT_Genesis_Magic_String_For_Old_Block_Hash); // Nothing for first line
|
|
|
|
|
|
+ FOperationBlock.initial_safe_box_hash := TCrypto.DoSha256(TEncoding.ASCII.GetBytes(CT_Genesis_Magic_String_For_Old_Block_Hash)); // Nothing for first line
|
|
FOperationBlock.protocol_version := CT_PROTOCOL_1;
|
|
FOperationBlock.protocol_version := CT_PROTOCOL_1;
|
|
FOperationsHashTree.Max0feeOperationsBySigner := -1;
|
|
FOperationsHashTree.Max0feeOperationsBySigner := -1;
|
|
end;
|
|
end;
|
|
FOperationBlock.operations_hash := FOperationsHashTree.HashTree;
|
|
FOperationBlock.operations_hash := FOperationsHashTree.HashTree;
|
|
FOperationBlock.fee := 0;
|
|
FOperationBlock.fee := 0;
|
|
FOperationBlock.nonce := 0;
|
|
FOperationBlock.nonce := 0;
|
|
- FOperationBlock.proof_of_work := '';
|
|
|
|
|
|
+ FOperationBlock.proof_of_work:=Nil;
|
|
FOperationBlock.protocol_available := CT_BlockChain_Protocol_Available;
|
|
FOperationBlock.protocol_available := CT_BlockChain_Protocol_Available;
|
|
FIsOnlyOperationBlock := false;
|
|
FIsOnlyOperationBlock := false;
|
|
Finally
|
|
Finally
|
|
@@ -1398,10 +1398,10 @@ begin
|
|
And (OperationBlock1.timestamp=OperationBlock2.timestamp)
|
|
And (OperationBlock1.timestamp=OperationBlock2.timestamp)
|
|
And (OperationBlock1.compact_target=OperationBlock2.compact_target)
|
|
And (OperationBlock1.compact_target=OperationBlock2.compact_target)
|
|
And (OperationBlock1.nonce=OperationBlock2.nonce)
|
|
And (OperationBlock1.nonce=OperationBlock2.nonce)
|
|
- And (OperationBlock1.block_payload=OperationBlock2.block_payload)
|
|
|
|
- And (OperationBlock1.initial_safe_box_hash=OperationBlock2.initial_safe_box_hash)
|
|
|
|
- And (OperationBlock1.operations_hash=OperationBlock2.operations_hash)
|
|
|
|
- And (OperationBlock1.proof_of_work=OperationBlock2.proof_of_work);
|
|
|
|
|
|
+ And (TBaseType.Equals(OperationBlock1.block_payload,OperationBlock2.block_payload))
|
|
|
|
+ And (TBaseType.Equals(OperationBlock1.initial_safe_box_hash,OperationBlock2.initial_safe_box_hash))
|
|
|
|
+ And (TBaseType.Equals(OperationBlock1.operations_hash,OperationBlock2.operations_hash))
|
|
|
|
+ And (TBaseType.Equals(OperationBlock1.proof_of_work,OperationBlock2.proof_of_work));
|
|
end;
|
|
end;
|
|
|
|
|
|
function TPCOperationsComp.GetAccountKey: TAccountKey;
|
|
function TPCOperationsComp.GetAccountKey: TAccountKey;
|
|
@@ -1477,7 +1477,7 @@ function TPCOperationsComp.LoadBlockFromStreamExt(Stream: TStream; LoadingFromSt
|
|
Var i : Integer;
|
|
Var i : Integer;
|
|
lastfee : UInt64;
|
|
lastfee : UInt64;
|
|
soob : Byte;
|
|
soob : Byte;
|
|
- m: AnsiString;
|
|
|
|
|
|
+ raw: TRawBytes;
|
|
load_protocol_version : Word;
|
|
load_protocol_version : Word;
|
|
begin
|
|
begin
|
|
Lock;
|
|
Lock;
|
|
@@ -1528,8 +1528,8 @@ begin
|
|
|
|
|
|
if Stream.Read(FOperationBlock.block, Sizeof(FOperationBlock.block))<0 then exit;
|
|
if Stream.Read(FOperationBlock.block, Sizeof(FOperationBlock.block))<0 then exit;
|
|
|
|
|
|
- if TStreamOp.ReadAnsiString(Stream, m) < 0 then exit;
|
|
|
|
- FOperationBlock.account_key := TAccountComp.RawString2Accountkey(m);
|
|
|
|
|
|
+ if TStreamOp.ReadAnsiString(Stream, raw) < 0 then exit;
|
|
|
|
+ FOperationBlock.account_key := TAccountComp.RawString2Accountkey(raw);
|
|
if Stream.Read(FOperationBlock.reward, Sizeof(FOperationBlock.reward)) < 0 then exit;
|
|
if Stream.Read(FOperationBlock.reward, Sizeof(FOperationBlock.reward)) < 0 then exit;
|
|
if Stream.Read(FOperationBlock.fee, Sizeof(FOperationBlock.fee)) < 0 then exit;
|
|
if Stream.Read(FOperationBlock.fee, Sizeof(FOperationBlock.fee)) < 0 then exit;
|
|
if Stream.Read(FOperationBlock.timestamp, Sizeof(FOperationBlock.timestamp)) < 0 then exit;
|
|
if Stream.Read(FOperationBlock.timestamp, Sizeof(FOperationBlock.timestamp)) < 0 then exit;
|
|
@@ -1583,7 +1583,7 @@ class function TPCOperationsComp.OperationBlockToText(const OperationBlock: TOpe
|
|
begin
|
|
begin
|
|
Result := Format('Block:%d Timestamp:%d Reward:%d Fee:%d Target:%d PoW:%s Payload:%s Nonce:%d OperationsHash:%s SBH:%s',[operationBlock.block,
|
|
Result := Format('Block:%d Timestamp:%d Reward:%d Fee:%d Target:%d PoW:%s Payload:%s Nonce:%d OperationsHash:%s SBH:%s',[operationBlock.block,
|
|
operationblock.timestamp,operationblock.reward,operationblock.fee, OperationBlock.compact_target, TCrypto.ToHexaString(operationblock.proof_of_work),
|
|
operationblock.timestamp,operationblock.reward,operationblock.fee, OperationBlock.compact_target, TCrypto.ToHexaString(operationblock.proof_of_work),
|
|
- OperationBlock.block_payload,OperationBlock.nonce,TCrypto.ToHexaString(OperationBlock.operations_hash),
|
|
|
|
|
|
+ OperationBlock.block_payload.ToPrintable,OperationBlock.nonce,TCrypto.ToHexaString(OperationBlock.operations_hash),
|
|
TCrypto.ToHexaString(OperationBlock.initial_safe_box_hash)]);
|
|
TCrypto.ToHexaString(OperationBlock.initial_safe_box_hash)]);
|
|
end;
|
|
end;
|
|
|
|
|
|
@@ -1644,10 +1644,10 @@ begin
|
|
FOperationBlock.block := 0;
|
|
FOperationBlock.block := 0;
|
|
FOperationBlock.reward := TPascalCoinProtocol.GetRewardForNewLine(0);
|
|
FOperationBlock.reward := TPascalCoinProtocol.GetRewardForNewLine(0);
|
|
FOperationBlock.compact_target := CT_MinCompactTarget_v1;
|
|
FOperationBlock.compact_target := CT_MinCompactTarget_v1;
|
|
- FOperationBlock.initial_safe_box_hash := TCrypto.DoSha256(CT_Genesis_Magic_String_For_Old_Block_Hash);
|
|
|
|
|
|
+ FOperationBlock.initial_safe_box_hash := TCrypto.DoSha256(TEncoding.ASCII.GetBytes(CT_Genesis_Magic_String_For_Old_Block_Hash));
|
|
FOperationBlock.protocol_version := CT_PROTOCOL_1;
|
|
FOperationBlock.protocol_version := CT_PROTOCOL_1;
|
|
end;
|
|
end;
|
|
- FOperationBlock.proof_of_work := '';
|
|
|
|
|
|
+ FOperationBlock.proof_of_work:=Nil;
|
|
FOperationBlock.protocol_available := CT_BlockChain_Protocol_Available;
|
|
FOperationBlock.protocol_available := CT_BlockChain_Protocol_Available;
|
|
n := 0;
|
|
n := 0;
|
|
FOperationBlock.fee := 0;
|
|
FOperationBlock.fee := 0;
|
|
@@ -2048,7 +2048,7 @@ begin
|
|
FListOrderedBySha256.Clear;
|
|
FListOrderedBySha256.Clear;
|
|
FListOrderedByAccountsData.Clear;
|
|
FListOrderedByAccountsData.Clear;
|
|
FListOrderedByOpReference.Clear;
|
|
FListOrderedByOpReference.Clear;
|
|
- FHashTree := '';
|
|
|
|
|
|
+ FHashTree:=Nil;
|
|
End;
|
|
End;
|
|
If Assigned(FOnChanged) then FOnChanged(Self);
|
|
If Assigned(FOnChanged) then FOnChanged(Self);
|
|
finally
|
|
finally
|
|
@@ -2101,7 +2101,7 @@ begin
|
|
FListOrderedByOpReference := TList.Create;
|
|
FListOrderedByOpReference := TList.Create;
|
|
FTotalAmount := 0;
|
|
FTotalAmount := 0;
|
|
FTotalFee := 0;
|
|
FTotalFee := 0;
|
|
- FHashTree := '';
|
|
|
|
|
|
+ FHashTree := Nil;
|
|
FMax0feeOperationsBySigner := -1; // Unlimited by default
|
|
FMax0feeOperationsBySigner := -1; // Unlimited by default
|
|
FHashTreeOperations := TPCThreadList.Create('TOperationsHashTree_HashTreeOperations');
|
|
FHashTreeOperations := TPCThreadList.Create('TOperationsHashTree_HashTreeOperations');
|
|
end;
|
|
end;
|
|
@@ -2169,7 +2169,7 @@ begin
|
|
// Recalc operations hash
|
|
// Recalc operations hash
|
|
FTotalAmount := 0;
|
|
FTotalAmount := 0;
|
|
FTotalFee := 0;
|
|
FTotalFee := 0;
|
|
- FHashTree := ''; // Init to future recalc
|
|
|
|
|
|
+ FHashTree := Nil; // Init to future recalc
|
|
for i := 0 to l.Count - 1 do begin
|
|
for i := 0 to l.Count - 1 do begin
|
|
P := l[i];
|
|
P := l[i];
|
|
// Include to hash tree
|
|
// Include to hash tree
|
|
@@ -2187,7 +2187,7 @@ begin
|
|
FOnChanged := Nil;
|
|
FOnChanged := Nil;
|
|
ClearHastThree;
|
|
ClearHastThree;
|
|
FreeAndNil(FHashTreeOperations);
|
|
FreeAndNil(FHashTreeOperations);
|
|
- SetLength(FHashTree,0);
|
|
|
|
|
|
+ FHashTree := Nil;
|
|
FreeAndNil(FListOrderedBySha256);
|
|
FreeAndNil(FListOrderedBySha256);
|
|
FreeAndNil(FListOrderedByAccountsData);
|
|
FreeAndNil(FListOrderedByAccountsData);
|
|
FreeAndNil(FListOrderedByOpReference);
|
|
FreeAndNil(FListOrderedByOpReference);
|
|
@@ -2198,16 +2198,18 @@ function TOperationsHashTree.GetHashTree: TRawBytes;
|
|
Var l : TList;
|
|
Var l : TList;
|
|
i : Integer;
|
|
i : Integer;
|
|
P : POperationHashTreeReg;
|
|
P : POperationHashTreeReg;
|
|
|
|
+ tmpRaw : TRawBytes;
|
|
begin
|
|
begin
|
|
if Length(FHashTree)<>32 then begin
|
|
if Length(FHashTree)<>32 then begin
|
|
l := FHashTreeOperations.LockList;
|
|
l := FHashTreeOperations.LockList;
|
|
Try
|
|
Try
|
|
- TCrypto.DoSha256('',FHashTree);
|
|
|
|
|
|
+ TCrypto.DoSha256(Nil,FHashTree);
|
|
for i := 0 to l.Count - 1 do begin
|
|
for i := 0 to l.Count - 1 do begin
|
|
P := l[i];
|
|
P := l[i];
|
|
// Include to hash tree
|
|
// Include to hash tree
|
|
// TCrypto.DoSha256(FHashTree+P^.Op.Sha256,FHashTree); COMPILER BUG 2.1.6: Using FHashTree as a "out" param can be initialized prior to be updated first parameter!
|
|
// TCrypto.DoSha256(FHashTree+P^.Op.Sha256,FHashTree); COMPILER BUG 2.1.6: Using FHashTree as a "out" param can be initialized prior to be updated first parameter!
|
|
- FHashTree := TCrypto.DoSha256(FHashTree+P^.Op.Sha256);
|
|
|
|
|
|
+ TBaseType.Concat(FHashTree,P^.Op.Sha256,tmpRaw);
|
|
|
|
+ FHashTree := TCrypto.DoSha256(tmpRaw);
|
|
end;
|
|
end;
|
|
Finally
|
|
Finally
|
|
FHashTreeOperations.UnlockList;
|
|
FHashTreeOperations.UnlockList;
|
|
@@ -2336,7 +2338,7 @@ begin
|
|
// Include to hash tree (Only if CalcNewHashTree=True)
|
|
// Include to hash tree (Only if CalcNewHashTree=True)
|
|
If (CalcNewHashTree) And (Length(FHashTree)=32) then begin
|
|
If (CalcNewHashTree) And (Length(FHashTree)=32) then begin
|
|
// TCrypto.DoSha256(FHashTree+op.Sha256,FHashTree); COMPILER BUG 2.1.6: Using FHashTree as a "out" param can be initialized prior to be updated first parameter!
|
|
// TCrypto.DoSha256(FHashTree+op.Sha256,FHashTree); COMPILER BUG 2.1.6: Using FHashTree as a "out" param can be initialized prior to be updated first parameter!
|
|
- hForNewHash := FHashTree + op.Sha256;
|
|
|
|
|
|
+ TBaseType.Concat(FHashTree,op.Sha256,hForNewHash);
|
|
TCrypto.DoSha256(hForNewHash,FHashTree);
|
|
TCrypto.DoSha256(hForNewHash,FHashTree);
|
|
end;
|
|
end;
|
|
npos := list.Add(P);
|
|
npos := list.Add(P);
|
|
@@ -2763,7 +2765,7 @@ end;
|
|
constructor TPCOperation.Create;
|
|
constructor TPCOperation.Create;
|
|
begin
|
|
begin
|
|
FHasValidSignature := False;
|
|
FHasValidSignature := False;
|
|
- FBufferedSha256:='';
|
|
|
|
|
|
+ FBufferedSha256:=Nil;
|
|
FUsedPubkeyForSignature := CT_TECDSA_Public_Nul;
|
|
FUsedPubkeyForSignature := CT_TECDSA_Public_Nul;
|
|
InitializeData;
|
|
InitializeData;
|
|
end;
|
|
end;
|
|
@@ -2878,7 +2880,7 @@ begin
|
|
block :=0;
|
|
block :=0;
|
|
account :=0;
|
|
account :=0;
|
|
n_operation :=0;
|
|
n_operation :=0;
|
|
- SetLength(md160Hash,0);
|
|
|
|
|
|
+ md160Hash := Nil;
|
|
if length(operationHash)<>32 then exit;
|
|
if length(operationHash)<>32 then exit;
|
|
ms := TMemoryStream.Create;
|
|
ms := TMemoryStream.Create;
|
|
try
|
|
try
|
|
@@ -2944,7 +2946,7 @@ begin
|
|
FPrevious_Seller_updated_block := 0;
|
|
FPrevious_Seller_updated_block := 0;
|
|
FHasValidSignature := false;
|
|
FHasValidSignature := false;
|
|
FUsedPubkeyForSignature:=CT_TECDSA_Public_Nul;
|
|
FUsedPubkeyForSignature:=CT_TECDSA_Public_Nul;
|
|
- FBufferedSha256:='';
|
|
|
|
|
|
+ FBufferedSha256 := Nil;
|
|
end;
|
|
end;
|
|
|
|
|
|
procedure TPCOperation.FillOperationResume(Block: Cardinal; getInfoForAllAccounts : Boolean; Affected_account_number: Cardinal; var OperationResume: TOperationResume);
|
|
procedure TPCOperation.FillOperationResume(Block: Cardinal; getInfoForAllAccounts : Boolean; Affected_account_number: Cardinal; var OperationResume: TOperationResume);
|
|
@@ -3216,7 +3218,7 @@ begin
|
|
else Exit;
|
|
else Exit;
|
|
end;
|
|
end;
|
|
OperationResume.OriginalPayload := Operation.OperationPayload;
|
|
OperationResume.OriginalPayload := Operation.OperationPayload;
|
|
- If TCrypto.IsHumanReadable(OperationResume.OriginalPayload) then OperationResume.PrintablePayload := OperationResume.OriginalPayload
|
|
|
|
|
|
+ If TCrypto.IsHumanReadable(OperationResume.OriginalPayload) then OperationResume.PrintablePayload := OperationResume.OriginalPayload.ToPrintable
|
|
else OperationResume.PrintablePayload := TCrypto.ToHexaString(OperationResume.OriginalPayload);
|
|
else OperationResume.PrintablePayload := TCrypto.ToHexaString(OperationResume.OriginalPayload);
|
|
OperationResume.OperationHash:=TPCOperation.OperationHashValid(Operation,Block);
|
|
OperationResume.OperationHash:=TPCOperation.OperationHashValid(Operation,Block);
|
|
if (Block>0) And (Block<CT_Protocol_Upgrade_v2_MinBlock) then begin
|
|
if (Block>0) And (Block<CT_Protocol_Upgrade_v2_MinBlock) then begin
|