Вернуться   Биткоин Форум > - Mining (Altcoins)
19 июля 2014, 3:17:30 PM   # 1
 
 
Сообщения: 378
Цитировать по имени
цитировать ответ
по умолчанию Re: Как создать свой собственный Multipool - на Open Source Way

Взлом Биткоин адресов.
500 Биткоинов взломаны в "мозговом кошельке" с паролем "bitcoin is awesome"
Адрес кошелька: 14NWDXkQwcGN1Pd9fboL8npVynD5SfyJAE
Приватный ключ: 5J64pq77XjeacCezwmAr2V1s7snvvJkuAz8sENxw7xCkikceV6e
подробнее...


Всем кто хочет заработать Биткоины без вложений - рекомендую сайт http://bitcoin-zarabotat.ru
В этой теме, я собираюсь пройти через шаги, необходимые для создания своего собственного POS multipool, в комплекте с довольно интерфейсной статистикой и автоматической торговлей обменом .. Это будет работать только для связанных с Bitcoin монет. Я не обещаю разделить все секреты, но достаточно, чтобы получить сайт и работает.

Я собираюсь рассказать вам все это совершенно бесплатно.
Я не собираюсь polute это с донорством домогательств - если вы хотели бы отправить мне для написания BTC это, как только вы закончите читать это, П.М. меня, и я пришлю вам мой адрес.

 Я приложить некоторые усилия, чтобы поддержать, чтобы помочь в осуществлении этого, если у кого есть проблемы.



Это не может быть красивой, но это работает - и я не буду шантажировать монеты из любого из вас. Это большой винт вас все пизда операторов МПА, которые забыли, где вся эта сцена пришла. Satoshi releaed в Bitcoin клиент с открытым исходным кодом, бросить зарядки людям Bitcoin, чтобы установить их в multipool и бросить пытается ввернуть все закончилось.
Эта реализация кстати, не фальсифицировать любого из статистики, как некоторые из других основных бассейнов, и это обеспечивает полную видимость в статистику. Он также не делает ничего из этого "Everbody способствует акции к алго конкретному ведру, выплачивающие один раз в день" дерьмо, где оператор бассейна может украсть 1/3 денег от вершины, прежде чем кто-нибудь может сказать.

Это использует комбинацию питона, Node.js и даже основных cronjobs, чтобы получить работу.  


Шаг 1 - начать с базовой NOMP установки. мерзавец клон из NOMP репо: https://github.com/zone117x/node-open-mining-portal.git
Шаг 2 - Настройка ваших монет демонов, как если бы это была основной NOMP сборка. Есть несколько исключений. В / монеты / директории, которую вы собираетесь быть ограничены только с помощью монет, размещенных на любом Cryptsy или Mintpal - я мог бы eaily добавили некоторые другие рынки к этому, так что не стесняйтесь. Для каждой монеты, в / монетах directiory включает в себя дополнительную линию: "Я БЫ": "<либо рынок ID от Cryptsy, или слово "mintpal" если монета только на mintpal>"

IE:
котировка
корень @ blackcoinpool # кошка feathercoin.json
{
"имя": "Feathercoin",
"Я БЫ": "5",
"символ": "Федеральная торговая комиссия",
"алгоритм": "Scrypt"
}
Бассейн собирается использовать это, чтобы помочь ему посмотреть значение для монет, когда она вычислительная некоторая статистики позже.

