private void RequireAuthorityByContractInfo(ContractInfo contractInfo) { bool validationResult; var proposerWhiteListContext = GetParliamentProposerWhiteListContext(); if (proposerWhiteListContext.ProposerAuthorityRequired) { validationResult = proposerWhiteListContext.Proposers.Any(p => p == Context.Sender); } else if (State.ContractProposerAuthorityRequired.Value) { validationResult = CheckAddressIsParliamentMember(Context.Sender); } else if (contractInfo.IsSystemContract) { validationResult = proposerWhiteListContext.Proposers.Any(p => p == Context.Sender) || CheckAddressIsParliamentMember(Context.Sender); } else { validationResult = Context.Sender == contractInfo.Author; } Assert(validationResult, "No permission."); }
private Address PrivateDeploySystemSmartContract(Hash name, int category, byte[] code) { if (name != null) { Assert(State.NameAddressMapping[name] == null, "contract name already been registered"); } var serialNumber = State.ContractSerialNumber.Value; // Increment State.ContractSerialNumber.Value = serialNumber + 1; var contractAddress = AddressHelper.BuildContractAddress(Context.ChainId, serialNumber); var codeHash = Hash.FromRawBytes(code); var info = new ContractInfo { SerialNumber = serialNumber, Owner = Context.Sender, Category = category, CodeHash = codeHash }; State.ContractInfos[contractAddress] = info; var reg = new SmartContractRegistration { Category = category, Code = ByteString.CopyFrom(code), CodeHash = codeHash }; State.SmartContractRegistrations[reg.CodeHash] = reg; Context.DeployContract(contractAddress, reg, name); Context.Fire(new ContractDeployed() { CodeHash = codeHash, Address = contractAddress, Creator = Context.Sender }); Context.LogDebug(() => "BasicContractZero - Deployment ContractHash: " + codeHash.ToHex()); Context.LogDebug(() => "BasicContractZero - Deployment success: " + contractAddress.GetFormatted()); if (name != null) { State.NameAddressMapping[name] = contractAddress; } return(contractAddress); }
private void AssertAuthorityByContractInfo(ContractInfo contractInfo, Address address) { Assert(contractInfo.Author == Context.Self || address == contractInfo.Author, "No permission."); }
private Address DeploySmartContract(Hash name, int category, byte[] code, bool isSystemContract, Address author) { if (name != null) { Assert(State.NameAddressMapping[name] == null, "contract name has already been registered before"); } var codeHash = HashHelper.ComputeFrom(code); Assert(State.SmartContractRegistrations[codeHash] == null, "contract code has already been deployed before"); var serialNumber = State.ContractSerialNumber.Value; // Increment State.ContractSerialNumber.Value = serialNumber + 1; var contractAddress = AddressHelper.BuildContractAddress(Context.ChainId, serialNumber); var info = new ContractInfo { SerialNumber = serialNumber, Author = author, Category = category, CodeHash = codeHash, IsSystemContract = isSystemContract, Version = 1 }; State.ContractInfos[contractAddress] = info; var reg = new SmartContractRegistration { Category = category, Code = ByteString.CopyFrom(code), CodeHash = codeHash, IsSystemContract = info.IsSystemContract, Version = info.Version }; State.SmartContractRegistrations[reg.CodeHash] = reg; Context.DeployContract(contractAddress, reg, name); Context.Fire(new ContractDeployed { CodeHash = codeHash, Address = contractAddress, Author = author, Version = info.Version, Name = name }); Context.LogDebug(() => "BasicContractZero - Deployment ContractHash: " + codeHash.ToHex()); Context.LogDebug(() => "BasicContractZero - Deployment success: " + contractAddress.ToBase58()); if (name != null) { State.NameAddressMapping[name] = contractAddress; } return(contractAddress); }