Exemplo n.º 1
0
        /*public Transaction SignTransaction(JObject t)
         * {
         *  Transaction tr = new Transaction();
         *
         *  try
         *  {
         *      tr.From = ByteArrayHelpers.FromHexString(addr);
         *      tr.To = Convert.FromBase64String(t["to"].ToString());
         *      tr.IncrementId = t["incr"].ToObject<ulong>();
         *      tr.MethodName = t["method"].ToObject<string>();
         *      var p = Convert.FromBase64String(t["params"].ToString());
         *      tr.Params = p.Length == 0 ? null : p;
         *
         *      SignTransaction(tr);
         *
         *      return tr;
         *  }
         *  catch (Exception e)
         *  {
         *      ;
         *  }
         *
         *  return null;
         * }*/

        public Transaction SignTransaction(Transaction tx)
        {
            string addr = tx.From.Value.ToHex(true);

            ECKeyPair kp = _keyStore.GetAccountKeyPair(addr);

            if (kp == null)
            {
                throw new AccountLockedException(addr);
            }

            MemoryStream ms = new MemoryStream();

            Serializer.Serialize(ms, tx);

            byte[] b     = ms.ToArray();
            byte[] toSig = SHA256.Create().ComputeHash(b);

            // Sign the hash
            ECSigner    signer    = new ECSigner();
            ECSignature signature = signer.Sign(kp, toSig);

            // Update the signature
            tx.Sig = new Signature {
                R = signature.R, S = signature.S, P = kp.PublicKey.Q.GetEncoded()
            };

            return(tx);
        }
Exemplo n.º 2
0
        public void Main4Test()
        {
            Wallet.WalletClient wallet = GetMainNetWalletClient;

            var keyTriple = new KeyTriple("B7E85CA5910922C49DCCB92EE48DFEC13A60674845CB7152C86B88F31DA6DC67");

            byte[]       hashTransaction1 = StringHelper.HexStringToByteArray("a7e974c6e69fb7741bf5e08de8a2d8f6617826c59422b440de22e0612b03c393");
            BytesMessage bytesMessage1    = new BytesMessage();

            bytesMessage1.Value = ByteString.CopyFrom(hashTransaction1);
            Transaction transactionLoad1 = wallet.GetTransactionByIdAsync(bytesMessage1).GetAwaiter().GetResult();

            Transaction.Types.Contract contract         = transactionLoad1.RawData.Contract[0];
            TransferContract           transferContract = TransferContract.Parser.ParseFrom(contract.Parameter.Value.ToByteArray());

            byte[] publicKeyOwner = transferContract.OwnerAddress.ToByteArray();
            string encode         = Base58.Encode(publicKeyOwner);

            byte[] transactionRaw = transactionLoad1.RawData.ToByteArray();
            byte[] hash           = Sha256.Hash(transactionRaw);
            string signBase64     = transactionLoad1.Signature[0].ToBase64();

            byte[] byteArray = transactionLoad1.Signature[0].ToByteArray();
            bool   isSignatureValidFromBytes = new ECSigner().IsSignatureValidFromBytes(hash, byteArray, publicKeyOwner);
        }
Exemplo n.º 3
0
        public void SignAndVerifyTransaction()
        {
            // Generate the key pair
            ECKeyPair keyPair = new KeyPairGenerator().Generate();

            Transaction tx = new Transaction();

            tx.From = Address.FromRawBytes(CryptoHelpers.RandomFill(ADR_LENGTH));
            tx.To   = Address.FromRawBytes(CryptoHelpers.RandomFill(ADR_LENGTH));

            Block block = new Block();

            block.AddTransaction(tx);

            // Serialize and hash the transaction
            Hash hash = tx.GetHash();

            // Sign the hash
            ECSigner    signer    = new ECSigner();
            ECSignature signature = signer.Sign(keyPair, hash.DumpByteArray());

            ECVerifier verifier = new ECVerifier(keyPair);

            Assert.True(verifier.Verify(signature, hash.DumpByteArray()));
        }
Exemplo n.º 4
0
        public static Transaction BuildTransaction(Address adrTo = null, ulong nonce = 0, ECKeyPair keyPair = null)
        {
            keyPair = keyPair ?? new KeyPairGenerator().Generate();

            var tx = new Transaction();

            tx.From        = keyPair.GetAddress();
            tx.To          = adrTo ?? Address.FromRawBytes(Hash.Generate().ToByteArray());
            tx.IncrementId = nonce;
            tx.Sig         = new Signature
            {
                P = ByteString.CopyFrom(keyPair.PublicKey.Q.GetEncoded())
            };
            tx.Fee        = TxPoolConfig.Default.FeeThreshold + 1;
            tx.MethodName = "hello world";
            tx.Params     = ByteString.CopyFrom(new Parameters
            {
                Params = { new Param
                           {
                               IntVal = 1
                           } }
            }.ToByteArray());

            // Serialize and hash the transaction
            Hash hash = tx.GetHash();

            // Sign the hash
            ECSigner    signer    = new ECSigner();
            ECSignature signature = signer.Sign(keyPair, hash.DumpByteArray());

            // Update the signature
            tx.Sig.R = ByteString.CopyFrom(signature.R);
            tx.Sig.S = ByteString.CopyFrom(signature.S);
            return(tx);
        }
