Jelajahi Sumber

блокчейны

Rimmon 3 tahun lalu
induk
melakukan
eb69f410cd
3 mengubah file dengan 183 tambahan dan 35 penghapusan
  1. 107 2
      Models/Blockchain.cs
  2. 51 12
      Pages/Blockchains.razor
  3. 25 21
      Pages/Blockchains.razor.cs

+ 107 - 2
Models/Blockchain.cs

@@ -1,11 +1,16 @@
 using System;
+using System.Diagnostics;
 using System.Text;
 using System.Collections.Generic;
 using System.Linq;
+using System.Drawing;
+using System.Drawing.Imaging;
 using System.Threading.Tasks;
 using Newtonsoft.Json;
 using Console = HyperCube.Utils.AdvConsole;
 using System.Text.RegularExpressions;
+using QRCoder;
+using System.IO;
 
 //0xe5D682717955d6C35d465A3485625C64655a04f4 - HCB in rinkeby
 //0xb504ba124b74333d8536db534f7fcdc174d6ee3d - system address rinkeby
@@ -36,6 +41,7 @@ namespace HyperCube.Models
         public static string decimals;
         public static string symbol;
         public static string tokenBalance;
+        public static string balanceHCB;
 
         public static Dictionary<int, Blockchain> supported;
         public static string Connected
@@ -85,6 +91,40 @@ namespace HyperCube.Models
             return null;
         }
 
+
+        public async Task<string> GetBalanceToken(string contractAddress, string address)
+        {
+            TransactionObject transObj = new TransactionObject();
+            transObj.to = contractAddress;
+
+            //compile data
+            //to.data = await compileFunction("decimals");
+            //transObj.data = await compileFunction("name");
+            //var answer = await RunFunction2("eth_call", transObj, "latest");
+            ////Console.WriteLine("ImportERC20 len "+ answer.Length + " answer " + answer);
+            //var parsed = ParseStringAnswer(answer);
+            //int tokenlen = hex2dec(parsed[1]);
+            //tokenName = HextoString(parsed[2]).Substring(0, tokenlen);
+            //to.data = await compileFunction("balanceOf(address)");
+            transObj.data = await compileFunction("symbol");
+            var answer = await RunFunction2("eth_call", transObj, "latest");
+            var parsed = ParseStringAnswer(answer);
+            int symlen = hex2dec(parsed[1]);
+            symbol = HextoString(parsed[2]).Substring(0, symlen);
+            //Console.WriteLine("ImportERC20 len " + answer.Length + " answer " + answer);
+            transObj.data = await compileFunction("decimals");
+            answer = await RunFunction2("eth_call", transObj, "latest");
+            decimals = hex2dec(ParseStringAnswer(answer)[0]).ToString();
+
+            transObj.data = await compileFunction($"function balanceOf(address account)");
+            if (address != null)
+                transObj.data += zerofill(address, 64, true);
+            //answer = await RunFunction2("eth_call", to, AccountModel.Current.GetActualAddress(this));
+            answer = await RunFunction2("eth_call", transObj, "latest");
+            balanceHCB = ((double)AccountModel.ConvertBalance(ParseStringAnswer(answer)[0]) / 1000000000000000000.0).ToString();
+            return null;
+        }
+
         public async Task<string> Initialize()
         {
             if (!loaded.ContainsKey(id))
@@ -331,6 +371,70 @@ namespace HyperCube.Models
             //return "test answer";
         }
 
