Blockchain.cs 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. using System;
  2. using System.Text;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Threading.Tasks;
  6. using Newtonsoft.Json;
  7. namespace HyperCube.Models
  8. {
  9. public class Blockchain
  10. {
  11. public static bool newData = false;
  12. public static List<Blockchain> loaded = new List<Blockchain>();
  13. public int port;
  14. public string url;
  15. public string address;
  16. public string name;
  17. Blockchain()
  18. {
  19. }
  20. public Blockchain(string url, int port)
  21. {
  22. this.url = url;
  23. this.port = port;
  24. }
  25. public static string bin2hex(string code)
  26. {
  27. //code = "0x".bin2hex('getCount()');
  28. var bytes = Encoding.UTF8.GetBytes(code);
  29. var hex = BitConverter.ToString(bytes).Replace("-", "");
  30. Console.WriteLine("hex " + hex);
  31. return "0x"+hex;
  32. }
  33. public async Task<string> GetSHA3(string code)
  34. {
  35. var hex = bin2hex(code);
  36. var req = $"{{ \"jsonrpc\":\"2.0\",\"method\":\"web3_sha3\",\"params\":[\"{hex}\"], \"id\":1}}";
  37. var answer = await Post.PostRequestAsync(req);
  38. //dynamic jsonDe = JsonConvert.DeserializeObject(answer);
  39. Console.WriteLine("result " + answer);
  40. return answer;
  41. }
  42. public async Task<string> RunContract(string contractAddress, string data)
  43. {
  44. Console.WriteLine("RunContract contractAddress " + contractAddress);
  45. var req = $"{{ \"jsonrpc\":\"2.0\",\"method\":\"eth_sendTransaction\",\"params\":[{{\"from\":\"{address}\",\"to\":\"{contractAddress}\",\"gas\":\"0x31b2e\", \"data\":\"{data}\"}}], \"id\":1}}";
  46. var answer = await Post.PostRequestAsync(req);
  47. dynamic jsonDe = JsonConvert.DeserializeObject(answer);
  48. Console.WriteLine("result " + answer);
  49. return contractAddress;
  50. }
  51. public async Task<string> GetReceipt(string transactionAddress)
  52. {
  53. Console.WriteLine("transactionAddress " + transactionAddress);
  54. var req = $"{{ \"jsonrpc\":\"2.0\",\"method\":\"eth_getTransactionReceipt\",\"params\":[\"{transactionAddress}\"], \"id\":1}}";
  55. var answer = await Post.PostRequestAsync(req);
  56. dynamic jsonDe = JsonConvert.DeserializeObject(answer);
  57. var blockHash = jsonDe.result.blockHash;
  58. var blockNumber = jsonDe.result.blockNumber;
  59. var contractAddress = jsonDe.result.contractAddress;
  60. Console.WriteLine("result " + answer);
  61. return contractAddress;
  62. }
  63. public async Task<string> Initialize()
  64. {
  65. await ListAccounts();
  66. if (!loaded.Contains(this))
  67. loaded.Add(this);
  68. Console.WriteLine("loaded blockchains " + loaded.Count);
  69. return $"Blockchain connected: {url}";
  70. }
  71. public async void GetGas(string bytecode)
  72. {
  73. }
  74. public async Task<string> AddContract(string bytecode)
  75. {
  76. Console.WriteLine("bytecode " + bytecode);
  77. var req = $"{{ \"jsonrpc\":\"2.0\",\"method\":\"eth_sendTransaction\",\"params\":[{{\"from\":\"{address}\",\"gas\":\"0x31b2e\", \"data\":\"{bytecode}\"}}], \"id\":1}}";
  78. var answer = await Post.PostRequestAsync(req);
  79. dynamic jsonDe = JsonConvert.DeserializeObject(answer);
  80. var res = jsonDe.result;
  81. Console.WriteLine("result AddContract transactionAddress: " + res);
  82. return res;
  83. }
  84. public async Task ListAccounts()
  85. {
  86. string answer = "no";
  87. //{ "jsonrpc":"2.0","method":"eth_getCode","params":["0x938cae6f6c21ed9d55196e96ef880f562e530553", "latest" ],"id":1}
  88. //string req = "{\"jsonrpc\":\"2.0\",\"method\":\"eth_getCode\",\"params\":[\"0x874c6a51e62680d4594cd2555ed8fa47b63ed253\",\"latest\"],\"id\":1}";
  89. string req = "{\"jsonrpc\":\"2.0\",\"method\":\"eth_accounts\", \"params\":[],\"id\":1}";
  90. answer = await Post.PostRequestAsync(req);
  91. //string json = Encoding.UTF8.GetString(bytedata, 1, bytedata.Length - 1);
  92. //try
  93. //{
  94. Console.WriteLine("Json string " + answer);
  95. dynamic jsonDe = JsonConvert.DeserializeObject(answer);
  96. address = jsonDe.result[0];
  97. Console.WriteLine("Json addr " + jsonDe.result[0]);
  98. var methodName = (string)jsonDe.name;
  99. newData = true;
  100. }
  101. public async void ExecuteContract()
  102. {
  103. string answer = "no";
  104. string req = "{\"jsonrpc\":\"2.0\",\"method\":\"eth_call\",\"params\":[{\"to\":\"0x874c6a51e62680d4594cd2555ed8fa47b63ed253\", \"data\":\"0xa87d942c\"},\"latest\"],\"id\":1}";
  105. //string req = "{\"jsonrpc\":\"2.0\",\"id\":1,\"result\":\"0x0000000000000000000000000000000000000000000000000000000000000004\"}";
  106. //Console.WriteLine($"req " + req);
  107. await Post.PostRequestAsync(req);
  108. //Console.WriteLine($"answer {answer} len {answer.Length}" );
  109. address = answer;
  110. }
  111. public string GetAddress()
  112. {
  113. //this.address = address;
  114. return address;
  115. //post запрос
  116. }
  117. }
  118. }