Exemplo n.º 5
0
Arquivo: Peer.cs Projeto: wyk125/AElf
        /// <summary>
        /// This method sends authentification information to the distant peer and
        /// start the authentification timer.
        /// </summary>
        /// <returns></returns>
        private void StartAuthentification()
        {
            var nodeInfo = new NodeData {
                Port = _port
            };

            ECSigner    signer = new ECSigner();
            ECSignature sig    = signer.Sign(_nodeKey, nodeInfo.ToByteArray());

            var nd = new Handshake
            {
                NodeInfo  = nodeInfo,
                PublicKey = ByteString.CopyFrom(_nodeKey.GetEncodedPublicKey()),
                Height    = CurrentHeight,
                Version   = GlobalConfig.ProtocolVersion,
                R         = ByteString.CopyFrom(sig.R),
                S         = ByteString.CopyFrom(sig.S)
            };

            byte[] packet = nd.ToByteArray();

            _logger?.Trace($"Sending authentification : {{ port: {nd.NodeInfo.Port}, addr: {nd.PublicKey.ToByteArray().ToHex()} }}");

            _messageWriter.EnqueueMessage(new Message {
                Type = (int)MessageType.Auth, HasId = false, Length = packet.Length, Payload = packet
            });

            StartAuthTimer();
        }
        public Transaction SignTransaction(Transaction tx)
        {
            string addr = tx.From.Value.ToHex();

            ECKeyPair kp = _keyStore.GetAccountKeyPair(addr);

            if (kp == null)
            {
                Console.WriteLine("The following account is locked:" + addr);
                return(null);
            }

            MemoryStream ms = new MemoryStream();

            Serializer.Serialize(ms, tx);

            byte[] b     = ms.ToArray();
            byte[] toSig = SHA256.Create().ComputeHash(b);

            // Sign the hash
            ECSigner    signer    = new ECSigner();
            ECSignature signature = signer.Sign(kp, toSig);

            // Update the signature
            tx.R = signature.R;
            tx.S = signature.S;

            tx.P = kp.PublicKey.Q.GetEncoded();

            return(tx);
        }
Exemplo n.º 7
0
 public void SignUnsignTest()
 {
     ECSigner ecSigner         = new ECSigner();
     var      message          = "test";
     string   sign             = ecSigner.Sign(message);
     bool     isSignatureValid = ecSigner.IsSignatureValid(message, sign);
 }
Exemplo n.º 8
0
        public async Task <JObject> SignHash(string address, string password, string hash)
        {
            var tryOpen = KeyStore.OpenAsync(address, password);

            if (tryOpen == AElfKeyStore.Errors.WrongPassword)
            {
                return(new JObject()
                {
                    ["error"] = "Wrong password."
                });
            }

            ECKeyPair kp = KeyStore.GetAccountKeyPair(address);

            byte[] toSig = ByteArrayHelpers.FromHexString(hash);
            // Sign the hash
            ECSigner    signer    = new ECSigner();
            ECSignature signature = signer.Sign(kp, toSig);

            // TODO: Standardize encoding
            return(new JObject()
            {
                ["R"] = signature.R,
                ["S"] = signature.S,
                ["P"] = kp.PublicKey.Q.GetEncoded()
            });
        }
Exemplo n.º 9
0
        public void SignUnsign2Test()
        {
            ECSigner ecSigner         = new ECSigner("4C4CA01FBD362CABE6654337AC23B22496EE58D79CEDBEE26139D551BDCA5ADA");
            string   message          = "test";
            string   sign             = ecSigner.Sign(message);
            bool     isSignatureValid = ecSigner.IsSignatureValid(message, sign);

            Assert.IsTrue(isSignatureValid);
        }
