Ejemplo n.º 1
0
        private void CreateWitness(WitnessCreateContract contract)
        {
            WitnessCapsule witness = new WitnessCapsule(
                contract.OwnerAddress,
                0,
                contract.Url.ToStringUtf8());

            Logger.Debug(
                string.Format(
                    "CreateWitness, address[{0}]",
                    witness.ToHexString()));

            this.db_manager.Witness.Put(witness.CreateDatabaseKey(), witness);
            AccountCapsule account = this.db_manager.Account.Get(witness.CreateDatabaseKey());

            account.IsWitness = true;

            if (this.db_manager.DynamicProperties.GetAllowMultiSign() == 1)
            {
                account.SetDefaultWitnessPermission(this.db_manager);
            }
            this.db_manager.Account.Put(account.CreateDatabaseKey(), account);

            long cost = this.db_manager.DynamicProperties.GetAccountUpgradeCost();

            this.db_manager.AdjustBalance(contract.OwnerAddress.ToByteArray(), -cost);
            this.db_manager.AdjustBalance(this.db_manager.Account.GetBlackHole().CreateDatabaseKey(), +cost);
            this.db_manager.DynamicProperties.AddTotalCreateWitnessCost(cost);
        }
Ejemplo n.º 2
0
        public static RpcApiResult CreateWitnessContract(byte[] owner_address,
                                                         byte[] url,
                                                         out WitnessCreateContract contract)
        {
            contract = new WitnessCreateContract();
            contract.OwnerAddress = ByteString.CopyFrom(owner_address);
            contract.Url          = ByteString.CopyFrom(url);

            return(RpcApiResult.Success);
        }
Ejemplo n.º 3
0
        public override bool Execute(TransactionResultCapsule result)
        {
            long fee = CalcFee();

            try
            {
                WitnessCreateContract contract = this.contract.Unpack <WitnessCreateContract>();
                CreateWitness(contract);
                result.SetStatus(fee, code.Sucess);
            }
            catch (InvalidProtocolBufferException e)
            {
                Logger.Debug(e.Message);
                result.SetStatus(fee, code.Failed);
                throw new ContractExeException(e.Message);
            }
            catch (BalanceInsufficientException e)
            {
                Logger.Debug(e.Message);
                result.SetStatus(fee, code.Failed);
                throw new ContractExeException(e.Message);
            }
            return(true);
        }
Ejemplo n.º 4
0
 public TransactionCapsule(WitnessCreateContract contract)
 {
     CreateTransaction(contract, Transaction.Types.Contract.Types.ContractType.WitnessCreateContract);
 }
Ejemplo n.º 5
0
        public override bool Validate()
        {
            if (this.contract == null)
            {
                throw new ContractValidateException("No contract!");
            }
            if (this.db_manager == null)
            {
                throw new ContractValidateException("No dbManager!");
            }

            if (this.contract.Is(WitnessCreateContract.Descriptor))
            {
                WitnessCreateContract witness_create_contract = null;
                try
                {
                    witness_create_contract = this.contract.Unpack <WitnessCreateContract>();
                }
                catch (InvalidProtocolBufferException e)
                {
                    throw new ContractValidateException(e.Message);
                }

                byte[] owner_address     = witness_create_contract.OwnerAddress.ToByteArray();
                string owner_address_str = owner_address.ToHexString();

                if (!Wallet.IsValidAddress(owner_address))
                {
                    throw new ContractValidateException("Invalid address");
                }

                if (!TransactionUtil.ValidUrl(witness_create_contract.Url.ToByteArray()))
                {
                    throw new ContractValidateException("Invalid url");
                }

                AccountCapsule account = this.db_manager.Account.Get(owner_address);

                if (account == null)
                {
                    throw new ContractValidateException("account[" + owner_address_str + "] not exists");
                }


                if (this.db_manager.Witness.Contains(owner_address))
                {
                    throw new ContractValidateException("Witness[" + owner_address_str + "] has existed");
                }

                if (account.Balance < this.db_manager.DynamicProperties.GetAccountUpgradeCost())
                {
                    throw new ContractValidateException("balance < AccountUpgradeCost");
                }
            }
            else
            {
                throw new ContractValidateException(
                          "contract type error,expected type [WitnessCreateContract],real type[" + this.contract.GetType().Name + "]");
            }

            return(true);
        }
Ejemplo n.º 6
0
 public async Task <TransactionExtention> CreateWitnessAsync(WitnessCreateContract contract)
 {
     return(await _grpcClient.CreateWitness2Async(contract));
 }
Ejemplo n.º 7
0
        public async Task <Transaction> CreateWitnessAsync(WitnessCreateContract contract, CancellationToken token = default)
        {
            var wallet = GetWallet();

            return(await wallet.CreateWitnessAsync(contract, _configuration.GetCallOptions(token)));
        }