using System; using System.Text; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Newtonsoft.Json; namespace HyperCube.Models { public class Blockchain { public static bool newData = false; public static List loaded = new List(); public int port; public string url; public string address; public string name; Blockchain() { } public Blockchain(string url, int port) { this.url = url; this.port = port; } public static string bin2hex(string code) { //code = "0x".bin2hex('getCount()'); var bytes = Encoding.UTF8.GetBytes(code); var hex = BitConverter.ToString(bytes).Replace("-", ""); Console.WriteLine("hex " + hex); return "0x"+hex; } public async Task GetSHA3(string code) { var hex = bin2hex(code); var req = $"{{ \"jsonrpc\":\"2.0\",\"method\":\"web3_sha3\",\"params\":[\"{hex}\"], \"id\":1}}"; var answer = await Post.PostRequestAsync(req); //dynamic jsonDe = JsonConvert.DeserializeObject(answer); Console.WriteLine("result " + answer); return answer; } public async Task RunContract(string contractAddress, string data) { Console.WriteLine("RunContract contractAddress " + contractAddress); var req = $"{{ \"jsonrpc\":\"2.0\",\"method\":\"eth_sendTransaction\",\"params\":[{{\"from\":\"{address}\",\"to\":\"{contractAddress}\",\"gas\":\"0x31b2e\", \"data\":\"{data}\"}}], \"id\":1}}"; var answer = await Post.PostRequestAsync(req); dynamic jsonDe = JsonConvert.DeserializeObject(answer); Console.WriteLine("result " + answer); return contractAddress; } public async Task GetReceipt(string transactionAddress) { Console.WriteLine("transactionAddress " + transactionAddress); var req = $"{{ \"jsonrpc\":\"2.0\",\"method\":\"eth_getTransactionReceipt\",\"params\":[\"{transactionAddress}\"], \"id\":1}}"; var answer = await Post.PostRequestAsync(req); dynamic jsonDe = JsonConvert.DeserializeObject(answer); var blockHash = jsonDe.result.blockHash; var blockNumber = jsonDe.result.blockNumber; var contractAddress = jsonDe.result.contractAddress; Console.WriteLine("result " + answer); return contractAddress; } public async Task Initialize() { await ListAccounts(); if (!loaded.Contains(this)) loaded.Add(this); Console.WriteLine("loaded blockchains " + loaded.Count); return $"Blockchain connected: {url}"; } public async void GetGas(string bytecode) { } public async Task AddContract(string bytecode) { Console.WriteLine("bytecode " + bytecode); var req = $"{{ \"jsonrpc\":\"2.0\",\"method\":\"eth_sendTransaction\",\"params\":[{{\"from\":\"{address}\",\"gas\":\"0x31b2e\", \"data\":\"{bytecode}\"}}], \"id\":1}}"; var answer = await Post.PostRequestAsync(req); dynamic jsonDe = JsonConvert.DeserializeObject(answer); var res = jsonDe.result; Console.WriteLine("result AddContract transactionAddress: " + res); return res; } public async Task ListAccounts() { string answer = "no"; //{ "jsonrpc":"2.0","method":"eth_getCode","params":["0x938cae6f6c21ed9d55196e96ef880f562e530553", "latest" ],"id":1} //string req = "{\"jsonrpc\":\"2.0\",\"method\":\"eth_getCode\",\"params\":[\"0x874c6a51e62680d4594cd2555ed8fa47b63ed253\",\"latest\"],\"id\":1}"; string req = "{\"jsonrpc\":\"2.0\",\"method\":\"eth_accounts\", \"params\":[],\"id\":1}"; answer = await Post.PostRequestAsync(req); //string json = Encoding.UTF8.GetString(bytedata, 1, bytedata.Length - 1); //try //{ Console.WriteLine("Json string " + answer); dynamic jsonDe = JsonConvert.DeserializeObject(answer); address = jsonDe.result[0]; Console.WriteLine("Json addr " + jsonDe.result[0]); var methodName = (string)jsonDe.name; newData = true; } public async void ExecuteContract() { string answer = "no"; string req = "{\"jsonrpc\":\"2.0\",\"method\":\"eth_call\",\"params\":[{\"to\":\"0x874c6a51e62680d4594cd2555ed8fa47b63ed253\", \"data\":\"0xa87d942c\"},\"latest\"],\"id\":1}"; //string req = "{\"jsonrpc\":\"2.0\",\"id\":1,\"result\":\"0x0000000000000000000000000000000000000000000000000000000000000004\"}"; //Console.WriteLine($"req " + req); await Post.PostRequestAsync(req); //Console.WriteLine($"answer {answer} len {answer.Length}" ); address = answer; } public string GetAddress() { //this.address = address; return address; //post запрос } } }