Exemplo n.º 10
0
Arquivo: Block.cs Projeto: wyk125/AElf
        /// <summary>
        /// block signature
        /// </summary>
        /// <param name="keyPair"></param>
        /// <exception cref="NotImplementedException"></exception>
        public void Sign(ECKeyPair keyPair)
        {
            ECSigner    signer    = new ECSigner();
            var         hash      = GetHash();
            var         bytes     = hash.DumpByteArray();
            ECSignature signature = signer.Sign(keyPair, bytes);

            Header.P = ByteString.CopyFrom(keyPair.PublicKey.Q.GetEncoded());
            Header.R = ByteString.CopyFrom(signature.R);
            Header.S = ByteString.CopyFrom(signature.S);
        }
Exemplo n.º 11
0
        public void ATest()
        {
            ECSigner ecSigner = new ECSigner("F43EBCC94E6C257EDBE559183D1A8778B2D5A08040902C0F0A77A3343A1D0EA5");

            byte[] encoded     = ecSigner._keyPair.ECPublicKey.Q.GetEncoded();
            byte[] computeHash = Sha3.Sha3256().ComputeHash(encoded, 1, 64);
            string string2     = computeHash.ToHexString2();


            String pubkey04    = "04e6a49d098ee94871252622b8a8b727e5cdf81b7138e5ac16591887f6e8c10e881e4b4250fa8c87f5b29ad020216a9ffd0acf5995a627d6c70e4dd274c54c20bd";
            string hexString04 = Sha3.Sha3256().ComputeHash(pubkey04.FromHexToByteArray2(), 1, 64).ToHexString2();
        }
Exemplo n.º 12
0
        public void VerifySignature_CorrectDataAndSig_ReturnsTrue()
        {
            ECKeyPair keyPair = new KeyPairGenerator().Generate();

            byte[] message = new BigInteger("968236873715988614170569073515315707566766479517").ToByteArray();

            ECSigner    signer    = new ECSigner();
            ECSignature signature = signer.Sign(keyPair, message);

            ECVerifier verifier = new ECVerifier(keyPair);

            Assert.True(verifier.Verify(signature, message));
        }
Exemplo n.º 13
0
        public void SignAndVerifyTransaction()
        {
            byte[] fromAdress = CryptoHelpers.RandomFill(ADR_LENGTH);
            byte[] toAdress   = CryptoHelpers.RandomFill(ADR_LENGTH);

            // Generate the key pair
            ECKeyPair keyPair = new KeyPairGenerator().Generate();


            ;

            Transaction tx = new Transaction();

            tx.From = Address.FromRawBytes(fromAdress);
            tx.To   = Address.FromRawBytes(toAdress);
            tx.Sig  = new Signature
            {
                P = ByteString.CopyFrom(keyPair.PublicKey.Q.GetEncoded())
            };

            // Serialize and hash the transaction
            Hash hash = tx.GetHash();

            // Sign the hash
            ECSigner    signer    = new ECSigner();
            ECSignature signature = signer.Sign(keyPair, hash.DumpByteArray());

            // Update the signature
            tx.Sig.R = ByteString.CopyFrom(signature.R);
            tx.Sig.S = ByteString.CopyFrom(signature.S);

            // Serialize as for sending over the network
            byte[] serializedTx = tx.Serialize();

            /**** broadcast/receive *****/

            Transaction dTx = Transaction.Parser.ParseFrom(serializedTx);

            // Serialize and hash the transaction
            Hash dHash = dTx.GetHash();

            byte[] uncompressedPrivKey = tx.Sig.P.ToByteArray();

            ECKeyPair  recipientKeyPair = ECKeyPair.FromPublicKey(uncompressedPrivKey);
            ECVerifier verifier         = new ECVerifier(recipientKeyPair);

            Assert.True(verifier.Verify(dTx.GetSignature(), dHash.DumpByteArray()));
        }
Exemplo n.º 14
0
        public List <Transaction> CreateTx(Hash chainId)
        {
            var contractAddressZero = AddressHelpers.GetSystemContractAddress(chainId, GlobalConfig.GenesisBasicContract);

            Console.WriteLine($"zero {contractAddressZero}");
            var code = ExampleContractCode;

            ECKeyPair keyPair = new KeyPairGenerator().Generate();
            ECSigner  signer  = new ECSigner();

            var txPrint = new Transaction()
            {
                From        = keyPair.GetAddress(),
                To          = contractAddressZero,
                IncrementId = NewIncrementId(),
                MethodName  = "Print",
                Params      = ByteString.CopyFrom(new Parameters()
                {
                    Params =
                    {
                        new Param
                        {
                            StrVal = "AElf"
                        }
                    }
                }.ToByteArray()),

                Fee = TxPoolConfig.Default.FeeThreshold + 1
            };

            Hash hash = txPrint.GetHash();

            ECSignature signature = signer.Sign(keyPair, hash.DumpByteArray());

            txPrint.Sig = new Signature
            {
                P = ByteString.CopyFrom(keyPair.PublicKey.Q.GetEncoded()),
                R = ByteString.CopyFrom(signature.R),
                S = ByteString.CopyFrom(signature.S),
            };

            var txs = new List <Transaction>()
            {
                txPrint
            };

            return(txs);
        }
