Алгоритм общения и обработки данных при майнинге ETH на пуле

421
15 января 2018, 10:17

Нужен пошаговый алгоритм взаимодействия и майнинга эфира на пуле(для примера Dwarfpool). Нигде нет этого всего в одном месте.

То, что известно мне:

1)Закидываем на сервер запрос

http://exp-us.dwarfpool.com:81/0x8D4CC8e0b26BfFFe5418d820F9F6581Ebc3CB8C1/rig1123341061151111101141129934583450464834443410910111610411110034583410111610495103101116871111141073444341129711497109115345891934434105100345850125

2)Получаем с сервера ответ

{"result":["0x20e452a80e8d07b613b2176bd87edbe50fc5ce6402de22ec0444fc3c59a52ab0","0x1842cb89c0dfad7efb5ce2bf93f418e369214e9e1773a1bfe7c9c72ceee682bb","0x0000000225c17d04dad2965cc5a02a23e254c0c3f75d9178046aeb27ce1ca574"],"jsonrpc":"2.0","id":0}

3) Как то обрабатываем этот ответ.

ulong[] array = this.Search(work.headerHash, upper64OfBoundary, this._workId, start_nonce);
if (array == null) // А вот и проблема - этот массив всегда null
{
break;
}                     
this._client.SubmitWork(this.light, array, work.headerHash); //Это никогда не выполняется
                        start_nonce = array.Max() + 1;

4) Отсылаем его на сервер? 5) Запрашиваем новую работу?

Хотелось бы знать, как должно быть. Обработчик ответа всегда возвращает null и тут же запрашивает следующую работу. Судя по статистике сайта - программа не работает, ничего не вычисляет и не возвращает. Хотелось бы починить, но непонятно, как должно быть? Блок-схему или просто пошаговое объяснение логики взаимодействия. Весь приведённый код, ответы с сервера - настоящие.

По просьбе @Birdy прилагаю метод Search:

private ulong[] Search(byte[] headerHash, ulong upper64OfBoundary, int workPackage, ulong start_nonce)
        {
            this._kernel.SetMemoryArgument(0, this._searchBuffer);
            this._kernel.SetMemoryArgument(1, this._header);
            this._queue.WriteToBuffer(headerHash, this._header, true, null);
            this._kernel.SetValueArgument(3, start_nonce);
            this._kernel.SetValueArgument(4, upper64OfBoundary);
            Stopwatch stopwatch = new Stopwatch();
            uint num = 0u;
            uint[] array = new uint[this._maxSearchResults + 1];
            string text = "00.00";
            stopwatch.Start();
            while (true)
            {
                this._kernel.SetValueArgument(3, start_nonce);
                this._queue.WriteToBuffer(this._emptyBuffer, this._searchBuffer, true, null);
                this._queue.Execute(this._kernel, null, new long[1]
                {
                    this._globalWorkSize
                }, new long[1]
                {
                    this._workgroupSize
                }, null);
                this._queue.ReadFromBuffer(this._searchBuffer, ref array, true, null);

                this._queue.Finish();
                num += this._globalWorkSize;
                if (stopwatch.Elapsed >= this._second)
                {
                    stopwatch.Stop();
                    string text2 = Miner.Speed = ((double)num / stopwatch.Elapsed.TotalMilliseconds / 1000.0).ToString("00.00", CultureInfo.InvariantCulture);
                    num = 0u;
                    stopwatch.Reset();
                    stopwatch.Start();
                    if (text.Substring(0, 2) != text2.Substring(0, 2))
                    {
                        text = text2;
                        UnityEngine.Debug.Log(string.Format("[{0}] {1}MH/s [A{2} R{3}]", DateTime.Now.ToString("HH:mm", CultureInfo.InvariantCulture), text2, Miner.AcceptedShares, Miner.RejectedShares));
                    }
                }
                if (array[0] != 0)
                {
                    UnityEngine.Debug.LogWarning("array[0] != null");
                    ulong[] array2 = new ulong[this._maxSearchResults];
                    for (int i = 0; i != Math.Min(array[0], this._maxSearchResults); i++)
                    {
                        array2[i] = start_nonce + array[i + 1];
                    }
                    return array2;
                }
                if (this._workId == workPackage && this.Running)
                {
                    start_nonce += this._globalWorkSize;
                    continue;
                }
                break;
            }
            Miner.Speed = "00.00";
            return null;
        }

MinerSpeed показывается. Значения вполне реалистичные, около того, что показывает стандартный ethminer. Но после этого всё равно возвращает null.

READ ALSO
Cоздание индивидуального ползунка “<input type=”range“>”

Cоздание индивидуального ползунка “<input type=”range“>”

Здравствуйте, необходимо сделать ползунок с индивидуальным дизайномПоэтому input type=range не подойдет, пробовал использовать jQueryUI, но он тоже...

365
Регулярное выражение: у русских слов нет границы &ldquo;\b&rdquo;?

Регулярное выражение: у русских слов нет границы “\b”?

Поясните, пожалуйста, почему не работает граница слова \b для русских слов, в то время, когда для английских работает

330
Цифровые часы как сделать

Цифровые часы как сделать

не нашел примеров в интернетеКак сделать такие вот часы?

215
Почему некорректно работает скрипт?

Почему некорректно работает скрипт?

Добрый день! Для фиксации блоков использую скрипт:

254