Skip to content

Commit eb08aac

Browse files
authored
Merge pull request #3464 from AElfProject/release/1.6.0
Release v1.6.0
2 parents bd91fc5 + e2996bd commit eb08aac

File tree

80 files changed

+3172
-1822
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

80 files changed

+3172
-1822
lines changed

AElf.All.sln

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -375,6 +375,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AElf.Contracts.TestContract
375375
EndProject
376376
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AElf.Contracts.TestContract.VirtualAddress", "test\AElf.Contracts.TestContract.VirtualAddress\AElf.Contracts.TestContract.VirtualAddress.csproj", "{64498F8C-B827-4E1C-B5FB-4B9188C839A8}"
377377
EndProject
378+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AElf.Contracts.TestContract.VirtualTransactionEvent", "test\AElf.Contracts.TestContract.VirtualTransactionEvent\AElf.Contracts.TestContract.VirtualTransactionEvent.csproj", "{0F10B838-C363-4F55-A5BB-B7F9F80565AB}"
379+
EndProject
380+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AElf.Contracts.VirtualTransactionEventContract.Tests", "test\AElf.Contracts.VirtualTransactionEventContract.Tests\AElf.Contracts.VirtualTransactionEventContract.Tests.csproj", "{6981684D-450C-412B-9082-0B0A67A679B9}"
381+
EndProject
378382
Global
379383
GlobalSection(SolutionConfigurationPlatforms) = preSolution
380384
Debug|Any CPU = Debug|Any CPU
@@ -1077,6 +1081,14 @@ Global
10771081
{64498F8C-B827-4E1C-B5FB-4B9188C839A8}.Debug|Any CPU.Build.0 = Debug|Any CPU
10781082
{64498F8C-B827-4E1C-B5FB-4B9188C839A8}.Release|Any CPU.ActiveCfg = Release|Any CPU
10791083
{64498F8C-B827-4E1C-B5FB-4B9188C839A8}.Release|Any CPU.Build.0 = Release|Any CPU
1084+
{0F10B838-C363-4F55-A5BB-B7F9F80565AB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
1085+
{0F10B838-C363-4F55-A5BB-B7F9F80565AB}.Debug|Any CPU.Build.0 = Debug|Any CPU
1086+
{0F10B838-C363-4F55-A5BB-B7F9F80565AB}.Release|Any CPU.ActiveCfg = Release|Any CPU
1087+
{0F10B838-C363-4F55-A5BB-B7F9F80565AB}.Release|Any CPU.Build.0 = Release|Any CPU
1088+
{6981684D-450C-412B-9082-0B0A67A679B9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
1089+
{6981684D-450C-412B-9082-0B0A67A679B9}.Debug|Any CPU.Build.0 = Debug|Any CPU
1090+
{6981684D-450C-412B-9082-0B0A67A679B9}.Release|Any CPU.ActiveCfg = Release|Any CPU
1091+
{6981684D-450C-412B-9082-0B0A67A679B9}.Release|Any CPU.Build.0 = Release|Any CPU
10801092
EndGlobalSection
10811093
GlobalSection(SolutionProperties) = preSolution
10821094
HideSolutionNode = FALSE
@@ -1266,5 +1278,7 @@ Global
12661278
{860947CF-F081-4A3B-BE65-199ECE793616} = {D3950CC9-808F-4ED8-946A-79A992F3F8EF}
12671279
{C7EDD0EB-CCE7-4B06-BF1E-F9CA7F149097} = {D3950CC9-808F-4ED8-946A-79A992F3F8EF}
12681280
{64498F8C-B827-4E1C-B5FB-4B9188C839A8} = {D3950CC9-808F-4ED8-946A-79A992F3F8EF}
1281+
{0F10B838-C363-4F55-A5BB-B7F9F80565AB} = {D3950CC9-808F-4ED8-946A-79A992F3F8EF}
1282+
{6981684D-450C-412B-9082-0B0A67A679B9} = {D3950CC9-808F-4ED8-946A-79A992F3F8EF}
12691283
EndGlobalSection
12701284
EndGlobal

contract/AElf.Contracts.Genesis/BasicContractZero.cs

Lines changed: 78 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,12 @@ public override ContractCodeHashList GetContractCodeHashListByDeployingBlockHeig
8181
public override Int32Value GetContractProposalExpirationTimePeriod(Empty input)
8282
{
8383
var expirationTimePeriod = GetCurrentContractProposalExpirationTimePeriod();
84-
return new Int32Value{ Value = expirationTimePeriod };
84+
return new Int32Value { Value = expirationTimePeriod };
85+
}
86+
87+
public override Address GetSigner(Address input)
88+
{
89+
return State.SignerMap[input];
8590
}
8691

8792
#endregion Views
@@ -111,12 +116,23 @@ public override Address DeploySystemSmartContract(SystemContractDeploymentInput
111116
public override Hash ProposeNewContract(ContractDeploymentInput input)
112117
{
113118
// AssertDeploymentProposerAuthority(Context.Sender);
114-
AssertContractExists(HashHelper.ComputeFrom(input.Code.ToByteArray()));
119+
var codeHash = HashHelper.ComputeFrom(input.Code.ToByteArray());
120+
AssertContractNotExists(codeHash);
115121
var proposedContractInputHash = CalculateHashFromInput(input);
116122
RegisterContractProposingData(proposedContractInputHash);
117-
123+
118124
var expirationTimePeriod = GetCurrentContractProposalExpirationTimePeriod();
119125

126+
if (input.ContractOperation != null)
127+
{
128+
ValidateContractOperation(input.ContractOperation, 0, codeHash);
129+
130+
// Remove one time signer if exists. Signer is only needed for validating signature.
131+
RemoveOneTimeSigner(input.ContractOperation.Deployer);
132+
133+
AssertContractAddressAvailable(input.ContractOperation.Deployer, input.ContractOperation.Salt);
134+
}
135+
120136
// Create proposal for deployment
121137
var proposalCreationInput = new CreateProposalBySystemContractInput
122138
{
@@ -160,7 +176,19 @@ public override Hash ProposeUpdateContract(ContractUpdateInput input)
160176
Assert(info != null, "Contract not found.");
161177
AssertAuthorityByContractInfo(info, Context.Sender);
162178
AssertContractVersion(info.ContractVersion, input.Code, info.Category);
163-
AssertContractExists(HashHelper.ComputeFrom(input.Code.ToByteArray()));
179+
180+
var codeHash = HashHelper.ComputeFrom(input.Code.ToByteArray());
181+
AssertContractNotExists(codeHash);
182+
183+
Assert((input.Address == Context.Self || info.SerialNumber > 0) && input.ContractOperation == null ||
184+
info.SerialNumber == 0 && input.ContractOperation != null, "Not compatible.");
185+
186+
if (input.ContractOperation != null)
187+
{
188+
ValidateContractOperation(input.ContractOperation, info.Version, codeHash);
189+
RemoveOneTimeSigner(input.ContractOperation.Deployer);
190+
AssertSameDeployer(input.Address, input.ContractOperation.Deployer);
191+
}
164192

165193
var expirationTimePeriod = GetCurrentContractProposalExpirationTimePeriod();
166194

@@ -282,7 +310,8 @@ public override Address DeploySmartContract(ContractDeploymentInput input)
282310

283311
var address =
284312
DeploySmartContract(null, input.Category, input.Code.ToByteArray(), false,
285-
DecideNonSystemContractAuthor(contractProposingInput?.Proposer, Context.Sender), false);
313+
DecideNonSystemContractAuthor(contractProposingInput?.Proposer, Context.Sender), false,
314+
input.ContractOperation?.Deployer, input.ContractOperation?.Salt);
286315
return address;
287316
}
288317

@@ -297,7 +326,7 @@ public override Address UpdateSmartContract(ContractUpdateInput input)
297326
Assert(Context.Sender == info.Author, "No permission.");
298327

299328
UpdateSmartContract(contractAddress, input.Code.ToByteArray(), info.Author, false);
300-
329+
301330
return contractAddress;
302331
}
303332

@@ -362,17 +391,22 @@ public override Empty SetContractProposalExpirationTimePeriod(SetContractProposa
362391
State.ContractProposalExpirationTimePeriod.Value = input.ExpirationTimePeriod;
363392
return new Empty();
364393
}
365-
366-
public override DeployUserSmartContractOutput DeployUserSmartContract(ContractDeploymentInput input)
394+
395+
public override DeployUserSmartContractOutput DeployUserSmartContract(UserContractDeploymentInput input)
367396
{
368397
AssertInlineDeployOrUpdateUserContract();
369398
AssertUserDeployContract();
370-
399+
371400
var codeHash = HashHelper.ComputeFrom(input.Code.ToByteArray());
372401
Context.LogDebug(() => "BasicContractZero - Deployment user contract hash: " + codeHash.ToHex());
373-
374-
AssertContractExists(codeHash);
375-
402+
403+
AssertContractNotExists(codeHash);
404+
405+
if (input.Salt != null)
406+
{
407+
AssertContractAddressAvailable(Context.Sender, input.Salt);
408+
}
409+
376410
var proposedContractInputHash = CalculateHashFromInput(input);
377411
SendUserContractProposal(proposedContractInputHash,
378412
nameof(BasicContractZeroImplContainer.BasicContractZeroImplBase.PerformDeployUserSmartContract),
@@ -394,23 +428,24 @@ public override DeployUserSmartContractOutput DeployUserSmartContract(ContractDe
394428
};
395429
}
396430

397-
public override Empty UpdateUserSmartContract(ContractUpdateInput input)
431+
public override Empty UpdateUserSmartContract(UserContractUpdateInput input)
398432
{
399433
AssertInlineDeployOrUpdateUserContract();
400-
434+
401435
var info = State.ContractInfos[input.Address];
402436
Assert(info != null, "Contract not found.");
403437
Assert(Context.Sender == info.Author, "No permission.");
438+
Assert(info.Deployer == null || info.Deployer == Context.Sender, "No permission to update.");
404439
var codeHash = HashHelper.ComputeFrom(input.Code.ToByteArray());
405440
Assert(info.CodeHash != codeHash, "Code is not changed.");
406-
AssertContractExists(codeHash);
441+
AssertContractNotExists(codeHash);
407442
AssertContractVersion(info.ContractVersion, input.Code, info.Category);
408-
443+
409444
var proposedContractInputHash = CalculateHashFromInput(input);
410445
SendUserContractProposal(proposedContractInputHash,
411446
nameof(BasicContractZeroImplContainer.BasicContractZeroImplBase.PerformUpdateUserSmartContract),
412447
input.ToByteString());
413-
448+
414449
// Fire event to trigger BPs checking contract code
415450
Context.Fire(new CodeCheckRequired
416451
{
@@ -420,10 +455,10 @@ public override Empty UpdateUserSmartContract(ContractUpdateInput input)
420455
IsSystemContract = false,
421456
IsUserContract = true
422457
});
423-
458+
424459
return new Empty();
425460
}
426-
461+
427462
public override Empty ReleaseApprovedUserSmartContract(ReleaseContractInput input)
428463
{
429464
var contractProposingInput = State.ContractProposingInputMap[input.ProposedContractInputHash];
@@ -432,9 +467,9 @@ public override Empty ReleaseApprovedUserSmartContract(ReleaseContractInput inpu
432467
contractProposingInput != null &&
433468
contractProposingInput.Status == ContractProposingInputStatus.CodeCheckProposed &&
434469
contractProposingInput.Proposer == Context.Self, "Invalid contract proposing status.");
435-
470+
436471
AssertCurrentMiner();
437-
472+
438473
contractProposingInput.Status = ContractProposingInputStatus.CodeChecked;
439474
State.ContractProposingInputMap[input.ProposedContractInputHash] = contractProposingInput;
440475
var codeCheckController = State.CodeCheckController.Value;
@@ -443,27 +478,27 @@ public override Empty ReleaseApprovedUserSmartContract(ReleaseContractInput inpu
443478
return new Empty();
444479
}
445480

446-
public override Address PerformDeployUserSmartContract(ContractDeploymentInput input)
481+
public override Address PerformDeployUserSmartContract(UserContractDeploymentInput input)
447482
{
448483
RequireSenderAuthority(State.CodeCheckController.Value.OwnerAddress);
449484

450485
var inputHash = CalculateHashFromInput(input);
451486
TryClearContractProposingData(inputHash, out var contractProposingInput);
452487

453488
var address = DeploySmartContract(null, input.Category, input.Code.ToByteArray(), false,
454-
contractProposingInput.Author, true);
489+
contractProposingInput.Author, true, contractProposingInput.Author, input.Salt);
455490
return address;
456491
}
457492

458-
public override Empty PerformUpdateUserSmartContract(ContractUpdateInput input)
493+
public override Empty PerformUpdateUserSmartContract(UserContractUpdateInput input)
459494
{
460495
RequireSenderAuthority(State.CodeCheckController.Value.OwnerAddress);
461-
496+
462497
var inputHash = CalculateHashFromInput(input);
463498
TryClearContractProposingData(inputHash, out var proposingInput);
464499

465500
UpdateSmartContract(input.Address, input.Code.ToByteArray(), proposingInput.Author, true);
466-
501+
467502
return new Empty();
468503
}
469504

@@ -481,7 +516,23 @@ public override Empty SetContractAuthor(SetContractAuthorInput input)
481516
OldAuthor = oldAuthor,
482517
NewAuthor = input.NewAuthor
483518
});
484-
519+
520+
return new Empty();
521+
}
522+
523+
public override Empty SetSigner(Address input)
524+
{
525+
Assert(input != null && !input.Value.IsNullOrEmpty(), "Invalid input.");
526+
527+
if (State.SignerMap[Context.Sender] == input) return new Empty();
528+
529+
State.SignerMap[Context.Sender] = input;
530+
return new Empty();
531+
}
532+
533+
public override Empty RemoveSigner(Empty input)
534+
{
535+
RemoveOneTimeSigner(Context.Sender);
485536
return new Empty();
486537
}
487538

contract/AElf.Contracts.Genesis/BasicContractZeroState.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,4 +34,6 @@ public partial class BasicContractZeroState : ContractState
3434
public MappedState<long, ContractCodeHashList> ContractCodeHashListMap { get; set; }
3535

3636
public SingletonState<int> ContractProposalExpirationTimePeriod { get; set; }
37+
38+
public MappedState<Address, Address> SignerMap { get; set; }
3739
}

0 commit comments

Comments
 (0)