Exemplo n.º 15
0
        public void VerifySignature_WrongData_ReturnsFalse()
        {
            ECKeyPair keyPair = new KeyPairGenerator().Generate();

            byte[] message = new BigInteger("968236873715988614170569073515315707566766479517").ToByteArray();

            ECSigner    signer    = new ECSigner();
            ECSignature signature = signer.Sign(keyPair, message);

            // Change the message
            message = new BigInteger("9682368737159881417056907351531570756676647951").ToByteArray();

            ECVerifier verifier = new ECVerifier(keyPair);

            Assert.False(verifier.Verify(signature, message));
        }
Exemplo n.º 16
0
        public List <Transaction> CreateTx(Hash chainId)
        {
            var contractAddressZero =
                AddressHelpers.GetSystemContractAddress(chainId, GlobalConfig.GenesisBasicContract);

            var keyPair = new KeyPairGenerator().Generate();
            var signer  = new ECSigner();

            var txPrint = new Transaction()
            {
                From       = keyPair.GetAddress(),
                To         = contractAddressZero,
                MethodName = "Print",
                Params     = ByteString.CopyFrom(new Parameters()
                {
                    Params =
                    {
                        new Param
                        {
                            StrVal = "AElf"
                        }
                    }
                }.ToByteArray()),

                Fee = 0
            };

            var hash = txPrint.GetHash();

            var signature = signer.Sign(keyPair, hash.DumpByteArray());

            txPrint.Sig = new Signature
            {
                P = ByteString.CopyFrom(keyPair.PublicKey.Q.GetEncoded()),
                R = ByteString.CopyFrom(signature.R),
                S = ByteString.CopyFrom(signature.S)
            };

            var txs = new List <Transaction>
            {
                txPrint
            };

            return(txs);
        }
Exemplo n.º 17
0
Arquivo: Miner.cs Projeto: wyk125/AElf
        /// <summary>
        /// Generate a system tx for parent chain block info and broadcast it.
        /// </summary>
        /// <returns></returns>
        private async Task GenerateTransactionWithParentChainBlockInfo()
        {
            var parentChainBlockInfo = GetParentChainBlockInfo();

            if (parentChainBlockInfo == null)
            {
                return;
            }
            try
            {
                var bn = await _blockChain.GetCurrentBlockHeightAsync();

                bn = bn > 4 ? bn - 4 : 0;
                var bh     = bn == 0 ? Hash.Genesis : (await _blockChain.GetHeaderByHeightAsync(bn)).GetHash();
                var bhPref = bh.Value.Where((x, i) => i < 4).ToArray();
                var tx     = new Transaction
                {
                    From = _keyPair.GetAddress(),
                    To   = AddressHelpers.GetSystemContractAddress(Config.ChainId,
                                                                   SmartContractType.SideChainContract.ToString()),
                    RefBlockNumber = bn,
                    RefBlockPrefix = ByteString.CopyFrom(bhPref),
                    MethodName     = "WriteParentChainBlockInfo",
                    Sig            = new Signature
                    {
                        P = ByteString.CopyFrom(_keyPair.GetEncodedPublicKey())
                    },
                    Type   = TransactionType.CrossChainBlockInfoTransaction,
                    Params = ByteString.CopyFrom(ParamsPacker.Pack(parentChainBlockInfo)),
                    Time   = Timestamp.FromDateTime(DateTime.UtcNow)
                };
                // sign tx
                var signature = new ECSigner().Sign(_keyPair, tx.GetHash().DumpByteArray());
                tx.Sig.R = ByteString.CopyFrom(signature.R);
                tx.Sig.S = ByteString.CopyFrom(signature.S);

                await InsertTransactionToPool(tx);

                _logger?.Trace($"Generated Cross chain info transaction {tx.GetHash()}");
            }
            catch (Exception e)
            {
                _logger?.Error(e, "PCB transaction generation failed.");
            }
        }
Exemplo n.º 18
0
        static void Main(string[] args)
        {
            ECKeyPair keyPair = KeyPairGenerator.Generate();

            //Console.WriteLine(privateKey.ToString() + Environment.NewLine);

            // Fake data
            byte[] message = new BigInteger("968236873715988614170569073515315707566766479517").ToByteArray();

            ECSigner    signer    = new ECSigner();
            ECSignature signature = signer.Sign(keyPair, message);

            message = new BigInteger("9682368737159881417056907351531570756676647951").ToByteArray();
            ECVerifier verifier = new ECVerifier(keyPair);
            bool       isGood   = verifier.Verify(signature, message);

            Console.WriteLine(isGood);
        }