+        public static string QRtest(string input)
+        {
+            QRCodeGenerator qrGenerator = new QRCodeGenerator();
+            QRCodeData qrCodeData = qrGenerator.CreateQrCode(input, QRCodeGenerator.ECCLevel.Q);
+            QRCode qrCode = new QRCode(qrCodeData);
+            Bitmap qrCodeImage = qrCode.GetGraphic(7);
+            //Image img = qrCodeImage;
+
+            MemoryStream ms = new MemoryStream();
+            BinaryWriter bw = new BinaryWriter(ms);
+            //var fulltexname = Encoding.UTF8.GetBytes("http://" + myHostName + "/" + filename);
+
+            //bw.Write(loc_id);
+            //bw.Write(fulltexname);
+
+            
+            //return base64String;            
+            qrCodeImage.Save(ms, ImageFormat.Png);
+            byte[] imageBytes = ms.ToArray();
+            string base64String = Convert.ToBase64String(imageBytes);
+            Console.WriteLine($"base64String {base64String}");
+            return base64String;
+            //Image.FromStream(ms);
+        }
+
+        public static List<string> ExecuteCommand(string cmd)
+        {
+            List<string> output = new List<string>();            
+            var processInfo = new ProcessStartInfo(@"e:\www\nodejs\test.bat", cmd );
+            processInfo.CreateNoWindow = true;
+            processInfo.UseShellExecute = false;
+            processInfo.RedirectStandardError = true;
+            processInfo.RedirectStandardOutput = true;
+
+            var process = Process.Start(processInfo);
+
+            process.OutputDataReceived += (object sender, DataReceivedEventArgs e) => Echo(e.Data, ref output);
+            process.BeginOutputReadLine();
+
+            process.ErrorDataReceived += (object sender, DataReceivedEventArgs e) =>
+                Console.WriteLine("error>>" + e.Data);
+            process.BeginErrorReadLine();
+
+            process.WaitForExit();
+
+            Console.WriteLine($"ExitCode: {process.ExitCode}");
+            num = 0;
+            process.Close();
+            return output;
+        }
+
+        static int num = 0;
+        
+        static void Echo(string msg, ref List<string> output)
+        {
+            //if (num > 0)
+            if (msg != null && msg.Length > 0)
+            {
+                Console.WriteLine("output >>" + msg);
+                output.Add(msg);
+            }
+            num++;
+        }
+
         async Task<string> mySHA3(string code)
         {
             var res = await GetSHA3(code);
@@ -439,8 +543,9 @@ namespace HyperCube.Models
             var answer = await RunFunction2("eth_sendTransaction", transObj);            
         }
 
-        public async Task ImportERC20(string contractAddress)
+        public async Task ImportERC20(string contractAddress, string importAddress)
         {
+            //"0xb504ba124b74333D8536DB534F7fcdC174d6Ee3d"
             //var gbh = await GetTByHash("0x00bdbf1571aa69a2cf8c8c7913a01eaca3a4b7e5e7e49fc787cb81c0df2c2682");
             //Console.WriteLine("GetTByHash " + gbh );
             //runfunction balanceOf totalSupply symbol name
@@ -469,7 +574,7 @@ namespace HyperCube.Models
             
             transObj.data = await compileFunction($"function balanceOf(address account)");
             if (address != null)
-                transObj.data += zerofill("0xb504ba124b74333D8536DB534F7fcdC174d6Ee3d", 64, true);
+                transObj.data += zerofill(importAddress, 64, true);
             //answer = await RunFunction2("eth_call", to, AccountModel.Current.GetActualAddress(this));
             answer = await RunFunction2("eth_call", transObj, "latest");
             tokenBalance = ((double)AccountModel.ConvertBalance(ParseStringAnswer(answer)[0]) / 1000000000000000000.0).ToString();

+ 51 - 12
Pages/Blockchains.razor

@@ -35,6 +35,7 @@
     string hidecontr = "visible";
     string hidereceipt = "hidden";
     string result = "";
+    string qrr = "";
     string newcode = "";
     string newname = "";
     string balance = "";
@@ -202,14 +203,20 @@
         <button @onclick="Unlock">Unlock</button>
         <div>Wallet:@myWallet</div>
         <div>Token balance:@balanceHCB</div>
+        <br><br>
         @*<button @onclick="TransferContract">Transfer 10 by Contract</button>*@
-        <button @onclick="EstimateGas">EstimateGas</button>
+        @*<button @onclick="EstimateGas">EstimateGas</button>*@
         @*<button onclick="window.location.href='@mypath'">Download 1</button>*@
-        <button id="btn" @onclick="Dload">Dload</button>
+    <p>Export address:</p>
+    <button id="btn" @onclick="DloadJSON">Download JSON file</button>
+    <button id="btn" @onclick="ExportPrivateKey">Private Key</button>
+    <button id="btn" @onclick="PrivateKeyQR">QR code</button>
     </p>
-
-    <p>Result: @result, gas: @gas</p>
-} 
+    <br>
+    <br>
+    <div>@((MarkupString)qrr)</div>
+    @*<p>Result: @result, gas: @gas</p>*@
+}
 @code
     {
     AccountModel account;
@@ -223,21 +230,52 @@
     int focus = 0;
     string gas = "";
 
+    async Task<string> PrivateKeyQR()
+    {
+        var code = await ExportPrivateKey();
+        code = HyperCube.Models.Blockchain.QRtest(code);
+        qrr = $"<img src=\"data: image / png; base64, {code}\"/>";
+        return "";
+    }
+
+    async Task<string> ExportPrivateKey()
+    {
+        var wallet = await GetWallet();
+        if (wallet != null)
+        {
+            var acc = AccountModel.Find(accountSelected);
+            string text = getFiles(wallet, "key", acc.PWDHash);
+            qrr = $"<p>{text}</p>";
+            return text;
+            //return await JsRuntime.InvokeAsync<string>("test", text);
+        }
+        return "";
+    }
+
+    async Task<string> DloadJSON()
+    {
+        var wallet = await GetWallet();
+        if (wallet != null)
+        {
+            string text = getFiles(wallet, "json");
+            qrr = $"<p>{text}</p>";
+            return await JsRuntime.InvokeAsync<string>("test", text);
+        }
+        return "";
+    }
 
-    async Task<string> Dload()
+    async Task<string> GetWallet()
     {
-        //string filepath = @"c:\Users\Администратор\AppData\Local\Ethereum\rinkeby\keystore\
         if (accountSelected != "" && accountSelected != null && accountSelected != "0")
         {
             var acc = AccountModel.Find(accountSelected);
             if (acc != null)
             {
                 myWallet = await acc.GetOrCreateActualAddress(Blockchain.GetMain());
-                string text = getFiles(myWallet);
-                return await JsRuntime.InvokeAsync<string>("test", text);
+                return myWallet;
             }
         }
-        return "";
+        return null;
     }
 
 
@@ -256,7 +294,7 @@
 
     async Task ImportERC20()
     {
-        await Blockchain.GetMain().ImportERC20(tokenContract);
+        await Blockchain.GetMain().ImportERC20(tokenContract, myWallet);
         //await Blockchain.GetMain().ImportERC20("0x413D9500A675d9b645034aC5f4325BF12ddeb7c1");
     }
 
@@ -405,9 +443,10 @@
         }
         else
         {
+            myWallet = Blockchain.GetMain().address;
             balance = await Blockchain.GetMain().GetBalance();
         }