Кроме того, при настройке демонов монеты - мы не будем использовать процессор оплаты NOMP ничего больше, чем вычисление таблицы противовесов в Redis. Поэтому убедитесь, что установлен минимальный выигрыш каждой монеты, чтобы 999999999999999 и в главном config.json отключить проверку подлинности имени работника.
котировка
Основной config.json ...

    "defaultPoolConfigs": {
        "blockRefreshInterval": 1000,
        "jobRebroadcastTimeout": 55,
        "время соединения вышло": 600,
       "emitInvalidBlockHashes": ложный,
       "validateWorkerUsername": ложный,
        "tcpProxyProtocol": ложный,
        "запрещая": {
            "включен": правда,
            "время": 600,
            "invalidPercent": 30,
            "checkThreshold": 500,
            "purgeInterval": 300
        },
        "Redis": {
            "хозяин": "127.0.0.1",
            "порт": 6379
        }
    },

    "Веб-сайт": {
        "включен": правда,
        "хозяин": "0.0.0.0",
        "порт": 80,
        "stratumHost": "everypool.com",
        "статистика": {
           "UpdateInterval": 60,
            "historicalRetention": 86400,

            "hashrateWindow": 300
    },

котировка
это от внутренней части на конфигураций / pool_config / монет
    "Процесс оплаты": {
        "включен": правда,
       "paymentInterval": 75,
        "минимальный платеж": 99999999999,

        "демон": {
            "хозяин": "127.0.0.1",
            "порт": <любой другой порт, ваша монета демон прослушивает>,
            "пользователь": "одного поля ягода",
            "пароль": "flocktogether"
        }
    },
paradigmflux сейчас офлайн Пожаловаться на paradigmflux   Ответить с цитированием Мультицитирование сообщения от paradigmflux Быстрый ответ на сообщение paradigmflux


Как заработать Биткоины?
Без вложений. Не майнинг.


19 июля 2014, 3:17:48 PM   # 2
 
 
Сообщения: 378
Цитировать по имени
цитировать ответ
по умолчанию Re: Как создать свой собственный Multipool - на Open Source Way

Получил 1806 Биткоинов
Реальная история.





Далее, мы собираемся расширить файл stats.js расширить API, чтобы иметь некоторые новые функциональные возможности. Это будет длинный пост.

В / Libs / директории, переименовывать stats.js полностью stats.old
Открываю новый stats.js и вставьте следующие три фрагментов - изменить вторые секции. Если ваша целевая монета только на mintpal, раскомментируйте строки, призывающие к mintpal API и введите свой тикер. Если монета находится на cryptsy, заполнить соответствующий рынок ID и тикер Cryptsy. Этот файл будет расширить API нескольких способов.

Самое главное, что он будет делать <ваш URL>/ API / выплаты /<имя работника> вернуть оценочное количество монет работник заработал в течение текущего сдвига (в выплатах монет по вашему выбору).
Он также будет распространяться на страницу «Мой шахтер», так что каждый работник может иметь полный список того, сколько монет какого типа они заработали в течение этого тока смещения.

Код:
вар ZLib = требуется ( 'Zlib');

вар Redis = требуется ( 'Redis');
вар = требует асинхронных ( «асинхр»);
запрос вар = требуется ( «запрос»);

вар OS = требуется ( 'ОС');

вар Algos = требуется ( 'прослойка бассейн / Библиотека / algoProperties.js');


module.exports = функция (регистратор, portalConfig, poolConfigs) {

    вар _this = это;

    вар logSystem = 'Статистика';

    вар redisClients = [];
    вар redisStats;

    this.statHistory = [];
    this.statPoolHistory = [];

    this.stats = {};
    this.statsString = '';

    setupStatsRedis ();
    gatherStatHistory ();

    вар canDoStats = TRUE;

    Object.keys (poolConfigs) .forEach (функция (монета) {

        если возвращение (canDoStats!);

        вар poolConfig = poolConfigs [монета];

        вар redisConfig = poolConfig.redis;

        для (вар я = 0; я < redisClients.length; я ++) {
            вар клиент = redisClients [I];
            если (client.client.port === redisConfig.port && client.client.host === redisConfig.host) {
                client.coins.push (монеты);
                вернуть;
            }
        }
        redisClients.push ({
            монеты: [монета],
            Клиент: redis.createClient (redisConfig.port, redisConfig.host)
        });
    });


    Функция setupStatsRedis () {
        redisStats = redis.createClient (portalConfig.redis.port, portalConfig.redis.host);
        redisStats.on ( 'ошибка', функция (ERR) {
            logger.error (logSystem, 'Historics', 'Redis для статистики была ошибка' + JSON.stringify (ERR));
        });
    }

    функционировать gatherStatHistory () {

        вар retentionTime = (((Date.now () / 1000) - portalConfig.website.stats.historicalRetention) | 0) .ToString ();

        redisStats.zrangebyscore ([ 'statHistory', retentionTime, '+ инф'], функция (ERR, ответы) {
            если (ERR) {
                logger.error (logSystem, 'Historics', 'Ошибка при попытке захватить накопленную статистику' + JSON.stringify (ERR));
                вернуть;
            }
            для (вар я = 0; я < replies.length; я ++) {
                _this.statHistory.push (JSON.parse (ответы [я]));
            }
            _this.statHistory = _this.statHistory.sort (функция (а, б) {
                вернуться a.time - b.time;
            });
            _this.statHistory.forEach (функция () {статистика
                addStatPoolHistory (статистика);
            });
        });
    }

    функционировать addStatPoolHistory (статистика) {
        данные вар = {
            Время: stats.time,
            бассейны: {}
        };
        для (вар бассейна в stats.pools) {
            data.pools [бассейн] = {
                hashrate: stats.pools [бассейн] .hashrate,
                workerCount: stats.pools [бассейн] .workerCount,
                блоки: stats.pools [бассейн] .blocks
            }
        }
        _this.statPoolHistory.push (данные);
    }


this.getCoins = функция (CBack) {
        _this.stats.coins = redisClients [0] .coins;
        CBack ();
    };

    this.getPayout = функция (адрес, CBack) {

        async.waterfall ([

            Функция (обратный вызов) {

                _this.getBalanceByAddress (адрес, функция () {

                    Обратный вызов (нуль, 'тест');
                });

            },

            Функция (MSG, обратный вызов) {

                вар totaltargetcoin = 0;

                async.each (_this.stats.balances, функция (баланс, CB) {

                    _this.getCoinTotals (balance.coin, balance.balance, функция (targetcoin) {

                        если (TypeOf (targetcoin)! = "не определено") {
                            totaltargetcoin + = targetcoin;
                        }

                        CB ();
                    });

                }, Функция (ERR) {
                    обратный вызов (нуль, totaltargetcoin);
                });
            }

        ], Функция (ERR, всего) {

            CBack (total.toFixed ());

        });
    };


    this.getBalanceByAddress = функция (адрес, CBack) {

        вар клиент = redisClients [0] .client,
            монеты = redisClients [0] .coins,
            Остатки = [];
          выплаты = [];



                    client.hgetall ( 'Выплаты:' + адрес, функция (ошибка, txns) {
                                                                         //logger.error(logSystem, 'ТЕМП', 'txnid переменная:' + txnid);

                                                                        если (ошибка) {
                                                                                Обратный вызов ( «Там не было выплат найдено»);
                                                                                вернуть;
                                                                        }
                                                                        если (txns === NULL) {
                                                                               Индекс вар = [];
                                                                               } Еще {
                                                                               выплаты = txns;

                                                                               }

                                                                        });


        async.each (монеты, функция (монета, CB) {

            client.hget (монета + ': остатки', адрес функция (ошибка, результат) {
                если (ошибка) {
                    Обратный вызов ( «Была ошибка получения противовесов»);
                    вернуть;
                }

                если (результат === NULL) {
                    Результат = 0;
                } Еще {
                    результат = результат;
                }

                balances.push ({
                    монета: монета,
                    Баланс: результат
                });

                CB ();
            });

        }, Функция (ERR) {
            _this.stats.balances = остатки;
            _this.stats.address = адрес;

 
            CBack ();
        });
    };

this.getCoinTotals = функция (монета, баланс, CBack) {
        вар клиент = redisClients [0] .client,
        coinData = poolConfigs [монета] .coin;
       logger.error (logSystem, 'ТЕМП', 'переменная является' + JSON.stringify (poolConfigs [монета] .coin));
         //logger.error(logSystem, 'ТЕМП', 'переменная является coinData.ID:' + coinData.ID);

        async.waterfall ([

  // Получить все остатки от Redis, если нет баланса не был представлен уже
            Функция (обратный вызов) {

                если (баланс) {
                    Обратный вызов (нуль, баланс);
                    вернуть;
                }

                client.hgetall (монета + ': весы', функция (ошибка, результаты) {
                    если (ошибка) {
                        Обратный вызов ( «Была ошибка получения противовесов»);
                        вернуть;
                    }

                    обратный вызов (NULL, результаты);
                });
            },
ЭТА следующая часть файла вам необходимо сделать некоторые изменения - это продолжение выше, хотя файл
Код:
           // сделать вызов Mintpal получить targetcoin обменный курс
            Функция (balances_results, вызов) {
                Варианты вар = {
                  // URL: 'https: //api.mintpal.com/market/stats/<СТРОКА СИМВОЛ ТВОЕЙ TARGET МОНЕТЫ ЗДЕСЬ>/ BTC»,
                URL: "HTTP: //pubapi.cryptsy.com/api.php метод = singlemarketdata&marketid =»,
                JSON: правда
                }

                запрос (опции, функция (ошибка, ответ, тело) {
                  если (ошибка! && response.statusCode == 200) {
                   // переменная targetcoin_price = parseFloat (корпус [0] .last_price);
                        вар targetcoin_price = тело [ 'возвращение']. рынки [»<ВАШ POS TARGET МОНЕТКА БИЛЕТ SYMBOL ЗДЕСЬ>«] .lasttradeprice;
                    обратный вызов (NULL, targetcoin_price, balances_results);

                  } Еще {
                    Обратный вызов ( «Был ошибка получения mintpal курса targetcoin»);
                  }
                });
            },

Остальная часть stats.js ниже - просто вставьте все три из них в тот же файл, помня, чтобы заполнить вашу информацию во второй части.
Код:

            // сделать вызов, чтобы получить курс монеты
            Функция (targetcoin_price, balances_results, обратный вызов) {


               // logger.error (logSystem, 'ТЕМП', '# 1 ---- coinData.ID переменная:' + coinData.ID);

                если (coinData.ID === 'mintpal') {

                        вар optionsB = {
                   URL: 'https: //api.mintpal.com/market/stats/' + coinData.symbol + '/ BTC',
                JSON: правда
                }

                Запрос (optionsB, функция (ошибка, responseB, bodyB) {
            
                  если (ошибка! && responseB.statusCode == 200) {
                   вар coinB_price = parseFloat (bodyB [0] .last_price);
                        logger.error (logSystem, 'ТЕМП', 'переменная является coinB_price:' + coinB_price);

                    обратный вызов (NULL, targetcoin_price, coinB_price, balances_results);

                  } Еще {
                    Обратный вызов ( «Был ошибка получения mintpal курса»);
                  }
                });

                } Иначе, если (coinData.ID) {

                    Варианты вар = {
                        URL: "HTTP: //pubapi.cryptsy.com/api.php метод = singlemarketdata&marketid =»+ coinData.ID,
                        JSON: правда
                    }

                    запрос (опции, функция (ошибка, ответ, тело) {
                      если (ошибка! && response.statusCode == 200) {
                        вар coin_price = тело [ 'возвращение'] рынки [coinData.symbol] .lasttradeprice.

                        / *
                        если (coin_price.toString () IndexOf (. '-') === -1) {
                            // Хорошо это не прочерк .. нет необходимости, чтобы преобразовать его в фиксированное число
                        }
                        еще {
                            вар decimal_places = coin_price.toString () дробление ( '-') [1].
                            coin_price = coin_price.toFixed (ParseInt (decimal_places));
                        }
                        * /

                        обратный вызов (NULL, targetcoin_price, coin_price, balances_results);

                      } Еще {
                        Обратный вызов ( «Был ошибка получения mintpal курса targetcoin»);
                      }
                    });
                }
                еще {
                    обратный вызов (NULL, targetcoin_price, coinData.rate, balances_results);
                }
            },

            // Вычислить сумму targetcoin, полученную от баланса работника
            Функция (targetcoin_price, coin_price, balances_results, обратный вызов) {

                если (TypeOf balances_results! == 'объект') {
                    вар total_coins = balances_results
                    вар Bitcoins = parseFloat (total_coins) * coin_price;
                    вар баланс = (Bitcoins / targetcoin_price);

                    Обратный вызов (нуль, баланс);
                    вернуть;
                }

                Остатки вар = [];

                для (вар работника в balances_results) {
                    вар total_coins = parseFloat (balances_results [рабочий]) / 1;
                    вар Bitcoins = total_coins.toFixed () * coin_price;
                    вар баланс = (Bitcoins / targetcoin_price);
                    balances.push ({работник: работник, баланс: balance.toFixed (8)});
                }

                обратный вызов (NULL, весы);
            }

        ], функция (ERR, остатки) {

            если (баланс) {
                CBack (остатки);
                вернуть;
            }

            _this.stats.balances = остатки;
         _this.stats.payout = выплаты;
        //logger.error(logSystem, 'ТЕМП', '_this.stats прямо перед переменной ЦБ:' + JSON.stringify (_this.stats));

    CBack ();
        });

    };





    this.getGlobalStats = функция (обратный вызов) {

        вар statGatherTime = Date.now () / 1000 | 0;

        вар allCoinStats = {};

        async.each (redisClients, функция (клиент, обратный вызов) {
            вар windowTime = (((Date.now () / 1000) - portalConfig.website.stats.hashrateWindow) | 0) .ToString ();
            вар redisCommands = [];


            вар redisCommandTemplates = [
                [ 'Zremrangebyscore', ': hashrate', '-inf', '(' + windowTime],
                [ 'Zrangebyscore', ': hashrate', windowTime, '+ инф'],
                [ 'Hgetall', ': статистика'],
                [ 'SCard', ': blocksPending'],
                [ 'SCard', ': blocksConfirmed'],
                [ 'SCard', ': blocksOrphaned']
            ];

            вар commandsPerCoin = redisCommandTemplates.length;

            client.coins.map (функция (монета) {
                redisCommandTemplates.map (функция (т) {
                    вар clonedTemplates = t.slice (0);
                    clonedTemplates [1] = монета + clonedTemplates [1];
                    redisCommands.push (clonedTemplates);
                });
            });


            client.client.multi (redisCommands) .exec (функция (ERR, ответов) {
                если (ERR) {
                    logger.error (logSystem, 'Global', 'ошибка с получением глобальной статистикой' + JSON.stringify (ERR));
                    обратный вызов (ERR);
                }
                еще {
                    для (вар я = 0; я < replies.length; I + = commandsPerCoin) {
                        вар coinName = client.coins [я / commandsPerCoin | 0];
                        вар coinStats = {
                            имя: coinName,
                            символ: poolConfigs [coinName] .coin.symbol.toUpperCase (),
                            Алгоритм: poolConfigs [coinName] .coin.algorithm,
                            hashrates: ответы [I + 1],
                            poolStats: 0): 0,
                                invalidShares: ответы [я + 2]? (Ответов [я + 2] .invalidShares,
                            блоки: {
                                в ожидании: ответы [я + 3],
                                подтвердил: ответы [я + 4],
                                осиротел: ответы [я + 5]
                            }
                        };
                        allCoinStats [coinStats.name] = (coinStats);
                    }
                    Перезвони();
                }
            });
        }, Функция (ERR) {
            если (ERR) {
                logger.error (logSystem, 'Global', 'Ошибка при получении всех' Статистика + JSON.stringify (ERR));
                Перезвони();
                вернуть;
            }

            вар portalStats = {
                Время: statGatherTime,
                Глобальный:{
                    работников: 0,
                    hashrate: 0
                },
                Algos: {},
                бассейны: allCoinStats
            };

            Object.keys (allCoinStats) .forEach (функция (монета) {
                вар coinStats = allCoinStats [монета];
                coinStats.workers = {};
                coinStats.shares = 0;
                coinStats.hashrates.forEach (функциональные модули () {
                    вар части = ins.split ( ':');
                    вар workerShares = parseFloat (части [0]);
                    вар работник = детали [1];
                    если (workerShares > 0) {
                        coinStats.shares + = workerShares;
                        если (рабочий в coinStats.workers)
                            coinStats.workers [рабочий] .shares + = workerShares;
                        еще
                            coinStats.workers [рабочий] = {
                                акции: workerShares,
                                invalidshares: 0,
                                hashrateString: нулевой
                            };
                    }
                    еще {
                        если (рабочий в coinStats.workers)
                            coinStats.workers [рабочий] .invalidshares - = workerShares; // workerShares отрицательное число!
                        еще
                            coinStats.workers [рабочий] = {
                                акций: 0,
                                invalidshares: -workerShares,
                                hashrateString: нулевой
                            };
                    }
                });

                вар shareMultiplier = Math.pow (2, 32) / Algos [coinStats.algorithm] .multiplier;
                coinStats.hashrate = shareMultiplier * coinStats.shares / portalConfig.website.stats.hashrateWindow;

                coinStats.workerCount = Object.keys (coinStats.workers) .length;
                portalStats.global.workers + = coinStats.workerCount;

                / * Алгоритм конкретных глобальная статистика * /
                вар алго = coinStats.algorithm;
                если (! portalStats.algos.hasOwnProperty (алго)) {
                    portalStats.algos [алго] = {
                        работников: 0,
                        hashrate: 0,
                        hashrateString: нулевой
                    };
                }
                portalStats.algos [алго] .hashrate + = coinStats.hashrate;
                portalStats.algos [алго] .workers + = Object.keys (coinStats.workers) .length;

                для (вар работника в coinStats.workers) {
                    coinStats.workers [рабочий] .hashrateString = _this.getReadableHashRateString (shareMultiplier * coinStats.workers [рабочий] .shares / portalConfig.website.stats.hashrateWindow);
                }

                удалить coinStats.hashrates;
                удалить coinStats.shares;
                coinStats.hashrateString = _this.getReadableHashRateString (coinStats.hashrate);
            });

            Object.keys (portalStats.algos) .forEach (функция (алго) {
                вар algoStats = portalStats.algos [алго];
                algoStats.hashrateString = _this.getReadableHashRateString (algoStats.hashrate);
            });

            _this.stats = portalStats;
            _this.statsString = JSON.stringify (portalStats);



            _this.statHistory.push (portalStats);
            addStatPoolHistory (portalStats);

            вар retentionTime = (((Date.now () / 1000) - portalConfig.website.stats.historicalRetention) | 0);

            для (вар я = 0; я < _this.statHistory.length; я ++) {
                если (retentionTime < _this.statHistory [я] .time) {
                    Если я > 0) {
                        _this.statHistory = _this.statHistory.slice (я);
                        _this.statPoolHistory = _this.statPoolHistory.slice (я);
                    }
                    ломать;
                }
            }

            redisStats.multi ([
                [ 'Zadd', 'statHistory', statGatherTime, _this.statsString],
                [ 'Zremrangebyscore', 'statHistory', '-inf', '(' + retentionTime]
            ]). Exec (функция (ERR, ответы) {
                если (ERR)
                    logger.error (logSystem, 'Historics', 'Ошибка при добавлении к статистике historics' + JSON.stringify (ERR));
            });
            Перезвони();
        });

    };

    this.getReadableHashRateString = функция (hashrate) {
        вар я = -1;
        вар byteUnits = [ 'КН', 'МН', 'ГР', 'TH', 'PH'];
        делать {
            hashrate = hashrate / 1024;
                        я ++;
        } В то время как (hashrate > 1024);
        вернуть hashrate.toFixed (2) + byteUnits [I];
    };

};
[/код

Удалить фондовый website.js файл, а также, сделать новый:
[код]

вар фс = требуется ( «фс»);
вар путь = требуется ( «путь»);

вар = требует асинхронных ( «асинхр»);
вар часы = требуют ( «узла-часы»);
вар Redis = требуется ( 'Redis');

вар точка = требуется ( «точки»);
вар экспресс = требуется ( «экспресс»);
вар bodyParser = требуется ( 'тело-анализатор');
вар = компресс требуется ( «сжатия»);

вар Stratum = требуется ( 'роговой-пул');
вар Util = требуется ( 'прослойка-бассейн / Библиотека / util.js');

вар апи = требуется (»./ api.js');


module.exports = функция (регистратор) {

    dot.templateSettings.strip = ложь;

    вар portalConfig = JSON.parse (process.env.portalConfig);
    вар poolConfigs = JSON.parse (process.env.pools);

    вар websiteConfig = portalConfig.website;

    вар portalApi = новый API (регистратор, portalConfig, poolConfigs);
    вар portalStats = portalApi.stats;

    вар logSystem = 'Сайт';


вар = {файлы подкачки
        'Index.html': 'индекс',
        'Home.html': '',
        'Tbs.html': 'TBS',
        'Workers.html': 'рабочих,
        'Api.html': 'апи',
        'Admin.html': 'админ',
        'Mining_key.html': 'mining_key',
        'Miner.html': 'шахтер',
        'Miner_stats.html': 'miner_stats',
        'User_shares.html': 'user_shares',
        'Getting_started.html': 'Getting_Started'
    };

    вар pageTemplates = {};

    вар pageProcessed = {};
    вар indexesProcessed = {};

    вар keyScriptTemplate = '';
    вар keyScriptProcessed = '';


    вар processTemplates = функция () {

        для (вар Pagename в pageTemplates) {
            если (Pagename === 'индекс') продолжать;
            pageProcessed [Pagename] = pageTemplates [Pagename] ({
                poolsConfigs: poolConfigs,
                Статистика: portalStats.stats,
                portalConfig: portalConfig
            });
            indexesProcessed [Pagename] = pageTemplates.index ({
                страница: pageProcessed [Pagename],
                отмеченный: Pagename,
                Статистика: portalStats.stats,
                poolConfigs: poolConfigs,
                portalConfig: portalConfig
            });
        }

        //logger.debug(logSystem, «Статистика», «Сайт обновлен до последней статистики»);
    };



    вар readPageFiles = функция (файлы) {
        async.each (файлы, функция (Filename, обратный вызов) {
            вар Filepath = 'сайт /' + (имя_файл === 'index.html' '' '? страницы /') + имя_файл;
            fs.readFile (Filepath, 'utf8', функция (ERR, данные) {
                вар pTemp = dot.template (данные);
                pageTemplates [файлы подкачки [имя_файла]] = pTemp
                Перезвони();
            });
        }, Функция (ERR) {
            если (ERR) {
                console.log ( 'ошибка чтения файлов для создания шаблонов точечными:' + JSON.stringify (ERR));
                вернуть;
            }
            processTemplates ();
        });
    };


    // Если HTML файл был изменен перезагрузить его
    смотреть ( 'сайт', функция (имя файла) {
        вар = path.basename базовое имя (имя файла);
        если (в базовых файлах подкачка) {
            console.log (имя файла);
            readPageFiles ([базовый]);
            logger.debug (logSystem, 'Сервер', 'Reloaded файл' + базовое имя);
        }
    });

    portalStats.getGlobalStats (функция () {
        readPageFiles (Object.keys (файлы подкачки));
    });

    вар buildUpdatedWebsite = функция () {
        portalStats.getGlobalStats (функция () {
            processTemplates ();

            вар statData = 'данные:' + JSON.stringify (portalStats.stats) + '\ N \ N';
            для (вар UID в portalApi.liveStatConnections) {
                вар разреш = portalApi.liveStatConnections [UID];
                res.write (statData);
            }

        });
    };

    setInterval (buildUpdatedWebsite, websiteConfig.stats.updateInterval * 1000);


    вар buildKeyScriptPage = функция () {
        async.waterfall ([
            Функция (обратный вызов) {
                вар клиент = redis.createClient (portalConfig.redis.port, portalConfig.redis.host);
                client.hgetall ( 'coinVersionBytes', функция (ERR, coinBytes) {
                    если (ERR) {
                        client.quit ();
                        вернуть обратный вызов ( 'Ошибка захвата версии монеты байт из Redis' + JSON.stringify (ERR));
                    }
                    обратный вызов (нуль, клиент, coinBytes || {});
                });
            },
            Функция (клиент, coinBytes, обратный вызов) {
                вар enabledCoins = Object.keys (poolConfigs) .map (функция (с) {вернуть c.toLowerCase ()});
                вар missingCoins = [];
                enabledCoins.forEach (функция (с) {
                    если (! (с в coinBytes))
                        missingCoins.push (с);
                });
                Обратный вызов (нуль, клиент, coinBytes, missingCoins);
            },
            Функция (клиент, coinBytes, missingCoins, обратный вызов) {
                вар coinsForRedis = {};
                async.each (missingCoins, функция (с, CBack) {
                    вар coinInfo = (функция () {
                        для (вар PNAME в poolConfigs) {
                            если (pName.toLowerCase () === с)
                                вернуть {
                                    демон: poolConfigs [PNAME] .paymentProcessing.daemon,
                                    Адрес: poolConfigs [PNAME] .Address
                                }
                        }
                    }) ();
                    вар демон = новый Stratum.daemon.interface ([coinInfo.daemon], функция (тяжесть, сообщение) {
                        Регистратор [тяжесть] (logSystem, с, сообщение);
                    });
                    daemon.cmd ( 'dumpprivkey', [coinInfo.address], функция (результат) {
                        если (результат [0] .error) {
                            logger.error (logSystem, с, 'Может не dumpprivkey для' + C + '' + JSON.stringify (результат [0] .error));
                            CBack ();
                            вернуть;
                        }

                        вар vBytePub = util.getVersionByte (coinInfo.address) [0];
                        вар vBytePriv = util.getVersionByte (результат [0] .response) [0];

                        coinBytes [с] = vBytePub.toString () + '' + vBytePriv.toString ();
                        coinsForRedis [с] = coinBytes [с];
                        CBack ();
                    });
                }, Функция (ERR) {
                    обратный вызов (NULL, клиент, coinBytes, coinsForRedis);
                });
            },
            Функция (клиент, coinBytes, coinsForRedis, обратный вызов) {
                если (Object.keys (coinsForRedis) .length > 0) {
                    client.hmset ( 'coinVersionBytes', coinsForRedis, функция (ERR) {
                        если (ERR)
                            logger.error (logSystem, 'Init', 'Не удалось вставить монету байт версию в Redis' + JSON.stringify (ERR));
                        client.quit ();
                    });
                }
                еще {
                    client.quit ();
                }
                обратный вызов (нуль, coinBytes);
            }
        ], Функция (ERR, coinBytes) {
            если (ERR) {
                logger.error (logSystem, 'Init', ERR);
                вернуть;
            }
            пытаться{
                keyScriptTemplate = dot.template (fs.readFileSync ( 'веб-сайт / key.html', {кодирование: 'utf8'}));
                keyScriptProcessed = keyScriptTemplate ({монеты: coinBytes});
            }
            поймать (е) {
                logger.error (logSystem 'Init', 'Не удалось прочитать файл key.html');
            }
        });

    };
    buildKeyScriptPage ();

    вар GetPage = функция (PageId) {
        если (PageId в pageProcessed) {
            вар requestedPage = pageProcessed [PageId];
            вернуться requestedPage;
        }
    };




    вар minerpage = функция (REQ, разреш, следующий) {
        вар адрес = req.params.address || ноль;

        если (адрес! = NULL) {
            portalStats.getBalanceByAddress (адрес, функция () {
                processTemplates ();

                res.end (indexesProcessed [ 'miner_stats']);

            });
        }
        еще
            следующий();
    };

    вар выплаты = функция (REQ, разреш, следующий) {
        вар адрес = req.params.address || ноль;

        если (адрес! = NULL) {
            portalStats.getPayout (адрес, функция (данные) {
                res.write (data.toString ());
                Отправить();
            });
        }
        еще
            следующий();
    };


    вар акций = функция (Req, разреш рядом) {
        portalStats.getCoins (функция () {
            processTemplates ();

            res.end (indexesProcessed [ 'user_shares']);

        });
    };

    вар usershares = функция (REQ, разрешение, рядом) {

        вар монета = req.params.coin || ноль;

        если (монета! = NULL) {
            portalStats.getCoinTotals (монета, нуль, функция () {
                processTemplates ();

                res.end (indexesProcessed [ 'user_shares']);

            });
        }
        еще
            следующий();
    };


    вар маршрут = функция (Req, Рез, следующий) {
        вар PageId = req.params.page || '';
        если (PageId в indexesProcessed) {
            res.header ( 'Content-Type', 'текст / html');
            res.end (indexesProcessed [PageId]);
        }
        еще
            следующий();

    };



    вар приложение = экспресс ();


    app.use (bodyParser.json ());

    app.get ( '/ get_page', функция (REQ, разреш, следующий) {
        вар requestedPage = GetPage (req.query.id);
        если (requestedPage) {
            res.end (requestedPage);
            вернуть;
        }
        следующий();
    });

    app.get ( '/ key.html', функция (REQ, разреш, следующий) {
        res.end (keyScriptProcessed);
    });


        app.get ( '/ статистика / акции /: монета', usershares);
    app.get ( '/ статистик / акция', акция);
    app.get ( '/ забойщик /: адрес', minerpage);
    app.get ( '/ выплаты /: адрес', выплаты);



    app.get ( '/: страница', маршрут);
    app.get ( '/', маршрут);

    app.get ( '/ API /: метод', функция (REQ, разреш, следующий) {
        portalApi.handleApiRequest (REQ, разреш, следующий);
    });

    app.post ( '/ API / администратор /: метод', функция (REQ, разреш, следующий) {
        если (portalConfig.website
            && portalConfig.website.adminCenter
            && portalConfig.website.adminCenter.enabled) {
            если (portalConfig.website.adminCenter.password === req.body.password)
                portalApi.handleAdminApiRequest (REQ, разреш, следующий);
            еще
                res.send (401, JSON.stringify ({ошибка: 'Неправильный пароль'}));

        }
        еще
            следующий();

    });

    app.use (сжатие ());
    app.use ( '/ статический', express.static ( 'веб-сайт / статический'));

    app.use (функция (ERR, REQ, разреш, рядом) {
        console.error (err.stack);
        res.send (500, 'Что-то сломалось!');
    });

    пытаться {
        app.listen (portalConfig.website.port, portalConfig.website.host, функция () {
            logger.debug (logSystem, 'Сервер', 'Сайт начал' + portalConfig.website.host + ':' + portalConfig.website.port);
        });
    }
    поймать (е) {
        logger.error (logSystem, 'Сервер', 'Не удалось запустить сайт на' + portalConfig.website.host + ':' + portalConfig.website.port
            +  «- его либо в использовании, или вы не имеете прав»);
    }


};

Тогда внутри / сайта / страницы папки создать два новых файла .. Три на самом деле. Во-первых, пока в / Сайт / страница типа «сенсорный user_shares.html» просто создать файл, так NOMP не блевать сейчас.

Откройте новый файл с именем miner.html:
Код:

        

        

                <р класс ="вести">Введите ваш <ВАШ МОНЕТЫ> Бумажник адрес
                

                        <тип входного ="текст" класс ="форм-управления вводом-Л.Г.">
                        <пролет класс ="вход-группа-БТН">
                                <Кнопка класса ="БТН БТН-умолчанию БТН-Л.Г." тип ="кнопка">Идти!
                        
                
        




<Тип сценария ="текст / JavaScript">
        $ (Документ) .ready (функция () {

                $ ( 'БТН-Л.Г.'). Нажмите (функция () {
                        window.location = "шахтер /" . + $ ( 'Ввода-LG') Val ();
                });
        });

[/код]
paradigmflux сейчас офлайн Пожаловаться на paradigmflux   Ответить с цитированием Мультицитирование сообщения от paradigmflux Быстрый ответ на сообщение paradigmflux

19 июля 2014, 3:18:03 PM   # 3
 
 
Сообщения: 378
Цитировать по имени
цитировать ответ
по умолчанию Re: Как создать свой собственный Multipool - на Open Source Way

А также miner_stat.html

Код:
               

                                               

{{? it.stats.balances}}

                               

                               

                                                       

                           

<сильный><продолжительность ID ="адрес">{{= It.stats.address}}<пролет>
                           

                                <р класс ="вести">До сих пор этот сдвиг вы заработали: <сильный><пролет класс ="выплата"> <<ВСТАВИТЬ UR TARGET СИМВОЛ ЗДЕСЬ> (оценить).

                                <р класс ="вести">Ваш предыдущий баланс с бассейном в настоящее время: <сильный><пролет класс ="задолженность">  <ВСТАВИТЬ UR TARGET СИМВОЛ ЗДЕСЬ>                            
                       
               
                               
                       




                                               
                               
                       
&NBSP;
                        <центр>
                       

                               

                               


<ДИВ>

   
       


       
       


                   

                           


                       

                                                              {{Для (вар баланс в it.stats.balances) {}}
                                                                               

                                                                                 
<центр><пролет класс ="текст-хз"> {{= It.stats.balances [баланс] .coin}}
                                                                               
<пролет класс ="текст-BG"><сильный>{{= It.stats.balances [баланс] .balance}} &NBSP
                                                                               
                                              {{}}}
                                                                               
                       


               



       
       

                {{= JSON.stringify (it.stats)}}
       


{{?}}

<Тип сценария ="текст / JavaScript">

$ (Документ) .ready (функция () {

        вар адр = $ ( '# адрес') текст ().

        $ .get ( 'HTTP: // ururl: 7379 / hget / Pool_Stats: CurrentShift: WorkerTgtCoin /' + адр + '.txt', функция (payoutdata) {
                $ ( 'Выплата') текст (payoutdata).
        });



/ *
        $ .each ($ ( 'blockAmount'), функция (я, v) {
                если ($ (v) .html () === "не определено") {
                        $ (V) .html ( '---');
                }
        });

        $ .each ($ (». BlockShares'), функция (я, v) {
                если ($ (v) .html () === "не определено") {
                        $ (V) .html ( '---');
                }
        });
        * /
});


$ (Функция () {
                   вар адр = $ ( '# адрес') текст ().

                $ .get ("Http: // ururl: 7379 / ZSCORE / Pool_Stats: Весы /" + Адр, функция (payoutdata) {
                                                $ ( 'Задолжал.) Присоединять (payoutdata.ZSCORE).
                                });
                });




следующая установка Webdis здесь https://github.com/nicolasff/webdis
и запустить его с .json конфигурационный файл, как это:
Код:
корень @ blackcoinpool: / FORFREEDOM / # кошка ~ / webdis-дома / webdis.json
{
        "redis_host":   "127.0.0.1",

        "redis_port": 6379,
        "redis_auth": ноль,

        "HTTP_HOST":    "0.0.0.0",
        "http_port": 7379,

        "потоки": 5,
        "pool_size": 20,

        "демон": правда,
        "WebSockets": правда,
        "default_root": "/GET/index.html",
        "база данных": 0,

        "ACL": [
                {
                        "отключен": ["*"]
                },

                {
                        "включен": ["ПОЛУЧИТЬ", "HGET", "ZRANGE", "ZCARD", "ZRANGEBYSCORE", "ZVAL", "LRANGE", "HGETALL", "HKEYS", "HVALS", "ПОЛУЧИТЬ ВСЕ", "HGETALL", "ZRANGE", "SMEMBERS", "ZSCORE"]
                }
        ],

        "многословие": 6,
        "журнальный файл": "/root/webdis-home/webdis.log"
}

Далее, вы должны быть в состоянии перезагрузить nomp установки и перейдите к / Шахтер и введите ваш адрес работника и увидеть все монеты, которые работник добытого, что сдвиг. баланс и сумма задолженности будет пустым до. Вы можете вручную browe для / Выплаты /<работник> чтобы увидеть, по оценкам следующей выплаты.

Далее, давайте сделаем глубокое погружение в Redis и как NOMP использует его (а также повторно записать весь процессор оплаты)

paradigmflux сейчас офлайн Пожаловаться на paradigmflux   Ответить с цитированием Мультицитирование сообщения от paradigmflux Быстрый ответ на сообщение paradigmflux

19 июля 2014, 3:18:13 PM   # 4
 
 
Сообщения: 588
Цитировать по имени
цитировать ответ
по умолчанию Re: Как создать свой собственный Multipool - на Open Source Way

замечательно! Ждем Вашего руководства.
albertdros сейчас офлайн Пожаловаться на albertdros   Ответить с цитированием Мультицитирование сообщения от albertdros Быстрый ответ на сообщение albertdros

19 июля 2014, 3:18:17 PM   # 5
 
 
Сообщения: 378
Цитировать по имени
цитировать ответ
по умолчанию Re: Как создать свой собственный Multipool - на Open Source Way

Как NOMP использует REDIS, и как мы можем использовать его, чтобы получить то, что мы хотим (и улучшить)
Все монеты дают ключ REDIS по имени <монета> - это распадается на подразделы,: blocksCompleted, blocksPending, blocksOrphaned, blocksKicked
Она также имеет: ключ противовесов, которая отслеживает каждый работников в настоящее время прибыль на одну клавишу, а: выплаты (который отслеживает количество монет, выплачиваемых каждому пользователю).

Если мы устанавливаем конфигу монеты права, мы никогда не будем видеть: ключ выплаты в нашей установке.
Мы также намерены создать новый подраздел: blocksPaid, что мы будем двигаться каждый заплатил за тур в, каждый раз, когда мы бежим выплаты.

Теперь только статистика, которая держит NOMP жестоки.

Мы намерены реализовать новый уровень входа в Redis.

Мастер-ключ, Pool_Stats содержит все.
У нас также есть Кью названные Coin_Names, который содержит (в нижнем регистре) список каждой монеты мы поддерживаем.
У нас есть Coin_Algos, что перечислены все Algo мы поддерживаем (в нижнем регистре)
Мы имеем Coin_Names_<алго> в котором перечислены все монеты этого алгоритмом. Они все хранятся в виде хешей, кстати, со значениями 1 (хотя величина не имеет значения, все они доступны через Redis-команды HVALS)

то есть:
Coin_Names состоит из двух хэшей:
feathercoin 1
terracoin 1

Coin_Algos состоит из двух хэшей:
Scrypt 1
sha256 1

Coin_Names_scrypt состоит из 1-хэша
feathercoin 1
Coin_Name_sha256 состоит из 1 хеш:
terracoin 1

Установите эти вверх, как это:
 корень @ blackcoinpool: /: Redis-кли Coin_Names feathercoin H Установите 1
 корень @ blackcoinpool: /: Redis-кли Coin_Algos Scrypt H Установите 1
 корень @ blackcoinpool: /: Redis-кли Coin_Names_scrypt feathercoin H Установите 1
и так далее для всех ваших монет / Algos ....

Мы будем следить за каждые пользователь исторической hashrate в ключе с именем Pool_Stats: WorkerHRS::<работник> как часть REDIS SORTED SET. Формат отсортированного набора будет использовать время эпохи, как оценку и значение будет установлено значением: <Пользователи тока hashrate>:<время эпохи> - время эпохи requierd, чтобы Redis для хранения дубликатов hashrates (как это делает их уникальными).
Pool_Stats будет иметь раздельные подразделы для каждой смены, но все, что будет получать автоматически создается через следующую серию сценариев я обеспечу.

Мы будем держать CurrentShift datat в Pool_Stats: CurrentShift и текущая рентабельность сдвига данных в Pool_Stats: CurrentShift: Рентабельность
Внутри CurrentShift мы будем иметь:

Pool_Stats: CurrentShift: AlgosBTC - хэш поле списка каждого Algos общей стоимости, в BTC, каждый Algo добывал до сих пор этот сдвиг.
Pool_Stats: CurrentShift: AlgosTgtCoin - хэш поле списка каждого Algos общей стоимости, в целевой монете, каждый из Algo добывал до сих пор этот этот сдвиг.
Pool_Stats: CurrentShift: CoinsBTC - хэш поле списка каждый монет общей BTC, которые были заработаны до сих пор этот сдвиг.
Pool_Stats: CurrentShift: CoinsTgtCoin - хэш поле списка каждый монеты всего целевые монет, которые были заработаны до сих пор этого сдвига.
Pool_Stats: CurrentShift: WorkersBTC - хэш-поле со списком всех сотрудников общей BTC они заработали до сих пор этот сдвиг
Pool_Stats: CurrentShift: WorkersTgtCoin - хэш-поле со списком всех работников общей целевой монеты они заработали до сих пор этот сдвиг.

Мы будем следить за историческую статистику в:
Pool_Stats: Profitability_<алго> - набор profitabilities, используя номер сдвига в поле и рентабельности значение.
Pool_Stats: WorkerHRs:<алго>:<работник> - отсортировано набор список hashrates, на одного работника, в алгоритме. Epoch время, как поле, значение hashrate: epochtime для обеспечения уникальности.
Pool_Stats: Остатки - остатки в целевой монете
Pool_Stats: DetailedPayouts:<работник> - отсортировано набор список выплат, используя время эпохи, как поля и значение, как TXN идентификаторов в целевой монете.
Pool_Stats: DetailedPayouts:<работник>: - Хеш ключ с именем Date: со значением, как время эпохи, хэш-ключ как сумма: и ценность в качестве суммы TxN, хэш-ключа в качестве URL и значения, установленного на полный URL для TXN в блоке проводнике целевой монеты.
Pool_Stats: TotalPaid - хэш-ключ перечисляя каждый работник ID в качестве имени ключа и общего количества целевых монет они были выплачены в общей сложности в качестве значения.

.

Эти значения все автоматически вычисляется процессор платежа, который грядет в нескольких постах - причина для дублированного хранения (как в BTC и TgtCoin это обеспечивает уровень вменяемости проверки для обработки платежей, прежде чем он решит выплатить сдвиг автоматически или нет).


Pool_Stats: CurrentShift всегда будет иметь StartTime набор ко времени эпохи, что сдвиг начался в.
Мы будем иметь инкрементора имени This_Shift в Pool_Stats (хэш-значение), который будет увеличиваться на один whenver сдвиг заканчивается.  
Всякий раз, когда конечный сдвиг, мы переименуем все Pool_Stats: ключи CurrentShift быть Pool_Stats:<Значение переменной ThisShift> вместо этого, а затем начать свежий Pool_Stats: CurrentShift набор ключей.


Давайте начнем с вычисления и хранения пользователей hashrates в Redis дб.

paradigmflux сейчас офлайн Пожаловаться на paradigmflux   Ответить с цитированием Мультицитирование сообщения от paradigmflux Быстрый ответ на сообщение paradigmflux

19 июля 2014, 3:19:04 PM   # 6
 
 
Сообщения: 378
Цитировать по имени
цитировать ответ
по умолчанию Re: Как создать свой собственный Multipool - на Open Source Way

лол ты парень в Dinks для stealting первых сообщений
paradigmflux сейчас офлайн Пожаловаться на paradigmflux   Ответить с цитированием Мультицитирование сообщения от paradigmflux Быстрый ответ на сообщение paradigmflux

19 июля 2014, 3:35:59 PM   # 7
 
 
Сообщения: 322
Цитировать по имени
цитировать ответ
по умолчанию Re: Как создать свой собственный Multipool - на Open Source Way

Да, я заблудился в

котировка
Шаг 1 - начать с базовой NOMP установки. мерзавец клон из NOMP репо: https://github.com/zone117x/node-open-mining-portal.git

ха-ха
cryptoangel сейчас офлайн Пожаловаться на cryptoangel   Ответить с цитированием Мультицитирование сообщения от cryptoangel Быстрый ответ на сообщение cryptoangel

19 июля 2014, 3:50:17 PM   # 8
 
 
Сообщения: 1386
Цитировать по имени
цитировать ответ
по умолчанию Re: Как создать свой собственный Multipool - на Open Source Way

лол ты парень в Dinks для stealting первых сообщений

Там есть кнопка Edit по причине.
bathrobehero сейчас офлайн Пожаловаться на bathrobehero   Ответить с цитированием Мультицитирование сообщения от bathrobehero Быстрый ответ на сообщение bathrobehero

19 июля 2014, 4:07:26 PM   # 9
 
 
Сообщения: 6
Цитировать по имени
цитировать ответ
по умолчанию Re: Как создать свой собственный Multipool - на Open Source Way

Это, вероятно, Noob вопросы, но здесь идет в любом случае.

Сколько машина будет для этого потребуется (RAM, запоминающее устройство)?

Каков минимальный hashrate вы рекомендовали бы для перед установкой собственного Multipool?
MV120 сейчас офлайн Пожаловаться на MV120   Ответить с цитированием Мультицитирование сообщения от MV120 Быстрый ответ на сообщение MV120

19 июля 2014, 4:12:23 PM   # 10
 
 
Сообщения: 378
Цитировать по имени
цитировать ответ
по умолчанию Re: Как создать свой собственный Multipool - на Open Source Way

Это, вероятно, Noob вопросы, но здесь идет в любом случае.

Сколько машина будет для этого потребуется (RAM, запоминающее устройство)?

Каков минимальный hashrate вы рекомендовали бы для перед установкой собственного Multipool?
SSD поддержка важна, но вы можете запустить MP легко на машине с 4 Гб оперативной памяти и 40 Гб дискового пространства.
paradigmflux сейчас офлайн Пожаловаться на paradigmflux   Ответить с цитированием Мультицитирование сообщения от paradigmflux Быстрый ответ на сообщение paradigmflux

19 июля 2014, 4:34:23 PM   # 11
 
 
Сообщения: 378
Цитировать по имени
цитировать ответ
по умолчанию Re: Как создать свой собственный Multipool - на Open Source Way

Настройка cronjob для запуска каждые 10 минут.
Имейте это запустить файл Баш, и это файл Баш:
Код:
#! / Bin / Баш
workercounter = 0
arraycounter = 0
Теперь ="`Дата +% s`"
TenMins = $ ((сейчас - 600))
Интервал = 600
Модификатор = 65536
SHAmodifier = 4294967296
Redis-кли-дель-tmpkey

в то время как прочитать Algo
делать
        TotalWorkers = 0
        WorkerTotals = 0
        эта переменная не установлена ​​arrWorkerTotals
        эта переменная не установлена ​​arrWorkerCounts
        эта переменная не установлена ​​arrWorkerNames
        верстать -A arrWorkerTotals
        верстать -A arrWorkerCounts
        верстать -A arrWorkerNames
        AlgoCounter = 0
        workercounter = 0
        Redis-кли-дель-tmpkey
        в то время как прочитать CoinType
        делать
                эхо "$ CoinType"

                Счетчик = 0
                CoinKeyName = $ CoinType": hashrate"
                totalhashes = `Redis-кли zcard $ CoinKeyName`
        если [-z "$ totalhashes" ]
        тогда
                эхо "нет хэши" >/ DEV / нуль
        еще
                в то время как прочитать LINEITEM
                делать
# эхо "$ LineItem"
        счетчик = $ (($ счетчика + 1))
                        AlgoCounter = $ (($ AlgoCounter + 1))
                        IN = $ LineItem
            arrIN = ($ {// В: /})
            preworker = ($ {arrIN [1]})
            #strip HTML теги, чтобы обеспечить безопасный показ позже
            workername = `эхо "$ Preworker," | TR -d '<>, ' `
                        эхо "$ workername"
                        если [[$ workername == "" ]]
                        тогда
                                эхо "игнорировать работника"
                        еще
                               доля = ($ {arrIN [0]})
                                arrWorkerCounts [$ workername] = $ (($ {arrWorkerCounts [$ workername]} + 1))
если [[$ {arrWorkerCounts [$ workername]} -eq 1]]
                                  тогда
                                #must были это работники первой акции, так Тхи S новый рабочий
                                TotalWorkers = $ (($ TotalWorkers + 1))
                workercounter = $ (($ workercounter + 1))
                        arrWorkerNames [$ workercounter] = $ workername
                                эхо "TotalWorkers - $ TotalWorkers ~~~ workercounter - $ workercounter ~~~ arrWorkerNames -" $ {arrWorkerNames [$ workercounter]}
                                  еще
                                        # Эти был дубликат работника, ничего не делать
                                        эхо " " >/ DEV / нуль
                                фи
                        если [-z "$ {arrWorkerTotals [$ workername]}" ]
                        тогда
                                tempvar = 0
                        еще
                                tempvar = $ {arrWorkerTotals [$ workername]}
                        фи


                         arrWorkerTotals [$ workername] = `эхо "масштаб = 6; $ tempvar + $ доля" | Ьс -l`

                        эхо "$ {arrWorkerNames [$ workercounter]}"



            фи
                        сделанный< <(Redis-кли zrangebyscore $ CoinKeyName $ TenMins $ сейчас)

                        TotalHash = `эхо "$ TotalHash + $ доля" | Ьс -l`
фи
                сделанный< <(Redis-кли hkeys Coin_Names_ $ Algo)


                  # Разбить его - ша хранится в GH, все остальное хранится MH
                                если [$ Algo = "sha256" ]
                                тогда
                                        Модификатор = 4294967296
                                        делитель = 1073741824
                                Элиф [$ Algo = "keccak" ]
                                тогда
                                        Модификатор = 16777216
                                        делитель = 1048576
                                Элиф [$ Algo = "x11" ]
                                тогда
                                        Модификатор = 4294967296
                                        делитель = 1048576
                                еще
                                        Модификатор = 65536
                                        делитель = 1048576
                                фи

                                TotalHR = `эхо "Шкала = 3; $ TotalHash * $ Модификатор / $ интервал / $ делителем" | bc`
                Redis-Zadd Pool_Stats консоли: avgHR: $ Algo $ теперь $ TotalHR":"$ в настоящее время
                #go над массивом WorkerNames и рассчитать каждый работников HR
                                counterB = 0
                в то время как [[$ counterB -lt $ workercounter]]
                делать
                        counterB = $ (($ counterB + 1))
                        workerName = $ {arrWorkerNames [$ counterB]}
                        Эхо $ workerName
                        Временный = `эхо "масштаб = 6; $ {arrWorkerTotals [$ workerName]} * $ Модификатор" | Ьс -l`
                                        # Число = `эхо "$ Интервала / $ делителя" | Ьс -l`
                          arrWorkerHashRates [$ counterB] = `эхо "$ Временный / $ интервал / $ делитель" | Ьс -l`
                                                workerName = $ {arrWorkerNames [$ counterB]}
                                                скорость = $ {arrWorkerHashRates [$ counterB]}
                                                Эхо $ workerName $ ставка
                                                строка = $ ставка":"$ в настоящее время
                                                Redis-Zadd Pool_Stats консоли: WorkerHRs: $ Algo: $ workerName $ теперь $ строка
                                                эхо "$ Algo - $ workerName -"$ arrWorkerHashRates [$ counterB]}
                сделанный


сделанный< <(Redis-кли hkeys Coin_Algos)

Идите вперед и запустить его несколько раз в командной строке и посмотреть, как это работает - это немного спам, но обратите внимание, как ключи Redis в настоящее время заполнены всей информацией пользователей hashrate сейчас? Линия в верхней может быть adjuted от 600 до более низкого числа, если вы предпочли бы пользователи не должны ждать 10 минут, чтобы увидеть точную скорость хеширования. Убедитесь, что у вас есть Coin_Algos и Coin_Names_<алго> Redis значения, заполненное надлежащим образом для этой работы.
paradigmflux сейчас офлайн Пожаловаться на paradigmflux   Ответить с цитированием Мультицитирование сообщения от paradigmflux Быстрый ответ на сообщение paradigmflux

19 июля 2014, 4:44:11 PM   # 12
 
 
Сообщения: 378
Цитировать по имени
цитировать ответ
по умолчанию Re: Как создать свой собственный Multipool - на Open Source Way

Теперь давайте настроим cronjob и начать захват локальной копии всех курсов обмена монет.
Это simplfied версия, у меня есть лучший вариант, объединяющие цены от нескольких обменов, но все мы должны держать некоторые секреты, не так ли? Я никогда не говорил, что я отдам, как сделать наиболее выгодный бассейн, но я говорил я хотел бы показать вам, как настроить multipool.

Код:
#! / Bin / Баш
BC2BTC = `локон -G 'https://api.mintpal.com/v1/market/stats/BC/BTC/' | JQ -r. []. last_price`
FTC2BTC = `локон -G«http://pubapi.cryptsy.com/api.php?method=singlemarketdata&marketid = 5' | JQ -r .return.markets.FTC.lasttradeprice`
MZC2BTC = `локон -G«http://pubapi.cryptsy.com/api.php?method=singlemarketdata&marketid = 164' | JQ -r .return.markets.MZC.lasttradeprice`
NET2BTC = `локон -G«http://pubapi.cryptsy.com/api.php?method=singlemarketdata&marketid = 134' | JQ -r .return.markets.NET.lasttradeprice`
DRK2BTC = `локон -G«http://pubapi.cryptsy.com/api.php?method=singlemarketdata&marketid = 155' | JQ -r .return.markets.DRK.lasttradeprice`
WDC2BTC = `локон -G«http://pubapi.cryptsy.com/api.php?method=singlemarketdata&marketid = 14' | JQ -r .return.markets.WDC.lasttradeprice`
STR2BTC = `локон -G«http://pubapi.cryptsy.com/api.php?method=singlemarketdata&marketid = 83' | JQ -r .return.markets.STR.lasttradeprice`
KDC2BTC = `локон -G«http://pubapi.cryptsy.com/api.php?method=singlemarketdata&marketid = 178' | JQ -r .return.markets.KDC.lasttradeprice`
NYAN2BTC = `локон -G«http://pubapi.cryptsy.com/api.php?method=singlemarketdata&marketid = 184' | JQ -r .return.markets.NYAN.lasttradeprice`
MNC2BTC = `локон -G«http://pubapi.cryptsy.com/api.php?method=singlemarketdata&marketid = 7' | JQ -r .return.markets.MNC.lasttradeprice`
POT2BTC = `локон -G«http://pubapi.cryptsy.com/api.php?method=singlemarketdata&marketid = 173' | JQ -r .return.markets.POT.lasttradeprice`
GDC2BTC = `локон -G«http://pubapi.cryptsy.com/api.php?method=singlemarketdata&marketid = 82' | JQ -r .return.markets.GDC.lasttradeprice`
GLC2BTC = `локон -G«http://pubapi.cryptsy.com/api.php?method=singlemarketdata&marketid = 76' | JQ -r .return.markets.GLC.lasttradeprice`
BTE2BTC = `локон -G«http://pubapi.cryptsy.com/api.php?method=singlemarketdata&marketid = 49' | JQ -r .return.markets.BTE.lasttradeprice`
UNO2BTC = `локон -G«http://pubapi.cryptsy.com/api.php?method=singlemarketdata&marketid = 133' | JQ -r .return.markets.UNO.lasttradeprice`
USDE2BTC = `локон -G 'https://poloniex.com/public?command=returnTicker' | JQ -r .BTC_USDE.last`
HIRO2BTC = `локон -G 'https://poloniex.com/public?command=returnTicker' | JQ -r .BTC_HIRO.last`
GDN2BTC = `локон -G 'https://poloniex.com/public?command=returnTicker' | JQ -r .BTC_GDN.last`
cinni2btc = `локон -G 'https://poloniex.com/public?command=returnTicker' | JQ -r .BTC_CINNI.last`
NOBL2BTC = `локон -G 'https://poloniex.com/public?command=returnTicker' | JQ -r .BTC_NOBL.last`
REDD2BTC = `локон -G 'https://poloniex.com/public?command=returnTicker' | JQ -r .BTC_REDD.last`
LGC2BTC = `локон -G 'https://poloniex.com/public?command=returnTicker' | JQ -r .BTC_LGC.last`
EAC2BTC = `локон -G«http://pubapi.cryptsy.com/api.php?method=singlemarketdata&marketid = 139' | JQ -r .return.markets.EAC.lasttradeprice`
CAP2BTC = `локон -G«http://pubapi.cryptsy.com/api.php?method=singlemarketdata&marketid = 53' | JQ -r .return.markets.CAP.lasttradeprice`
RBY2BTC = `локон -G 'https://bittrex.com/api/v1/public/getticker?market=BTC-RBY' | JQ -r .result.Last`
tips2ltc = `локон -G«http://pubapi.cryptsy.com/api.php?method=singlemarketdata&marketid = 147' | JQ -r .return.markets.TIPS.lasttradeprice`
ltc2btc = `локон -G«http://pubapi.cryptsy.com/api.php?method=singlemarketdata&marketid = 3' | JQ -r .return.markets.LTC.lasttradeprice`
nxt2btc = `локон -G«http://pubapi.cryptsy.com/api.php?method=singlemarketdata&marketid = 159' | JQ -r .return.markets.NXT.lasttradeprice`
tips2btc = `эхо "$ Tips2ltc * $ ltc2btc" | Ьс -l`
TRC2BTC = `локон -G«http://pubapi.cryptsy.com/api.php?method=singlemarketdata&marketid = 27' | JQ -r .return.markets.TRC.lasttradeprice`
LOT2BTC = `локон -G«http://pubapi.cryptsy.com/api.php?method=singlemarketdata&marketid = 137' | JQ -r .return.markets.LOT.lasttradeprice`
GLD2BTC = `локон -G«http://pubapi.cryptsy.com/api.php?method=singlemarketdata&marketid = 30' | JQ -r .return.markets.GLD.lasttradeprice`
MEC2BTC = `локон -G«http://pubapi.cryptsy.com/api.php?method=singlemarketdata&marketid = 45' | JQ -r .return.markets.MEC.lasttradeprice`
MYR2BTC = `локон -G«http://pubapi.cryptsy.com/api.php?method=singlemarketdata&marketid = 200' | JQ -r .return.markets.MYR.lasttradeprice`
MEOW2BTC = `локон -G«http://pubapi.cryptsy.com/api.php?method=singlemarketdata&marketid = 149' | JQ -r .return.markets.MEOW.lasttradeprice`
EXE2BTC = `локон -G«http://pubapi.cryptsy.com/api.php?method=singlemarketdata&marketid = 183' | JQ -r .return.markets.EXE.lasttradeprice`
VTC2BTC = `локон -G«http://pubapi.cryptsy.com/api.php?method=singlemarketdata&marketid = 151' | JQ -r .return.markets.VTC.lasttradeprice`
SAT2BTC = `локон -G«http://pubapi.cryptsy.com/api.php?method=singlemarketdata&marketid = 168' | JQ -r .return.markets.SAT.lasttradeprice`
NXT2BTC = `локон -G«http://pubapi.cryptsy.com/api.php?method=singlemarketdata&marketid = 159' | JQ -r .return.markets.NXT.lasttradeprice`
MAX2BTC = `локон -G«http://pubapi.cryptsy.com/api.php?method=singlemarketdata&marketid = 152' | JQ -r .return.markets.MAX.lasttradeprice`
THREE2BTC = `локон -G 'https://api.mintpal.com/v1/market/stats/365/BTC/' | JQ -r. []. last_price`
ZET2BTC = `локон -G«http://pubapi.cryptsy.com/api.php?method=singlemarketdata&marketid = 85' | JQ -r .return.markets.ZET.lasttradeprice`
XC2BTC = `локон -G«http://pubapi.cryptsy.com/api.php?method=singlemarketdata&marketid = 210' | JQ -r .return.markets.XC.lasttradeprice`

Redis-кли Exchange_Rates blackcoin H Установите $ BC2BTC
Redis-кли Exchange_Rates globaldenomination H Установите $ GDN2BTC
Redis-кли Exchange_Rates zetacoin H Установите $ ZET2BTC
Redis-кли Exchange_Rates logicoin H Установите $ LGC2BTC
Redis-кли Exchange_Rates cinnicoin H Установите $ cinni2btc
Redis-кли Exchange_Rates 365coin H Установите $ THREE2BTC
Redis-кли Exchange_Rates NXT H Установите $ NXT2BTC
Redis-кли Exchange_Rates execoin H Установите $ EXE2BTC
Redis-кли Exchange_Rates vertcoin H Установите $ VTC2BTC
Redis-кли Exchange_Rates kittehcoin H Установите $ MEOW2BTC
Redis-кли Exchange_Rates megacoin H Установите $ MEC2BTC
Redis-кли Exchange_Rates netcoin H Установите $ NET2BTC
Redis-кли Exchange_Rates globalcoin H Установите $ GLC2BTC
Redis-кли Exchange_Rates grandcoin H Установите $ GDC2BTC
Redis-кли Exchange_Rates goldcoin H Установите $ GLD2BTC
Redis-кли Exchange_Rates fedoracoin H Установите $ tips2btc
Redis-кли Exchange_Rates litecoin H Установите $ ltc2btc
Redis-кли Exchange_Rates NXT H Установите $ NXT2BTC
Redis-кли Exchange_Rates terracoin H Установите $ TRC2BTC
Redis-кли Exchange_Rates feathercoin H Установите $ FTC2BTC
Redis-кли Exchange_Rates reddcoin H Установите $ REDD2BTC
Redis-кли Exchange_Rates earthcoin H Установите $ EAC2BTC
Redis-кли Exchange_Rates bottlecaps H Установите $ CAP2BTC
Redis-кли Exchange_Rates rubycoin H Установите $ RBY2BTC
Redis-кли Exchange_Rates terracoin H Установите $ TRC2BTC
Redis-кли Exchange_Rates noblecoin H Установите $ NOBL2BTC
Redis-кли Exchange_Rates mincoin H Установите $ MNC2BTC
Redis-кли Exchange_Rates klondikecoin H Установите $ KDC2BTC
Redis-кли Exchange_Rates darkcoin H Установите $ DRK2BTC
Redis-кли Exchange_Rates mazacoin H Установите $ MZC2BTC
Redis-кли Exchange_Rates Unobtanium H Установите $ UNO2BTC
Redis-кли Exchange_Rates hirocoin H Установите $ HIRO2BTC
Redis-кли Exchange_Rates cinnicoin H Установите $ cinni2btc
Redis-кли Exchange_Rates USDE H Установите $ USDE2BTC
Redis-кли Exchange_Rates lottocoin H Установите $ LOT2BTC
Redis-кли Exchange_Rates nyancoin H Установите $ NYAN2BTC
Redis-кли Exchange_Rates worldcoin H Установите $ WDC2BTC
Redis-кли Exchange_Rates potcoin H Установите $ POT2BTC
Redis-кли Exchange_Rates myriadcoin H Установите $ MYR2BTC
Redis-консоли Exchange_Rates несметное H Установите-Scrypt $ MYR2BTC
Redis-кли Exchange_Rates myriadsha H Установите $ MYR2BTC
Redis-кли Exchange_Rates saturncoin H Установите $ SAT2BTC
Redis-кли Exchange_Rates maxcoin H Установите $ MAX2BTC
Redis-кли Exchange_Rates rubycoin H Установите $ RBY2BTC
Redis-кли Exchange_Rates xccoin H Установите $ XC2BTC

Получить эту cronjob для запуска каждые 5 минут, это будет следить за наиболее текущих биржевых цен. (Последний шаг будет синхронизировать все cronjobs в единый сценарий, но мы вернемся к этому еще в нескольких постах. Далее будет переписывание процессор оплаты, чтобы правильно обрабатывать начало и конец «сдвиги», а также чтобы справиться с монеткой двигающейся на биржу.

paradigmflux сейчас офлайн Пожаловаться на paradigmflux   Ответить с цитированием Мультицитирование сообщения от paradigmflux Быстрый ответ на сообщение paradigmflux

19 июля 2014, 4:55:32 PM   # 13
 
 
Сообщения: 378
Цитировать по имени
цитировать ответ
по умолчанию Re: Как создать свой собственный Multipool - на Open Source Way

Дайте мне знать, если кто-то даже читать это далеко.
paradigmflux сейчас офлайн Пожаловаться на paradigmflux   Ответить с цитированием Мультицитирование сообщения от paradigmflux Быстрый ответ на сообщение paradigmflux

19 июля 2014, 5:17:43 PM   # 14
 
 
Сообщения: 378
Цитировать по имени
цитировать ответ
по умолчанию Re: Как создать свой собственный Multipool - на Open Source Way

Нау, не стесняйтесь отправлять - Я не собираюсь тратить свое время положить все это, если никто не заинтересован.
Я буду ссылки на .zip со всеми файлами, я имею в виду, как хорошо, как только я получаю все это написано.
paradigmflux сейчас офлайн Пожаловаться на paradigmflux   Ответить с цитированием Мультицитирование сообщения от paradigmflux Быстрый ответ на сообщение paradigmflux

19 июля 2014, 5:19:52 PM   # 15
 
 
Сообщения: 504
Цитировать по имени
цитировать ответ
по умолчанию Re: Как создать свой собственный Multipool - на Open Source Way

Im, вероятно, будет установлен один фоновым для моих шахтеров. Спасибо за ваши усилия!
На данный момент им переключение вручную на моем NOMP бассейне фонового.
Kergekoin сейчас офлайн Пожаловаться на Kergekoin   Ответить с цитированием Мультицитирование сообщения от Kergekoin Быстрый ответ на сообщение Kergekoin

19 июля 2014, 5:23:08 PM   # 16
 
 
Сообщения: 378
Цитировать по имени
цитировать ответ
по умолчанию Re: Как создать свой собственный Multipool - на Open Source Way

ЕЩЕ ВПЕРЕДИ:

--> пользовательский процессор оплаты
---> передний конец Javascript отчетность
---> Обмен интеграции
---> Cryptonote интеграция
--> Sanity Проверка
--> Планы на будущее
paradigmflux сейчас офлайн Пожаловаться на paradigmflux   Ответить с цитированием Мультицитирование сообщения от paradigmflux Быстрый ответ на сообщение paradigmflux

19 июля 2014, 5:54:00 PM   # 17
 
 
Сообщения: 1526
Цитировать по имени
цитировать ответ
по умолчанию Re: Как создать свой собственный Multipool - на Open Source Way

Нау, не стесняйтесь отправлять - Я не собираюсь тратить свое время положить все это, если никто не заинтересован.
Я буду ссылки на .zip со всеми файлами, я имею в виду, как хорошо, как только я получаю все это написано.


Нет, сэр, пожалуйста, поделитесь! Я был очень любопытным, как работа депутата, и это руководство до сих пор было здорово!
billotronic сейчас офлайн Пожаловаться на billotronic   Ответить с цитированием Мультицитирование сообщения от billotronic Быстрый ответ на сообщение billotronic

19 июля 2014, 7:28:12 PM   # 18
 
 
Сообщения: 378
Цитировать по имени
цитировать ответ
по умолчанию Re: Как создать свой собственный Multipool - на Open Source Way

Кстати, я приглашаю кого-intereted проверить http://www.btcdpool.com  Отправить некоторый хэш это способ и посмотреть, как это работает, и если вам нравится чувствовать его.
Я буду размещать все этот источник времени, эта нить вдохновлялась.
paradigmflux сейчас офлайн Пожаловаться на paradigmflux   Ответить с цитированием Мультицитирование сообщения от paradigmflux Быстрый ответ на сообщение paradigmflux

19 июля 2014, 7:39:30 PM   # 19
 
 
Сообщения: 378
Цитировать по имени
цитировать ответ
по умолчанию Re: Как создать свой собственный Multipool - на Open Source Way

Расчет рентабельности

Расчет рентабельности можно сделать довольно легко, как это! Это также вычисляет текущие доходы каждого работника за раунд, а также обновляет каждый из соответствующих клавиш под Pool_Stats: ключ CurrentShift для зарабатывающих сумм монет / Algo.
Установить через cronjob, проходит всего за несколько секунд на бассейн, даже если он получает Mutli ГР Scrypt / x11 трафика. Вы можете запустить его вручную, чтобы проверить выход (это немного спам, но он печатает, что он делает на экране, как вы это делаете. Если запустить через cronjob это будет все просто пойти в нуль.

Код:
#! / Bin / Баш
объявить -A ProArr
объявить -A NameArr
AlgoCounter = 0
Теперь ="`Дата +% s`"
ShiftNumber = `Redis-кли hget Pool_Stats This_Shift`
эхо "Контрольная работа"
startstring ="Pool_Stats:"$ ShiftNumber
STARTTIME = `Redis-кли hget $ startstring starttime`
= $ EndTime прямо сейчас
длина = $ (($ EndTime - $ время_запуска))
Redis-кли Pool_Stats CurLength H Установите $ длина
dayslength = `эхо "Шкала = 3; $ длина / 86400" | Ьс -l`
TgtCoinPrice = `Redis-кли hget Exchange_Rates `
TotalEarned = 0
TotalEarnedTgtCoin = 0
Redis-кли Pool_Stats CurDaysLength H Установите $ dayslength
Redis-дель-Pool_Stats консоли: CurrentShift: WorkerBTC
Redis-дель-Pool_Stats консоли: CurrentShift: WorkerTgtCoin

# НАЧАЛО РАСЧЕТ COIN ПРИБЫЛЬ ДЛЯ ТЕКУЩЕГО ТУРА - ЭТО ТАКЖЕ Рассчитывает РАБОЧИЙ ПРИБЫЛЬ MID SHIFT.
# Обратите внимание, все монетку имена в COIN_ALGO REDIS ключ должен совпадать с ключом имен в EXCHANGE_RATES KEY CASE-WISE
в то время как для чтения строки
делать
        AlgoTotal = 0
        AlgoTotalTgtCoin = 0
        logkey2 ="Pool_Stats: CurrentShift: Algos"
        logkey2TgtCoin ="Pool_Stats: CurrentShift: AlgosTgtCoin"
        эхо "LOGKEY2: $ logkey2"
        # Цикл по каждой монете для этого алгоритма
        в то время как прочитать CoinName
        делать
                coinTotal = 0
                coinTotalTgtCoin = 0
                thiskey = $ CoinName": остатки"
                logkey ="Pool_Stats: CurrentShift: Монеты"
                logkeyTgtCoin ="Pool_Stats: CurrentShift: CoinsTgtCoin"
                #Determine цена для монет
                coin2btc = `Redis-кли hget Exchange_Rates $ CoinName`
# эхо "$ CoinName - $ coin2btc"
                workersPerCoin = `Redis-кли hlen $ thiskey`
                если [$ workersPerCoin = 0]
                тогда
                        эхо "ничего не делать" > / DEV / нуль
                еще

                        в то время как прочитать WorkerName
                        делать
                                thisBalance = `Redis-кли hget $ thiskey $ WorkerName`
                                thisEarned = `эхо "масштаб = 6; $ thisBalance * $ coin2btc" | Ьс -l`
                                coinTotal = `эхо "Шкала = 6; $ coinTotal + $ thisEarned" | Ьс -l`
                                AlgoTotal = `эхо "Шкала = 6; $ AlgoTotal + $ thisEarned" | Ьс -l`
                                TgtCoinEarned = `эхо "Шкала = 6; $ thisEarned / $ TgtCoinPrice" | Ьс -l`
                                coinTotalTgtCoin = `эхо "Шкала = 6; $ coinTotalTgtCoin + $ TgtCoinEarned" | Ьс -l`
                                AlgoTotalTgtCoin = `эхо "Шкала = 6; $ AlgoTotalTgtCoin + $ TgtCoinEarned" | Ьс -l`

# эхо "$ WorkerName заработал $ TgtCoinEarned от $ CoinName"
                                Redis-hincrbyfloat Pool_Stats консоли: CurrentShift: WorkerTgtCoin $ WorkerName $ TgtCoinEarned
                                Redis-hincrbyfloat Pool_Stats консоли: CurrentShift: WorkerBTC $ WorkerName $ thisEarned
                        сделанный< <(Redis-кли hkeys $ CoinName: остатки)
                        Redis-кли $ logkey H Установите $ CoinName $ coinTotal
                        Redis-кли $ logkeyTgtCoin H Установите $ CoinName $ coinTotalTgtCoin
                        эхо "$ CoinName: $ coinTotal"

                фи
        сделанный< <(Redis-кли hkeys Coin_Names_ $ линия)
          Redis-кли $ logkey2 H Установите $ линии $ AlgoTotal
        Redis-кли $ logkey2TgtCoin H Установите $ линии $ AlgoTotalTgtCoin
TotalEarned = `эхо "Шкала = 6; $ TotalEarned + $ AlgoTotal" | Ьс -l`
TotalEarnedTgtCoin = `эхо "Шкала = 6; $ TotalEarnedTgtCoin + $ AlgoTotalTgtCoin" | Ьс -l`

сделанный< <(Redis-кли hkeys Coin_Algos)


# END РАСЧЕТ ПРИБЫЛИ ДЛЯ ТЕКУЩЕГО COIN SHIFT


# START CALCULATIN СРЕДНЯЯ HASHRATES ПОКА ЭТА SHIFT
эхо "Начало: $ STARTTIME Конец: $ EndTime"
        AlgoCounter = 0
        в то время как прочитать Algo
        делать
                AlgoCounter = $ (($ AlgoCounter + 1))
                если [$ Algo = "sha256" ]
                тогда
                        Algo ="sha256"
                фи
                AlgoHRTotal = 0
                Счетчик = 0
                loopstring ="Pool_Stats: AvgHRs:"$ Algo
                в то время как для чтения HR
                делать
                        IN = $ HR
                        arrIN = ($ {// В: /})
                        = $ AMT {arrIN [0]}
                        Счетчик = `эхо "$ Счетчика + 1" | bc`
                        AlgoHRTotal = `эхо "$ AlgoHRTotal + $ амт" | Ьс -l`
               сделанный< <(Redis-кли zrangebyscore $ loopstring $ время_запуска $ EndTime)

                если [$ Algo = "ша" ]
                тогда
                        Algo ="sha256"
                фи
                thisalgoAVG = `эхо "шкала = 8; $ AlgoHRTotal / $ счетчика" | Ьс -l`
                строка ="в среднем_"$ Algo
                Redis-консоли Pool_Stats: H Установите CurrentShift $ строка $ thisalgoAVG
                string3 ="Pool_Stats: CurrentShift: Algos"
                thisalgoEarned = `Redis-кли hget $ string3 $ Algo`
                thisalgoP = `эхо "шкала = 8; $ thisalgoEarned / $ thisalgoAVG / $ dayslength" | Ьс -l`
                строка2 ="Profitability_ $ Algo"
                Redis-кли Pool_Stats H Установите: CurrentShift $ строка2 $ thisalgoP
                если [$ Algo = "keccak" ]
                тогда
                        thisalgoP = `эхо "Шкала = 8; $ thisalgoP * 500" | Ьс -l`
                Элиф [$ Algo = "sha256" ]
                тогда
                        thisalgoP = `эхо "Шкала = 8; $ thisalgoP * 100" | Ьс -l`
                Элиф [$ Algo = "x11" ]
                тогда
                        thisalgoP = `эхо "Шкала = 8; $ thisalgoP * 4" | Ьс -l`
                еще
                        эхо "сделанный" >/ DEV / нуль
                фи
                если [-z "$ thisalgoP" ]
                тогда
                        thisalgoP = 0
                фи

                ProArr [$ AlgoCounter] = $ thisalgoP
                NameArr [$ AlgoCounter] = $ Algo
                Redis-кли Pool_Stats H Установите: CurrentShift $ строка2 $ thisalgoP

                эхо "Для текущей смены Algo $ Algo имели в среднем $ thisalgoAVG - рентабельность составила $ thisalgoP"
        сделанный< <(Redis-кли hkeys Coin_Algos)

                profitstring = $ {ProArr [1]}":"$ {ProArr [2]}":"$ {ProArr [3]}":"$ {ProArr [4]}":"$ {ProArr [5]}
                stringnames = $ {NameArr [1]}":"$ {NameArr [2]}":"$ {NameArr [3]}":"$ {NameArr [4]}":"$ {NameArr [5]}
Redis-консоли Pool_Stats: H Установите CurrentShift: Рентабельность $ сейчас $ profitstring
Redis-кли Pool_Stats H Установите: CurrentShift NameString $ stringnames



Некрасиво, но это работает.
Он даже дает вам все данные, которые вы требуете, чтобы быть в состоянии осуществить довольно графики текущей доходности сдвига.
Я буду стараться и убирать комментарии и перепечатывать в ближайшее время.
paradigmflux сейчас офлайн Пожаловаться на paradigmflux   Ответить с цитированием Мультицитирование сообщения от paradigmflux Быстрый ответ на сообщение paradigmflux

19 июля 2014, 8:00:59 PM   # 20
 
 
Сообщения: 378
Цитировать по имени
цитировать ответ
по умолчанию Re: Как создать свой собственный Multipool - на Open Source Way

Я выложу следующий бит о пуле когда hashrate на btcdpool.com идет вверх немного.
paradigmflux сейчас офлайн Пожаловаться на paradigmflux   Ответить с цитированием Мультицитирование сообщения от paradigmflux Быстрый ответ на сообщение paradigmflux



Как заработать Биткоины?

Bitcoin Wallet * Portefeuille Bitcoin * Monedero Bitcoin * Carteira Bitcoin * Portafoglio Bitcoin * Bitcoin Cüzdan * 比特币钱包

bitcoin-zarabotat.ru
Почта для связи: bitcoin-zarabotat.ru@yandex.ru

3HmAQ9FkRFk6HZGuwExYxL62y7C1B9MwPW