Exemplo n.º 19
0
Arquivo: DPoS.cs Projeto: wyk125/AElf
        private async Task <Transaction> GenerateTransactionAsync(string methodName, List <byte[]> parameters)
        {
            try
            {
                _logger?.Trace("Entered generating tx.");
                var bn = await BlockChain.GetCurrentBlockHeightAsync();

                bn = bn > 4 ? bn - 4 : 0;
                var bh     = bn == 0 ? Hash.Genesis : (await BlockChain.GetHeaderByHeightAsync(bn)).GetHash();
                var bhPref = bh.Value.Where((x, i) => i < 4).ToArray();
                var tx     = new Transaction
                {
                    From           = _nodeKeyPair.Address,
                    To             = ContractAddress,
                    RefBlockNumber = bn,
                    RefBlockPrefix = ByteString.CopyFrom(bhPref),
                    MethodName     = methodName,
                    Sig            = new Signature {
                        P = ByteString.CopyFrom(_nodeKeyPair.NonCompressedEncodedPublicKey)
                    },
                    Type   = TransactionType.DposTransaction,
                    Params = ByteString.CopyFrom(ParamsPacker.Pack(parameters.Select(p => (object)p).ToArray()))
                };

                var signer    = new ECSigner();
                var signature = signer.Sign(_nodeKeyPair, tx.GetHash().DumpByteArray());

                // Update the signature
                tx.Sig.R = ByteString.CopyFrom(signature.R);
                tx.Sig.S = ByteString.CopyFrom(signature.S);

                _logger?.Trace("Leaving generating tx.");

                MessageHub.Instance.Publish(StateEvent.ConsensusTxGenerated);

                return(tx);
            }
            catch (Exception e)
            {
                _logger?.Trace(e, "Error while during generating DPoS tx.");
            }

            return(null);
        }
Exemplo n.º 20
0
        public static (ECKeyPair, Handshake) CreateKeyPairAndHandshake(int port)
        {
            ECKeyPair key = new KeyPairGenerator().Generate();

            var nodeInfo = new NodeData {
                Port = port
            };

            ECSigner    signer = new ECSigner();
            ECSignature sig    = signer.Sign(key, nodeInfo.ToByteArray());

            var handshakeMsg = new Handshake
            {
                NodeInfo  = nodeInfo,
                PublicKey = ByteString.CopyFrom(key.GetEncodedPublicKey()),
                R         = ByteString.CopyFrom(sig.R),
                S         = ByteString.CopyFrom(sig.S),
            };

            return(key, handshakeMsg);
        }
Exemplo n.º 21
0
        private Transaction GetTxToVerifyBlockProducer(Address contractAccountHash, ECKeyPair keyPair,
                                                       string recipientAddress, Timestamp timestamp, long roundId)
        {
            if (contractAccountHash == null || keyPair == null || recipientAddress == null)
            {
                _logger?.Error("Something wrong happened to consensus verification filter.");
                return(null);
            }

            var tx = new Transaction
            {
                From        = keyPair.GetAddress(),
                To          = contractAccountHash,
                IncrementId = 0,
                MethodName  = "Validation",
                Sig         = new Signature
                {
                    P = ByteString.CopyFrom(keyPair.PublicKey.Q.GetEncoded())
                },
                Params = ByteString.CopyFrom(ParamsPacker.Pack(
                                                 new StringValue {
                    Value = recipientAddress.RemoveHexPrefix()
                }.ToByteArray(),
                                                 timestamp.ToByteArray(),
                                                 new Int64Value {
                    Value = roundId
                }))
            };

            var signer    = new ECSigner();
            var signature = signer.Sign(keyPair, tx.GetHash().DumpByteArray());

            // Update the signature
            tx.Sig.R = ByteString.CopyFrom(signature.R);
            tx.Sig.S = ByteString.CopyFrom(signature.S);

            return(tx);
        }