-
+        await Blockchain.GetMain().GetBalanceToken("0xe5D682717955d6C35d465A3485625C64655a04f4", myWallet);
     }
 
     //private async Task CreateBlockchainAccount(Blockchain bc, string pass)

+ 25 - 21
Pages/Blockchains.razor.cs

@@ -2,7 +2,7 @@
 using System.Threading.Tasks;
 using System.Net;
 using System.IO;
-
+using System.Text;
 
 using Microsoft.AspNetCore.Components;
 
@@ -14,48 +14,52 @@ namespace HyperCube.Pages
         public int Smart { get; set; }
         public string answer;
         public string myWallet;
-        public string balanceHCB;
+        public string balanceHCB
+        {
+            get { return HyperCube.Models.Blockchain.balanceHCB; }
+            set { }
+        }
         //public partial class Blocchains
         //{
         //    [Parameter]
         //    public string Smart { get; set; }
         //}
-        
+
         //public string mypath = @"Wallet";
         public string mypath = @"getfile";
-        public string getFiles(string wallet)
-        {
+
+        public string getFiles(string wallet, string cmd, string pwd = "")
+        {            
             mypath = @"c:\Users\Администратор\AppData\Local\Ethereum\rinkeby\keystore\";
-            //string filepath = @"c:\Users\Администратор\AppData\Local\Ethereum\rinkeby\keystore\UTC--2021-04-21T07-20-25.392048000Z--1841462ee3e39af00de42b067853c58ab7e18876";
-            //text = File.ReadAllText(filepath);
-            string toprint = "";
+            string ret = "";
             var files = Directory.GetFiles(mypath);
-
             foreach (var file in files)
             {
                 string fileName = file.Substring(mypath.Length + 1);
                 var name = fileName.Split("--");
                 try
                 {
-                    var filepath = mypath + file;                    
                     if ("0x" + name[2] == wallet)
                     {
-                        var content = File.ReadAllText(file);
-                        Console.WriteLine($"fileName {name[2]} path {filepath} {"0x" + name[2] == wallet} first {content[0]}");
-                        return content;
+                        if (cmd == "key")
+                        {
+                            
+                            Console.WriteLine($"pwd {pwd}");
+                            return Models.Blockchain.ExecuteCommand(name[2] + " " + pwd)[1];
+                        }
+                        else if (cmd == "json")
+                        {
+                            var content = File.ReadAllText(file);
+                            return content;
+                        }
                     }                    
-                    //uint fileTaskId = Convert.ToUInt32(name[0]);
-                    //if (fileTaskId == taskid)
-                    //{
-                    //    toprint += fileName + ",";
-                    //}
                 }
                 catch (Exception e)
                 {
                     Console.WriteLine($"Exception file {fileName}: {e.Message}");
-                }
-            }
-            return toprint;
+                }                
+            }            
+            return ret;
         }
     }
 }