Exemplo n.º 22
0
        public List <Transaction> CreateTxs(Hash chainId)
        {
            var contractAddressZero = AddressHelpers.GetSystemContractAddress(chainId, GlobalConfig.GenesisBasicContract);

            var code = ExampleContractCode;

            ECKeyPair keyPair = new KeyPairGenerator().Generate();
            ECSigner  signer  = new ECSigner();
            var       txnDep  = new Transaction()
            {
                From        = keyPair.GetAddress(),
                To          = contractAddressZero,
                IncrementId = 0,
                MethodName  = "DeploySmartContract",
                Params      = ByteString.CopyFrom(ParamsPacker.Pack((int)0, code)),

                Fee  = TxPoolConfig.Default.FeeThreshold + 1,
                Type = TransactionType.ContractTransaction
            };

            Hash hash = txnDep.GetHash();

            ECSignature signature1 = signer.Sign(keyPair, hash.DumpByteArray());

            txnDep.Sig = new Signature
            {
                P = ByteString.CopyFrom(keyPair.PublicKey.Q.GetEncoded()),
                R = ByteString.CopyFrom(signature1.R),
                S = ByteString.CopyFrom(signature1.S),
            };

            var txInv_1 = new Transaction
            {
                From        = keyPair.GetAddress(),
                To          = contractAddressZero,
                IncrementId = 1,
                MethodName  = "Print",
                Params      = ByteString.CopyFrom(ParamsPacker.Pack("AElf")),

                Fee  = TxPoolConfig.Default.FeeThreshold + 1,
                Type = TransactionType.ContractTransaction
            };
            ECSignature signature2 = signer.Sign(keyPair, txInv_1.GetHash().DumpByteArray());

            txInv_1.Sig = new Signature {
                P = ByteString.CopyFrom(keyPair.PublicKey.Q.GetEncoded()),
                R = ByteString.CopyFrom(signature2.R),
                S = ByteString.CopyFrom(signature2.S)
            };


            var txInv_2 = new Transaction
            {
                From        = keyPair.GetAddress(),
                To          = contractAddressZero,
                IncrementId = txInv_1.IncrementId,
                MethodName  = "Print",
                Params      = ByteString.CopyFrom(ParamsPacker.Pack("AElf")),

                Fee  = TxPoolConfig.Default.FeeThreshold + 1,
                Type = TransactionType.ContractTransaction
            };

            ECSignature signature3 = signer.Sign(keyPair, txInv_2.GetHash().DumpByteArray());

            txInv_2.Sig = new Signature
            {
                P = ByteString.CopyFrom(keyPair.PublicKey.Q.GetEncoded())
            };
            txInv_2.Sig.R = ByteString.CopyFrom(signature3.R);
            txInv_2.Sig.S = ByteString.CopyFrom(signature3.S);

            var txs = new List <Transaction>()
            {
                txnDep, txInv_1, txInv_2
            };

            return(txs);
        }
Exemplo n.º 23
0
        private void ProcessCommand(CmdParseResult parsedCmd, CliCommandDefinition def)
        {
            string error = def.Validate(parsedCmd);

            if (!string.IsNullOrEmpty(error))
            {
                _screenManager.PrintError(error);
            }
            else
            {
                if (def is GetDeserializedResultCmd g)
                {
                    try
                    {
                        var str = g.Validate(parsedCmd);
                        if (str != null)
                        {
                            _screenManager.PrintError(str);
                            return;
                        }

                        // RPC
                        var t    = parsedCmd.Args.ElementAt(0);
                        var data = parsedCmd.Args.ElementAt(1);

                        byte[] sd;
                        try
                        {
                            sd = ByteArrayHelpers.FromHexString(data);
                        }
                        catch (Exception e)
                        {
                            _screenManager.PrintError("Wrong data formant.");
                            return;
                        }

                        object dd;
                        try
                        {
                            dd = Deserializer.Deserialize(t, sd);
                        }
                        catch (Exception e)
                        {
                            _screenManager.PrintError("Invalid data format");
                            return;
                        }
                        if (dd == null)
                        {
                            _screenManager.PrintError("Not supported type.");
                            return;
                        }
                        _screenManager.PrintLine(dd.ToString());
                        return;
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine(e);
                        return;
                    }
                }

                if (def is LoadContractAbiCmd l)
                {
                    error = l.Validate(parsedCmd);

                    if (!string.IsNullOrEmpty(error))
                    {
                        _screenManager.PrintError(error);
                    }
                    try
                    {
                        // RPC
                        HttpRequestor reqhttp = new HttpRequestor(_rpcAddress);
                        if (!parsedCmd.Args.Any())
                        {
                            if (_genesisAddress == null)
                            {
                                _screenManager.PrintError(ConnectionNeeded);
                                return;
                            }
                            parsedCmd.Args.Add(_genesisAddress);
                            //parsedCmd.Args.Add(Globals.GenesisBasicContract);
                        }

                        var    addr = parsedCmd.Args.ElementAt(0);
                        Module m    = null;
                        if (!_loadedModules.TryGetValue(addr, out m))
                        {
                            string resp = reqhttp.DoRequest(def.BuildRequest(parsedCmd).ToString());

                            if (resp == null)
                            {
                                _screenManager.PrintError(ServerConnError);
                                return;
                            }

                            if (resp.IsEmpty())
                            {
                                _screenManager.PrintError(NoReplyContentError);
                                return;
                            }
                            JObject jObj = JObject.Parse(resp);
                            var     res  = JObject.FromObject(jObj["result"]);

                            JToken ss = res["abi"];
                            byte[] aa = ByteArrayHelpers.FromHexString(ss.ToString());

                            MemoryStream ms = new MemoryStream(aa);
                            m = Serializer.Deserialize <Module>(ms);
                            _loadedModules.Add(addr, m);
                        }

                        var obj = JObject.FromObject(m);
                        _screenManager.PrintLine(obj.ToString());
                    }
                    catch (Exception e)
                    {
                        if (e is JsonReaderException)
                        {
                            _screenManager.PrintError(WrongInputFormat);
                            return;
                        }
                        return;
                    }

                    return;
                }
                if (def is DeployContractCommand dcc)
                {
                    if (_genesisAddress == null)
                    {
                        _screenManager.PrintError(NotConnected);
                        return;
                    }

                    try
                    {
                        string err = dcc.Validate(parsedCmd);
                        if (!string.IsNullOrEmpty(err))
                        {
                            _screenManager.PrintLine(err);
                            return;
                        }

                        //string cat = parsedCmd.Args.ElementAt(0);
                        string filename = parsedCmd.Args.ElementAt(0);

                        // Read sc bytes
                        SmartContractReader screader = new SmartContractReader();
                        byte[] sc  = screader.Read(filename);
                        string hex = sc.ToHex();

                        var    name = GlobalConfig.GenesisBasicContract;
                        Module m    = _loadedModules.Values.FirstOrDefault(ld => ld.Name.Equals(name));

                        if (m == null)
                        {
                            _screenManager.PrintError(AbiNotLoaded);
                            return;
                        }

                        Method meth = m.Methods.FirstOrDefault(mt => mt.Name.Equals(DeploySmartContract));

                        if (meth == null)
                        {
                            _screenManager.PrintError(MethodNotFound);
                            return;
                        }

                        byte[] serializedParams = meth.SerializeParams(new List <string> {
                            "1", hex
                        });

                        Transaction t = new Transaction();
                        t = CreateTransaction(parsedCmd.Args.ElementAt(2), _genesisAddress,
                                              DeploySmartContract, serializedParams, TransactionType.ContractTransaction);

                        t = t.AddBlockReference(_rpcAddress);

                        MemoryStream ms = new MemoryStream();
                        Serializer.Serialize(ms, t);
                        byte[]      b      = ms.ToArray();
                        byte[]      toSig  = SHA256.Create().ComputeHash(b);
                        ECSigner    signer = new ECSigner();
                        ECSignature signature;
                        ECKeyPair   kp = _accountManager.GetKeyPair(parsedCmd.Args.ElementAt(2));
                        if (kp == null)
                        {
                            throw new AccountLockedException(parsedCmd.Args.ElementAt(2));
                        }
                        signature = signer.Sign(kp, toSig);

                        // Update the signature
                        t.Sig = new Signature {
                            R = signature.R, S = signature.S, P = kp.PublicKey.Q.GetEncoded()
                        };

                        var resp = SignAndSendTransaction(t);

                        if (resp == null)
                        {
                            _screenManager.PrintError(ServerConnError);
                            return;
                        }
                        if (resp.IsEmpty())
                        {
                            _screenManager.PrintError(NoReplyContentError);
                            return;
                        }
                        JObject jObj = JObject.Parse(resp);

                        string toPrint = def.GetPrintString(JObject.FromObject(jObj["result"]));
                        _screenManager.PrintLine(toPrint);
                        return;
                    }
                    catch (Exception e)
                    {
                        if (e is ContractLoadedException || e is AccountLockedException)
                        {
                            _screenManager.PrintError(e.Message);
                            return;
                        }

                        if (e is InvalidTransactionException)
                        {
                            _screenManager.PrintError(InvalidTransaction);
                            return;
                        }
                        if (e is JsonReaderException)
                        {
                            _screenManager.PrintError(WrongInputFormat);
                            return;
                        }
                        return;
                    }
                }

                // Execute
                // 2 cases : RPC command, Local command (like account management)
                if (def.IsLocal)
                {
                    if (def is SendTransactionCmd c)
                    {
                        try
                        {
                            JObject j = JObject.Parse(parsedCmd.Args.ElementAt(0));

                            Transaction tr;

                            tr = ConvertFromJson(j);
                            string hex = tr.To.Value.ToHex();

                            Module m = null;
                            if (!_loadedModules.TryGetValue(hex.Replace("0x", ""), out m))
                            {
                                if (!_loadedModules.TryGetValue("0x" + hex.Replace("0x", ""), out m))
                                {
                                    _screenManager.PrintError(AbiNotLoaded);
                                    return;
                                }
                            }

                            Method method = m.Methods?.FirstOrDefault(mt => mt.Name.Equals(tr.MethodName));

                            if (method == null)
                            {
                                _screenManager.PrintError(MethodNotFound);
                                return;
                            }

                            JArray p = j["params"] == null ? null : JArray.Parse(j["params"].ToString());
                            tr.Params = j["params"] == null ? null : method.SerializeParams(p.ToObject <string[]>());
                            tr.type   = TransactionType.ContractTransaction;

                            tr = tr.AddBlockReference(_rpcAddress);

                            _accountManager.SignTransaction(tr);
                            var resp = SignAndSendTransaction(tr);

                            if (resp == null)
                            {
                                _screenManager.PrintError(ServerConnError);
                                return;
                            }
                            if (resp.IsEmpty())
                            {
                                _screenManager.PrintError(NoReplyContentError);
                                return;
                            }
                            JObject jObj = JObject.Parse(resp);

                            string toPrint = def.GetPrintString(JObject.FromObject(jObj["result"]));
                            _screenManager.PrintLine(toPrint);
                        }
                        catch (Exception e)
                        {
                            if (e is AccountLockedException || e is InvalidTransactionException ||
                                e is InvalidInputException)
                            {
                                _screenManager.PrintError(e.Message);
                            }
                            if (e is JsonReaderException || e is FormatException)
                            {
                                _screenManager.PrintError(WrongInputFormat);
                                return;
                            }
                        }
                    }
                    else if (def is CallReadOnlyCmd)
                    {
                        JObject j = JObject.Parse(parsedCmd.Args.ElementAt(0));

                        Transaction tr;

                        tr = ConvertFromJson(j);
                        string hex = tr.To.Value.ToHex();

                        Module m = null;
                        if (!_loadedModules.TryGetValue(hex.Replace("0x", ""), out m))
                        {
                            if (!_loadedModules.TryGetValue("0x" + hex.Replace("0x", ""), out m))
                            {
                                _screenManager.PrintError(AbiNotLoaded);
                                return;
                            }
                        }

                        Method method = m.Methods?.FirstOrDefault(mt => mt.Name.Equals(tr.MethodName));

                        if (method == null)
                        {
                            _screenManager.PrintError(MethodNotFound);
                            return;
                        }

                        JArray p = j["params"] == null ? null : JArray.Parse(j["params"].ToString());
                        tr.Params = j["params"] == null ? null : method.SerializeParams(p.ToObject <string[]>());

                        var resp = CallTransaction(tr);

                        if (resp == null)
                        {
                            _screenManager.PrintError(ServerConnError);
                            return;
                        }
                        if (resp.IsEmpty())
                        {
                            _screenManager.PrintError(NoReplyContentError);
                            return;
                        }
                        JObject jObj = JObject.Parse(resp);

                        string toPrint = def.GetPrintString(JObject.FromObject(jObj["result"]));
                        _screenManager.PrintLine(toPrint);
                    }
                    else if (def is AccountCmd)
                    {
                        _accountManager.ProcessCommand(parsedCmd);
                    }
                    else if (def is CertificateCmd)
                    {
                        _certificatManager.ProcCmd(parsedCmd);
                    }
                }
                else
                {
                    try
                    {
                        // RPC
                        HttpRequestor reqhttp = new HttpRequestor(_rpcAddress);
                        string        resp    = reqhttp.DoRequest(def.BuildRequest(parsedCmd).ToString(), def.GetUrl());

                        if (resp == null)
                        {
                            _screenManager.PrintError(ServerConnError);
                            return;
                        }

                        if (resp.IsEmpty())
                        {
                            _screenManager.PrintError(NoReplyContentError);
                            return;
                        }

                        JObject jObj = JObject.Parse(resp);

                        var j = jObj["result"];

                        if (j["error"] != null)
                        {
                            _screenManager.PrintLine(j["error"].ToString());
                            return;
                        }

                        if (j["result"]?["BasicContractZero"] != null)
                        {
                            _genesisAddress = j["result"]["BasicContractZero"].ToString();
                        }

                        string toPrint = def.GetPrintString(JObject.FromObject(j));

                        _screenManager.PrintLine(toPrint);
                    }
                    catch (Exception e)
                    {
                        if (e is UriFormatException)
                        {
                            _screenManager.PrintError(UriFormatEroor);
                            return;
                        }

                        if (e is JsonReaderException)
                        {
                            _screenManager.PrintError(WrongInputFormat);
                            return;
                        }
                    }
                }
            }
        }